'use strict'; const fs = require('node:fs'); const path = require('node:path'); const assert = require('node:assert/strict'); const { buildCandidate, assertCurrentBaseline, verifyUnchanged, schemaContent } = require('../scripts/publish-timecard-main.cjs'); const file = process.argv[2]; assert.ok(file, '请指定只读线上基线Schema文件;测试不发起网络请求'); const baseline = schemaContent(JSON.parse(fs.readFileSync(file, 'utf8'))); const actions = fs.readFileSync(path.join(__dirname, '../src/timecard-main.actions.js'), 'utf8'); const render = fs.readFileSync(path.join(__dirname, '../src/timecard-main.render.jsx'), 'utf8'); const candidate = buildCandidate(baseline, actions, render); assert.equal(candidate.functions, 110); assert.equal(candidate.schema.pages[0].componentsTree[0].dataSource.online.length, 9); verifyUnchanged(baseline, candidate.schema, candidate.paths); assertCurrentBaseline(baseline, structuredClone(baseline)); const revisionChanged = structuredClone(baseline); revisionChanged.gmtModified++; assert.throws(() => assertCurrentBaseline(baseline, revisionChanged), /线上页面已变化/); const configurationChanged = structuredClone(baseline); configurationChanged.config += ' '; assert.throws(() => assertCurrentBaseline(baseline, configurationChanged), /线上页面已变化/); const unauthorizedChange = structuredClone(candidate.schema); unauthorizedChange.pages[0].componentsTree[0].dataSource.online.pop(); assert.throws(() => verifyUnchanged(baseline, unauthorizedChange, candidate.paths)); const missingAction = structuredClone(baseline); missingAction.actions.list.push({ id: 'unexpectedExistingAction', title: '既有动作' }); assert.throws(() => buildCandidate(missingAction, actions, render), /不能移除原动作/); const duplicateJsx = structuredClone(baseline); duplicateJsx.pages[0].componentsTree.push({ componentName: 'Jsx', props: { render: {} } }); assert.throws(() => buildCandidate(duplicateJsx, actions, render), /唯一的既有Jsx/); assert.throws(() => buildCandidate(baseline, actions, render + '\n// 💾'), /EMOJI|emoji/i); assert.throws(() => schemaContent({ success: false, content: baseline }), /Schema响应无效/); console.log('通过:双文件编译、原配置与9个数据源保留、并发版本拒绝、范围外变更拒绝、动作删除拒绝及完整内容校验。');