This commit is contained in:
oneao committed 2026-10-14 17:25:47 +08:00
1 parent 15e0ae5b67
commit e434374db5
71 files changed
+5726 -329

No files matched your search

@@ -0,0 +1,37 @@
import { test as base, expect } from '@playwright/test'
import { SESSION_STORAGE_KEY, loadSession, type PersistedSession } from './session'
export { expect }
/**
* 免登录的 test:每个 page 在应用脚本执行**之前**就把 sessionStorage 种好,
* 于是路由守卫(`isAuthenticated` 只看 token 非空)直接放行,用例一进站就是登录态。
*
* 为什么不是 `storageState`:token 存在 sessionStorage,而 Playwright 的 storageState
* 只覆盖 cookie + localStorage,种不进去。
*
* 这里覆盖的是内置 `context` fixture —— 同名依赖拿到的是基类的原始实现(不是自己,
* 否则就无限递归了)。放 `context` 而不是 `page`:addInitScript 挂在 context 上,
* 用例里新开的 tab / iframe 也一并生效。
*
* 手写等价物:
* sessionStorage.setItem('g3erp:login', JSON.stringify({ loginInfo: { token, user } }))
*
* ⚠️ 别在用例里真去提交登录表单:那会刷新服务端会话,把本轮其他并发用例一起踢下线。
* 要测登录流程本身,得先用一个**专用账号**,并关掉 VITE_DEV_AUTO_LOGIN。
*/
export const test = base.extend({
context: async ({ context }, use) => {
const { token, user } = loadSession()
const seed: PersistedSession = { loginInfo: { token, user } }
await context.addInitScript(
(payload: { key: string; value: PersistedSession }) => {
window.sessionStorage.setItem(payload.key, JSON.stringify(payload.value))
},
{ key: SESSION_STORAGE_KEY, value: seed },
)
await use(context)
},
})