abapGit/src/zabapgit_object_tabl_valid.prog.abap
2017-01-22 09:37:26 +00:00

220 lines
7.0 KiB
ABAP

*&---------------------------------------------------------------------*
*& Include zabapgit_object_tabl_valid
*&---------------------------------------------------------------------*
CLASS lcl_object_tabl_validation DEFINITION FINAL.
PUBLIC SECTION.
METHODS validate
IMPORTING
io_remote_version TYPE REF TO lcl_xml_input
io_local_version TYPE REF TO lcl_xml_input
RETURNING
VALUE(rv_message) TYPE string
RAISING
lcx_exception.
ENDCLASS.
CLASS lcl_tabl_validation_dialog DEFINITION FINAL.
PUBLIC SECTION.
METHODS:
constructor
IMPORTING
iv_message TYPE string.
INTERFACES: lif_object_comparison_result.
PRIVATE SECTION.
DATA mv_message TYPE string.
DATA mv_halt TYPE string.
ENDCLASS.
CLASS lcl_object_tabl_validation IMPLEMENTATION.
METHOD validate.
DATA: lt_previous_table_fields TYPE TABLE OF dd03p,
ls_previous_table_field LIKE LINE OF lt_previous_table_fields,
lt_current_table_fields TYPE TABLE OF dd03p,
ls_current_table_field LIKE LINE OF lt_current_table_fields.
io_remote_version->read(
EXPORTING
iv_name = 'DD03P_TABLE'
CHANGING
cg_data = lt_previous_table_fields ).
io_local_version->read(
EXPORTING
iv_name = 'DD03P_TABLE'
CHANGING
cg_data = lt_current_table_fields ).
LOOP AT lt_previous_table_fields INTO ls_previous_table_field.
READ TABLE lt_current_table_fields WITH KEY fieldname = ls_previous_table_field-fieldname
INTO ls_current_table_field.
IF sy-subrc = 0.
IF ls_current_table_field-rollname <> ls_previous_table_field-rollname.
rv_message = 'Fields were changed. This may lead to inconsistencies.'.
ENDIF.
ELSE.
rv_message = 'Fields were changed. This may lead to inconsistencies.'.
ENDIF.
ENDLOOP.
ENDMETHOD.
ENDCLASS.
CLASS lcl_tabl_validation_dialog IMPLEMENTATION.
METHOD constructor.
mv_message = iv_message.
ENDMETHOD.
METHOD lif_object_comparison_result~is_result_complete_halt.
rv_response = mv_halt.
ENDMETHOD.
METHOD lif_object_comparison_result~show_confirmation_dialog.
DATA lv_answer TYPE string.
TRY.
lv_answer = lcl_popups=>popup_to_confirm(
titlebar = 'Warning'
text_question = mv_message
text_button_1 = 'Abort'
icon_button_1 = 'ICON_CANCEL'
text_button_2 = 'Pull anyway'
icon_button_2 = 'ICON_OKAY'
default_button = '2'
display_cancel_button = abap_false ).
CATCH lcx_exception.
mv_halt = abap_true.
ENDTRY.
IF lv_answer = 1.
mv_halt = abap_true.
ENDIF.
ENDMETHOD.
ENDCLASS.
CLASS lct_table_validation DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL.
PRIVATE SECTION.
METHODS:
setup,
type_changed FOR TESTING RAISING lcx_exception,
no_type_changes FOR TESTING RAISING lcx_exception,
field_not_found FOR TESTING RAISING lcx_exception,
no_fields_no_message FOR TESTING RAISING lcx_exception,
create_xmls
RAISING
lcx_exception.
DATA: mo_table_validator TYPE REF TO lcl_object_tabl_validation,
mo_previous_version_out_xml TYPE REF TO lcl_xml_output,
mo_previous_version_input_xml TYPE REF TO lcl_xml_input,
mo_current_version_out_xml TYPE REF TO lcl_xml_output,
mo_current_version_input_xml TYPE REF TO lcl_xml_input,
mt_previous_table_fields TYPE TABLE OF dd03p,
mt_current_table_fields TYPE TABLE OF dd03p,
mv_validation_message TYPE string.
ENDCLASS.
CLASS lct_table_validation IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_table_validator.
ENDMETHOD.
METHOD type_changed.
DATA:
ls_previous_table_field LIKE LINE OF mt_previous_table_fields,
ls_current_table_field LIKE LINE OF mt_current_table_fields.
ls_previous_table_field-fieldname = 'FIELD1'.
ls_previous_table_field-rollname = 'INT4'.
APPEND ls_previous_table_field TO mt_previous_table_fields.
ls_current_table_field-fieldname = 'FIELD1'.
ls_current_table_field-rollname = 'CHAR30'.
APPEND ls_current_table_field TO mt_current_table_fields.
create_xmls( ).
mv_validation_message = mo_table_validator->validate(
io_remote_version = mo_previous_version_input_xml
io_local_version = mo_current_version_input_xml ).
cl_abap_unit_assert=>assert_equals(
act = mv_validation_message
exp = 'Fields were changed. This may lead to inconsistencies.' ).
ENDMETHOD.
METHOD no_type_changes.
DATA:
ls_previous_table_field LIKE LINE OF mt_previous_table_fields.
ls_previous_table_field-fieldname = 'FIELD1'.
ls_previous_table_field-rollname = 'INT4'.
APPEND ls_previous_table_field TO mt_previous_table_fields.
mt_current_table_fields = mt_previous_table_fields.
create_xmls( ).
mv_validation_message = mo_table_validator->validate(
io_remote_version = mo_previous_version_input_xml
io_local_version = mo_current_version_input_xml ).
cl_abap_unit_assert=>assert_equals(
act = mv_validation_message
exp = '' ).
ENDMETHOD.
METHOD field_not_found.
DATA:
ls_previous_table_field LIKE LINE OF mt_previous_table_fields,
ls_current_table_field LIKE LINE OF mt_current_table_fields.
ls_previous_table_field-fieldname = 'FIELD1'.
ls_previous_table_field-rollname = 'INT4'.
APPEND ls_previous_table_field TO mt_previous_table_fields.
ls_current_table_field-fieldname = 'ANOTHER_FIELD'.
ls_current_table_field-rollname = 'CHAR30'.
APPEND ls_current_table_field TO mt_current_table_fields.
create_xmls( ).
mv_validation_message = mo_table_validator->validate(
io_remote_version = mo_previous_version_input_xml
io_local_version = mo_current_version_input_xml ).
cl_abap_unit_assert=>assert_equals(
act = mv_validation_message
exp = 'Fields were changed. This may lead to inconsistencies.' ).
ENDMETHOD.
METHOD no_fields_no_message.
create_xmls( ).
mv_validation_message = mo_table_validator->validate(
io_remote_version = mo_previous_version_input_xml
io_local_version = mo_current_version_input_xml ).
cl_abap_unit_assert=>assert_initial( mv_validation_message ).
ENDMETHOD.
METHOD create_xmls.
CREATE OBJECT mo_previous_version_out_xml.
mo_previous_version_out_xml->add(
iv_name = 'DD03P_TABLE'
ig_data = mt_previous_table_fields ).
CREATE OBJECT mo_previous_version_input_xml
EXPORTING
iv_xml = mo_previous_version_out_xml->render( ).
CREATE OBJECT mo_current_version_out_xml.
mo_current_version_out_xml->add(
iv_name = 'DD03P_TABLE'
ig_data = mt_current_table_fields ).
CREATE OBJECT mo_current_version_input_xml
EXPORTING
iv_xml = mo_current_version_out_xml->render( ).
ENDMETHOD.
ENDCLASS.