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
예제 #3
0
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,
        }
    ]
예제 #9
0
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}
예제 #10
0
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
예제 #11
0
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"})
예제 #12
0
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
예제 #13
0
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."
예제 #15
0
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({})
예제 #16
0
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,
    }
예제 #18
0
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"}) == []
예제 #19
0
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})
예제 #20
0
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"})
예제 #21
0
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,
        },
    ]
예제 #29
0
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 == [""]
예제 #30
0
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