From 3b2c082743b930f22368db3a256016f34459a065 Mon Sep 17 00:00:00 2001 From: ThearchyHelios Date: Fri, 25 Sep 2026 17:04:56 +0800 Subject: [PATCH] =?UTF-8?q?check-ui=20=E8=B7=9F=E4=B8=8A=E3=80=8C=E5=9C=A8?= =?UTF-8?q?=E7=94=BB=E5=B8=83=E9=87=8C=E6=89=93=E5=BC=80=E3=80=8D=E7=9A=84?= =?UTF-8?q?=E6=96=B0=E8=A1=8C=E4=B8=BA=EF=BC=8C=E8=80=8C=E4=B8=94=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E5=BE=80=E5=BA=93=E9=87=8C=E5=86=99=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 429398a 把「在画布里打开」改成新建一张工作流、送去它自己的地址,但 check-ui 还断言 落在 /studio,那次提交也没跑 check-ui。更糟的是按钮本身会写库:照旧断言跑一次,库里 就多一张「问数据:…」。 现在拦下建图那次 POST,拿它自己发出去的图回一个"已建好",之后对这张图的读取也由检查 自己答;校验、变量分析只算不写,放行;其余写操作一律拦掉。断言改成:建了新图且送到 它的地址、建的是这一轮的图、没被别的工作流盖掉、没弹"未保存改动",最后核对库里的 工作流数前后不变。 check-ui 另有一项"本地哈希要标出没有语义能力"仍不过:配置的向量模型连不上、实际退回 local-hashing 时,页面按 kind === 'local' 判断,不提示。这是本分支之前的问题(11780ed), 这里不动。 --- scripts/check-ui.mjs | 47 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/scripts/check-ui.mjs b/scripts/check-ui.mjs index a39e33e1..be1890f2 100644 --- a/scripts/check-ui.mjs +++ b/scripts/check-ui.mjs @@ -354,10 +354,15 @@ console.log('\n=== URL 指得到 ===') } { - // 问数据页的「在画布里打开」:现在会直接把人送去 /studio。 - // 送过去的是一张还没存、没有 id 的草稿图,所以那边的"不带 id 就落到 - // 第一张图"必须让开——不让开就会拿第一张图把它盖掉,而且因为 setGraph - // 标了脏,还会先弹一句莫名其妙的"有未保存的改动" + // 问数据页的「在画布里打开」:建成一张新工作流、送去它自己的地址。 + // 以前只是把节点塞进画布,store 里的 workflow 还是上一张图,⌘S 就把那张 + // 整张覆盖了。要守的是:送到的是新图的地址、图没被别的工作流盖掉、 + // 没弹莫名其妙的"有未保存的改动"。 + // + // 这个按钮会写库。检查不该在库里留东西(以前按旧断言跑一次就多一张 + // 「问数据:…」),所以拦下建图那次 POST,拿它自己发出去的图回一个 + // "已建好",之后对这张图的读取也由这里答;校验、变量分析只算不写,放行 + const DRAFT = 'c0ffee00c0ffee00c0ffee00c0ffee00' const convs = await (await fetch(`${API}/conversations`)).json() let seed = null for (const c of convs.slice(0, 8)) { @@ -366,20 +371,50 @@ console.log('\n=== URL 指得到 ===') if (t) { seed = { id: c.id, want: t.graph.nodes.length }; break } } if (seed) { + const before = await (await fetch(`${API}/workflows`)).json() const page = await ctx.newPage() let dialogs = 0 page.on('dialog', async (d) => { dialogs++; await d.dismiss() }) + let created = null + await page.route('**/api/workflows**', (route) => { + const r = route.request() + const path = new URL(r.url()).pathname + if (r.method() === 'POST' && path.endsWith('/api/workflows')) { + const body = r.postDataJSON() + const now = new Date().toISOString().replace('Z', '') + created = { id: DRAFT, name: body.name, description: '', graph: body.graph, tags: [], + version: 1, is_template: false, status: 'draft', published_version: null, + created_at: now, updated_at: now, run_count: 0 } + return route.fulfill({ status: 201, json: created }) + } + if (path.includes(`/workflows/${DRAFT}`)) { + if (path.endsWith('/versions')) return route.fulfill({ json: [] }) + if (r.method() === 'GET' && created) return route.fulfill({ json: created }) + } + if (r.method() === 'GET' || /\/workflows\/(validate|variables)$/.test(path)) { + return route.continue() + } + return route.abort() // 其余写操作一律不放 + }) await page.goto(`${WEB}/chat/${seed.id}`, { waitUntil: 'networkidle' }) await page.waitForTimeout(900) const btn = page.getByRole('button', { name: '在画布里打开' }).first() if (await btn.count()) { await btn.click() - await page.waitForTimeout(1600) - check('「在画布里打开」会把人送到画布', page.url().endsWith('/studio'), page.url()) + await page.waitForURL(`**/studio/${DRAFT}`, { timeout: 5000 }).catch(() => {}) + await page.waitForTimeout(1200) + check('「在画布里打开」建了新图、送到它自己的地址', + !!created && page.url().endsWith(`/studio/${DRAFT}`), page.url()) + check('建的是这一轮的图,名字带着问题', + created?.graph?.nodes?.length === seed.want && created.name.startsWith('问数据:'), + created?.name) check('送过去的草稿图没被第一张工作流盖掉', (await page.locator('.react-flow__node').count()) === seed.want, `${await page.locator('.react-flow__node').count()} / ${seed.want} 个节点`) check('没有弹莫名其妙的"未保存改动"', dialogs === 0, `弹了 ${dialogs} 次`) + const after = await (await fetch(`${API}/workflows`)).json() + check('检查本身没往库里写图', after.length === before.length, + `${before.length} → ${after.length}`) } else { check('(跳过:这一轮没有「在画布里打开」)', true) }