Anydoc / anydoc parser engine (push) Canceled after 0s
App / Format, vet, test, and build (push) Canceled after 0s
CLI / test (macos-latest / go 1.26) (push) Canceled after 0s
CLI / test (ubuntu-latest / go 1.26) (push) Canceled after 0s
CLI / test (windows-latest / go 1.26) (push) Canceled after 0s
Build and Push Docker Image / build-ui (push) Canceled after 0s
Build and Push Docker Image / build-docreader (push) Canceled after 0s
Build and Push Docker Image / build-sandbox (push) Canceled after 0s
Build and Push Docker Image / build-app (amd64, linux/amd64, ubuntu-latest) (push) Canceled after 0s
Build and Push Docker Image / build-app (arm64, linux/arm64, ubuntu-24.04-arm) (push) Canceled after 0s
DocReader / Python tests and Go client tests (push) Canceled after 0s
Build & Publish (dsh-weknora) / Typecheck, test, pack (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (pinned) (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (latest, advisory) (push) Canceled after 0s
Frontend / Test, type-check, and build (push) Canceled after 0s
Go Lint Cache / warm lint cache (.) (push) Canceled after 0s
Go Lint Cache / warm lint cache (cli) (push) Canceled after 0s
Go Lint Cache / warm lint cache (client) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.10) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.11) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.12) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.13) (push) Canceled after 0s
Build and Push Docker Image / merge (push) Canceled after 0s
Build & Publish (dsh-weknora) / Publish to npm (push) Canceled after 0s
Build & Publish (mcp-server) / Build sdist + wheel (push) Canceled after 0s
Build & Publish (mcp-server) / Publish to PyPI (push) Canceled after 0s
78 lines
4.8 KiB
JavaScript
78 lines
4.8 KiB
JavaScript
const assert = require('node:assert/strict')
|
|
const fs = require('node:fs')
|
|
const { chromium } = require('/Users/macclaw/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/node_modules/playwright')
|
|
|
|
const directory = '/Volumes/Extreme SSD/yawan-storage/weknora/acceptance'
|
|
const origin = process.env.VERIFY_FRONTEND_ORIGIN || 'https://agent.pducv.cn'
|
|
const checks = [], failures = []
|
|
let browser
|
|
const check = (name, result) => { checks.push({name, passed: !!result}); assert.ok(result, name) }
|
|
|
|
async function main() {
|
|
const credentials = JSON.parse(fs.readFileSync(`${directory}/super-admin-login.json`, 'utf8'))
|
|
const response = await fetch(`${origin}/api/v1/auth/login`, {
|
|
method: 'POST', headers: {'Content-Type': 'application/json'},
|
|
body: JSON.stringify({email: credentials.email, password: credentials.password}),
|
|
signal: AbortSignal.timeout(30000),
|
|
})
|
|
assert.equal(response.status, 200)
|
|
const auth = await response.json()
|
|
browser = await chromium.launch({headless: true, channel: 'chrome'})
|
|
const context = await browser.newContext({viewport: {width: 1440, height: 1000}})
|
|
await context.addInitScript(a => {
|
|
const values = {
|
|
weknora_user: JSON.stringify({...a.user, tenant_id: String(a.user.tenant_id)}),
|
|
weknora_tenant: JSON.stringify({...a.active_tenant, id: '10059'}),
|
|
weknora_token: a.token, weknora_refresh_token: a.refresh_token,
|
|
weknora_memberships: JSON.stringify(a.memberships),
|
|
}
|
|
for (const [key, value] of Object.entries(values)) localStorage.setItem(key, value)
|
|
localStorage.setItem('weknora:new-user-guide-done:v1', '1')
|
|
}, auth)
|
|
const page = await context.newPage(), errors = [], writes = []
|
|
page.on('pageerror', e => errors.push(e.name))
|
|
page.on('request', request => {
|
|
if (request.method() === 'POST') writes.push(new URL(request.url()).pathname)
|
|
})
|
|
await page.goto(`${origin}/platform/agents`)
|
|
await page.getByRole('button', {name: 'AI 创建', exact: true}).waitFor()
|
|
await page.getByRole('button', {name: '手动创建', exact: true}).click()
|
|
await page.locator('.settings-modal').waitFor()
|
|
check('manual_creation_opens_editor_without_ai', !writes.includes('/api/v1/agents/draft'))
|
|
await page.screenshot({path: `${directory}/public-agent-manual-desktop.png`, animations: 'disabled'})
|
|
await page.locator('.settings-modal .close-btn').click()
|
|
await page.locator('.settings-modal').waitFor({state: 'hidden'})
|
|
await page.getByRole('button', {name: 'AI 创建', exact: true}).click()
|
|
const dialog = page.locator('.t-dialog').filter({hasText: 'AI 创建 Agent'})
|
|
await dialog.locator('textarea').fill('创建一个课程规划 Agent,面向新学员整理连续课程框架,每天衔接前一天的核心概念,并检查主题重复。只生成配置草稿。')
|
|
const generate = dialog.getByRole('button', {name: '生成配置', exact: true})
|
|
await page.setViewportSize({width: 390, height: 844})
|
|
const draftResponse = page.waitForResponse(r => new URL(r.url()).pathname === '/api/v1/agents/draft', {timeout: 120000})
|
|
await generate.click()
|
|
await dialog.locator('progress').waitFor()
|
|
check('ai_draft_has_visible_progress', await dialog.locator('progress').isVisible())
|
|
await page.screenshot({path: `${directory}/public-agent-ai-progress-mobile.png`, animations: 'disabled'})
|
|
check('ai_dialog_mobile_has_no_horizontal_overflow', await page.evaluate(() => document.documentElement.scrollWidth <= innerWidth + 2))
|
|
const result = await draftResponse
|
|
check(`configured_model_generates_real_draft_http_${result.status()}`, result.status() === 200)
|
|
const draft = (await result.json()).data
|
|
check('draft_has_no_persisted_resource_id', !!draft?.name && !draft.id)
|
|
await page.locator('.settings-modal').waitFor()
|
|
const name = page.locator('[data-guide="agent-create-name"] input')
|
|
await name.waitFor()
|
|
await page.waitForFunction(expected => document.querySelector('[data-guide="agent-create-name"] input')?.value === expected, draft.name)
|
|
check('generated_draft_is_editable_before_saving', await name.inputValue() === draft.name && await name.isEditable())
|
|
await page.screenshot({path: `${directory}/public-agent-ai-draft-mobile.png`, animations: 'disabled'})
|
|
await page.setViewportSize({width: 1440, height: 1000})
|
|
await page.screenshot({path: `${directory}/public-agent-ai-draft-desktop.png`, animations: 'disabled'})
|
|
check('ai_draft_does_not_auto_create_agent', !writes.includes('/api/v1/agents'))
|
|
check('agent_creation_has_no_javascript_errors', errors.length === 0)
|
|
}
|
|
|
|
main().catch(error => {failures.push(error.message); process.exitCode = 1}).finally(async () => {
|
|
if (browser) await browser.close()
|
|
const report = {checked_at: new Date().toISOString(), origin, checks, failures, passed: failures.length === 0}
|
|
fs.writeFileSync(`${directory}/public-agent-creation.json`, JSON.stringify(report, null, 2))
|
|
console.log(JSON.stringify(report))
|
|
})
|