diff --git a/src/git/zcl_abapgit_git_factory.clas.abap b/src/git/zcl_abapgit_git_factory.clas.abap
index 0e5e94f30..c6f558f9e 100644
--- a/src/git/zcl_abapgit_git_factory.clas.abap
+++ b/src/git/zcl_abapgit_git_factory.clas.abap
@@ -1,22 +1,42 @@
CLASS zcl_abapgit_git_factory DEFINITION
PUBLIC
FINAL
- CREATE PUBLIC .
+ CREATE PRIVATE
+ GLOBAL FRIENDS zcl_abapgit_git_injector .
PUBLIC SECTION.
- CLASS-METHODS
+ CLASS-METHODS:
get_v2_porcelain
- RETURNING VALUE(ri_v2) TYPE REF TO zif_abapgit_gitv2_porcelain.
+ RETURNING VALUE(ri_v2) TYPE REF TO zif_abapgit_gitv2_porcelain,
+
+ get_git_transport
+ RETURNING
+ VALUE(ri_git_transport) TYPE REF TO zif_abapgit_git_transport.
+
PROTECTED SECTION.
PRIVATE SECTION.
+ CLASS-DATA:
+ gi_git_transport TYPE REF TO zif_abapgit_git_transport.
+
ENDCLASS.
-CLASS ZCL_ABAPGIT_GIT_FACTORY IMPLEMENTATION.
-
+CLASS zcl_abapgit_git_factory IMPLEMENTATION.
METHOD get_v2_porcelain.
CREATE OBJECT ri_v2 TYPE zcl_abapgit_gitv2_porcelain.
ENDMETHOD.
+
+
+ METHOD get_git_transport.
+
+ IF gi_git_transport IS INITIAL.
+ CREATE OBJECT gi_git_transport TYPE zcl_abapgit_git_transport.
+ ENDIF.
+
+ ri_git_transport = gi_git_transport.
+
+ ENDMETHOD.
+
ENDCLASS.
diff --git a/src/git/zcl_abapgit_git_injector.clas.abap b/src/git/zcl_abapgit_git_injector.clas.abap
new file mode 100644
index 000000000..07b1aebba
--- /dev/null
+++ b/src/git/zcl_abapgit_git_injector.clas.abap
@@ -0,0 +1,22 @@
+CLASS zcl_abapgit_git_injector DEFINITION
+ PUBLIC
+ FINAL
+ CREATE PRIVATE .
+
+ PUBLIC SECTION.
+ CLASS-METHODS:
+ set_git_transport
+ IMPORTING
+ ii_git_transport TYPE REF TO zif_abapgit_git_transport.
+
+ENDCLASS.
+
+
+
+CLASS zcl_abapgit_git_injector IMPLEMENTATION.
+
+ METHOD set_git_transport.
+ zcl_abapgit_git_factory=>gi_git_transport = ii_git_transport.
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/git/zcl_abapgit_git_injector.clas.xml b/src/git/zcl_abapgit_git_injector.clas.xml
new file mode 100644
index 000000000..b0463f9e3
--- /dev/null
+++ b/src/git/zcl_abapgit_git_injector.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ ZCL_ABAPGIT_GIT_INJECTOR
+ E
+ abapGit - Git Injector
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/git/zcl_abapgit_git_porcelain.clas.abap b/src/git/zcl_abapgit_git_porcelain.clas.abap
index 07a81363a..672de746e 100644
--- a/src/git/zcl_abapgit_git_porcelain.clas.abap
+++ b/src/git/zcl_abapgit_git_porcelain.clas.abap
@@ -358,7 +358,7 @@ CLASS zcl_abapgit_git_porcelain IMPLEMENTATION.
lt_tags TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt.
" For annotated tags, find the correct commit
- lo_branches = zcl_abapgit_git_transport=>branches( iv_url ).
+ lo_branches = zcl_abapgit_git_factory=>get_git_transport( )->branches( iv_url ).
lt_tags = lo_branches->get_tags_only( ).
lv_tag = zcl_abapgit_git_tag=>remove_peel( is_tag-name ).
diff --git a/src/git/zcl_abapgit_git_transport.clas.abap b/src/git/zcl_abapgit_git_transport.clas.abap
index 8a12e3c25..60512203c 100644
--- a/src/git/zcl_abapgit_git_transport.clas.abap
+++ b/src/git/zcl_abapgit_git_transport.clas.abap
@@ -4,6 +4,8 @@ CLASS zcl_abapgit_git_transport DEFINITION
CREATE PUBLIC .
PUBLIC SECTION.
+ INTERFACES:
+ zif_abapgit_git_transport.
* remote to local
CLASS-METHODS upload_pack_by_branch
@@ -39,11 +41,12 @@ CLASS zcl_abapgit_git_transport DEFINITION
zcx_abapgit_exception .
CLASS-METHODS branches
IMPORTING
- !iv_url TYPE string
+ iv_url TYPE string
RETURNING
VALUE(ro_branch_list) TYPE REF TO zcl_abapgit_git_branch_list
RAISING
zcx_abapgit_exception .
+
PROTECTED SECTION.
PRIVATE SECTION.
@@ -102,7 +105,7 @@ ENDCLASS.
CLASS zcl_abapgit_git_transport IMPLEMENTATION.
- METHOD branches.
+ METHOD zif_abapgit_git_transport~branches.
DATA: lo_client TYPE REF TO zcl_abapgit_http_client.
@@ -439,4 +442,13 @@ CLASS zcl_abapgit_git_transport IMPLEMENTATION.
it_hashes = lt_hashes ).
ENDMETHOD.
+
+
+ METHOD branches.
+
+ " This method is kept for compatibility reasons
+ ro_branch_list = zcl_abapgit_git_factory=>get_git_transport( )->branches( iv_url ).
+
+ ENDMETHOD.
+
ENDCLASS.
diff --git a/src/git/zif_abapgit_git_transport.intf.abap b/src/git/zif_abapgit_git_transport.intf.abap
new file mode 100644
index 000000000..308ef3b82
--- /dev/null
+++ b/src/git/zif_abapgit_git_transport.intf.abap
@@ -0,0 +1,11 @@
+INTERFACE zif_abapgit_git_transport
+ PUBLIC .
+ METHODS branches
+ IMPORTING
+ iv_url TYPE string
+ RETURNING
+ VALUE(ro_branch_list) TYPE REF TO zcl_abapgit_git_branch_list
+ RAISING
+ zcx_abapgit_exception .
+
+ENDINTERFACE.
diff --git a/src/git/zif_abapgit_git_transport.intf.xml b/src/git/zif_abapgit_git_transport.intf.xml
new file mode 100644
index 000000000..f5f523df2
--- /dev/null
+++ b/src/git/zif_abapgit_git_transport.intf.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+ ZIF_ABAPGIT_GIT_TRANSPORT
+ E
+ abapGit - Git Transport
+ 2
+ 1
+ X
+
+
+
+
diff --git a/src/repo/stage/zcl_abapgit_merge.clas.abap b/src/repo/stage/zcl_abapgit_merge.clas.abap
index ff4b10683..f9b716c60 100644
--- a/src/repo/stage/zcl_abapgit_merge.clas.abap
+++ b/src/repo/stage/zcl_abapgit_merge.clas.abap
@@ -252,7 +252,7 @@ CLASS zcl_abapgit_merge IMPLEMENTATION.
DATA: lo_branch_list TYPE REF TO zcl_abapgit_git_branch_list,
lt_upload TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt.
- lo_branch_list = zcl_abapgit_git_transport=>branches( ms_merge-repo->get_url( ) ).
+ lo_branch_list = zcl_abapgit_git_factory=>get_git_transport( )->branches( ms_merge-repo->get_url( ) ).
ms_merge-source = lo_branch_list->find_by_name(
zcl_abapgit_git_branch_list=>complete_heads_branch_name( mv_source_branch ) ).
diff --git a/src/repo/zcl_abapgit_repo_online.clas.abap b/src/repo/zcl_abapgit_repo_online.clas.abap
index 865d465e8..ed279c752 100644
--- a/src/repo/zcl_abapgit_repo_online.clas.abap
+++ b/src/repo/zcl_abapgit_repo_online.clas.abap
@@ -152,7 +152,7 @@ CLASS zcl_abapgit_repo_online IMPLEMENTATION.
lt_branches TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt,
lv_display_name TYPE string.
- lt_branches = zcl_abapgit_git_transport=>branches( get_url( ) )->get_branches_only( ).
+ lt_branches = zcl_abapgit_git_factory=>get_git_transport( )->branches( get_url( ) )->get_branches_only( ).
READ TABLE lt_branches WITH TABLE KEY name_key
COMPONENTS name = iv_name
@@ -181,7 +181,7 @@ CLASS zcl_abapgit_repo_online IMPLEMENTATION.
lv_branch = get_selected_branch( ).
IF lv_branch IS NOT INITIAL.
- lo_branch_list = zcl_abapgit_git_transport=>branches( get_url( ) ).
+ lo_branch_list = zcl_abapgit_git_factory=>get_git_transport( )->branches( get_url( ) ).
TRY.
lo_branch_list->find_by_name( lv_branch ).
diff --git a/src/repo/zcl_abapgit_repo_srv.clas.abap b/src/repo/zcl_abapgit_repo_srv.clas.abap
index 7d5e49af3..7d8e3191f 100644
--- a/src/repo/zcl_abapgit_repo_srv.clas.abap
+++ b/src/repo/zcl_abapgit_repo_srv.clas.abap
@@ -100,7 +100,7 @@ CLASS zcl_abapgit_repo_srv IMPLEMENTATION.
rv_name = iv_name.
IF rv_name IS INITIAL.
ASSERT NOT iv_url IS INITIAL.
- lo_branch_list = zcl_abapgit_git_transport=>branches( iv_url ).
+ lo_branch_list = zcl_abapgit_git_factory=>get_git_transport( )->branches( iv_url ).
rv_name = lo_branch_list->get_head_symref( ).
ELSEIF -1 = find(
val = rv_name
diff --git a/src/ui/pages/zcl_abapgit_gui_page_commit.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_commit.clas.abap
index 42e5d4a91..874ace04e 100644
--- a/src/ui/pages/zcl_abapgit_gui_page_commit.clas.abap
+++ b/src/ui/pages/zcl_abapgit_gui_page_commit.clas.abap
@@ -449,7 +449,9 @@ CLASS zcl_abapgit_gui_page_commit IMPLEMENTATION.
lv_new_branch_name = io_form_data->get( c_id-new_branch_name ).
IF lv_new_branch_name IS NOT INITIAL.
" check if branch already exists
- lt_branches = zcl_abapgit_git_transport=>branches( mo_repo->get_url( ) )->get_branches_only( ).
+ lt_branches = zcl_abapgit_git_factory=>get_git_transport(
+ )->branches( mo_repo->get_url( )
+ )->get_branches_only( ).
READ TABLE lt_branches TRANSPORTING NO FIELDS WITH TABLE KEY name_key
COMPONENTS name = branch_name_to_internal( lv_new_branch_name ).
IF sy-subrc = 0.
diff --git a/src/ui/pages/zcl_abapgit_gui_page_merge_sel.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_merge_sel.clas.abap
index 0614484ae..57c86f763 100644
--- a/src/ui/pages/zcl_abapgit_gui_page_merge_sel.clas.abap
+++ b/src/ui/pages/zcl_abapgit_gui_page_merge_sel.clas.abap
@@ -141,7 +141,7 @@ CLASS zcl_abapgit_gui_page_merge_sel IMPLEMENTATION.
DATA lo_branches TYPE REF TO zcl_abapgit_git_branch_list.
- lo_branches = zcl_abapgit_git_transport=>branches( mo_repo->get_url( ) ).
+ lo_branches = zcl_abapgit_git_factory=>get_git_transport( )->branches( mo_repo->get_url( ) ).
mt_branches = lo_branches->get_branches_only( ).
DELETE mt_branches WHERE name = zif_abapgit_git_definitions=>c_head_name.
diff --git a/src/ui/pages/zcl_abapgit_gui_page_sett_remo.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_sett_remo.clas.abap
index aa47b3c6b..eface1e26 100644
--- a/src/ui/pages/zcl_abapgit_gui_page_sett_remo.clas.abap
+++ b/src/ui/pages/zcl_abapgit_gui_page_sett_remo.clas.abap
@@ -763,7 +763,7 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION.
iv_val = c_head_types-branch ).
IF lv_url CP 'http*'.
- lv_branch = zcl_abapgit_git_transport=>branches( lv_url )->get_head_symref( ).
+ lv_branch = zcl_abapgit_git_factory=>get_git_transport( )->branches( lv_url )->get_head_symref( ).
mo_form_data->set(
iv_key = c_id-branch
iv_val = lv_branch ).
@@ -903,7 +903,7 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION.
TRY.
IF lv_branch IS NOT INITIAL.
- lo_branch_list = zcl_abapgit_git_transport=>branches( lv_url ).
+ lo_branch_list = zcl_abapgit_git_factory=>get_git_transport( )->branches( lv_url ).
lo_branch_list->find_by_name( lv_branch ).
ENDIF.
CATCH zcx_abapgit_exception INTO lx_error.
diff --git a/src/ui/pages/zcl_abapgit_gui_page_sett_remo.clas.testclasses.abap b/src/ui/pages/zcl_abapgit_gui_page_sett_remo.clas.testclasses.abap
new file mode 100644
index 000000000..477cdedaf
--- /dev/null
+++ b/src/ui/pages/zcl_abapgit_gui_page_sett_remo.clas.testclasses.abap
@@ -0,0 +1,470 @@
+*"* use this source file for your ABAP unit test classes
+
+CLASS ltd_git_transport DEFINITION FINAL FOR TESTING.
+
+ PUBLIC SECTION.
+ INTERFACES:
+ zif_abapgit_git_transport.
+
+ENDCLASS.
+
+
+CLASS ltd_branch_list DEFINITION FINAL FOR TESTING INHERITING FROM zcl_abapgit_git_branch_list.
+
+ PUBLIC SECTION.
+ METHODS:
+ constructor
+ IMPORTING
+ iv_data TYPE string
+ RAISING
+ zcx_abapgit_exception,
+
+ find_by_name REDEFINITION.
+
+ENDCLASS.
+
+
+CLASS ltd_frontend_services DEFINITION FINAL FOR TESTING
+ DURATION SHORT
+ RISK LEVEL HARMLESS.
+
+ PUBLIC SECTION.
+
+ INTERFACES:
+ zif_abapgit_frontend_services.
+
+ENDCLASS.
+
+
+
+CLASS ltcl_validate_form DEFINITION FINAL FOR TESTING
+ DURATION SHORT
+ RISK LEVEL HARMLESS.
+
+ PRIVATE SECTION.
+ CONSTANTS:
+ c_git_repo_url TYPE string VALUE 'https://repo.com/demo.git'.
+
+ DATA:
+ mo_cut TYPE REF TO zcl_abapgit_gui_page_sett_remo,
+
+ mo_repo TYPE REF TO zcl_abapgit_repo_online,
+ mo_given_form_data TYPE REF TO zcl_abapgit_string_map,
+ mo_act_validation_log TYPE REF TO zcl_abapgit_string_map,
+
+ mo_git_transport_mock TYPE REF TO zif_abapgit_git_transport,
+ mo_frontend_services_mock TYPE REF TO zif_abapgit_frontend_services.
+
+ METHODS:
+ setup RAISING cx_static_check,
+ teardown RAISING cx_static_check,
+
+ switch_to_offline_no_error FOR TESTING RAISING cx_static_check,
+ invalid_url FOR TESTING RAISING cx_static_check,
+ invalid_url2 FOR TESTING RAISING cx_static_check,
+ valid_url_no_head_type FOR TESTING RAISING cx_static_check,
+
+ invalid_branch FOR TESTING RAISING cx_static_check,
+ valid_branch FOR TESTING RAISING cx_static_check,
+
+ invalid_tag FOR TESTING RAISING cx_static_check,
+ valid_tag FOR TESTING RAISING cx_static_check,
+
+ invalid_pull_request FOR TESTING RAISING cx_static_check,
+ valid_pull_request FOR TESTING RAISING cx_static_check,
+
+ invalid_commit FOR TESTING RAISING cx_static_check,
+ valid_commit FOR TESTING RAISING cx_static_check,
+
+ when_validate_form
+ RAISING
+ zcx_abapgit_exception,
+
+ then_no_error_shd_occur,
+ then_error_shd_occur
+ IMPORTING
+ iv_exp_error_key TYPE string.
+
+ENDCLASS.
+
+CLASS zcl_abapgit_gui_page_sett_remo DEFINITION LOCAL FRIENDS ltcl_validate_form.
+
+CLASS ltd_git_transport IMPLEMENTATION.
+
+ METHOD zif_abapgit_git_transport~branches.
+
+ CONSTANTS: lc_dummy_data TYPE string VALUE '0000'.
+
+ CREATE OBJECT ro_branch_list TYPE ltd_branch_list
+ EXPORTING
+ iv_data = lc_dummy_data.
+
+ ENDMETHOD.
+
+ENDCLASS.
+
+
+CLASS ltd_branch_list IMPLEMENTATION.
+
+ METHOD constructor.
+
+ super->constructor( iv_data ).
+
+ ENDMETHOD.
+
+
+ METHOD find_by_name.
+
+ IF iv_branch_name CS 'feature'
+ OR iv_branch_name CS 'inv_tag'
+ OR iv_branch_name CS 'inv_pr'
+ OR iv_branch_name IS INITIAL.
+ RAISE EXCEPTION TYPE zcx_abapgit_exception.
+ ENDIF.
+
+ ENDMETHOD.
+
+ENDCLASS.
+
+
+CLASS ltd_frontend_services IMPLEMENTATION.
+
+ METHOD zif_abapgit_frontend_services~clipboard_export.
+ ENDMETHOD.
+
+ METHOD zif_abapgit_frontend_services~directory_browse.
+ ENDMETHOD.
+
+ METHOD zif_abapgit_frontend_services~directory_create.
+ ENDMETHOD.
+
+ METHOD zif_abapgit_frontend_services~directory_exist.
+ ENDMETHOD.
+
+ METHOD zif_abapgit_frontend_services~execute.
+ ENDMETHOD.
+
+ METHOD zif_abapgit_frontend_services~file_download.
+ ENDMETHOD.
+
+ METHOD zif_abapgit_frontend_services~file_upload.
+ ENDMETHOD.
+
+ METHOD zif_abapgit_frontend_services~get_file_separator.
+ ENDMETHOD.
+
+ METHOD zif_abapgit_frontend_services~get_gui_version.
+ ENDMETHOD.
+
+ METHOD zif_abapgit_frontend_services~get_system_directory.
+ ENDMETHOD.
+
+ METHOD zif_abapgit_frontend_services~gui_is_available.
+ ENDMETHOD.
+
+ METHOD zif_abapgit_frontend_services~is_sapgui_for_java.
+ ENDMETHOD.
+
+ METHOD zif_abapgit_frontend_services~is_sapgui_for_windows.
+ ENDMETHOD.
+
+ METHOD zif_abapgit_frontend_services~is_webgui.
+ ENDMETHOD.
+
+ METHOD zif_abapgit_frontend_services~open_ie_devtools.
+ ENDMETHOD.
+
+ METHOD zif_abapgit_frontend_services~show_file_open_dialog.
+ ENDMETHOD.
+
+ METHOD zif_abapgit_frontend_services~show_file_save_dialog.
+ ENDMETHOD.
+
+ENDCLASS.
+
+
+CLASS ltcl_validate_form IMPLEMENTATION.
+
+ METHOD setup.
+
+ DATA: ls_data TYPE zif_abapgit_persistence=>ty_repo.
+
+ CREATE OBJECT mo_git_transport_mock TYPE ltd_git_transport.
+ zcl_abapgit_git_injector=>set_git_transport( mo_git_transport_mock ).
+
+ CREATE OBJECT mo_frontend_services_mock TYPE ltd_frontend_services.
+ zcl_abapgit_ui_injector=>set_frontend_services( mo_frontend_services_mock ).
+
+ ls_data-key = 1.
+ ls_data-branch_name = 'main'.
+
+ CREATE OBJECT mo_repo EXPORTING is_data = ls_data.
+
+ CREATE OBJECT mo_given_form_data.
+ mo_given_form_data->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-branch
+ iv_val = 'main' ).
+
+ CREATE OBJECT mo_cut EXPORTING io_repo = mo_repo.
+
+ ENDMETHOD.
+
+
+ METHOD teardown.
+
+ CLEAR:
+ mo_git_transport_mock,
+ mo_frontend_services_mock.
+ zcl_abapgit_git_injector=>set_git_transport( mo_git_transport_mock ).
+ zcl_abapgit_ui_injector=>set_frontend_services( mo_frontend_services_mock ).
+
+ ENDMETHOD.
+
+
+ METHOD switch_to_offline_no_error.
+
+ mo_given_form_data->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-offline
+ iv_val = abap_true ).
+ when_validate_form( ).
+ then_no_error_shd_occur( ).
+
+ ENDMETHOD.
+
+
+ METHOD invalid_url.
+
+ mo_given_form_data->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-offline
+ iv_val = abap_false
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-url
+ iv_val = 'http://test' ).
+
+ when_validate_form( ).
+ then_error_shd_occur( zcl_abapgit_gui_page_sett_remo=>c_id-url ).
+
+ ENDMETHOD.
+
+
+ METHOD invalid_url2.
+
+ mo_given_form_data->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-offline
+ iv_val = abap_false
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-url
+ iv_val = 'test' ).
+
+ when_validate_form( ).
+ then_error_shd_occur( zcl_abapgit_gui_page_sett_remo=>c_id-url ).
+
+ ENDMETHOD.
+
+
+ METHOD valid_url_no_head_type.
+
+ mo_given_form_data->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-offline
+ iv_val = abap_false
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-url
+ iv_val = c_git_repo_url ).
+
+ when_validate_form( ).
+ then_error_shd_occur( zcl_abapgit_gui_page_sett_remo=>c_id-head_type ).
+
+ ENDMETHOD.
+
+
+ METHOD invalid_branch.
+
+ mo_given_form_data->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-offline
+ iv_val = abap_false
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-url
+ iv_val = c_git_repo_url
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-head_type
+ iv_val = zcl_abapgit_gui_page_sett_remo=>c_head_types-branch
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-branch
+ iv_val = 'feature' ).
+
+ when_validate_form( ).
+ then_error_shd_occur( zcl_abapgit_gui_page_sett_remo=>c_id-branch ).
+
+ ENDMETHOD.
+
+
+ METHOD valid_branch.
+
+ mo_given_form_data->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-offline
+ iv_val = abap_false
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-url
+ iv_val = c_git_repo_url
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-head_type
+ iv_val = zcl_abapgit_gui_page_sett_remo=>c_head_types-branch
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-branch
+ iv_val = 'main' ).
+
+ when_validate_form( ).
+ then_no_error_shd_occur( ).
+
+ ENDMETHOD.
+
+
+ METHOD invalid_tag.
+
+ mo_given_form_data->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-offline
+ iv_val = abap_false
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-url
+ iv_val = c_git_repo_url
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-head_type
+ iv_val = zcl_abapgit_gui_page_sett_remo=>c_head_types-tag
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-tag
+ iv_val = 'inv_tag' ).
+
+ when_validate_form( ).
+ then_error_shd_occur( zcl_abapgit_gui_page_sett_remo=>c_id-tag ).
+
+ ENDMETHOD.
+
+
+ METHOD valid_tag.
+
+ mo_given_form_data->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-offline
+ iv_val = abap_false
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-url
+ iv_val = c_git_repo_url
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-head_type
+ iv_val = zcl_abapgit_gui_page_sett_remo=>c_head_types-tag
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-tag
+ iv_val = 'v1.1.3' ).
+
+ when_validate_form( ).
+ then_no_error_shd_occur( ).
+
+ ENDMETHOD.
+
+
+ METHOD invalid_pull_request.
+
+ mo_given_form_data->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-offline
+ iv_val = abap_false
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-url
+ iv_val = c_git_repo_url
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-head_type
+ iv_val = zcl_abapgit_gui_page_sett_remo=>c_head_types-pull_request
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-pull_request
+ iv_val = 'x@inv_pr' ).
+
+ when_validate_form( ).
+ then_error_shd_occur( zcl_abapgit_gui_page_sett_remo=>c_id-pull_request ).
+
+ ENDMETHOD.
+
+
+ METHOD valid_pull_request.
+
+ mo_given_form_data->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-offline
+ iv_val = abap_false
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-url
+ iv_val = c_git_repo_url
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-head_type
+ iv_val = zcl_abapgit_gui_page_sett_remo=>c_head_types-pull_request
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-pull_request
+ iv_val = 'x@pr' ).
+
+ when_validate_form( ).
+ then_no_error_shd_occur( ).
+
+ ENDMETHOD.
+
+
+ METHOD invalid_commit.
+
+ mo_given_form_data->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-offline
+ iv_val = abap_false
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-url
+ iv_val = c_git_repo_url
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-head_type
+ iv_val = zcl_abapgit_gui_page_sett_remo=>c_head_types-commit
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-commit
+ iv_val = 'ABCD1234' ).
+
+ when_validate_form( ).
+ then_error_shd_occur( zcl_abapgit_gui_page_sett_remo=>c_id-commit ).
+
+ ENDMETHOD.
+
+
+ METHOD valid_commit.
+
+ mo_given_form_data->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-offline
+ iv_val = abap_false
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-url
+ iv_val = c_git_repo_url
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-head_type
+ iv_val = zcl_abapgit_gui_page_sett_remo=>c_head_types-commit
+ )->set(
+ iv_key = zcl_abapgit_gui_page_sett_remo=>c_id-commit
+ iv_val = '1d4abf5342a939202ae24ab4a5ad78da3cad24fb' ).
+
+ when_validate_form( ).
+ then_no_error_shd_occur( ).
+
+ ENDMETHOD.
+
+
+ METHOD when_validate_form.
+
+ mo_act_validation_log = mo_cut->validate_form( mo_given_form_data ).
+
+ ENDMETHOD.
+
+
+ METHOD then_no_error_shd_occur.
+
+ cl_abap_unit_assert=>assert_equals(
+ exp = abap_true
+ act = mo_act_validation_log->is_empty( ) ).
+
+ ENDMETHOD.
+
+
+ METHOD then_error_shd_occur.
+
+ cl_abap_unit_assert=>assert_not_initial( mo_act_validation_log->get( iv_exp_error_key ) ).
+
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/ui/pages/zcl_abapgit_gui_page_sett_remo.clas.xml b/src/ui/pages/zcl_abapgit_gui_page_sett_remo.clas.xml
index 1617b17d7..f6771f669 100644
--- a/src/ui/pages/zcl_abapgit_gui_page_sett_remo.clas.xml
+++ b/src/ui/pages/zcl_abapgit_gui_page_sett_remo.clas.xml
@@ -10,6 +10,7 @@
X
X
X
+ X
diff --git a/src/ui/pages/zcl_abapgit_gui_page_tags.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_tags.clas.abap
index a07e4ea39..0270b2c4a 100644
--- a/src/ui/pages/zcl_abapgit_gui_page_tags.clas.abap
+++ b/src/ui/pages/zcl_abapgit_gui_page_tags.clas.abap
@@ -300,7 +300,7 @@ CLASS zcl_abapgit_gui_page_tags IMPLEMENTATION.
IF lv_new_tag_name IS NOT INITIAL.
" Check if tag already exists
- lt_tags = zcl_abapgit_git_transport=>branches( mo_repo->get_url( ) )->get_tags_only( ).
+ lt_tags = zcl_abapgit_git_factory=>get_git_transport( )->branches( mo_repo->get_url( ) )->get_tags_only( ).
READ TABLE lt_tags TRANSPORTING NO FIELDS WITH TABLE KEY name_key
COMPONENTS name = zcl_abapgit_git_tag=>add_tag_prefix( lv_new_tag_name ).
diff --git a/src/ui/popups/zcl_abapgit_popup_branch_list.clas.abap b/src/ui/popups/zcl_abapgit_popup_branch_list.clas.abap
index 4eef26a1a..7e6d5e8c3 100644
--- a/src/ui/popups/zcl_abapgit_popup_branch_list.clas.abap
+++ b/src/ui/popups/zcl_abapgit_popup_branch_list.clas.abap
@@ -75,7 +75,7 @@ CLASS zcl_abapgit_popup_branch_list IMPLEMENTATION.
FIELD-SYMBOLS LIKE LINE OF rt_branches.
- lo_branches = zcl_abapgit_git_transport=>branches( mv_repo_url ).
+ lo_branches = zcl_abapgit_git_factory=>get_git_transport( )->branches( mv_repo_url ).
rt_branches = lo_branches->get_branches_only( ).
lv_head_symref = lo_branches->get_head_symref( ).
diff --git a/src/ui/popups/zcl_abapgit_popup_tag_list.clas.abap b/src/ui/popups/zcl_abapgit_popup_tag_list.clas.abap
index 285a8d730..85ecdb296 100644
--- a/src/ui/popups/zcl_abapgit_popup_tag_list.clas.abap
+++ b/src/ui/popups/zcl_abapgit_popup_tag_list.clas.abap
@@ -61,7 +61,7 @@ CLASS zcl_abapgit_popup_tag_list IMPLEMENTATION.
DATA lo_branches TYPE REF TO zcl_abapgit_git_branch_list.
- lo_branches = zcl_abapgit_git_transport=>branches( mv_repo_url ).
+ lo_branches = zcl_abapgit_git_factory=>get_git_transport( )->branches( mv_repo_url ).
rt_tags = lo_branches->get_tags_only( ).
DELETE rt_tags WHERE name CP '*' && zif_abapgit_git_definitions=>c_git_branch-peel.
diff --git a/src/ui/zcl_abapgit_popups.clas.abap b/src/ui/zcl_abapgit_popups.clas.abap
index 2753fe512..3d150612f 100644
--- a/src/ui/zcl_abapgit_popups.clas.abap
+++ b/src/ui/zcl_abapgit_popups.clas.abap
@@ -180,7 +180,7 @@ CLASS zcl_abapgit_popups IMPLEMENTATION.
LIKE LINE OF lt_branches.
- lo_branches = zcl_abapgit_git_transport=>branches( iv_url ).
+ lo_branches = zcl_abapgit_git_factory=>get_git_transport( )->branches( iv_url ).
lt_branches = lo_branches->get_branches_only( ).
lv_head_suffix = | ({ zif_abapgit_git_definitions=>c_head_name })|.
lv_head_symref = lo_branches->get_head_symref( ).
@@ -847,7 +847,7 @@ CLASS zcl_abapgit_popups IMPLEMENTATION.
LIKE LINE OF lt_tags.
- lo_branches = zcl_abapgit_git_transport=>branches( iv_url ).
+ lo_branches = zcl_abapgit_git_factory=>get_git_transport( )->branches( iv_url ).
lt_tags = lo_branches->get_tags_only( ).
LOOP AT lt_tags ASSIGNING WHERE name NP '*' && zif_abapgit_git_definitions=>c_git_branch-peel.
diff --git a/test/src/zcl_abapgit_integration_git.clas.testclasses.abap b/test/src/zcl_abapgit_integration_git.clas.testclasses.abap
index bfe77b0e2..5c1bf1361 100644
--- a/test/src/zcl_abapgit_integration_git.clas.testclasses.abap
+++ b/test/src/zcl_abapgit_integration_git.clas.testclasses.abap
@@ -34,7 +34,7 @@ CLASS ltcl_test IMPLEMENTATION.
CREATE OBJECT li_memory.
zcl_abapgit_persist_injector=>set_settings( li_memory ).
- lv_ref = zcl_abapgit_git_transport=>branches( lc_url )->get_head_symref( ).
+ lv_ref = zcl_abapgit_git_factory=>get_git_transport( )->branches( lc_url )->get_head_symref( ).
cl_abap_unit_assert=>assert_equals(
act = lv_ref