def test_handle_release_bad_hash(monkeypatch, tmp_path):
    monkeypatch.setattr(settings, "RELEASE_STORAGE", tmp_path / "releases")

    upload = tmp_path / "release.zip"
    release_hash = make_release_zip(upload)
    release = ReleaseFactory(
        id=release_hash, files=["file.txt"], backend_user="******"
    )

    with pytest.raises(ValidationError) as exc:
        handle_release(
            release.workspace, release.backend, "user", "bad hash", upload.open("rb")
        )

    assert "did not match" in exc.value.detail["detail"]
def test_handle_release_db_error(monkeypatch, tmp_path):
    monkeypatch.setattr(settings, "RELEASE_STORAGE", tmp_path / "releases")
    monkeypatch.setattr(Release.objects, "create", raise_error)

    upload = tmp_path / "release.zip"
    release_hash = make_release_zip(upload)
    workspace = WorkspaceFactory()
    backend = BackendFactory()

    with pytest.raises(DatabaseError):
        handle_release(workspace, backend, "user", release_hash, upload.open("rb"))

    # check the extracted files have been deleted due to the error
    upload_dir = tmp_path / "releases" / workspace.name / release_hash
    assert not upload_dir.exists()
def test_handle_release_created(monkeypatch, tmp_path):
    monkeypatch.setattr(settings, "RELEASE_STORAGE", tmp_path / "releases")
    workspace = WorkspaceFactory()
    backend = BackendFactory()

    upload = tmp_path / "release.zip"
    release_hash = make_release_zip(upload)

    release, created = handle_release(
        workspace, backend, "user", release_hash, upload.open("rb")
    )
    assert created
    assert release.id == release_hash
    assert release.backend_user == "user"
    assert release.files == ["file.txt", "metadata/manifest.json"]
    assert release.file_path("file.txt").read_text() == "test"
    assert release.manifest == {"workspace": "workspace", "repo": "repo"}
def test_handle_release_already_exists(monkeypatch, tmp_path):
    monkeypatch.setattr(settings, "RELEASE_STORAGE", tmp_path / "releases")

    upload = tmp_path / "release.zip"
    release_hash = make_release_zip(upload)
    release = ReleaseFactory(
        id=release_hash,
        files=["file.txt", "metadata/manifest.json"],
        backend_user="******",
    )

    release, created = handle_release(
        release.workspace, release.backend, "user", release_hash, upload.open("rb")
    )
    assert not created
    assert release.id == release_hash
    assert release.backend_user == "original"
    assert release.files == ["file.txt", "metadata/manifest.json"]