Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2f39237

Browse files
committed
Added tests for ut_executable.
Fixed issue with non-null serveroutput (empty_clob) created for every run. Removed unused code from `ut_suite_builder`
1 parent 331ff92 commit 2f39237

5 files changed

Lines changed: 157 additions & 63 deletions

File tree

source/core/types/ut_executable.tpb

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,17 +86,19 @@ create or replace type body ut_executable is
8686
l_status number;
8787
l_line varchar2(32767);
8888
begin
89-
dbms_lob.createtemporary(self.serveroutput, true, dur => dbms_lob.session);
90-
91-
loop
92-
dbms_output.get_line(line => l_line, status => l_status);
93-
exit when l_status = 1;
9489

90+
dbms_output.get_line(line => l_line, status => l_status);
91+
if l_status != 1 then
92+
dbms_lob.createtemporary(self.serveroutput, true, dur => dbms_lob.session);
93+
end if;
94+
while l_status != 1 loop
9595
if l_line is not null then
9696
ut_utils.append_to_clob(self.serveroutput, l_line);
9797
end if;
98-
99-
dbms_lob.writeappend(self.serveroutput,1,chr(10));
98+
dbms_output.get_line(line => l_line, status => l_status);
99+
if l_status != 1 then
100+
dbms_lob.writeappend(self.serveroutput,1,chr(10));
101+
end if;
100102
end loop;
101103
end save_dbms_output;
102104
begin
@@ -116,7 +118,7 @@ create or replace type body ut_executable is
116118
' l_error_backtrace varchar2(32767);' || chr(10) ||
117119
'begin' || chr(10) ||
118120
' begin' || chr(10) ||
119-
' ' || ut_metadata.form_name(self.owner_name, self.object_name, self.procedure_name) || ';' || chr(10) ||
121+
' ' || self.form_name() || ';' || chr(10) ||
120122
' exception' || chr(10) ||
121123
' when others then ' || chr(10) ||
122124
' l_error_stack := dbms_utility.format_error_stack;' || chr(10) ||

source/core/ut_suite_builder.pkb

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -307,21 +307,6 @@ create or replace package body ut_suite_builder is
307307
return l_result;
308308
end;
309309

310-
procedure add_executable(
311-
a_executables in out nocopy ut_executables,
312-
a_owner t_object_name,
313-
a_package_name t_object_name,
314-
a_procedure_name t_object_name,
315-
a_executable_type ut_utils.t_executable_type
316-
) is
317-
begin
318-
if a_executables is null then
319-
a_executables := ut_executables();
320-
end if;
321-
a_executables.extend;
322-
a_executables(a_executables.last) := ut_executable(a_owner, a_package_name, a_procedure_name, a_executable_type);
323-
end;
324-
325310
function add_executables(
326311
a_owner t_object_name,
327312
a_package_name t_object_name,

test/api/test_ut_run.pks

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ create or replace package test_ut_run is
99
--%aftertest(drop_test_suite)
1010
procedure raise_in_invalid_state;
1111

12-
--%test(ut.run - run invalid package and fail expectation)
12+
--%test(ut.run - Does not execute suite when specified package is not valid)
1313
--%beforetest(compile_invalid_package)
1414
--%aftertest(drop_invalid_package)
1515
procedure run_in_invalid_state;
1616
procedure compile_invalid_package;
1717
procedure drop_invalid_package;
1818

19-
--%test( Invalidate package specs via rebuild but still execute package)
19+
--%test(Invalidate package specs via rebuild but still execute package)
2020
--%beforetest(generate_invalid_spec)
2121
--%aftertest(drop_test_package)
2222
procedure run_and_revalidate_specs;

test/core/test_ut_executable.pkb

Lines changed: 132 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,163 @@
11
create or replace package body test_ut_executable is
22

3-
--%suite(ut_executable)
4-
--%suitepath(utplsql.core)
3+
g_dbms_output_text varchar2(30) := 'Some output from procedure';
54

6-
--%beforeall
7-
procedure create_dummy_package is
5+
procedure exec_schema_package_proc is
6+
l_executable ut3.ut_executable;
7+
l_test ut3.ut_test;
8+
l_result boolean;
89
begin
9-
null;
10+
--Arrange
11+
l_test := ut3.ut_test(a_object_name => 'test_ut_executable',a_name => 'test_ut_executable');
12+
l_executable := ut3.ut_executable_test( null, 'test_ut_executable', 'passing_proc', ut3.ut_utils.gc_test_execute );
13+
--Act
14+
l_result := l_executable.do_execute(l_test);
15+
--Assert
16+
ut.expect(l_result).to_be_true;
17+
ut.expect(l_executable.serveroutput).to_be_null;
18+
ut.expect(l_executable.get_error_stack_trace()).to_be_null;
1019
end;
1120

12-
--%afterall
13-
procedure drop_dummy_package is
21+
procedure exec_package_proc_output is
22+
l_executable ut3.ut_executable;
23+
l_test ut3.ut_test;
24+
l_result boolean;
1425
begin
15-
null;
26+
--Arrange
27+
l_test := ut3.ut_test(a_object_name => 'test_ut_executable',a_name => 'test_ut_executable');
28+
l_executable := ut3.ut_executable_test( user, 'test_ut_executable', 'output_proc', ut3.ut_utils.gc_test_execute );
29+
--Act
30+
l_result := l_executable.do_execute(l_test);
31+
--Assert
32+
ut.expect(l_result).to_be_true;
33+
ut.expect(l_executable.serveroutput).to_equal(to_clob(g_dbms_output_text));
34+
ut.expect(l_executable.get_error_stack_trace()).to_be_null;
1635
end;
1736

18-
--%context(do_execute)
37+
procedure exec_failing_proc is
38+
l_executable ut3.ut_executable;
39+
l_test ut3.ut_test;
40+
l_result boolean;
41+
begin
42+
--Arrange
43+
l_test := ut3.ut_test(a_object_name => 'test_ut_executable',a_name => 'test_ut_executable');
44+
l_executable := ut3.ut_executable_test( user, 'test_ut_executable', 'throwing_proc', ut3.ut_utils.gc_test_execute );
45+
--Act
46+
l_result := l_executable.do_execute(l_test);
47+
--Assert
48+
ut.expect(l_result).to_be_false;
49+
ut.expect(l_executable.serveroutput).to_be_null;
50+
ut.expect(l_executable.get_error_stack_trace()).to_be_like('ORA-06501: PL/SQL: program error%');
51+
end;
1952

20-
--%test(Executes procedure in current schema when user was not provided)
21-
procedure exec_schema_package_proc is
53+
procedure create_state_dependant_pkg is
54+
pragma autonomous_transaction;
2255
begin
23-
null;
56+
execute immediate q'[
57+
create or replace package stateful_package as
58+
g_state varchar2(1) := 'A';
59+
end;
60+
]';
61+
execute immediate q'[
62+
create or replace package state_dependant_pkg as
63+
procedure run;
64+
end;
65+
]';
66+
execute immediate q'[
67+
create or replace package body state_dependant_pkg as
68+
procedure run is
69+
x varchar2(30);
70+
begin
71+
if stateful_package.g_state = 'A' then
72+
dbms_output.put_line('stateful_package.g_state = "A"');
73+
end if;
74+
end;
75+
end;
76+
]';
2477
end;
2578

26-
--%test(Executes procedure and saves dbms_output)
27-
procedure exec_package_proc is
79+
procedure modify_stateful_package is
80+
l_job_name varchar2(30) := 'recreate_stateful_package';
81+
l_cnt integer := 1;
82+
pragma autonomous_transaction;
2883
begin
29-
null;
84+
dbms_scheduler.create_job(
85+
job_name => l_job_name,
86+
job_type => 'PLSQL_BLOCK',
87+
job_action => q'/
88+
begin
89+
execute immediate q'[
90+
create or replace package stateful_package as
91+
g_state varchar2(3) := 'abc';
92+
end;]';
93+
end;/',
94+
start_date => localtimestamp,
95+
enabled => TRUE,
96+
auto_drop => TRUE,
97+
comments => 'one-time job'
98+
);
99+
dbms_lock.sleep(0.4);
100+
while l_cnt > 0 loop
101+
select count(1) into l_cnt
102+
from dba_scheduler_running_jobs srj
103+
where srj.job_name = l_job_name;
104+
end loop;
30105
end;
31106

32-
--%test(Executes a procedure raising exception, saves dbms_output and exception stack trace)
33-
procedure exec_failing_proc is
107+
procedure drop_state_dependant_pkg is
108+
pragma autonomous_transaction;
34109
begin
35-
null;
110+
execute immediate 'drop package state_dependant_pkg';
111+
execute immediate 'drop package stateful_package';
36112
end;
37113

38-
--%test(Sets state invalidation flag when executed procedure in a state-invalidated package, saves dbms_output and exception stack trace)
114+
39115
procedure exec_invalid_state_proc is
116+
l_executable ut3.ut_executable;
117+
l_test ut3.ut_test;
118+
l_result boolean;
40119
begin
41-
null;
42-
end;
120+
--Arrange
121+
l_test := ut3.ut_test(a_object_name => 'state_dependant_pkg',a_name => 'state_dependant_pkg');
122+
l_executable := ut3.ut_executable_test( user, 'state_dependant_pkg', 'run', ut3.ut_utils.gc_test_execute );
123+
l_result := l_executable.do_execute(l_test);
124+
ut.expect(l_result).to_be_true;
43125

44-
--%endcontext
126+
modify_stateful_package;
45127

46-
--%context(form_name)
128+
l_test := ut3.ut_test(a_object_name => 'state_dependant_pkg',a_name => 'state_dependant_pkg');
129+
l_executable := ut3.ut_executable_test( user, 'state_dependant_pkg', 'run', ut3.ut_utils.gc_test_execute );
130+
--Act
131+
l_result := l_executable.do_execute(l_test);
132+
--Assert
133+
ut.expect(l_result).to_be_false;
134+
ut.expect(l_executable.serveroutput).to_be_null;
135+
ut.expect(l_executable.get_error_stack_trace()).to_be_like('ORA-04061: existing state of package "UT3_TESTER.STATEFUL_PACKAGE" has been invalidated%');
136+
ut.expect(ut3.ut_expectation_processor.invalidation_exception_found()).to_be_true;
137+
end;
47138

48-
--%test(Builds a name for the executable test)
49139
procedure form_name is
140+
begin
141+
ut.expect(ut3.ut_executable_test( user, 'package', 'proc', null ).form_name()).to_equal(user||'.package.proc');
142+
ut.expect(ut3.ut_executable_test( null, 'package', 'proc', null ).form_name()).to_equal('package.proc');
143+
ut.expect(ut3.ut_executable_test( null, 'proc', null, null ).form_name()).to_equal('proc');
144+
ut.expect(ut3.ut_executable_test( user, 'proc', null, null ).form_name()).to_equal(user||'.proc');
145+
end;
146+
147+
procedure passing_proc is
50148
begin
51149
null;
52150
end;
53-
--%endcontext
151+
152+
procedure output_proc is
153+
begin
154+
dbms_output.put_line(g_dbms_output_text);
155+
end;
156+
157+
procedure throwing_proc is
158+
begin
159+
raise program_error;
160+
end;
54161

55162
end;
56163
/

test/core/test_ut_executable.pks

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,39 +3,39 @@ create or replace package test_ut_executable is
33
--%suite(ut_executable)
44
--%suitepath(utplsql.core)
55

6-
--%beforeall
7-
procedure create_dummy_package;
8-
9-
--%afterall
10-
procedure drop_dummy_package;
11-
126
--%context(do_execute)
137

148
--%test(Executes procedure in current schema when user was not provided)
15-
--%disabled
169
procedure exec_schema_package_proc;
1710

1811
--%test(Executes procedure and saves dbms_output)
19-
--%disabled
20-
procedure exec_package_proc;
12+
procedure exec_package_proc_output;
2113

2214
--%test(Executes a procedure raising exception, saves dbms_output and exception stack trace)
23-
--%disabled
2415
procedure exec_failing_proc;
2516

26-
--%test(Sets state invalidation flag when executed procedure in a state-invalidated package, saves dbms_output and exception stack trace)
27-
--%disabled
17+
--%test(Sets state invalid flag when package-state invalidated and saves exception stack trace)
18+
--%beforetest(create_state_dependant_pkg)
19+
--%aftertest(drop_state_dependant_pkg)
2820
procedure exec_invalid_state_proc;
2921

22+
procedure create_state_dependant_pkg;
23+
procedure drop_state_dependant_pkg;
24+
3025
--%endcontext
3126

3227
--%context(form_name)
3328

3429
--%test(Builds a name for the executable test)
35-
--%disabled
3630
procedure form_name;
3731

3832
--%endcontext
3933

34+
procedure passing_proc;
35+
36+
procedure output_proc;
37+
38+
procedure throwing_proc;
39+
4040
end;
4141
/

0 commit comments

Comments
 (0)