This commit is contained in:
2026-10-11 12:08:36 +07:00
parent 5973eaf072
commit b2798ae0e8
3 changed files with 41 additions and 3 deletions
+9
View File
@@ -33,6 +33,7 @@ python3 tests/venue/dns.py --server 192.168.10.155
```sh
python3 tests/venue/flow.py
python3 tests/venue/flow.py --browser
python3 tests/venue/flow.py --results
```
`flow.py` собирает актуальный Go/Vue-код во временном каталоге, поднимает
@@ -62,6 +63,14 @@ python3 tests/venue/flow.py --browser
backend, имитируя смену DNS; API-ответы не подменяются. Тестовые ссылки, ZIP,
профиль Firefox и сборки остаются во временном каталоге до конца прогона.
`--results` дополнительно проверяет этап 9: серверный сервис собирает ZIP
результатов обеих завершённых игр из реальной тестовой БД. Проверяются привязка
к исходному ZIP, прогресс/материалы/баллы, новый снимок после оценивания,
конкурентное оценивание, сохранность предыдущего пакета, повтор после
перезапуска и отсутствие изменений исходных игр. Локальные ссылки RustFS
в пакеты не попадают. ZIP находятся только во временном каталоге с правами
0600; новые API/UI для возврата и применение онлайн не выполняются.
### Ручная контрольная точка этапа 8
Автоматический прогон не заменяет проверку телефонов и камеры. После отдельного
+26
View File
@@ -19,6 +19,7 @@ import urllib.error
import urllib.parse
import urllib.request
import uuid
import zipfile
sys.dont_write_bytecode = True
ROOT = Path(__file__).resolve().parents[2]
@@ -371,6 +372,7 @@ def exercise(stand, data):
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--results', action='store_true', help='Also verify stage 9 result packages before/after restart')
parser.add_argument('--browser', action='store_true', help='Also run Firefox against the real APIs (Firefox required)')
args = parser.parse_args()
with tempfile.TemporaryDirectory(prefix='ed029-flow-') as directory:
@@ -389,6 +391,30 @@ def main():
assert imported['gameID'] == data['game'] and not imported['repeated']
for data in fixtures:
exercise(stand, data)
if args.results:
source_before = [stand.apis['prod'].game(data['game']) for data in fixtures]
venue_before = [stand.apis['venue'].game(data['game']) for data in fixtures]
for attempt in range(2):
if attempt:
stand.restart()
for data in fixtures:
with zipfile.ZipFile(stand.directory / f'game-{data["game"]}.zip') as archive:
manifest = json.loads(archive.read('manifest.json'))
result = run('env', f'TEST_DATABASE_URL=host={pg_address} user=test password=test-only dbname=test sslmode=disable',
f'ED029_RESULTS_GAME_ID={data["game"]}', f'ED029_RESULTS_PACKAGE_ID={manifest["package_id"]}',
f'ED029_RESULTS_DIR={stand.directory}', 'go', 'test', './internal/services/game_results_package_service',
'-run', 'TestVenueFlowResults', '-count=1', '-v', cwd=ROOT / 'evening_detective_server')
assert '--- PASS: TestVenueFlowResults' in result
with zipfile.ZipFile(stand.directory / f'results-{data["game"]}.zip') as archive:
result_manifest = json.loads(archive.read('manifest.json'))
payload = archive.read('results.json')
assert set(archive.namelist()) == {'manifest.json', 'results.json'}
assert result_manifest['source_sha256'] == hashlib.sha256(data['package']).hexdigest()
assert result_manifest['sha256'] == hashlib.sha256(payload).hexdigest()
assert b'game-import-' not in payload
assert [stand.apis['prod'].game(data['game']) for data in fixtures] == source_before
assert [stand.apis['venue'].game(data['game']) for data in fixtures] == venue_before
print('PASS: stage 9 real result packages, fresh grading, concurrent snapshots, restart and unchanged games', flush=True)
finally:
stand.close()
if args.browser: