Files
OBS-Overlays/pokemon-party/tests/test_server.py
T

76 lines
2.7 KiB
Python

import json
import sys
import tempfile
import threading
import unittest
from http.client import HTTPConnection
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
class PartyServerTests(unittest.TestCase):
def setUp(self):
from server import PartyOverlayHandler, ThreadingHTTPServer
self.tmp = tempfile.TemporaryDirectory()
self.root = Path(self.tmp.name)
(self.root / "party.json").write_text('{"party": []}\n', encoding="utf-8")
(self.root / "editor.html").write_text("editor", encoding="utf-8")
handler = lambda *args, **kwargs: PartyOverlayHandler(*args, directory=str(self.root), **kwargs)
self.httpd = ThreadingHTTPServer(("127.0.0.1", 0), handler)
self.thread = threading.Thread(target=self.httpd.serve_forever, daemon=True)
self.thread.start()
self.host, self.port = self.httpd.server_address
def tearDown(self):
self.httpd.shutdown()
self.thread.join(timeout=2)
self.tmp.cleanup()
def request(self, method, path, body=None, headers=None):
conn = HTTPConnection(self.host, self.port, timeout=5)
conn.request(method, path, body=body, headers=headers or {})
response = conn.getresponse()
data = response.read().decode("utf-8")
conn.close()
return response.status, data, dict(response.getheaders())
def test_post_api_party_writes_normalized_party_json(self):
payload = {
"party": [
{"species": "cyndaquil", "nickname": "Toast", "sprite": "sprites/hgss/155.png", "status": "alive"}
]
}
status, body, _headers = self.request(
"POST",
"/api/party",
body=json.dumps(payload),
headers={"Content-Type": "application/json"},
)
self.assertEqual(status, 200)
self.assertEqual(json.loads(body)["ok"], True)
saved = json.loads((self.root / "party.json").read_text(encoding="utf-8"))
self.assertEqual(len(saved["party"]), 6)
self.assertEqual(saved["party"][0]["species"], "cyndaquil")
self.assertEqual(saved["party"][1]["status"], "empty")
def test_post_api_party_rejects_invalid_json_without_overwriting_file(self):
before = (self.root / "party.json").read_text(encoding="utf-8")
status, body, _headers = self.request(
"POST",
"/api/party",
body="not json",
headers={"Content-Type": "application/json"},
)
self.assertEqual(status, 400)
self.assertIn("error", json.loads(body))
self.assertEqual((self.root / "party.json").read_text(encoding="utf-8"), before)
if __name__ == "__main__":
unittest.main()