def test_get_num_versions(versioned_service: VersionedMongoService,
                          request_user: User):
    uid = versioned_service.create(request_user, {
        "name": "Sauron",
        "Occupation": "Industrialist"
    })
    assert versioned_service.get_num_versions(request_user, uid) == 1
    versioned_service.update(
        request_user,
        {
            "name": "Sauron",
            "Occupation": "Industrialist, Necromancer"
        },
        uid,
    )
    assert versioned_service.get_num_versions(request_user, uid) == 2
    versioned_service.update(
        request_user,
        {
            "name": "Sauron",
            "Occupation": "Industrialist, Necromancer, Dark Lord"
        },
        uid,
    )
    assert versioned_service.get_num_versions(request_user, uid) == 3

    with pytest.raises(ObjectNotFoundError):
        versioned_service.get_num_versions(request_user,
                                           "this_uid_does_not_exist")
Ejemplo n.º 2
0
def test_conflict_resolution(versioned_service: VersionedMongoService,
                             request_user: User):
    # TODO: Implement more tests, this one is only to catch a specific edge case that
    # I had to fix
    response = versioned_service.create(request_user, {
        "name": "Celebrimbor",
        "Occupation": "Ringmaker"
    })
    uid = response["uid"]
    with pytest.raises(EtagMismatchError):
        versioned_service.update(request_user, {
            "name": "Celebrimbor",
            "Occupation": "Ringmaker"
        },
                                 uid,
                                 etag="wrong_etag")
    # Make sure that the versioned collection was not changed
    result = versioned_service._versions_svc.retrieve_one(request_user, uid)
    assert result is None
def test_versioned_update(versioned_service: VersionedMongoService, request_user: User):
    with pytest.raises(
        ImmutableMetadataField, match="Cannot mutate field: `version` in `splash_md`"
    ):
        versioned_service.create(
            request_user,
            {
                "name": "Celebrimbor",
                "Occupation": "Ringmaker",
                "splash_md": {"version": 3},
            },
        )

    response = versioned_service.create(
        request_user, {"name": "Celebrimbor", "Occupation": "Ringmaker"}
    )
    uid = response["uid"]

    document_1 = versioned_service.retrieve_one(request_user, uid)
    assert document_1["uid"] == uid
    assert document_1["splash_md"]["version"] == 1
    assert document_1["name"] == "Celebrimbor"
    assert document_1["Occupation"] == "Ringmaker"
    assert document_1["splash_md"] == response["splash_md"]
    assert len(document_1) == 4

    with pytest.raises(
        ImmutableMetadataField, match="Cannot mutate field: `version` in `splash_md`"
    ):
        versioned_service.update(
            request_user,
            {
                "name": "Celebrimbor",
                "Occupation": "Ringmaker",
                "splash_md": {"version": 3},
            },
            uid,
        )

    update_resp = versioned_service.update(
        request_user,
        {"name": "Celebrimbor", "Occupation": "Ringmaker, Swordsmith"},
        response["uid"],
    )
    assert update_resp["uid"] == uid

    document_2 = versioned_service.retrieve_one(request_user, uid)
    assert document_2["uid"] == uid
    assert document_2["splash_md"]["version"] == 2
    assert document_2["name"] == "Celebrimbor"
    assert document_2["Occupation"] == "Ringmaker, Swordsmith"
    assert document_2["splash_md"] == update_resp["splash_md"]
    assert len(document_2) == 4

    update_resp = versioned_service.update(
        request_user,
        {"name": "Celebrimbor", "Occupation": "Ringmaker, Swordsmith, Archer"},
        uid,
    )
    assert update_resp["uid"] == uid

    document_3 = versioned_service.retrieve_one(request_user, uid)
    assert document_3["uid"] == uid
    assert document_3["splash_md"]["version"] == 3
    assert document_3["name"] == "Celebrimbor"
    assert document_3["Occupation"] == "Ringmaker, Swordsmith, Archer"
    assert document_3["splash_md"] == update_resp["splash_md"]
    assert len(document_3) == 4

    # Make sure there's only one version in the main collection at a time
    assert (
        len(list(versioned_service.retrieve_multiple(request_user, query={"uid": uid})))
        == 1
    )

    with pytest.raises(ObjectNotFoundError):
        versioned_service.update(
            request_user, {"name": "Legolas"}, uid="Does not exist"
        )

    assert versioned_service.retrieve_one(request_user, uid="Does not exist") is None
def versioned_service():
    db = mongomock.MongoClient().db
    versioned_service = VersionedMongoService(db, "elves", "elves_old")
    return versioned_service
def test_retrieve_version(versioned_service: VersionedMongoService, request_user: User):
    create_resp = versioned_service.create(
        request_user, {"name": "Celebrimbor", "Occupation": "Ringmaker"}
    )
    uid = create_resp["uid"]
    update_resp1 = versioned_service.update(
        request_user,
        {"name": "Celebrimbor", "Occupation": "Ringmaker, Swordsmith"},
        uid,
    )
    update_resp2 = versioned_service.update(
        request_user,
        {"name": "Celebrimbor", "Occupation": "Ringmaker, Swordsmith, Archer"},
        uid,
    )
    document_1 = versioned_service.retrieve_version(request_user, uid, 1)
    assert document_1["uid"] == uid
    assert document_1["splash_md"]["version"] == 1
    assert document_1["name"] == "Celebrimbor"
    assert document_1["Occupation"] == "Ringmaker"
    assert create_resp["splash_md"] == create_resp["splash_md"]
    assert len(document_1) == 4

    document_2 = versioned_service.retrieve_version(request_user, uid, 2)
    assert document_2["uid"] == uid
    assert document_2["splash_md"]["version"] == 2
    assert document_2["name"] == "Celebrimbor"
    assert document_2["Occupation"] == "Ringmaker, Swordsmith"
    assert update_resp1["splash_md"] == document_2["splash_md"]
    assert len(document_2) == 4

    document_3 = versioned_service.retrieve_version(request_user, uid, 3)
    assert document_3["uid"] == uid
    assert document_3["splash_md"]["version"] == 3
    assert document_3["name"] == "Celebrimbor"
    assert document_3["Occupation"] == "Ringmaker, Swordsmith, Archer"
    assert update_resp2["splash_md"] == document_3["splash_md"]
    assert len(document_3) == 4

    with pytest.raises(VersionNotFoundError):
        versioned_service.retrieve_version(request_user, uid, 4)

    with pytest.raises(ObjectNotFoundError):
        versioned_service.retrieve_version(request_user, "does not exist", 4)

    with pytest.raises(ValueError, match="argument `version` must be more than zero"):
        versioned_service.retrieve_version(request_user, uid, 0)

    with pytest.raises(ValueError, match="argument `version` must be more than zero"):
        versioned_service.retrieve_version(request_user, uid, -1)

    with pytest.raises(TypeError, match="argument `version` must be an integer"):
        versioned_service.retrieve_version(request_user, uid, 2.5)