import pytest from core.Expando import Expando from workflow.DefaultDataPresenter import DefaultDataPresenter def test_i_can_present_static_mappings(): mappings_def = "field1 = renamed_1 , field2 " presenter = DefaultDataPresenter("comp_id", mappings_def) data = Expando({"field1": "value1", "field2": "value2", "field3": "value3"}) actual = presenter.present(data) assert actual == Expando({"renamed_1": "value1", "field2": "value2"}) # field3 is removed def test_i_can_present_implicit_renaming(): mappings_def = "root.field1=" presenter = DefaultDataPresenter("comp_id", mappings_def) as_dict = {"root": {"field1": "value1"}} data = Expando(as_dict) actual = presenter.present(data) assert isinstance(actual, Expando) assert actual.as_dict() == {"field1": "value1"} def test_the_latter_mappings_take_precedence(): mappings_def = "field1 = renamed_1 , field1 " presenter = DefaultDataPresenter("comp_id", mappings_def) data = Expando({"field1": "value1", "field2": "value2", "field3": "value3"}) actual = presenter.present(data) assert actual == Expando({"field1": "value1"}) # field3 is removed def test_i_can_present_static_mappings_with_sub_fields(): mappings_def = "root.field1 = renamed_1 , root.field2, root.sub_field.field3, root.sub_field.field4=renamed4 " presenter = DefaultDataPresenter("comp_id", mappings_def) as_dict = {"root": {"field1": "value1", "field2": "value2", "sub_field": {"field3": "value3", "field4": "value4" }}} data = Expando(as_dict) actual = presenter.present(data) assert isinstance(actual, Expando) assert actual.as_dict() == {"renamed_1": "value1", "root.field2": "value2", "root.sub_field.field3": "value3", "renamed4": "value4"} def test_i_can_present_dynamic_mappings(): mappings_def = "*" presenter = DefaultDataPresenter("comp_id", mappings_def) data = Expando({"field1": "value1", "field2": "value2", "field3": "value3"}) actual = presenter.present(data) assert actual == Expando({"field1": "value1", "field2": "value2", "field3": "value3"}) def test_i_can_present_dynamic_mappings_for_complex_data(): mappings_def = "*" presenter = DefaultDataPresenter("comp_id", mappings_def) as_dict = {"root": {"field1": "value1", "field2": "value2", "sub_field": {"field3": "value3", "field4": "value4" } }, "field5": "value5"} data = Expando(as_dict) actual = presenter.present(data) assert isinstance(actual, Expando) assert actual.as_dict() == as_dict def test_i_can_present_dynamic_mappings_with_sub_fields(): mappings_def = "root.sub_field.*" presenter = DefaultDataPresenter("comp_id", mappings_def) as_dict = {"root": {"field1": "value1", "field2": "value2", "sub_field": {"field3": "value3", "field4": "value4" }}} data = Expando(as_dict) actual = presenter.present(data) assert isinstance(actual, Expando) assert actual.as_dict() == {"root.sub_field.field3": "value3", "root.sub_field.field4": "value4"} def test_i_can_present_dynamic_mappings_with_sub_fields_and_renames(): mappings_def = "root.sub_field.*=*" presenter = DefaultDataPresenter("comp_id", mappings_def) as_dict = {"root": {"field1": "value1", "field2": "value2", "sub_field": {"field3": "value3", "field4": "value4" }}} data = Expando(as_dict) actual = presenter.present(data) assert isinstance(actual, Expando) assert actual.as_dict() == {"field3": "value3", "field4": "value4"} def test_i_can_present_dynamic_mappings_with_sub_fields_and_implicit_renames(): mappings_def = "root.sub_field.*=" presenter = DefaultDataPresenter("comp_id", mappings_def) as_dict = {"root": {"field1": "value1", "field2": "value2", "sub_field": {"field3": "value3", "field4": "value4" }}} data = Expando(as_dict) actual = presenter.present(data) assert isinstance(actual, Expando) assert actual.as_dict() == {"field3": "value3", "field4": "value4"} def test_i_can_present_dynamic_mappings_and_rename_them(): mappings_def = "*=*" # does not really have effects as '*' only goes down one level presenter = DefaultDataPresenter("comp_id", mappings_def) as_dict = {"root1": {"field1": "value1", "field2": "value2"}, "root2": {"field3": "value3", "field4": "value4"}} data = Expando(as_dict) actual = presenter.present(data) assert isinstance(actual, Expando) assert actual.as_dict() == as_dict def test_i_can_present_static_and_dynamic_mappings(): mappings_def = "root.field1 = renamed_1, root.sub_field.*" presenter = DefaultDataPresenter("comp_id", mappings_def) as_dict = {"root": {"field1": "value1", "field2": "value2", "sub_field": {"field3": "value3", "field4": "value4" }}} data = Expando(as_dict) actual = presenter.present(data) assert isinstance(actual, Expando) assert actual.as_dict() == {"renamed_1": "value1", "root.sub_field.field3": "value3", "root.sub_field.field4": "value4"} def test_another_example_of_static_and_dynamic_mappings(): mappings_def = "* , field1 = renamed_1" presenter = DefaultDataPresenter("comp_id", mappings_def) data = Expando({"field1": "value1", "field2": "value2", "field3": "value3"}) actual = presenter.present(data) assert actual == Expando({"renamed_1": "value1", "field2": "value2", "field3": "value3"}) # field3 is removed def test_i_can_detect_conflict_when_dynamically_renaming_a_field(): mappings_def = "root_1.*=*, root_2.*=*" presenter = DefaultDataPresenter("comp_id", mappings_def) as_dict = {"root_1": {"field1": "value1", "field2": "value2"}, "root_2": {"field1": "value1", "field2": "value2"}} data = Expando(as_dict) with pytest.raises(ValueError) as e: presenter.present(data) assert str(e.value) == "Collision detected for field 'field1'. It is mapped from both 'root_1.*=*' and 'root_2.*=*'." def test_i_can_detect_declaration_error(): mappings_def = "field1 ,, field2" presenter = DefaultDataPresenter("comp_id", mappings_def) data = Expando({"field1": "value1", "field2": "value2", "field3": "value3"}) with pytest.raises(ValueError) as e: presenter.present(data) def test_i_can_detect_dynamic_error_declaration(): mappings_def = "root.field1.*" # field1 is not an object presenter = DefaultDataPresenter("comp_id", mappings_def) as_dict = {"root": {"field1": "value1", "field2": "value2", "sub_field": {"field3": "value3", "field4": "value4" }}} data = Expando(as_dict) with pytest.raises(ValueError) as e: presenter.present(data)