Files
brassbirimingham-native-bac…/linux-native-backend-v1-usable/test_local.py
T
2026-07-30 20:56:50 +08:00

89 lines
2.6 KiB
Python

from __future__ import annotations
import json
import threading
import time
import urllib.error
import urllib.request
from app.server import build_server
def call(method: str, url: str, payload: dict | None = None, headers: dict | None = None) -> tuple[int, dict]:
data = None
req_headers = {"Content-Type": "application/json"}
if headers:
req_headers.update(headers)
if payload is not None:
data = json.dumps(payload).encode("utf-8")
request = urllib.request.Request(url, data=data, method=method, headers=req_headers)
try:
with urllib.request.urlopen(request) as response:
return response.status, json.loads(response.read().decode("utf-8"))
except urllib.error.HTTPError as exc:
return exc.code, json.loads(exc.read().decode("utf-8"))
def main() -> None:
server = build_server("127.0.0.1", 18765)
thread = threading.Thread(target=server.serve_forever, daemon=True)
thread.start()
time.sleep(0.2)
base = "http://127.0.0.1:18765"
status, payload = call(
"POST",
f"{base}/register",
{"email": "host@example.com", "password": "123456", "name": "Host"},
)
assert status in {201, 409}, (status, payload)
status, payload = call(
"POST",
f"{base}/login",
{"email": "host@example.com", "password": "123456"},
)
assert status == 200, (status, payload)
token = payload["access_token"]
headers = {"Authorization": f"Bearer {token}"}
status, payload = call("GET", f"{base}/me", headers=headers)
assert status == 200, (status, payload)
status, payload = call(
"POST",
f"{base}/1.0.0/games",
{
"GameId": "test-game-001",
"GameStartConfiguration": {"NumberOfPlayersAsInt": 4, "IsPrivate": False},
},
headers=headers,
)
assert status in {201, 409}, (status, payload)
status, payload = call("GET", f"{base}/1.0.0/games?perPage=20", headers=headers)
assert status == 200 and isinstance(payload.get("data"), list), (status, payload)
status, payload = call(
"POST",
f"{base}/1.0.0/games/test-game-001/events",
{"events": [{"$type": "GameStarted"}]},
headers=headers,
)
assert status == 200 and isinstance(payload, dict), (status, payload)
status, payload = call(
"GET",
f"{base}/1.0.0/games/test-game-001/events-and-metadata",
headers=headers,
)
assert status == 200, (status, payload)
server.shutdown()
print("local test passed")
if __name__ == "__main__":
main()