Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

--%throws annotation named package constant/variable not recognized #1223

Open
jgebal opened this issue Aug 2, 2022 · 1 comment
Open

--%throws annotation named package constant/variable not recognized #1223

jgebal opened this issue Aug 2, 2022 · 1 comment

Comments

@jgebal
Copy link
Member

jgebal commented Aug 2, 2022

When a test is executed, the named constant is being searched in scope of current user (user executing the tests.
This is not how it is expected to work.

Example of the problem

create or replace package user1.error_codes as
  some_error constant integer := -20001;
end;
/

create or replace package user1.main_package as
  function the_proc (a number , b number ) return number;
end;
/

create or replace package body user1.main_package as
  function the_proc(a number , b number ) return number is
  begin
     if b = 0 then
        raise_application_error(error_codes.some_error, 'Cannot use "0"');
     end if;
     return a/b;
  end;
end;
/

create or replace package user1.ut_the_code as
  --%suite

  --%test
  --%throws(error_codes.some_error)
  procedure the_test;

end;
/

create or replace package body user1.ut_the_code as
  procedure the_test is
    y number;
  begin
    y := main_package.the_proc (1,0);
  end;
end;
/

The above test will succeed when called from schema user1.

ut_the_code
  the_test [.019 sec]

Finished in .027852 seconds
1 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)

If called from user2,

ut_the_code
  the_test [.007 sec] (FAILED - 1)

Failures:

  1) the_test
      ORA-20001: Cannot use "0"
      ORA-06512: at "USER1.MAIN_PACKAGE", line 5
      ORA-06512: at "USER1.UT_THE_CODE", line 5
      ORA-06512: at line 6

Warnings:

  1) ut_the_code.the_test
      Invalid parameter value "error_codes.some_error" for "--%throws" annotation. Parameter ignored.
      at package "USER1.UT_THE_CODE.THE_TEST", line 4

Finished in .010336 seconds
1 tests, 0 failed, 1 errored, 0 disabled, 1 warning(s)

This is because the value of --%throws annotation is evaluated at runtime within the scope of the user running the code.

A change is needed so that the value is evaluated in scope of the executed UT package schema.

Ideally, we should also allow for below syntax to be valid:

create or replace package user1.ut_the_code as
  --%suite

  some_error constant integer := -20003;
  
  --%test
  --%throws(some_error)
  procedure the_test;

end;
/
@jgebal
Copy link
Member Author

jgebal commented Aug 2, 2022

Currently a workaround is possible.
Instead of --%throws(error_codes.some_error) use --%throws(user1.error_codes.some_error)
This will work regardless of user running the test

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant