def test_put_is_updating_and_previous_value_cannot_be_used_to_filter( controller: layabase.CRUDController, mock_mongo_audit_datetime): controller.post({ "key": "my_key1", "mandatory": 1, "optional": "my_value1" }) controller.put({"key": "my_key1", "optional": "my_value"}) assert controller.get({"optional": "my_value1"}) == [] 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": "Update", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "key": "my_key1", "mandatory": 1, "optional": "my_value", "revision": 2, }, ]
def test_update_with_dot_notation_invalid_value_is_invalid( controller: layabase.CRUDController): assert { "dict_col": { "first_key": "Value1", "second_key": 3 }, "key": "my_key", } == controller.post({ "key": "my_key", "dict_col": { "first_key": "Value1", "second_key": 3 } }) with pytest.raises(layabase.ValidationFailed) as exception_info: controller.put({ "key": "my_key", "dict_col.second_key": "invalid integer" }) assert { "dict_col.second_key": ["Not a valid int."] } == exception_info.value.errors assert { "key": "my_key", "dict_col.second_key": "invalid integer", } == exception_info.value.received_data
def test_put_with_empty_dict_is_invalid(controller: layabase.CRUDController): with pytest.raises(layabase.ValidationFailed) as exception_info: controller.put({}) assert exception_info.value.errors == { "key": ["Missing data for required field."] } assert exception_info.value.received_data == {}
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_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_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_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_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_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_put_with_non_nullable_as_none_is_invalid(controller: layabase.CRUDController): controller.post({"key": "value1", "mandatory": 1}) with pytest.raises(ValidationFailed) as exception_info: controller.put({"key": "value1", "mandatory": None}) assert { "mandatory": ["Missing data for required field."] } == exception_info.value.errors assert {"key": "value1", "mandatory": None} == exception_info.value.received_data
def test_put_is_updating_and_previous_value_cannot_be_used_to_filter( controller: layabase.CRUDController, ): controller.post({ "key": "my_key1", "mandatory": 1, "optional": "my_value1" }) controller.put({"key": "my_key1", "optional": "my_value"}) assert [] == controller.get({"optional": "my_value1"})
def test_put_with_wrong_type_is_invalid(controller: layabase.CRUDController): controller.post({"key": "value1", "mandatory": 1}) with pytest.raises(layabase.ValidationFailed) as exception_info: controller.put({"key": "value1", "mandatory": "invalid value"}) assert {"mandatory": ["Not a valid int."]} == exception_info.value.errors assert { "key": "value1", "mandatory": "invalid value", } == exception_info.value.received_data
def test_put_unexisting_is_invalid(controller: layabase.CRUDController): controller.post({ "key": "my_key1", "date_str": "2018-12-30", "datetime_str": "2016-09-23T23:59:59", }) with pytest.raises(layabase.ValidationFailed) as exception_info: controller.put({"key": "my_key2"}) assert exception_info.value.received_data == {"key": "my_key2"}
def test_update_when_db_down(disconnected_database, controller: layabase.CRUDController): with pytest.raises(Exception) as exception_info: controller.put({ "key": "my_key1", "mandatory": 1, "optional": "my_value1" }) assert str(exception_info.value) == "Database could not be reached."
def test_put_with_optional_as_none_is_valid( controller: layabase.CRUDController): controller.post({"key": "value1", "mandatory": 1}) controller.put({"key": "value1", "mandatory": 1, "optional": None}) assert [{ "mandatory": 1, "key": "value1", "optional": None }] == controller.get({})
def test_update_when_db_down(disconnected_database, controller: layabase.CRUDController): with pytest.raises(Exception) as exception_info: controller.put({ "key": "my_key1", "mandatory": 1, "optional": "my_value1" }) 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 \nWHERE test."key" = ?\n LIMIT ? OFFSET ?]\n[parameters: ('my_key1', 1, 0)]\n(Background on this error at: http://sqlalche.me/e/13/e3q8)""" )
def test_get_versioned_audit_after_post_put( 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}) assert controller_versioned.get_one({"key": "my_key"}) == { "enum_fld": "Value2", "key": "my_key", "valid_since_revision": 2, "valid_until_revision": -1, }
def test_put_with_unknown_fields_is_valid(controller: layabase.CRUDController): controller.post({ "key": "my_key1", "date_str": "2018-12-30", "datetime_str": "2016-09-23T23:59:59", }) assert controller.put({ "key": "my_key1", "date_str": "2018-12-31", "unknown_field": "value" }) == ( { "key": "my_key1", "date_str": "2018-12-30", "datetime_str": "2016-09-23T23:59:59", }, { "key": "my_key1", "date_str": "2018-12-31", "datetime_str": "2016-09-23T23:59:59", }, ) assert controller.get({"date_str": "2018-12-31"}) == [{ "key": "my_key1", "date_str": "2018-12-31", "datetime_str": "2016-09-23T23:59:59", }] assert controller.get({"date_str": "2018-12-30"}) == []
def test_put_is_updating(controller: layabase.CRUDController): controller.post({ "key": "my_key1", "mandatory": 1, "optional": "my_value1" }) assert ( { "key": "my_key1", "mandatory": 1, "optional": "my_value1" }, { "key": "my_key1", "mandatory": 1, "optional": "my_value" }, ) == controller.put({ "key": "my_key1", "optional": "my_value" }) assert [{ "key": "my_key1", "mandatory": 1, "optional": "my_value" }] == controller.get({"mandatory": 1})
def test_put_is_updating_date(controller: layabase.CRUDController): controller.post({ "key": "my_key1", "date_str": "2017-05-15", "datetime_str": "2016-09-23T23:59:59", }) assert ( { "date_str": "2017-05-15", "datetime_str": "2016-09-23T23:59:59", "key": "my_key1", }, { "date_str": "2018-06-01", "datetime_str": "1989-12-31T01:00:00", "key": "my_key1", }, ) == controller.put({ "key": "my_key1", "date_str": "2018-06-01", "datetime_str": "1989-12-31T01:00:00", }) assert [{ "date_str": "2018-06-01", "datetime_str": "1989-12-31T01:00:00", "key": "my_key1", }] == controller.get({"date_str": "2018-06-01"})
def test_update_with_dot_notation_is_valid( controller: layabase.CRUDController): assert { "dict_col": { "first_key": "Value1", "second_key": 3 }, "key": "my_key", } == controller.post({ "key": "my_key", "dict_col": { "first_key": "Value1", "second_key": 3 } }) assert ( { "dict_col": { "first_key": "Value1", "second_key": 3 }, "key": "my_key" }, { "dict_col": { "first_key": "Value1", "second_key": 4 }, "key": "my_key" }, ) == controller.put({ "key": "my_key", "dict_col.second_key": 4 })
def test_put_with_wrong_type_is_invalid(controller: layabase.CRUDController, mock_mongo_audit_datetime): controller.post({"key": "value1", "mandatory": 1}) with pytest.raises(layabase.ValidationFailed) as exception_info: controller.put({"key": "value1", "mandatory": "invalid_value"}) assert exception_info.value.errors == {"mandatory": ["Not a valid int."]} assert exception_info.value.received_data == { "key": "value1", "mandatory": "invalid_value", } assert controller.get_audit({}) == [{ "audit_action": "Insert", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "key": "value1", "mandatory": 1, "optional": None, "revision": 1, }]
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_value_can_be_updated_to_previous_value( 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.put({ "key": "my_key1", "mandatory": 1 }) # Put back initial value 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": "Update", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "key": "my_key1", "mandatory": 2, "optional": "my_value1", "revision": 2, }, { "audit_action": "Update", "audit_date_utc": "2018-10-11T15:05:05.663000", "audit_user": "", "key": "my_key1", "mandatory": 1, "optional": "my_value1", "revision": 3, }, ]
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_put_without_primary_key_but_default_value_is_valid( controller: layabase.CRUDController): assert { "key": "test", "optional": "test2" } == controller.post({"optional": "test2"}) assert ( { "key": "test", "optional": "test2" }, { "key": "test", "optional": "test3" }, ) == controller.put({"optional": "test3"})
def test_put_without_providing_required_nullable_dict_column_is_valid( controller: layabase.CRUDController, ): controller.post( {"key": "first", "dict_field": {"first_key": "Value1", "second_key": 0}} ) assert controller.put({"key": "first"}) == ( { "dict_field": {"first_key": "Value1", "second_key": 0}, "key": "first", "valid_since_revision": 1, "valid_until_revision": -1, }, { "dict_field": {"first_key": "Value1", "second_key": 0}, "key": "first", "valid_since_revision": 2, "valid_until_revision": -1, }, )
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_put_with_list_is_invalid(controller: layabase.CRUDController): with pytest.raises(layabase.ValidationFailed) as exception_info: controller.put([""]) assert exception_info.value.errors == {"": ["Must be a dictionary."]} assert exception_info.value.received_data == [""]
def test_put_with_nothing_is_invalid(controller: layabase.CRUDController): with pytest.raises(layabase.ValidationFailed) as exception_info: controller.put(None) assert exception_info.value.errors == {"": ["No data provided."]} assert exception_info.value.received_data is None