11create or replace package body test_expectations_cursor is
22
3+ gc_blob blob := to_blob('123');
4+ gc_clob clob := to_clob('abc');
5+ gc_date date := sysdate;
6+ gc_ds_int interval day(9) to second(9) := numtodsinterval(1.12345678912, 'day');
7+ gc_num number := 123456789.1234567890123456789;
8+ gc_ts timestamp(9) := to_timestamp_tz('2017-03-30 00:21:12.123456789 cet','yyyy-mm-dd hh24:mi:ss.ff9 tzr');
9+ gc_ts_tz timestamp(9) with time zone := to_timestamp_tz('2017-03-30 00:21:12.123456789 cet','yyyy-mm-dd hh24:mi:ss.ff9 tzr');
10+ gc_ts_ltz timestamp(9) with local time zone := to_timestamp_tz('2017-03-30 00:21:12.123456789 cet','yyyy-mm-dd hh24:mi:ss.ff9 tzr');
11+ gc_varchar varchar2(4000) := 'a varchar2';
12+ gc_ym_int interval year(9) to month := numtoyminterval(1.1, 'year');
13+
314 procedure cleanup_expectations is
415 begin
516 ut3.ut_expectation_processor.clear_expectations();
@@ -255,9 +266,7 @@ procedure fail_on_different_column_order
255266 as
256267 l_actual SYS_REFCURSOR;
257268 l_expected SYS_REFCURSOR;
258- l_result integer;
259- e_xpath_error exception;
260- pragma exception_init (e_xpath_error,-31011);
269+ l_error_code integer := -31011; --xpath_error
261270 begin
262271 --Arrange
263272 open l_actual for select a.*, 'a' as "A_Column", 'c' as A_COLUMN, 'x' SOME_COL, 'd' "Some_Col" from all_objects a where rownum < 4;
@@ -266,10 +275,10 @@ procedure fail_on_different_column_order
266275 --Act
267276 ut3.ut.expect(l_actual).to_equal(l_expected, a_exclude=>'/ROW/A_COLUMN,//Some_Col');
268277 --Assert
269- ut.fail('Expected -31011 but nothing was raised');
278+ ut.fail('Expected '||l_error_code||' but nothing was raised');
270279 exception
271- when e_xpath_error then
272- ut.expect(sqlcode).to_equal(-31011 );
280+ when others then
281+ ut.expect(sqlcode).to_equal(l_error_code );
273282 end;
274283 end;
275284
@@ -288,6 +297,150 @@ procedure fail_on_different_column_order
288297 ut.expect(ut3.ut_expectation_processor.get_status()).to_equal(ut3.ut_utils.tr_success);
289298 end;
290299
300+ procedure data_diff_on_failure
301+ as
302+ l_actual sys_refcursor;
303+ l_expected sys_refcursor;
304+ l_actual_message varchar2(32767);
305+ l_expected_message varchar2(32767);
306+ begin
307+ --Arrange
308+ open l_actual for select rownum rn from dual connect by level <=2;
309+ open l_expected for select rownum rn from dual connect by level <=3;
310+ --Act
311+ ut3.ut.expect(l_actual).to_equal(l_expected);
312+
313+ l_expected_message := q'[Actual:%
314+ (rows: 2, mismatched: 1)
315+ (refcursor)%
316+ was expected to equal:%
317+ (rows: 3, mismatched: 1)
318+ row_no: 3 <ROW><RN>3</RN></ROW>
319+ (refcursor)%]';
320+ l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message;
321+ --Assert
322+ ut.expect(l_actual_message).to_be_like(l_expected_message);
323+ end;
324+
325+ procedure prepare_table
326+ as
327+ pragma autonomous_transaction;
328+ begin
329+ execute immediate
330+ 'create table test_table_for_cursors (
331+ some_blob blob,
332+ some_clob clob,
333+ some_date date,
334+ some_ds_interval interval day(9) to second(9),
335+ some_nummber number,
336+ some_timestamp timestamp(9),
337+ some_timestamp_tz timestamp(9) with time zone,
338+ some_timestamp_ltz timestamp(9) with local time zone,
339+ some_varchar2 varchar2(4000),
340+ some_ym_interval interval year(9) to month
341+ )';
342+ execute immediate q'[
343+ insert into test_table_for_cursors
344+ values( :gc_blob, :gc_clob, :gc_date, :gc_ds_int, :gc_num, :gc_ts, :gc_ts_tz, :gc_ts_ltz, :gc_varchar, :gc_ym_int
345+ )
346+ ]' using gc_blob, gc_clob, gc_date, gc_ds_int, gc_num, gc_ts, gc_ts_tz, gc_ts_ltz, gc_varchar, gc_ym_int;
347+ commit;
348+ end;
349+
350+ procedure cleanup_table
351+ as
352+ pragma autonomous_transaction;
353+ begin
354+ execute immediate 'drop table test_table_for_cursors';
355+ end;
356+
357+ procedure compares_sql_and_plsql_types is
358+ l_expected sys_refcursor;
359+ l_actual sys_refcursor;
360+ begin
361+ --Arrange
362+ open l_expected for
363+ select gc_blob some_blob,
364+ gc_clob some_clob,
365+ gc_date some_date,
366+ gc_ds_int some_ds_interval,
367+ gc_num some_nummber,
368+ gc_ts some_timestamp,
369+ gc_ts_tz some_timestamp_tz,
370+ gc_ts_ltz some_timestamp_ltz ,
371+ gc_varchar some_varchar2,
372+ gc_ym_int some_ym_interval
373+ from dual;
374+ open l_actual for q'[select * from test_table_for_cursors]';
375+ --Act
376+ ut3.ut.expect(l_expected).to_equal(l_actual);
377+ --Assert
378+ ut.expect(ut3.ut_expectation_processor.get_status()).to_equal(ut3.ut_utils.tr_success);
379+ end;
380+
381+ procedure closes_cursor_after_use
382+ as
383+ l_actual sys_refcursor;
384+ begin
385+ --Arrange
386+ open l_actual for select 1 as value from dual;
387+ --Act
388+ ut3.ut.expect(l_actual).to_be_empty();
389+ --Assert
390+ ut.expect(l_actual%isopen).to_be_false();
391+ end;
392+
393+ procedure closes_cursor_after_use_on_err
394+ as
395+ l_actual sys_refcursor;
396+ begin
397+ --Arrange
398+ open l_actual for select 1/0 as value from dual;
399+ --Act
400+ begin
401+ ut3.ut.expect(l_actual).to_be_empty();
402+ exception
403+ when others then
404+ null;
405+ end;
406+ --Assert
407+ ut.expect(l_actual%isopen).to_be_false();
408+ end;
409+
410+ procedure reports_on_exception_in_cursor
411+ as
412+ l_actual sys_refcursor;
413+ l_error_code integer := -19202; --Error occurred in XML processing
414+ begin
415+ --Act
416+ open l_actual for select 1/0 as error_column from dual connect by level < 10;
417+ begin
418+ ut3.ut.expect(l_actual).to_be_empty();
419+ --Assert
420+ ut.fail('Expected '||l_error_code||' but nothing was raised');
421+ exception
422+ when others then
423+ ut.expect(sqlcode).to_equal(l_error_code);
424+ end;
425+ end;
426+
427+ procedure reports_on_closed_cursor
428+ as
429+ l_actual sys_refcursor;
430+ l_error_code integer := -19202; --Error occurred in XML processing
431+ begin
432+ --Act
433+ open l_actual for select 1 as value from dual connect by level < 10;
434+ close l_actual;
435+ begin
436+ ut3.ut.expect(l_actual).to_be_empty();
437+ --Assert
438+ ut.fail('Expected '||l_error_code||' but nothing was raised');
439+ exception
440+ when others then
441+ ut.expect(sqlcode).to_equal(l_error_code);
442+ end;
443+ end;
291444
292445end;
293446/
0 commit comments