96 lines
3.3 KiB
Python
96 lines
3.3 KiB
Python
import os
|
|
import pickle
|
|
from pathlib import Path
|
|
from typing import ClassVar
|
|
from uuid import UUID, uuid4
|
|
|
|
from flask import url_for
|
|
|
|
from . import TestBase
|
|
|
|
|
|
class TestTracker(TestBase):
|
|
room_id: UUID
|
|
tracker_uuid: UUID
|
|
log_filename: str
|
|
data: ClassVar[bytes]
|
|
|
|
@classmethod
|
|
def setUpClass(cls) -> None:
|
|
super().setUpClass()
|
|
with (Path(__file__).parent / "data" / "One_Archipelago.archipelago").open("rb") as f:
|
|
cls.data = f.read()
|
|
|
|
def setUp(self) -> None:
|
|
from pony.orm import db_session
|
|
from MultiServer import Context as MultiServerContext
|
|
from Utils import user_path
|
|
from WebHostLib.models import GameDataPackage, Room, Seed
|
|
|
|
super().setUp()
|
|
|
|
multidata = MultiServerContext.decompress(self.data)
|
|
|
|
with self.client.session_transaction() as session:
|
|
session["_id"] = uuid4()
|
|
self.tracker_uuid = uuid4()
|
|
with db_session:
|
|
# store game datapackage(s)
|
|
for game, game_data in multidata["datapackage"].items():
|
|
if not GameDataPackage.get(checksum=game_data["checksum"]):
|
|
GameDataPackage(checksum=game_data["checksum"],
|
|
data=pickle.dumps(game_data))
|
|
# create an empty seed and a room from it
|
|
seed = Seed(multidata=self.data, owner=session["_id"])
|
|
room = Room(seed=seed, owner=session["_id"], tracker=self.tracker_uuid)
|
|
self.room_id = room.id
|
|
self.log_filename = user_path("logs", f"{self.room_id}.txt")
|
|
|
|
def tearDown(self) -> None:
|
|
from pony.orm import db_session, select
|
|
from WebHostLib.models import Command, Room
|
|
|
|
with db_session:
|
|
for command in select(command for command in Command if command.room.id == self.room_id): # type: ignore
|
|
command.delete()
|
|
room: Room = Room.get(id=self.room_id)
|
|
room.seed.delete()
|
|
room.delete()
|
|
|
|
try:
|
|
os.unlink(self.log_filename)
|
|
except FileNotFoundError:
|
|
pass
|
|
|
|
def test_valid_if_modified_since(self) -> None:
|
|
"""
|
|
Verify that we get a 200 response for valid If-Modified-Since
|
|
"""
|
|
with self.app.app_context(), self.app.test_request_context():
|
|
response = self.client.get(
|
|
url_for(
|
|
"get_player_tracker",
|
|
tracker=self.tracker_uuid,
|
|
tracked_team=0,
|
|
tracked_player=1,
|
|
),
|
|
headers={"If-Modified-Since": "Wed, 21 Oct 2015 07:28:00 GMT"},
|
|
)
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
def test_invalid_if_modified_since(self) -> None:
|
|
"""
|
|
Verify that we get a 400 response for invalid If-Modified-Since
|
|
"""
|
|
with self.app.app_context(), self.app.test_request_context():
|
|
response = self.client.get(
|
|
url_for(
|
|
"get_player_tracker",
|
|
tracker=self.tracker_uuid,
|
|
tracked_team=1,
|
|
tracked_player=0,
|
|
),
|
|
headers={"If-Modified-Since": "Wed, 21 Oct 2015 07:28:00"}, # missing timezone
|
|
)
|
|
self.assertEqual(response.status_code, 400)
|