diff --git a/src/objects/core/zcl_abapgit_serialize.clas.abap b/src/objects/core/zcl_abapgit_serialize.clas.abap index 2eba30d7a..4a4cca91a 100644 --- a/src/objects/core/zcl_abapgit_serialize.clas.abap +++ b/src/objects/core/zcl_abapgit_serialize.clas.abap @@ -216,7 +216,8 @@ CLASS zcl_abapgit_serialize IMPLEMENTATION. iv_ignore_subpackages = ms_local_settings-ignore_subpackages iv_only_local_objects = ms_local_settings-only_local_objects io_dot = mo_dot_abapgit - ii_log = ii_log ). + ii_log = ii_log + it_filter = it_filter ). CREATE OBJECT lo_filter. diff --git a/src/objects/core/zcl_abapgit_tadir.clas.abap b/src/objects/core/zcl_abapgit_tadir.clas.abap index 6a66870bd..6de2ad7d1 100644 --- a/src/objects/core/zcl_abapgit_tadir.clas.abap +++ b/src/objects/core/zcl_abapgit_tadir.clas.abap @@ -388,6 +388,8 @@ CLASS zcl_abapgit_tadir IMPLEMENTATION. METHOD zif_abapgit_tadir~read. DATA: li_exit TYPE REF TO zif_abapgit_exit. + DATA: lr_tadir TYPE REF TO zif_abapgit_definitions=>ty_tadir. + DATA: lt_filter TYPE zif_abapgit_definitions=>ty_tadir_tt. " Start recursion " hmm, some problems here, should TADIR also build path? @@ -406,8 +408,26 @@ CLASS zcl_abapgit_tadir IMPLEMENTATION. CHANGING ct_tadir = rt_tadir ). - rt_tadir = check_exists( rt_tadir ). + IF it_filter IS NOT INITIAL. + "Apply filter manually instead of calling zcl_abapgit_repo_filter->apply, + "so that we can execute a unit test. The method applies addition filtering + "and does therefore additional selects + lt_filter = it_filter. + SORT lt_filter BY object obj_name. + LOOP AT rt_tadir REFERENCE INTO lr_tadir. + READ TABLE lt_filter TRANSPORTING NO FIELDS + WITH KEY object = lr_tadir->object + obj_name = lr_tadir->obj_name + BINARY SEARCH. + IF sy-subrc <> 0. + DELETE rt_tadir. + ENDIF. + ENDLOOP. + ENDIF. + IF iv_check_exists = abap_true. + rt_tadir = check_exists( rt_tadir ). + ENDIF. ENDMETHOD. diff --git a/src/objects/core/zif_abapgit_tadir.intf.abap b/src/objects/core/zif_abapgit_tadir.intf.abap index 43f0c8564..9e48dd6e0 100644 --- a/src/objects/core/zif_abapgit_tadir.intf.abap +++ b/src/objects/core/zif_abapgit_tadir.intf.abap @@ -18,6 +18,8 @@ INTERFACE zif_abapgit_tadir !iv_only_local_objects TYPE abap_bool DEFAULT abap_false !io_dot TYPE REF TO zcl_abapgit_dot_abapgit OPTIONAL !ii_log TYPE REF TO zif_abapgit_log OPTIONAL + !it_filter TYPE zif_abapgit_definitions=>ty_tadir_tt OPTIONAL + !iv_check_exists TYPE abap_bool DEFAULT abap_true RETURNING VALUE(rt_tadir) TYPE zif_abapgit_definitions=>ty_tadir_tt RAISING diff --git a/test/zcl_abapgit_tadir_test.clas.abap b/test/zcl_abapgit_tadir_test.clas.abap new file mode 100644 index 000000000..436a6261d --- /dev/null +++ b/test/zcl_abapgit_tadir_test.clas.abap @@ -0,0 +1,14 @@ +CLASS zcl_abapgit_tadir_test DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_TADIR_TEST IMPLEMENTATION. +ENDCLASS. diff --git a/test/zcl_abapgit_tadir_test.clas.testclasses.abap b/test/zcl_abapgit_tadir_test.clas.testclasses.abap new file mode 100644 index 000000000..2bafff38b --- /dev/null +++ b/test/zcl_abapgit_tadir_test.clas.testclasses.abap @@ -0,0 +1,242 @@ +CLASS ltcl_build DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION MEDIUM FINAL. + PRIVATE SECTION. + CLASS-DATA gi_environment TYPE REF TO if_osql_test_environment. + CLASS-METHODS class_setup. + CLASS-METHODS class_teardown. + CLASS-METHODS create_envoirment. + + METHODS check_build_wo_filter FOR TESTING RAISING zcx_abapgit_exception. + METHODS check_build_w_filter FOR TESTING RAISING zcx_abapgit_exception. +ENDCLASS. + +CLASS ltcl_build IMPLEMENTATION. + + METHOD create_envoirment. + + DATA lt_tables TYPE if_osql_test_environment=>ty_t_sobjnames. + DATA ls_tadir TYPE tadir. + DATA lt_tadir TYPE STANDARD TABLE OF tadir. + DATA ls_tdevc TYPE tdevc. + DATA lt_tdevc TYPE STANDARD TABLE OF tdevc. + + APPEND 'TADIR' TO lt_tables. + APPEND 'TDEVC' TO lt_tables. + APPEND 'SOTR_HEADU' TO lt_tables. + gi_environment = cl_osql_test_environment=>create( lt_tables ). + + ls_tadir-pgmid = 'R3TR'. + ls_tadir-object = 'DEVC'. + ls_tadir-obj_name = 'BASIS'. + ls_tadir-devclass = 'BASIS'. + INSERT ls_tadir INTO TABLE lt_tadir. + + ls_tadir-pgmid = 'R3TR'. + ls_tadir-object = 'DEVC'. + ls_tadir-obj_name = '/STMC/FND'. + ls_tadir-devclass = '/STMC/FND'. + INSERT ls_tadir INTO TABLE lt_tadir. + + ls_tadir-pgmid = 'R3TR'. + ls_tadir-object = 'DTEL'. + ls_tadir-obj_name = 'DEVCLASS'. + ls_tadir-devclass = 'BASIS'. "not in reality + INSERT ls_tadir INTO TABLE lt_tadir. + + ls_tadir-pgmid = 'R3TR'. + ls_tadir-object = 'DTEL'. + ls_tadir-obj_name = 'MATNR'. + ls_tadir-devclass = 'BASIS'. "not in reality + INSERT ls_tadir INTO TABLE lt_tadir. + + gi_environment->insert_test_data( lt_tadir ). + + ls_tdevc-devclass = 'BASIS'. + INSERT ls_tdevc INTO TABLE lt_tdevc. + + ls_tdevc-devclass = '$SWF_RUN_CNT'. + ls_tdevc-parentcl = '/STMC/FND'. "not in reality + INSERT ls_tdevc INTO TABLE lt_tdevc. + + ls_tdevc-devclass = '/STMC/FND'. + ls_tdevc-parentcl = 'BASIS'. "not in reality + INSERT ls_tdevc INTO TABLE lt_tdevc. + + gi_environment->insert_test_data( lt_tdevc ). + + ENDMETHOD. + + + METHOD check_build_wo_filter. + + DATA lo_dot TYPE REF TO zcl_abapgit_dot_abapgit. + DATA li_log TYPE REF TO zif_abapgit_log. + DATA lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt. + DATA lo_ex TYPE REF TO zcx_abapgit_exception. + DATA lv_top_package TYPE devclass. + + lv_top_package = 'BASIS'. + TRY. + CREATE OBJECT li_log TYPE zcl_abapgit_log. + + lo_dot = zcl_abapgit_dot_abapgit=>build_default( ). + lo_dot->set_folder_logic( zif_abapgit_dot_abapgit=>c_folder_logic-full ). + + lt_tadir = zcl_abapgit_factory=>get_tadir( )->read( + iv_package = lv_top_package + io_dot = lo_dot + iv_check_exists = abap_false ). + + cl_abap_unit_assert=>assert_not_initial( lt_tadir ). + + READ TABLE lt_tadir TRANSPORTING NO FIELDS + WITH KEY object = 'DEVC' + obj_name = '$SWF_RUN_CNT'. + + IF sy-subrc <> 0. + cl_abap_unit_assert=>fail( |Object DEVC $SWF_RUN_CNT missing| ). + ENDIF. + + READ TABLE lt_tadir TRANSPORTING NO FIELDS + WITH KEY object = 'DEVC' + obj_name = 'BASIS'. + + IF sy-subrc <> 0. + cl_abap_unit_assert=>fail( |Object DEVC BASIS missing| ). + ENDIF. + + READ TABLE lt_tadir TRANSPORTING NO FIELDS + WITH KEY object = 'DEVC' + obj_name = '/STMC/FND'. + + IF sy-subrc <> 0. + cl_abap_unit_assert=>fail( |Object DEVC /STMC/FND missing| ). + ENDIF. + + READ TABLE lt_tadir TRANSPORTING NO FIELDS + WITH KEY object = 'DTEL' + obj_name = 'DEVCLASS'. + + IF sy-subrc <> 0. + cl_abap_unit_assert=>fail( |Object DTEL DEVCLASS missing| ). + ENDIF. + + READ TABLE lt_tadir TRANSPORTING NO FIELDS + WITH KEY object = 'DTEL' + obj_name = 'MATNR'. + + IF sy-subrc <> 0. + cl_abap_unit_assert=>fail( |Object DTEL MATNR missing| ). + ENDIF. + + READ TABLE lt_tadir TRANSPORTING NO FIELDS + WITH KEY object = 'NSPC' + obj_name = '/STMC/'. + + IF sy-subrc <> 0. + cl_abap_unit_assert=>fail( |Object NSPC /STMC/ missing| ). + ENDIF. + + CATCH zcx_abapgit_exception INTO lo_ex. + cl_abap_unit_assert=>fail( lo_ex->get_text( ) ). + + ENDTRY. + ENDMETHOD. + + METHOD check_build_w_filter. + + DATA lo_dot TYPE REF TO zcl_abapgit_dot_abapgit. + DATA li_log TYPE REF TO zif_abapgit_log. + DATA lr_ex TYPE REF TO zcx_abapgit_exception. + DATA lo_tadir TYPE REF TO zcl_abapgit_tadir. + DATA lo_ex TYPE REF TO zcx_abapgit_exception. + DATA lv_top_package TYPE devclass. + DATA lt_filter TYPE zif_abapgit_definitions=>ty_tadir_tt. + DATA ls_filter TYPE zif_abapgit_definitions=>ty_tadir. + DATA lr_filter TYPE REF TO zif_abapgit_definitions=>ty_tadir. + DATA lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt. + DATA lr_tadir TYPE REF TO zif_abapgit_definitions=>ty_tadir. + DATA lv_msg TYPE string. + + lv_top_package = 'BASIS'. + + ls_filter-object = 'NSPC'. + ls_filter-obj_name = '/STMC/'. + INSERT ls_filter INTO TABLE lt_filter. + + ls_filter-object = 'DEVC'. + ls_filter-obj_name = '/STMC/FND'. + INSERT ls_filter INTO TABLE lt_filter. + + ls_filter-object = 'DTEL'. + ls_filter-obj_name = 'DEVCLASS'. + INSERT ls_filter INTO TABLE lt_filter. + + ls_filter-object = 'DEVC'. + ls_filter-obj_name = 'BASIS'. + INSERT ls_filter INTO TABLE lt_filter. + + ls_filter-object = 'DEVC'. + ls_filter-obj_name = '$SWF_RUN_CNT'. + INSERT ls_filter INTO TABLE lt_filter. + + READ TABLE lt_filter TRANSPORTING NO FIELDS + WITH KEY object = 'NSPC'. + + IF sy-subrc <> 0. + cl_abap_unit_assert=>fail( msg = |Read table lt_filter with table key obj_type = 'NSPC' failed'| ). + ENDIF. + + READ TABLE lt_filter TRANSPORTING NO FIELDS + WITH KEY object = 'DEVC'. + + IF sy-subrc <> 0. + cl_abap_unit_assert=>fail( msg = |Read table lt_filter with table key obj_type = 'DEVC' failed'| ). + ENDIF. + + TRY. + CREATE OBJECT li_log TYPE zcl_abapgit_log. + + lo_dot = zcl_abapgit_dot_abapgit=>build_default( ). + lo_dot->set_folder_logic( zif_abapgit_dot_abapgit=>c_folder_logic-full ). + + lt_tadir = zcl_abapgit_factory=>get_tadir( )->read( + iv_package = lv_top_package + io_dot = lo_dot + it_filter = lt_filter + iv_check_exists = abap_false ). + + cl_abap_unit_assert=>assert_not_initial( lt_tadir ). + + IF lines( lt_tadir ) <> lines( lt_filter ). + lv_msg = 'Differnt number of objects found than filtered:'. + LOOP AT lt_tadir REFERENCE INTO lr_tadir. + CONCATENATE lv_msg lr_tadir->obj_name INTO lv_msg SEPARATED BY ' | '. + ENDLOOP. + + CONCATENATE lv_msg '; requested:' INTO lv_msg SEPARATED BY space. + LOOP AT lt_filter REFERENCE INTO lr_filter. + CONCATENATE lv_msg lr_filter->obj_name INTO lv_msg SEPARATED BY ' | '. + ENDLOOP. + + cl_abap_unit_assert=>assert_equals( + act = lines( lt_tadir ) + exp = lines( lt_filter ) + msg = lv_msg ). + ENDIF. + CATCH zcx_abapgit_exception INTO lo_ex. + cl_abap_unit_assert=>fail( lo_ex->get_text( ) ). + + ENDTRY. + ENDMETHOD. + + METHOD class_setup. + create_envoirment( ). + ENDMETHOD. + + METHOD class_teardown. + IF NOT gi_environment IS INITIAL. + gi_environment->destroy( ). + ENDIF. + ENDMETHOD. + +ENDCLASS. \ No newline at end of file diff --git a/test/zcl_abapgit_tadir_test.clas.xml b/test/zcl_abapgit_tadir_test.clas.xml new file mode 100644 index 000000000..380ee6a85 --- /dev/null +++ b/test/zcl_abapgit_tadir_test.clas.xml @@ -0,0 +1,17 @@ + + + + + + ZCL_ABAPGIT_TADIR_TEST + E + TADIR Test Class + 1 + X + X + X + X + + + +