
REPORT zunitdemo_ex1_migrator.
TABLES sflight.
" Correct prices in SFLIGHT
" See also program documentation
" Assume that amount of data is so small, that it can be changed in a single commit
PARAMETERS: p_code TYPE n LENGTH 4.
IF p_code <> '4752'.
WRITE: / 'Wrong code, nothing will be done'.
RETURN.
ENDIF.
DATA: modified TYPE sflight,
modifieds TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY.
SELECT * FROM sflight INTO TABLE @DATA(sfs).
LOOP AT sfs INTO DATA(sf).
IF sf-fldate EQ '20200101'.
IF sf-price IS NOT INITIAL.
modified = sf.
IF sf-price < 100.
ADD 1 TO modified-price.
ELSEIF sf-price < 1000.
ADD 10 TO modified-price.
ELSE.
ADD 20 TO modified-price.
ENDIF.
modifieds = VALUE #( BASE modifieds ( modified ) ).
ENDIF.
ENDIF.
ENDLOOP.
IF modifieds IS NOT INITIAL.
MODIFY sflight FROM TABLE modifieds.
ENDIF.
REPORT zunitdemo_ex1_migrator_2.
TABLES sflight.
" Correct prices in SFLIGHT
" See also program documentation
" Assume that amount of data is so small, that it can be changed in a single commit
SELECT-OPTIONS s_carr FOR sflight-carrid.
PARAMETERS: p_code TYPE n LENGTH 4.
START-OF-SELECTION.
IF p_code <> '4752'.
WRITE: / 'Wrong code, nothing will be done'.
RETURN.
ENDIF.
DATA: migrator TYPE REF TO zunitdemo_ex1_cl_migrator_2.
migrator = NEW #( ).
" Copy select table to range with is transferred to the class
DATA carrid_range TYPE migrator->ty_carrid.
LOOP AT s_carr INTO DATA(sc).
APPEND sc TO carrid_range.
ENDLOOP.
migrator->migrate( EXPORTING carrid_range = carrid_range ).
CLASS zunitdemo_ex1_cl_migrator_2 DEFINITION
PUBLIC
CREATE PUBLIC .
PUBLIC SECTION.
TYPES ty_carrid TYPE RANGE OF sflight-carrid.
METHODS migrate
IMPORTING carrid_range TYPE ty_carrid.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS zunitdemo_ex1_cl_migrator_2 IMPLEMENTATION.
METHOD migrate.
DATA: modified TYPE sflight,
modifieds TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY.
SELECT * FROM sflight INTO TABLE @DATA(sfs) WHERE carrid IN @carrid_range.
LOOP AT sfs INTO DATA(sf).
IF sf-fldate EQ '20200101'.
IF sf-price IS NOT INITIAL.
modified = sf.
IF sf-price < 100.
ADD 1 TO modified-price.
ELSEIF sf-price < 1000.
ADD 10 TO modified-price.
ELSE.
ADD 20 TO modified-price.
ENDIF.
modifieds = VALUE #( BASE modifieds ( modified ) ).
ENDIF.
ENDIF.
ENDLOOP.
IF modifieds IS NOT INITIAL.
MODIFY sflight FROM TABLE modifieds.
ENDIF.
ENDMETHOD.
ENDCLASS.
CLASS ltcl_test DEFINITION DEFERRED.
CLASS zunitdemo_ex1_cl_migrator_2 DEFINITION LOCAL FRIENDS ltcl_test.
CLASS ltcl_test DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS:
first_test FOR TESTING RAISING cx_static_check.
ENDCLASS.
CLASS ltcl_test IMPLEMENTATION.
METHOD first_test.
cl_abap_unit_assert=>fail( 'Implement your first test here' ).
ENDMETHOD.
ENDCLASS.
CLASS ltcl_test DEFINITION DEFERRED.
CLASS zunitdemo_ex1_cl_migrator_2 DEFINITION LOCAL FRIENDS ltcl_test.
CLASS ltcl_test DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA f_cut TYPE REF TO zunitdemo_ex1_cl_migrator_2.
METHODS:
setup,
simple FOR TESTING RAISING cx_static_check.
ENDCLASS.
CLASS ltcl_test IMPLEMENTATION.
METHOD setup.
f_cut = NEW #( ).
ENDMETHOD.
METHOD simple.
" Prepare test data for migration
DELETE FROM sflight WHERE carrid = 'TST'.
COMMIT WORK AND WAIT.
DATA: test_data TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY.
test_data = VALUE #( (
carrid = |TST|
connid = 1
fldate = |20200101|
price = 1
) ).
INSERT sflight FROM TABLE test_data.
COMMIT WORK AND WAIT.
" Migrate
f_cut->migrate( carrid_range = VALUE #( ( sign = |I| option = |EQ| low = 'TST' ) ) ).
COMMIT WORK AND WAIT.
" Check correct migration
DATA: expecteds TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY,
actuals TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY.
expecteds = VALUE #( (
mandt = sy-mandt
carrid = |TST|
connid = 1
fldate = |20200101|
price = 2
) ).
SELECT * from sflight INTO TABLE @actuals WHERE carrid = 'TST'.
cl_abap_unit_assert=>assert_equals( msg = 'Expect correctly migrated data' exp = expecteds act = actuals ).
ENDMETHOD.
ENDCLASS.
The test data is intentionally not deleted after the test. It is sometimes helpful to inspect it after the test:

CLASS ltcl_test DEFINITION DEFERRED.
CLASS zunitdemo_ex1_cl_migrator_3 DEFINITION LOCAL FRIENDS ltcl_test.
CLASS ltcl_test DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA f_cut TYPE REF TO zunitdemo_ex1_cl_migrator_3.
DATA: test_data TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY,
expecteds TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY.
METHODS:
setup,
_prepare_test_data,
_migrate,
_check
IMPORTING
message TYPE string,
simple FOR TESTING RAISING cx_static_check,
simple2 FOR TESTING RAISING cx_static_check.
ENDCLASS.
CLASS ltcl_test IMPLEMENTATION.
METHOD setup.
f_cut = NEW #( ).
ENDMETHOD.
METHOD simple.
test_data = VALUE #( (
carrid = |TST|
connid = 1
fldate = |20200101|
price = 1
) ).
_prepare_test_data( ).
_migrate( ).
expecteds = VALUE #( (
mandt = sy-mandt
carrid = |TST|
connid = 1
fldate = |20200101|
price = 2
) ).
_check( 'Expect correctly migrated data' ).
ENDMETHOD.
METHOD simple2.
test_data = VALUE #( (
carrid = |TST|
connid = 1
fldate = |20200101|
price = 100
) ).
_prepare_test_data( ).
_migrate( ).
expecteds = VALUE #( (
mandt = sy-mandt
carrid = |TST|
connid = 1
fldate = |20200101|
price = 110
) ).
_check( 'Expect correctly migrated data' ).
ENDMETHOD.
METHOD _prepare_test_data.
" Prepare test data for migration
DELETE FROM sflight WHERE carrid = 'TST'.
COMMIT WORK AND WAIT.
INSERT sflight FROM TABLE test_data.
COMMIT WORK AND WAIT.
ENDMETHOD.
METHOD _migrate.
" Migrate
f_cut->migrate( carrid_range = VALUE #( ( sign = |I| option = |EQ| low = 'TST' ) ) ).
COMMIT WORK AND WAIT.
ENDMETHOD.
METHOD _check.
" Check
DATA: actuals TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY.
SELECT * FROM sflight INTO TABLE @actuals WHERE carrid = 'TST'.
SORT actuals.
SORT expecteds.
cl_abap_unit_assert=>assert_equals( msg = message exp = expecteds act = actuals ).
ENDMETHOD.
ENDCLASS.
CLASS test_container DEFINITION FOR TESTING.
PUBLIC SECTION.
CLASS-DATA: sflight_mock TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY.
ENDCLASS.
CLASS zunitdemo_ex1_cl_migrator_4 DEFINITION
PUBLIC
CREATE PUBLIC .
PUBLIC SECTION.
TYPES:
ty_carrid TYPE RANGE OF sflight-carrid .
METHODS migrate
IMPORTING
!carrid_range TYPE ty_carrid .
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS zunitdemo_ex1_cl_migrator_4 IMPLEMENTATION.
METHOD migrate.
DATA: modified TYPE sflight,
modifieds TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY.
DATA: sfs TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY.
TEST-SEAM sflight_select.
SELECT * FROM sflight INTO TABLE @sfs WHERE carrid IN @carrid_range.
END-TEST-SEAM.
LOOP AT sfs INTO DATA(sf).
IF sf-fldate EQ '20200101'.
IF sf-price IS NOT INITIAL.
modified = sf.
IF sf-price < 100.
ADD 1 TO modified-price.
ELSEIF sf-price < 1000.
ADD 10 TO modified-price.
ELSE.
ADD 20 TO modified-price.
ENDIF.
modifieds = VALUE #( BASE modifieds ( modified ) ).
ENDIF.
ENDIF.
ENDLOOP.
IF modifieds IS NOT INITIAL.
TEST-SEAM sflight_modify.
MODIFY sflight FROM TABLE modifieds.
END-TEST-SEAM.
ENDIF.
ENDMETHOD.
ENDCLASS.
CLASS ltcl_test DEFINITION DEFERRED.
CLASS zunitdemo_ex1_cl_migrator_4 DEFINITION LOCAL FRIENDS ltcl_test.
CLASS ltcl_test DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA f_cut TYPE REF TO zunitdemo_ex1_cl_migrator_4.
DATA: test_data TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY,
expecteds TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY.
METHODS:
setup,
_migrate,
_check
IMPORTING
message TYPE string,
simple FOR TESTING RAISING cx_static_check,
simple2 FOR TESTING RAISING cx_static_check.
ENDCLASS.
CLASS ltcl_test IMPLEMENTATION.
METHOD setup.
f_cut = NEW #( ).
TEST-INJECTION sflight_select.
" Do test seams correct. Otherwise tests may not work as expected
" This coding is equivalent to a select statement
DATA: sft TYPE sflight.
LOOP AT test_container=>sflight_mock INTO sft WHERE carrid IN carrid_range.
sfs = VALUE #( BASE sfs ( sft ) ).
ENDLOOP.
END-TEST-INJECTION.
TEST-INJECTION sflight_modify.
" Do test seams correct. Otherwise tests may not work as expected
DATA: m TYPE sflight.
FIELD-SYMBOLS: <f> TYPE sflight.
LOOP AT modifieds INTO m.
" This simulates a modify. All three key fields are checked.
" This coding is equivalent to a modify statement on a database table
READ TABLE test_container=>sflight_mock ASSIGNING <f> WITH KEY carrid = m-carrid connid = m-connid fldate = m-fldate.
IF sy-subrc EQ 0.
<f> = m.
ENDIF.
ENDLOOP.
END-TEST-INJECTION.
ENDMETHOD.
METHOD simple.
test_container=>sflight_mock = VALUE #( (
carrid = |TST|
connid = 1
fldate = |20200101|
price = 1
) ).
_migrate( ).
expecteds = VALUE #( (
carrid = |TST|
connid = 1
fldate = |20200101|
price = 2
) ).
_check( 'Expect correctly migrated data' ).
ENDMETHOD.
METHOD simple2.
test_container=>sflight_mock = VALUE #( (
carrid = |TST|
connid = 1
fldate = |20200101|
price = 100
) ).
_migrate( ).
expecteds = VALUE #( (
carrid = |TST|
connid = 1
fldate = |20200101|
price = 110
) ).
_check( 'Expect correctly migrated data' ).
ENDMETHOD.
METHOD _migrate.
" Migrate
f_cut->migrate( carrid_range = VALUE #( ( sign = |I| option = |EQ| low = 'TST' ) ) ).
COMMIT WORK AND WAIT.
ENDMETHOD.
METHOD _check.
SORT test_container=>sflight_mock.
SORT expecteds.
cl_abap_unit_assert=>assert_equals( msg = message exp = expecteds act = test_container=>sflight_mock ).
ENDMETHOD.
ENDCLASS.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
21 | |
8 | |
3 | |
3 | |
3 | |
3 | |
2 | |
2 | |
2 | |
1 |