def test_rollback_without_revision_is_invalid(controller: layabase.CRUDController): with pytest.raises(layabase.ValidationFailed) as exception_info: controller.rollback_to({"key": "unknown"}) assert exception_info.value.errors == { "revision": ["Missing data for required field."] } assert exception_info.value.received_data == {"key": "unknown"}
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_rollback_invalid_query(controller: layabase.CRUDController): controller.post({"key": "first"}) with pytest.raises(layabase.ValidationFailed) as exception_info: controller.rollback_to({"revision": 0, "dict_field.second_key": "invalid"}) assert exception_info.value.errors == { "dict_field.second_key": ["Not a valid int."] } assert exception_info.value.received_data == {"dict_field.second_key": "invalid"}
def test_rollback_unknown_criteria_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}) assert controller.rollback_to({"revision": before_update, "key": "unknown"}) == 0 assert controller.get_history({}) == [ { "key": "first", "dict_field": {"first_key": "Value2", "second_key": 1}, "valid_since_revision": 2, "valid_until_revision": -1, }, { "key": "first", "dict_field": {"first_key": "Value1", "second_key": 1}, "valid_since_revision": 1, "valid_until_revision": 2, }, ] assert controller.get({}) == [ { "key": "first", "dict_field": {"first_key": "Value2", "second_key": 1}, "valid_since_revision": 2, "valid_until_revision": -1, } ]
def test_rollback_already_valid_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.rollback_to({"revision": 2}) == 0 assert controller.get_history({}) == [ { "key": "first", "dict_field": {"first_key": "Value2", "second_key": 1}, "valid_since_revision": 2, "valid_until_revision": -1, }, { "key": "first", "dict_field": {"first_key": "Value1", "second_key": 1}, "valid_since_revision": 1, "valid_until_revision": 2, }, ] assert controller.get({}) == [ { "key": "first", "dict_field": {"first_key": "Value2", "second_key": 1}, "valid_since_revision": 2, "valid_until_revision": -1, } ]
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_rollback_to_0(controller: layabase.CRUDController): controller.post( { "key": "first", "dict_field.first_key": EnumTest.Value1, "dict_field.second_key": 1, } ) controller.post( { "key": "second", "dict_field.first_key": EnumTest.Value1, "dict_field.second_key": 1, } ) assert controller.rollback_to({"revision": 0}) == 2 assert controller.get({}) == []
def test_rollback_before_existing_is_valid(controller: layabase.CRUDController): controller.post( { "key": "first", "dict_field.first_key": EnumTest.Value1, "dict_field.second_key": 1, } ) before_insert = 1 controller.post( { "key": "second", "dict_field.first_key": EnumTest.Value1, "dict_field.second_key": 1, } ) assert controller.rollback_to({"revision": before_insert}) == 1 assert controller.get({"key": "second"}) == []
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_rollback_without_versioning_is_valid( controller: layabase.CRUDController): assert 0 == controller.rollback_to({"revision": "invalid revision"})
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_rollback_with_negative_revision_is_valid(controller: layabase.CRUDController): assert controller.rollback_to({"revision": -1}) == 0
def test_rollback_with_non_int_revision_is_invalid(controller: layabase.CRUDController): with pytest.raises(layabase.ValidationFailed) as exception_info: controller.rollback_to({"revision": "invalid revision"}) assert exception_info.value.errors == {"revision": ["Not a valid int."]} assert exception_info.value.received_data == {"revision": "invalid revision"}