* WebHost: fix 'too many players' error not showing * WebHost, Tests: add basic tests for generate endpoint * WebHost: hopefully make CodeQL happy with MAX_ROLL redirect
		
			
				
	
	
		
			74 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import zipfile
 | 
						|
from io import BytesIO
 | 
						|
 | 
						|
from flask import url_for
 | 
						|
 | 
						|
from . import TestBase
 | 
						|
 | 
						|
 | 
						|
class TestGenerate(TestBase):
 | 
						|
    def test_valid_yaml(self) -> None:
 | 
						|
        """
 | 
						|
        Verify that posting a valid yaml will start generating a game.
 | 
						|
        """
 | 
						|
        with self.app.app_context(), self.app.test_request_context():
 | 
						|
            yaml_data = """
 | 
						|
            name: Player1
 | 
						|
            game: Archipelago
 | 
						|
            Archipelago: {}
 | 
						|
            """
 | 
						|
            response = self.client.post(url_for("generate"),
 | 
						|
                                        data={"file": (BytesIO(yaml_data.encode("utf-8")), "test.yaml")},
 | 
						|
                                        follow_redirects=True)
 | 
						|
            self.assertEqual(response.status_code, 200)
 | 
						|
            self.assertTrue("/seed/" in response.request.path or
 | 
						|
                            "/wait/" in response.request.path,
 | 
						|
                            f"Response did not properly redirect ({response.request.path})")
 | 
						|
 | 
						|
    def test_empty_zip(self) -> None:
 | 
						|
        """
 | 
						|
        Verify that posting an empty zip will give an error.
 | 
						|
        """
 | 
						|
        with self.app.app_context(), self.app.test_request_context():
 | 
						|
            zip_data = BytesIO()
 | 
						|
            zipfile.ZipFile(zip_data, "w").close()
 | 
						|
            zip_data.seek(0)
 | 
						|
            self.assertGreater(len(zip_data.read()), 0)
 | 
						|
            zip_data.seek(0)
 | 
						|
            response = self.client.post(url_for("generate"),
 | 
						|
                                        data={"file": (zip_data, "test.zip")},
 | 
						|
                                        follow_redirects=True)
 | 
						|
            self.assertIn("user-message", response.text,
 | 
						|
                          "Request did not call flash()")
 | 
						|
            self.assertIn("not find any valid files", response.text,
 | 
						|
                          "Response shows unexpected error")
 | 
						|
            self.assertIn("generate-game-form", response.text,
 | 
						|
                          "Response did not get user back to the form")
 | 
						|
 | 
						|
    def test_too_many_players(self) -> None:
 | 
						|
        """
 | 
						|
        Verify that posting too many players will give an error.
 | 
						|
        """
 | 
						|
        max_roll = self.app.config["MAX_ROLL"]
 | 
						|
        # validate that max roll has a sensible value, otherwise we probably changed how it works
 | 
						|
        self.assertIsInstance(max_roll, int)
 | 
						|
        self.assertGreater(max_roll, 1)
 | 
						|
        self.assertLess(max_roll, 100)
 | 
						|
        # create a yaml with max_roll+1 players and watch it fail
 | 
						|
        with self.app.app_context(), self.app.test_request_context():
 | 
						|
            yaml_data = "---\n".join([
 | 
						|
                f"name: Player{n}\n"
 | 
						|
                "game: Archipelago\n"
 | 
						|
                "Archipelago: {}\n"
 | 
						|
                for n in range(1, max_roll + 2)
 | 
						|
            ])
 | 
						|
            response = self.client.post(url_for("generate"),
 | 
						|
                                        data={"file": (BytesIO(yaml_data.encode("utf-8")), "test.yaml")},
 | 
						|
                                        follow_redirects=True)
 | 
						|
            self.assertIn("user-message", response.text,
 | 
						|
                          "Request did not call flash()")
 | 
						|
            self.assertIn("limited to", response.text,
 | 
						|
                          "Response shows unexpected error")
 | 
						|
            self.assertIn("generate-game-form", response.text,
 | 
						|
                          "Response did not get user back to the form")
 |