Beispiel #1
0
def test_get(_clean_specs_table):
    """
    GIVEN user and database and storage with a single spec
    WHEN get is called with the user and spec id
    THEN the spec value is returned.
    """
    user = "******"
    spec_name = "spec name 1"
    version = "1"
    package_database.get().create_update_spec(
        sub=user, name=spec_name, version=version, model_count=1
    )
    spec = {"components": {}}
    storage.get_storage_facade().create_update_spec(
        user=user,
        name=spec_name,
        version=version,
        spec_str=json.dumps(spec, separators=(",", ":")),
    )

    response = specs.get(user=user, spec_name=spec_name)

    assert response.status_code == 200
    assert response.mimetype == "application/json"
    response_data_json = json.loads(response.data.decode())
    assert f"version: '{version}'" in response_data_json["value"]
    assert "components: {}" in response_data_json["value"]
    assert response_data_json["name"] == spec_name
    assert response_data_json["version"] == version
Beispiel #2
0
def test_delete_database_error(monkeypatch, _clean_specs_table):
    """
    GIVEN database that raises a DatabaseError and storage with spec and user and spec
        id
    WHEN put is called with the body and spec id
    THEN the spec is deleted from the storage.
    """
    spec_name = "id 1"
    user = "******"
    version = "1"
    mock_database_delete_spec = mock.MagicMock()
    mock_database_delete_spec.side_effect = package_database.exceptions.BaseError
    monkeypatch.setattr(
        package_database.get(),
        "delete_spec",
        mock_database_delete_spec,
    )
    storage.get_storage_facade().create_update_spec(
        user=user, name=spec_name, version=version, spec_str="spec str 1"
    )

    response = specs.delete(spec_name=spec_name, user=user)

    with pytest.raises(storage.exceptions.StorageError):
        storage.get_storage_facade().get_spec(
            user=user, name=spec_name, version=version
        )
    assert response.status_code == 204
Beispiel #3
0
def test_delete_storage_error(monkeypatch, _clean_specs_table):
    """
    GIVEN database and storage that raises a StorageError with spec and user and spec
        id
    WHEN put is called with the body and spec id
    THEN the spec is deleted from the database.
    """
    spec_name = "id 1"
    user = "******"
    version = "1"
    package_database.get().create_update_spec(
        sub=user, name=spec_name, version=version, model_count=1
    )
    mock_storage_delete_spec = mock.MagicMock()
    mock_storage_delete_spec.side_effect = storage.exceptions.StorageError
    monkeypatch.setattr(
        storage.get_storage_facade(),
        "delete_spec",
        mock_storage_delete_spec,
    )

    response = specs.delete(spec_name=spec_name, user=user)

    assert package_database.get().count_customer_models(sub=user) == 0
    assert response.status_code == 204
Beispiel #4
0
def test_get_spec():
    """
    GIVEN user, name, version and spec str
    WHEN create_update_spec is called with the user, canonically identical name, version
        and spec str and
        then get_spec is called with the user and name
    THEN the spec str is returned or ObjectNotFoundError is raised.
    """
    user = "******"
    name = "name 1"
    version_1 = "version 1"
    spec_str_1 = "spec str 1"

    storage_instance = storage.get_storage_facade()

    storage_instance.create_update_spec(user=user,
                                        name=name,
                                        version=version_1,
                                        spec_str=spec_str_1)

    assert (storage_instance.get_spec(user=user, name=name,
                                      version=version_1) == spec_str_1)
    # Retry with a different name that resolves to the same canonical name
    assert (storage_instance.get_spec(user=user,
                                      name=name.upper(),
                                      version=version_1) == spec_str_1)

    spec_str_2 = "spec str 2"
    storage_instance.create_update_spec(user=user,
                                        name=name,
                                        version=version_1,
                                        spec_str=spec_str_2)

    assert (storage_instance.get_spec(user=user, name=name,
                                      version=version_1) == spec_str_2)

    version_2 = "version 2"

    with pytest.raises(storage.exceptions.ObjectNotFoundError):
        storage_instance.get_spec(user=user, name=name, version=version_2)

    spec_str_3 = "spec str 3"
    storage_instance.create_update_spec(user=user,
                                        name=name,
                                        version=version_2,
                                        spec_str=spec_str_3)

    assert (storage_instance.get_spec(user=user, name=name,
                                      version=version_2) == spec_str_3)

    # Update using a a different name that resolves to the same canonical name
    spec_str_4 = "spec str 4"
    storage_instance.create_update_spec(user=user,
                                        name=name.upper(),
                                        version=version_2,
                                        spec_str=spec_str_4)

    assert (storage_instance.get_spec(user=user, name=name,
                                      version=version_2) == spec_str_4)
Beispiel #5
0
def test_delete_spec():
    """
    GIVEN user, name, version and spec str
    WHEN create_update_spec is called with the user, canonically identical name,
        version and spec str and then delete_spec is called with the user and name
    THEN the spec str is returned or ObjectNotFoundError is raised.
    """
    user = "******"
    name = "name 1"
    version_1 = "version 1"
    spec_str = "spec str 1"

    storage_instance = storage.get_storage_facade()

    storage_instance.create_update_spec(user=user,
                                        name=name,
                                        version=version_1,
                                        spec_str=spec_str)

    storage_instance.delete_spec(user=user, name=name)

    with pytest.raises(storage.exceptions.ObjectNotFoundError):
        storage_instance.get_spec(user=user, name=name, version=version_1)

    # Try again where delete is called with a different name that resolves to the same
    # canonical name
    storage_instance.create_update_spec(user=user,
                                        name=name,
                                        version=version_1,
                                        spec_str=spec_str)

    storage_instance.delete_spec(user=user, name=name.upper())

    with pytest.raises(storage.exceptions.ObjectNotFoundError):
        storage_instance.get_spec(user=user, name=name, version=version_1)

    with pytest.raises(storage.exceptions.StorageError):
        storage_instance.delete_spec(user=user, name=name)

    version_2 = "version 2"
    version_3 = "version 3"
    storage_instance.create_update_spec(user=user,
                                        name=name,
                                        version=version_2,
                                        spec_str=spec_str)
    storage_instance.create_update_spec(user=user,
                                        name=name,
                                        version=version_3,
                                        spec_str=spec_str)

    storage_instance.delete_spec(user=user, name=name)

    with pytest.raises(storage.exceptions.ObjectNotFoundError):
        storage_instance.get_spec(user=user, name=name, version=version_2)
    with pytest.raises(storage.exceptions.ObjectNotFoundError):
        storage_instance.get_spec(user=user, name=name, version=version_3)
Beispiel #6
0
def test_put_database_update_error(monkeypatch, _clean_specs_table):
    """
    GIVEN body and spec id
    WHEN put is called with the body and spec id
    THEN the spec is stored against the spec id.
    """
    mock_request = mock.MagicMock()
    mock_headers = {"X-LANGUAGE": "JSON"}
    mock_request.headers = mock_headers
    monkeypatch.setattr(server.Request, "request", mock_request)
    version = "1"
    spec = {
        "info": {
            "version": version
        },
        "components": {
            "schemas": {
                "Schema": {
                    "type": "object",
                    "x-tablename": "schema",
                    "properties": {
                        "id": {
                            "type": "integer"
                        }
                    },
                }
            }
        },
    }
    body = json.dumps(spec)
    spec_name = "id 1"
    user = "******"
    mock_database_create_update_spec = mock.MagicMock()
    mock_database_create_update_spec.side_effect = package_database.exceptions.BaseError
    monkeypatch.setattr(
        package_database.get(),
        "create_update_spec",
        mock_database_create_update_spec,
    )

    response = versions.put(body=body.encode(),
                            spec_name=spec_name,
                            version=version,
                            user=user)

    spec_str = storage.get_storage_facade().get_spec(user=user,
                                                     name=spec_name,
                                                     version=version)
    assert f'"{version}"' in spec_str
    assert '"Schema"' in spec_str
    assert '"x-tablename"' in spec_str
    assert '"schema"' in spec_str
    assert package_database.get().count_customer_models(sub=user) == 0
    assert response.status_code == 500
    assert response.mimetype == "text/plain"
    assert "database" in response.data.decode()
Beispiel #7
0
def test_put(monkeypatch, _clean_specs_table):
    """
    GIVEN body, spec id and user
    WHEN put is called with the body, spec id and user
    THEN the spec is stored against the spec id.
    """
    mock_request = mock.MagicMock()
    mock_headers = {"X-LANGUAGE": "JSON"}
    mock_request.headers = mock_headers
    monkeypatch.setattr(server.Request, "request", mock_request)
    version = "1"
    title = "title 1"
    description = "description 1"
    spec = {
        "info": {"version": version, "title": title, "description": description},
        "components": {
            "schemas": {
                "Schema": {
                    "type": "object",
                    "x-tablename": "schema",
                    "properties": {"id": {"type": "integer"}},
                }
            }
        },
    }
    body = json.dumps(spec)
    spec_name = "id 1"
    user = "******"

    response = specs.put(body=body.encode(), spec_name=spec_name, user=user)

    spec_str = storage.get_storage_facade().get_spec(
        user=user, name=spec_name, version=version
    )
    assert f'"{version}"' in spec_str
    assert '"Schema"' in spec_str
    assert '"x-tablename"' in spec_str
    assert '"schema"' in spec_str

    assert package_database.get().count_customer_models(sub=user) == 1
    spec_infos = package_database.get().list_specs(sub=user)
    assert len(spec_infos) == 1
    spec_info = spec_infos[0]
    assert spec_info["name"] == spec_name
    assert spec_info["id"] == spec_name
    assert spec_info["version"] == version
    assert spec_info["title"] == title
    assert spec_info["description"] == description
    assert spec_info["model_count"] == 1
    assert "updated_at" in spec_info

    assert response.status_code == 204
Beispiel #8
0
def test_get_database_miss():
    """
    GIVEN user and version and databasewithout and storage with a single spec
    WHEN get is called with the user and spec id
    THEN 500 is returned.
    """
    user = "******"
    spec_name = "spec name 1"
    version = "1"
    spec = {"components": {}}
    storage.get_storage_facade().create_update_spec(
        user=user,
        name=spec_name,
        version=version,
        spec_str=json.dumps(spec, separators=(",", ":")),
    )

    response = versions.get(user=user, spec_name=spec_name, version=version)

    assert response.status_code == 500
    assert response.mimetype == "text/plain"
    assert "database" in response.data.decode()
Beispiel #9
0
def test_get_spec_versions():
    """
    GIVEN user, name, version and spec str
    WHEN create_update_spec is called with the user, canonically identical name, version
        and spec str and then get_spec_versions is called with the user and name
    THEN the version is returned or ObjectNotFoundError is raised.
    """
    user = "******"
    name = "name 1"
    version_1 = "version 1"
    spec_str = "spec str 1"

    storage_instance = storage.get_storage_facade()

    storage_instance.create_update_spec(user=user,
                                        name=name,
                                        version=version_1,
                                        spec_str=spec_str)

    assert storage_instance.get_spec_versions(user=user,
                                              name=name) == [version_1]
    assert storage_instance.get_spec_versions(
        user=user, name=name.upper()) == [version_1]

    storage.get_storage().set(key=f"{user}/{name}/{version_1}.gzip",
                              value="value 1")

    assert storage_instance.get_spec_versions(user=user,
                                              name=name) == [version_1]

    version_2 = "version 2"

    storage_instance.create_update_spec(user=user,
                                        name=name,
                                        version=version_2,
                                        spec_str=spec_str)

    assert (storage_instance.get_spec_versions(
        user=user,
        name=name,
    ) == [version_1, version_2])

    with pytest.raises(storage.exceptions.ObjectNotFoundError) as exc:
        storage_instance.get_spec_versions(user="******", name=name)
    assert name in str(exc)

    with pytest.raises(storage.exceptions.ObjectNotFoundError) as exc:
        storage_instance.get_spec_versions(user=user, name="name 2")
    assert "name 2" in str(exc)
Beispiel #10
0
def test_delete(_clean_specs_table):
    """
    GIVEN database and storage with spec and user and spec id
    WHEN put is called with the body and spec id
    THEN the spec is deleted from the storage and database.
    """
    spec_name = "id 1"
    user = "******"
    version = "1"
    package_database.get().create_update_spec(
        sub=user, name=spec_name, version=version, model_count=1
    )
    storage.get_storage_facade().create_update_spec(
        user=user, name=spec_name, version=version, spec_str="spec str 1"
    )

    response = specs.delete(spec_name=spec_name, user=user)

    with pytest.raises(storage.exceptions.StorageError):
        storage.get_storage_facade().get_spec(
            user=user, name=spec_name, version=version
        )
    assert package_database.get().count_customer_models(sub=user) == 0
    assert response.status_code == 204
Beispiel #11
0
def test_put_storage_error(monkeypatch, _clean_specs_table):
    """
    GIVEN body with invalid spec and spec id
    WHEN put is called with the body and spec id
    THEN a 400 with an invalid spec is returned.
    """
    mock_request = mock.MagicMock()
    mock_headers = {"X-LANGUAGE": "JSON"}
    mock_request.headers = mock_headers
    monkeypatch.setattr(server.Request, "request", mock_request)
    version = "1"
    schemas = {
        "Schema": {
            "type": "object",
            "x-tablename": "schema",
            "properties": {
                "id": {
                    "type": "integer"
                }
            },
        }
    }
    body = json.dumps({
        "info": {
            "version": version
        },
        "components": {
            "schemas": schemas
        }
    })
    spec_name = "id 1"
    user = "******"
    mock_storage_create_update_spec = mock.MagicMock()
    mock_storage_create_update_spec.side_effect = storage.exceptions.StorageError
    monkeypatch.setattr(
        storage.get_storage_facade(),
        "create_update_spec",
        mock_storage_create_update_spec,
    )

    response = versions.put(body=body.encode(),
                            spec_name=spec_name,
                            version=version,
                            user=user)

    assert response.status_code == 500
    assert response.mimetype == "text/plain"
    assert "storing" in response.data.decode()
Beispiel #12
0
def test_get_storage_facade_error(monkeypatch):
    """
    GIVEN user and database with a spec but storage that raises an error
    WHEN get is called with the user and spec id
    THEN a 500 is returned.
    """
    user = "******"
    spec_name = "spec name 1"
    version = "1"
    mock_storage_get_spec = mock.MagicMock()
    mock_storage_get_spec.side_effect = storage.exceptions.StorageError
    monkeypatch.setattr(storage.get_storage_facade(), "get_spec",
                        mock_storage_get_spec)

    response = versions.get(user=user, spec_name=spec_name, version=version)

    assert response.status_code == 500
    assert response.mimetype == "text/plain"
    assert "reading" in response.data.decode()