76 lines
2.7 KiB
Python
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()
|