-
Notifications
You must be signed in to change notification settings - Fork 693
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
WebHost: Fix too-many-players error not showing (#4033)
* 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
- Loading branch information
1 parent
97f2c25
commit 6287bc2
Showing
2 changed files
with
74 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
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") |