mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-13 17:34:57 +03:00
feat(web-test): M8 — per-context lifecycle (closeContext + afterOpenContext/beforeCloseContext)
browser.mjs:
- + closeContext(name): logout slot + close page (tab) или context (window),
удаление из реестра. Throw если name неактивен (рулило: nicht den aktiven
closen, recorder always attached к active → invariant простой).
- _logoutSlot(slot, waitMs) — извлечён из disconnect, переиспользуется в
closeContext.
run.mjs:
- ensureContext() после createContext вызывает hooks.afterOpenContext(ctx, name, spec).
- wrapCloseContextHook() оборачивает ctx.closeContext (и каждую scoped-обёртку)
чтобы перед browser.closeContext fir'ить hooks.beforeCloseContext.
- Финальный teardown в finally: для всех живых контекстов кроме первого
(survivor) — beforeCloseContext + closeContext; для survivor только хук,
его закрывает disconnect().
_hooks.mjs v0.5:
- afterOpenContext инжектит persistent DOM-badge с displayName в правый
верхний угол page — в записанном видео всегда видно, какой контекст.
- beforeCloseContext counter-only.
- _state расширен полями afterOpenContext / beforeCloseContext.
15-multi-context-handover.test.mjs:
- +2 шага: closeContext('b') после handover, попытка closeContext(active)
ловится throw'ом с проверкой message.
00-hooks.test.mjs:
- +1 ассерт: afterOpenContext >= 1 (default уже создан), beforeCloseContext === 0
в теле первого теста.
spec §6:
- Раздел «Контекстный уровень» (afterOpenContext / beforeCloseContext + правила closeContext).
- ASCII-диаграмма порядка хуков обновлена с per-context lifecycle.
Регресс 19/19 ✓ (9m 16.8s).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -330,23 +330,41 @@ assert.noErrors(state, msg)
|
||||
- `afterEach(ctx)` -- после каждого теста. Дополнительно доступен `ctx.testResult`
|
||||
с результатом завершившегося теста (status/duration/error/...).
|
||||
|
||||
**Контекстный уровень** (на каждый browser-контекст, lifecycle = создан → удалён):
|
||||
- `afterOpenContext(ctx, name, spec)` -- сразу после успешного `createContext`.
|
||||
`spec` -- запись из `config.contexts[name]` со всеми custom-полями (`displayName`,
|
||||
`url`, `isolation`, ...). Полезно: инжект persistent overlay/badge,
|
||||
preload-навигация для контекста, регистрация телеметрии.
|
||||
- `beforeCloseContext(ctx, name, spec)` -- перед `closeContext` (контекст ещё
|
||||
активен и работает). Полезно: финальный flush, сбор метрик, последний скриншот.
|
||||
Срабатывает как при явном `ctx.closeContext(name)` из теста, так и в
|
||||
финальном teardown раннера перед `disconnect`.
|
||||
|
||||
`closeContext(name)` валиден только когда `name !== getActiveContext()` -- иначе
|
||||
бросает. В scoped API (`ctx.a.closeContext('b')`) это естественно: scoped-обёртка
|
||||
сначала `setActiveContext('a')`, потом close `'b'` -- target всегда не активен.
|
||||
|
||||
### Порядок выполнения
|
||||
|
||||
```
|
||||
prepare() // без браузера (восстановление БД, публикация)
|
||||
browser.launch() // запуск процесса браузера
|
||||
создание BrowserContext'ов // по одному на каждый используемый контекст
|
||||
beforeAll(ctx) // браузер готов, контексты созданы
|
||||
createContext(default) // первый контекст создан
|
||||
afterOpenContext(ctx, default) // hook: контекст готов
|
||||
beforeAll(ctx) // браузер готов, default-контекст создан
|
||||
[lazy ensureContext(name)] // для multi-context тестов
|
||||
afterOpenContext(ctx, name)
|
||||
beforeEach(ctx)
|
||||
test.setup(ctx) // подготовка теста
|
||||
test.default(ctx) // тело теста
|
||||
test.default(ctx) // тело теста (может вызвать ctx.closeContext)
|
||||
[при ctx.closeContext(x)]: beforeCloseContext(ctx, x) → close(x)
|
||||
test.teardown(ctx) // очистка теста (всегда)
|
||||
afterEach(ctx) // всегда
|
||||
[встроенный сброс] // всегда (для каждого активного контекста)
|
||||
[встроенный сброс] // всегда (для каждого живого контекста теста)
|
||||
...следующий тест...
|
||||
afterAll(ctx)
|
||||
закрытие всех BrowserContext'ов
|
||||
browser.close()
|
||||
[для каждого оставшегося контекста]: beforeCloseContext → closeContext
|
||||
browser.close() // финальный disconnect
|
||||
cleanup() // без браузера (удаление публикации)
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user