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)
							 |