up
This commit is contained in:
@@ -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
|
||||
|
||||
Автоматический прогон не заменяет проверку телефонов и камеры. После отдельного
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user