edh-elo/tests/test_fresh_db_tests.py
Jack Jackson 2fb5a291e5 Implement incremental updating
When `seed/all_in_one` is now called, it will update with only that data
that exists later than the most-recently-played* game, allowing the
upload to be used repeatedly without having to clear the database.

\* Actually, "highest-ID game", as we haven't implemented
`list_games_by_date`, yet
2024-07-27 20:05:28 -07:00

107 lines
3.8 KiB
Python

from typing import Mapping
import httpx
from fastapi.testclient import TestClient
from app import app
client = TestClient(app)
def test_add_and_retrieve_player(test_client: TestClient, cleanups):
response = _json_get(test_client, "/player/1")
assert response.status_code == 404
create_player_response = _json_post(client, "/player", {"name": "jason"})
assert create_player_response.status_code == 201
response_1 = _json_get(client, "/player/1")
assert response_1.json()["name"] == "jason"
def cleanup():
delete_response = _json_delete(client, "/player/1")
assert delete_response.status_code == 204
cleanups.add_success(cleanup)
def test_add_and_retrieve_deck(test_client: TestClient, cleanups):
not_found_response = _json_get(test_client, "/deck/1")
assert not_found_response.status_code == 404
# Try (and fail) to create a deck owned by a non-existent player
invalid_owner_response = _json_post(
test_client, "/deck", {"name": "Baby's First Deck", "owner_id": 1}
)
assert invalid_owner_response.status_code == 400
assert invalid_owner_response.json()["detail"] == "Owner id 1 not found"
create_jim_response = _json_post(test_client, "/player", {"name": "jim"})
assert create_jim_response.status_code == 201
jim_id = create_jim_response.json()["id"]
create_deck_response = _json_post(
test_client, "/deck", {"name": "Baby's First Deck", "owner_id": str(jim_id)}
)
assert create_deck_response.status_code == 201
# _Should_ always be 1, since we expect to start with an empty database, but why risk it?
deck_id = create_deck_response.json()["id"]
get_deck_response = _json_get(test_client, f"/deck/{deck_id}")
assert get_deck_response.status_code == 200
assert get_deck_response.json()["name"] == "Baby's First Deck"
# Very basic HTML testing
html_response = test_client.get(f"/deck/{deck_id}")
assert """owned by <a href="/player/1">jim</a>""" in html_response.text
def success_cleanup():
delete_response = _json_delete(test_client, f"/deck/{deck_id}")
assert delete_response.status_code == 204
cleanups.add_success(success_cleanup)
def test_incremental_add_of_games(test_client: TestClient, cleanups):
latest_deck_response = _json_get(test_client, "/game/latest_game")
assert latest_deck_response.status_code == 404
# https://github.com/tiangolo/fastapi/issues/1536#issuecomment-640781718
with open("seed-data/all-in-one.csv", "rb") as f:
test_client.post(
"/api/seed/all_in_one",
files={"file": ("fake_all_in_one_filename.csv", f, "text/csv")},
)
latest_deck_response = _json_get(test_client, "/game/latest_game")
assert latest_deck_response.status_code == 200
print(latest_deck_response.json())
assert latest_deck_response.json()["date"] == "2024-07-05T00:00:00"
# then seed again, and check that it successfully gets the expected latest
with open(
"seed-data/all-in-one-updated-for-incremental-add-testing.csv", "rb"
) as f:
test_client.post(
"/api/seed/all_in_one",
files={"file": ("fake_all_in_one_filename.csv", f, "text/csv")},
)
latest_deck_response = _json_get(test_client, "/game/latest_game")
assert latest_deck_response.status_code == 200
assert latest_deck_response.json()["date"] == "2024-07-25T00:00:00"
def _json_get(c: TestClient, path: str) -> httpx.Response:
return c.get(f"/api{path}", headers={"Content-Type": "application/json"})
def _json_post(c: TestClient, path: str, body: Mapping) -> httpx.Response:
return c.post(
f"/api{path}", headers={"Content-Type": "application/json"}, json=body
)
def _json_delete(c: TestClient, path: str) -> httpx.Response:
return c.delete(f"/api{path}", headers={"Content-Type": "application/json"})