def test_revision_on_versioned_audit_after_put_failure( controllers, controller_versioned: layabase.CRUDController, mock_mongo_audit_datetime, ): controller_versioned.post({"key": "my_key", "enum_fld": EnumTest.Value1}) with pytest.raises(ModelCouldNotBeFound): controller_versioned.put({ "key": "my_key2", "enum_fld": EnumTest.Value2 }) controller_versioned.delete({"key": "my_key"}) assert controller_versioned.get_audit({}) == [ { "audit_action": "Insert", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "revision": 1, "table_name": "test_versioned", }, { "audit_action": "Delete", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "revision": 2, "table_name": "test_versioned", }, ]
def test_audit_filter_on_audit_collection_is_returning_only_selected_data( controller: layabase.CRUDController, mock_mongo_audit_datetime): controller.post({ "key": "my_key1", "mandatory": 1, "optional": "my_value1" }) controller.put({"key": "my_key1", "mandatory": 2}) controller.delete({"key": "my_key1"}) assert controller.get_audit({"audit_action": "Update"}) == [{ "audit_action": "Update", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "key": "my_key1", "mandatory": 2, "optional": "my_value1", "revision": 2, }]
def test_delete_invalid_date_is_invalid(controller: layabase.CRUDController): with pytest.raises(layabase.ValidationFailed) as exception_info: controller.delete({"date_str": "this is not a date"}) assert exception_info.value.errors == {"date_str": ["Not a valid date."]} assert exception_info.value.received_data == { "date_str": "this is not a date" }
def test_remove_when_db_down(disconnected_database, controller: layabase.CRUDController): with pytest.raises(Exception) as exception_info: controller.delete({}) assert ( str(exception_info.value) == """A error occurred while querying database: (sqlite3.OperationalError) no such table: test\n[SQL: SELECT test."key" AS test_key \nFROM test]\n(Background on this error at: http://sqlalche.me/e/13/e3q8)""" )
def test_rollback_validation_custom(controller: layabase.CRUDController): controller.post({"key": "my_key", "enum_fld": EnumTest.Value1}) controller.put({"key": "my_key", "enum_fld": EnumTest.Value2}) controller.delete({"key": "my_key"}) with pytest.raises(layabase.ValidationFailed) as exception_info: controller.rollback_to({"revision": 1}) assert exception_info.value.errors == {"key": ["Rollback forbidden"]} assert exception_info.value.received_data == {"revision": 1}
def test_delete_without_filter_is_removing_everything( controller: layabase.CRUDController, ): controller.post({"key": "my_key1", "mandatory": 1, "optional": "my_value1"}) controller.post({"key": "my_key2", "mandatory": 2, "optional": "my_value2"}) assert 2 == controller.delete({}) assert [] == controller.get({})
def test_delete_versioning_is_valid(controller: layabase.CRUDController): controller.post( { "key": "first", "dict_field.first_key": EnumTest.Value1, "dict_field.second_key": 1, } ) controller.put({"key": "first", "dict_field.first_key": EnumTest.Value2}) assert controller.delete({"key": "first"}) == 1 assert controller.get_history({}) == [ { "key": "first", "dict_field": {"first_key": "Value2", "second_key": 1}, "valid_since_revision": 2, "valid_until_revision": 3, }, { "key": "first", "dict_field": {"first_key": "Value1", "second_key": 1}, "valid_since_revision": 1, "valid_until_revision": 2, }, ] assert controller.get({}) == []
def test_delete_with_filter_is_removing_the_proper_row( controller: layabase.CRUDController, ): controller.post({"key": "my_key1", "mandatory": 1, "optional": "my_value1"}) controller.post({"key": "my_key2", "mandatory": 2, "optional": "my_value2"}) assert 1 == controller.delete({"key": "my_key1"}) assert [ {"key": "my_key2", "mandatory": 2, "optional": "my_value2"} ] == controller.get({})
def test_rollback_before_update_deleted_versioning_is_valid( controller: layabase.CRUDController, ): controller.post( { "key": "first", "dict_field.first_key": EnumTest.Value1, "dict_field.second_key": 1, } ) before_update = 1 controller.put({"key": "first", "dict_field.first_key": EnumTest.Value2}) controller.delete({"key": "first"}) assert controller.rollback_to({"revision": before_update}) == 1 assert controller.get_history({}) == [ { "key": "first", "dict_field": {"first_key": "Value2", "second_key": 1}, "valid_since_revision": 2, "valid_until_revision": 3, }, { "key": "first", "dict_field": {"first_key": "Value1", "second_key": 1}, "valid_since_revision": 1, "valid_until_revision": 2, }, { "key": "first", "dict_field": {"first_key": "Value1", "second_key": 1}, "valid_since_revision": 4, "valid_until_revision": -1, }, ] assert controller.get({}) == [ { "key": "first", "dict_field": {"first_key": "Value1", "second_key": 1}, "valid_since_revision": 4, "valid_until_revision": -1, } ]
def test_versioned_int_primary_key_is_reset_after_delete( controller: layabase.CRUDController, mock_mongo_audit_datetime ): assert controller.post({"other": "test1"}) == { "key": 1, "other": "test1", "valid_since_revision": 1, "valid_until_revision": -1, } assert controller.delete({}) == 1 assert controller.post({"other": "test1"}) == { "key": 1, "other": "test1", "valid_since_revision": 3, "valid_until_revision": -1, } assert controller.get_audit({}) == [ { "audit_action": "Insert", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "revision": 1, "table_name": "test", }, { "audit_action": "Delete", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "revision": 2, "table_name": "test", }, { "audit_action": "Insert", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "revision": 3, "table_name": "test", }, ] assert controller.get_history({}) == [ { "key": 1, "other": "test1", "valid_since_revision": 1, "valid_until_revision": 2, }, { "key": 1, "other": "test1", "valid_since_revision": 3, "valid_until_revision": -1, }, ]
def test_delete_without_filter_is_removing_everything( controller: layabase.CRUDController, mock_mongo_audit_datetime): controller.post({ "key": "my_key1", "mandatory": 1, "optional": "my_value1" }) controller.post({ "key": "my_key2", "mandatory": 2, "optional": "my_value2" }) assert 2 == controller.delete({}) assert [] == controller.get({}) assert controller.get_audit({}) == [ { "audit_action": "Insert", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "key": "my_key1", "mandatory": 1, "optional": "my_value1", "revision": 1, }, { "audit_action": "Insert", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "key": "my_key2", "mandatory": 2, "optional": "my_value2", "revision": 2, }, { "audit_action": "Delete", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "key": "my_key1", "mandatory": 1, "optional": "my_value1", "revision": 3, }, { "audit_action": "Delete", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "key": "my_key2", "mandatory": 2, "optional": "my_value2", "revision": 4, }, ]
def test_versioned_audit_after_post_put_delete_rollback( controllers, controller_versioned: layabase.CRUDController, mock_mongo_audit_datetime, ): controller_versioned.post({"key": "my_key", "enum_fld": EnumTest.Value1}) controller_versioned.put({"key": "my_key", "enum_fld": EnumTest.Value2}) controller_versioned.delete({"key": "my_key"}) controller_versioned.rollback_to({"revision": 1}) assert controller_versioned.get_audit({}) == [ { "audit_action": "Insert", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "revision": 1, "table_name": "test_versioned", }, { "audit_action": "Update", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "revision": 2, "table_name": "test_versioned", }, { "audit_action": "Delete", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "revision": 3, "table_name": "test_versioned", }, { "audit_action": "Rollback", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "revision": 4, "table_name": "test_versioned", }, ]
def test_int_revision_is_not_reset_after_delete( controller: layabase.CRUDController, mock_mongo_audit_datetime): assert {"key": 1} == controller.post({"key": 1}) assert 1 == controller.delete({}) assert {"key": 1} == controller.post({"key": 1}) assert {"key": 2} == controller.post({"key": 2}) assert controller.get_audit({}) == [ { "audit_action": "Insert", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "key": 1, "revision": 1, }, { "audit_action": "Delete", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "key": 1, "revision": 2, }, { "audit_action": "Insert", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "key": 1, "revision": 3, }, { "audit_action": "Insert", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "key": 2, "revision": 4, }, ]
def test_rollback_multiple_rows_is_valid(controller: layabase.CRUDController): controller.post( { "key": "1", "dict_field.first_key": EnumTest.Value1, "dict_field.second_key": 1, } ) controller.post( { "key": "2", "dict_field.first_key": EnumTest.Value1, "dict_field.second_key": 1, } ) controller.put({"key": "1", "dict_field.first_key": EnumTest.Value2}) controller.delete({"key": "2"}) controller.post( { "key": "3", "dict_field.first_key": EnumTest.Value1, "dict_field.second_key": 1, } ) controller.post( { "key": "4", "dict_field.first_key": EnumTest.Value1, "dict_field.second_key": 1, } ) before_insert = 6 controller.post( { "key": "5", "dict_field.first_key": EnumTest.Value1, "dict_field.second_key": 1, } ) controller.put({"key": "1", "dict_field.second_key": 2}) # Remove key 5 and Update key 1 (Key 3 and Key 4 unchanged) assert controller.rollback_to({"revision": before_insert}) == 2 assert controller.get({}) == [ { "dict_field": {"first_key": "Value1", "second_key": 1}, "key": "3", "valid_since_revision": 5, "valid_until_revision": -1, }, { "dict_field": {"first_key": "Value1", "second_key": 1}, "key": "4", "valid_since_revision": 6, "valid_until_revision": -1, }, { "dict_field": {"first_key": "Value2", "second_key": 1}, "key": "1", "valid_since_revision": 9, "valid_until_revision": -1, }, ] assert controller.get_history({}) == [ { "dict_field": {"first_key": "Value2", "second_key": 2}, "key": "1", "valid_since_revision": 8, "valid_until_revision": 9, }, { "dict_field": {"first_key": "Value1", "second_key": 1}, "key": "2", "valid_since_revision": 2, "valid_until_revision": 4, }, { "dict_field": {"first_key": "Value1", "second_key": 1}, "key": "1", "valid_since_revision": 1, "valid_until_revision": 3, }, { "dict_field": {"first_key": "Value1", "second_key": 1}, "key": "3", "valid_since_revision": 5, "valid_until_revision": -1, }, { "dict_field": {"first_key": "Value1", "second_key": 1}, "key": "4", "valid_since_revision": 6, "valid_until_revision": -1, }, { "dict_field": {"first_key": "Value1", "second_key": 1}, "key": "5", "valid_since_revision": 7, "valid_until_revision": 9, }, { "dict_field": {"first_key": "Value2", "second_key": 1}, "key": "1", "valid_since_revision": 3, "valid_until_revision": 8, }, { "dict_field": {"first_key": "Value2", "second_key": 1}, "key": "1", "valid_since_revision": 9, "valid_until_revision": -1, }, ]
def test_delete_on_default_value_is_valid(controller: layabase.CRUDController): controller.post({"optional": "test"}) controller.post({"key": "test2", "optional": "test2"}) assert 1 == controller.delete({"key": "test"})
def test_remove_when_db_down(disconnected_database, controller: layabase.CRUDController): with pytest.raises(Exception) as exception_info: controller.delete({}) assert str(exception_info.value) == "Database could not be reached."
def test_delete_without_nothing_do_not_fail( controller: layabase.CRUDController): assert controller.delete({}) == 0