abapGit/src/env/zcl_abapgit_abap_language_vers.clas.testclasses.abap
2024-11-29 08:23:59 +01:00

500 lines
15 KiB
ABAP

* Helper to toggle (cloud) enviroment
CLASS lcl_environment DEFINITION.
PUBLIC SECTION.
INTERFACES zif_abapgit_environment.
DATA mv_is_cloud TYPE abap_bool.
METHODS set_cloud
IMPORTING
iv_is_cloud TYPE abap_bool.
ENDCLASS.
CLASS lcl_environment IMPLEMENTATION.
METHOD set_cloud.
mv_is_cloud = iv_is_cloud.
ENDMETHOD.
METHOD zif_abapgit_environment~is_sap_cloud_platform.
rv_result = mv_is_cloud.
ENDMETHOD.
METHOD zif_abapgit_environment~compare_with_inactive.
ENDMETHOD.
METHOD zif_abapgit_environment~get_basis_release.
ENDMETHOD.
METHOD zif_abapgit_environment~get_system_language_filter.
ENDMETHOD.
METHOD zif_abapgit_environment~is_merged.
ENDMETHOD.
METHOD zif_abapgit_environment~is_repo_object_changes_allowed.
ENDMETHOD.
METHOD zif_abapgit_environment~is_restart_required.
ENDMETHOD.
METHOD zif_abapgit_environment~is_sap_object_allowed.
ENDMETHOD.
METHOD zif_abapgit_environment~is_variant_maintenance.
ENDMETHOD.
METHOD zif_abapgit_environment~init_parallel_processing.
ENDMETHOD.
ENDCLASS.
* Helper to toggle experimental features
CLASS lcl_persist_settings DEFINITION.
PUBLIC SECTION.
INTERFACES zif_abapgit_persist_settings.
DATA mo_settings TYPE REF TO zcl_abapgit_settings.
METHODS constructor.
ENDCLASS.
CLASS lcl_persist_settings IMPLEMENTATION.
METHOD constructor.
CREATE OBJECT mo_settings.
ENDMETHOD.
METHOD zif_abapgit_persist_settings~modify.
ENDMETHOD.
METHOD zif_abapgit_persist_settings~read.
ro_settings = mo_settings.
ENDMETHOD.
ENDCLASS.
* Test cases
CLASS ltcl_abap_language_version DEFINITION FOR TESTING RISK LEVEL HARMLESS
DURATION SHORT FINAL.
PRIVATE SECTION.
" Cloud package hardcoded in cl_abap_language_version
CONSTANTS c_cloud_package TYPE devclass VALUE 'TEST_LANGUAGE_VERSION_SCP'.
CONSTANTS c_language_cfg TYPE seoclsname VALUE 'CL_ABAP_LANGUAGE_VERSION_CFG'.
DATA:
mt_versions TYPE string_table,
mv_has_cloud_package TYPE abap_bool,
mv_has_language_cfg TYPE abap_bool,
mo_environment TYPE REF TO lcl_environment,
mi_persistency TYPE REF TO zif_abapgit_persist_settings,
mo_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit,
mo_cut TYPE REF TO zcl_abapgit_abap_language_vers.
METHODS:
setup,
init
IMPORTING
iv_abap_language_version TYPE string,
set_environment
IMPORTING
iv_is_cloud TYPE abap_bool,
set_features
IMPORTING
iv_features TYPE string,
repo_setting_test
IMPORTING
iv_version TYPE string
iv_exp TYPE zif_abapgit_aff_types_v1=>ty_abap_language_version,
object_type_test
IMPORTING
iv_version TYPE string
iv_standard TYPE zif_abapgit_aff_types_v1=>ty_abap_language_version
iv_standard_src TYPE zif_abapgit_aff_types_v1=>ty_abap_language_version
iv_cloud TYPE zif_abapgit_aff_types_v1=>ty_abap_language_version
iv_cloud_src TYPE zif_abapgit_aff_types_v1=>ty_abap_language_version,
is_import_allowed_test
IMPORTING
iv_version TYPE string
iv_standard TYPE abap_bool
iv_cloud TYPE abap_bool
iv_new TYPE abap_bool.
METHODS:
repo_setting_feature_off FOR TESTING,
repo_setting_feature_on FOR TESTING,
object_type_feature_off FOR TESTING,
object_type_feature_on FOR TESTING,
is_import_allowed FOR TESTING,
check_abap_language_vers_same FOR TESTING RAISING zcx_abapgit_exception,
check_abap_language_vers_diff FOR TESTING.
ENDCLASS.
CLASS ltcl_abap_language_version IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_environment.
zcl_abapgit_injector=>set_environment( mo_environment ).
CREATE OBJECT mi_persistency TYPE lcl_persist_settings.
zcl_abapgit_persist_injector=>set_settings( mi_persistency ).
APPEND zif_abapgit_dot_abapgit=>c_abap_language_version-undefined TO mt_versions.
APPEND zif_abapgit_dot_abapgit=>c_abap_language_version-ignore TO mt_versions.
APPEND zif_abapgit_dot_abapgit=>c_abap_language_version-standard TO mt_versions.
APPEND zif_abapgit_dot_abapgit=>c_abap_language_version-key_user TO mt_versions.
APPEND zif_abapgit_dot_abapgit=>c_abap_language_version-cloud_development TO mt_versions.
mv_has_cloud_package = zcl_abapgit_factory=>get_sap_package( c_cloud_package )->exists( ).
ENDMETHOD.
METHOD init.
mo_dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( ).
mo_dot_abapgit->set_abap_language_version( iv_abap_language_version ).
CREATE OBJECT mo_cut
EXPORTING
io_dot_abapgit = mo_dot_abapgit.
ENDMETHOD.
METHOD set_environment.
mo_environment->set_cloud( iv_is_cloud ).
ENDMETHOD.
METHOD set_features.
mi_persistency->read( )->set_experimental_features( iv_features ).
ENDMETHOD.
METHOD repo_setting_test.
init( iv_version ).
" Assume on-prem (no cloud)
set_environment( abap_false ).
cl_abap_unit_assert=>assert_equals(
act = mo_cut->get_repo_abap_language_version( )
exp = iv_exp
msg = |ABAP Language Version: { iv_version }, On-prem| ).
" Assume cloud platform
set_environment( abap_true ).
cl_abap_unit_assert=>assert_equals(
act = mo_cut->get_repo_abap_language_version( )
exp = iv_exp
msg = |ABAP Language Version: { iv_version }, Cloud| ).
ENDMETHOD.
METHOD repo_setting_feature_off.
DATA lv_version TYPE string.
" If experimental feature is off, repo setting is not taken into consideration
set_features( '' ).
LOOP AT mt_versions INTO lv_version.
repo_setting_test(
iv_version = lv_version
iv_exp = zcl_abapgit_abap_language_vers=>c_any_abap_language_version ).
ENDLOOP.
ENDMETHOD.
METHOD repo_setting_feature_on.
DATA lv_version TYPE string.
" If experimental feature is on, repo setting is returned
set_features( zcl_abapgit_abap_language_vers=>c_feature_flag ).
LOOP AT mt_versions INTO lv_version.
CASE lv_version.
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
repo_setting_test(
iv_version = lv_version
iv_exp = zcl_abapgit_abap_language_vers=>c_any_abap_language_version ).
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-ignore.
repo_setting_test(
iv_version = lv_version
iv_exp = zcl_abapgit_abap_language_vers=>c_no_abap_language_version ).
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-standard.
repo_setting_test(
iv_version = lv_version
iv_exp = zif_abapgit_aff_types_v1=>co_abap_language_version_src-standard ).
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-key_user.
repo_setting_test(
iv_version = lv_version
iv_exp = zif_abapgit_aff_types_v1=>co_abap_language_version_src-key_user ).
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-cloud_development.
repo_setting_test(
iv_version = lv_version
iv_exp = zif_abapgit_aff_types_v1=>co_abap_language_version_src-cloud_development ).
ENDCASE.
ENDLOOP.
ENDMETHOD.
METHOD object_type_test.
init( iv_version ).
" Assume on-prem (no cloud)
set_environment( abap_false ).
" source code
cl_abap_unit_assert=>assert_equals(
act = mo_cut->get_abap_language_vers_by_objt(
iv_object_type = 'INTF'
iv_package = '$TMP' )
exp = iv_standard_src
msg = |ABAP Language Version: { iv_version }, On-prem| ).
" non-source code
cl_abap_unit_assert=>assert_equals(
act = mo_cut->get_abap_language_vers_by_objt(
iv_object_type = 'TABL'
iv_package = '$TMP' )
exp = iv_standard
msg = |ABAP Language Version: { iv_version }, On-prem| ).
" Assume cloud platform
IF mv_has_cloud_package = abap_false.
RETURN.
ENDIF.
set_environment( abap_true ).
" source code
cl_abap_unit_assert=>assert_equals(
act = mo_cut->get_abap_language_vers_by_objt(
iv_object_type = 'INTF'
iv_package = c_cloud_package )
exp = iv_cloud_src
msg = |ABAP Language Version: { iv_version }, Cloud| ).
" non-source code
cl_abap_unit_assert=>assert_equals(
act = mo_cut->get_abap_language_vers_by_objt(
iv_object_type = 'TABL'
iv_package = c_cloud_package )
exp = iv_cloud
msg = |ABAP Language Version: { iv_version }, Cloud| ).
ENDMETHOD.
METHOD object_type_feature_off.
DATA lv_version TYPE string.
" If experimental feature is off, repo setting is ignored
set_features( '' ).
LOOP AT mt_versions INTO lv_version.
object_type_test(
iv_version = lv_version
iv_standard = zcl_abapgit_abap_language_vers=>c_any_abap_language_version
iv_standard_src = zcl_abapgit_abap_language_vers=>c_any_abap_language_version
iv_cloud = zcl_abapgit_abap_language_vers=>c_any_abap_language_version
iv_cloud_src = zcl_abapgit_abap_language_vers=>c_any_abap_language_version ).
ENDLOOP.
ENDMETHOD.
METHOD object_type_feature_on.
DATA lv_version TYPE string.
" If experimental feature is on, repo setting is ignored but package setting is returned
set_features( zcl_abapgit_abap_language_vers=>c_feature_flag ).
LOOP AT mt_versions INTO lv_version.
CASE lv_version.
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
object_type_test(
iv_version = lv_version
iv_standard = zcl_abapgit_abap_language_vers=>c_any_abap_language_version
iv_standard_src = zcl_abapgit_abap_language_vers=>c_any_abap_language_version
iv_cloud = zcl_abapgit_abap_language_vers=>c_any_abap_language_version
iv_cloud_src = zcl_abapgit_abap_language_vers=>c_any_abap_language_version ).
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-ignore.
object_type_test(
iv_version = lv_version
iv_standard = zcl_abapgit_abap_language_vers=>c_no_abap_language_version
iv_standard_src = zcl_abapgit_abap_language_vers=>c_no_abap_language_version
iv_cloud = zcl_abapgit_abap_language_vers=>c_no_abap_language_version
iv_cloud_src = zcl_abapgit_abap_language_vers=>c_no_abap_language_version ).
WHEN OTHERS.
object_type_test(
iv_version = lv_version
iv_standard = zif_abapgit_aff_types_v1=>co_abap_language_version-standard
iv_standard_src = zif_abapgit_aff_types_v1=>co_abap_language_version_src-standard
iv_cloud = zif_abapgit_aff_types_v1=>co_abap_language_version-cloud_development
iv_cloud_src = zif_abapgit_aff_types_v1=>co_abap_language_version_src-cloud_development ).
ENDCASE.
ENDLOOP.
ENDMETHOD.
METHOD is_import_allowed_test.
init( iv_version ).
" Assume on-prem (no cloud)
set_environment( abap_false ).
IF mv_has_language_cfg = abap_true.
cl_abap_unit_assert=>assert_equals(
act = mo_cut->is_import_allowed( '$TMP' ) " existing standard package
exp = iv_standard ).
ENDIF.
IF mv_has_cloud_package = abap_true.
cl_abap_unit_assert=>assert_equals(
act = mo_cut->is_import_allowed( c_cloud_package ) " existing cloud package
exp = iv_cloud ).
ENDIF.
cl_abap_unit_assert=>assert_equals(
act = mo_cut->is_import_allowed( 'Z_FOO_BAR' ) " non-existing package
exp = iv_new ).
" Assume cloud platform
set_environment( abap_true ).
IF mv_has_language_cfg = abap_true.
cl_abap_unit_assert=>assert_equals(
act = mo_cut->is_import_allowed( '$TMP' ) " existing standard package
exp = iv_standard ).
ENDIF.
IF mv_has_cloud_package = abap_true.
cl_abap_unit_assert=>assert_equals(
act = mo_cut->is_import_allowed( c_cloud_package ) " existing cloud package
exp = iv_cloud ).
ENDIF.
cl_abap_unit_assert=>assert_equals(
act = mo_cut->is_import_allowed( 'Z_FOO_BAR' ) " non-existing package
exp = iv_new ).
ENDMETHOD.
METHOD is_import_allowed.
DATA lv_version TYPE string.
DATA ls_clskey TYPE seoclskey.
ls_clskey-clsname = c_language_cfg.
" Tests using ABAP language version "standard" only work if the required
" SAP class is available. In older releases, all packages will have
" ABAP language version "undefined" and are handled like a new package
CALL FUNCTION 'SEO_CLASS_EXISTENCE_CHECK'
EXPORTING
clskey = ls_clskey
EXCEPTIONS
OTHERS = 1.
mv_has_language_cfg = boolc( sy-subrc = 0 ).
LOOP AT mt_versions INTO lv_version.
CASE lv_version.
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-undefined
OR zif_abapgit_dot_abapgit=>c_abap_language_version-ignore.
is_import_allowed_test(
iv_version = lv_version
iv_standard = abap_true
iv_cloud = abap_true
iv_new = abap_true ).
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-standard.
is_import_allowed_test(
iv_version = lv_version
iv_standard = abap_true
iv_cloud = abap_false
iv_new = abap_true ).
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-key_user.
is_import_allowed_test(
iv_version = lv_version
iv_standard = abap_false
iv_cloud = abap_false
iv_new = abap_true ).
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-cloud_development.
is_import_allowed_test(
iv_version = lv_version
iv_standard = abap_false
iv_cloud = abap_true
iv_new = abap_true ).
ENDCASE.
ENDLOOP.
ENDMETHOD.
METHOD check_abap_language_vers_same.
DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
ls_item-obj_type = 'CLAS'.
ls_item-obj_name = 'ZCL_FOO_BAR'.
ls_item-abap_language_version = zif_abapgit_aff_types_v1=>co_abap_language_version-standard.
" Does not throw
zcl_abapgit_abap_language_vers=>check_abap_language_version(
iv_abap_language_version = zif_abapgit_aff_types_v1=>co_abap_language_version-standard
is_item = ls_item ).
ENDMETHOD.
METHOD check_abap_language_vers_diff.
DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
ls_item-obj_type = 'CLAS'.
ls_item-obj_name = 'ZCL_FOO_BAR'.
ls_item-abap_language_version = zif_abapgit_aff_types_v1=>co_abap_language_version_src-standard.
TRY.
zcl_abapgit_abap_language_vers=>check_abap_language_version(
iv_abap_language_version = zif_abapgit_aff_types_v1=>co_abap_language_version_src-cloud_development
is_item = ls_item ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception ##NO_HANDLER.
ENDTRY.
ENDMETHOD.
ENDCLASS.