krz/hutch-stats

Server-side utility for calculating contributions for sourcehut users.

clone: git clone https://gitbay.org/krz/hutch-stats.git

main: tests/test_repositories_api.py · raw

 1from fastapi.testclient import TestClient
 2
 3
 4def test_create_list_get_update_delete_tracked_repositories(client: TestClient) -> None:
 5    create_response = client.post(
 6        "/api/repositories",
 7        json={"actor": "~ccleberg", "repo_name": "Hutch"},
 8    )
 9
10    assert create_response.status_code == 201
11    assert create_response.json()["repo_name"] == "~ccleberg/Hutch"
12
13    repository_id = create_response.json()["id"]
14
15    get_response = client.get(f"/api/repositories/{repository_id}")
16    assert get_response.status_code == 200
17    assert get_response.json()["repo_name"] == "~ccleberg/Hutch"
18
19    update_response = client.patch(
20        f"/api/repositories/{repository_id}",
21        json={"repo_name": "~ccleberg/cleberg.net"},
22    )
23    assert update_response.status_code == 200
24    assert update_response.json()["repo_name"] == "~ccleberg/cleberg.net"
25
26    list_response = client.get("/api/repositories?actor=~ccleberg")
27    assert list_response.status_code == 200
28    assert list_response.json() == [
29        {
30            "id": repository_id,
31            "service": "git",
32            "actor": "~ccleberg",
33            "repo_name": "~ccleberg/cleberg.net",
34        }
35    ]
36
37    delete_response = client.delete(f"/api/repositories/{repository_id}")
38    assert delete_response.status_code == 204
39
40    missing_response = client.get(f"/api/repositories/{repository_id}")
41    assert missing_response.status_code == 404
42
43
44def test_repository_validation_and_conflicts(client: TestClient) -> None:
45    invalid_response = client.post(
46        "/api/repositories",
47        json={"actor": "~ccleberg", "repo_name": "   "},
48    )
49    assert invalid_response.status_code == 422
50
51    first_response = client.post(
52        "/api/repositories",
53        json={"actor": "~ccleberg", "repo_name": "Hutch"},
54    )
55    second_response = client.post(
56        "/api/repositories",
57        json={"actor": "~ccleberg", "repo_name": "~ccleberg/Hutch"},
58    )
59
60    assert first_response.status_code == 201
61    assert second_response.status_code == 409
62
63
64def test_same_repository_can_be_tracked_by_different_actors(client: TestClient) -> None:
65    first_response = client.post(
66        "/api/repositories",
67        json={"actor": "~ccleberg", "repo_name": "Hutch"},
68    )
69    second_response = client.post(
70        "/api/repositories",
71        json={"actor": "~other", "repo_name": "Hutch"},
72    )
73
74    assert first_response.status_code == 201
75    assert second_response.status_code == 201
76    assert first_response.json()["repo_name"] == "~ccleberg/Hutch"
77    assert second_response.json()["repo_name"] == "~other/Hutch"