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"}
Exemplo n.º 2
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}
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,
        }
    ]
Exemplo n.º 10
0
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"}