2449e77461
## 变更 - 新增按服务 origin、平台 userId / Developer Key 摘要和本地 projectId 分区的 External Editor 项目绑定 - 新增按当前 principal、远端项目、本地 assetId、源 SHA-256、媒体类型和 canonical kind 分区的资源绑定 - manifest 中的 canvasProjectId / resourceId / assetObjectId 仅保留来源信息,不再作为当前账号的可编辑授权 - 切换账号后从本地正式资源重新上传、confirm、登记;图片、视频、角色动画、素材画布参考、art-spec 派生和 Direct 恢复统一使用当前账号绑定 - prepared / accepted / running 账本继续冻结原 principal;账号变化或远端结果不确定时停止补偿并保留现场等待对账 - 同步技术方案、decision log 和 pitfalls ## Review 结论 - 两路独立代码 review 均未发现剩余 P0-P2 - Review 发现并关闭了 max-pass 测试误放宽问题,恢复为绑定最大轮次的强断言 - 首轮 CI 暴露两处本 PR import 排序错误,已在独立提交09486f142中修复并复核 ## 验证 - Rust 完整测试:2301 passed,0 failed,16 ignored - Rust 集成与构建测试:5 + 2 + 14 passed - repository-ci 本地同构门禁通过:lint、typecheck、139 表 SpacetimeDB schema guard、403 个 appSurface 测试、web/admin-web build - External Editor procedure 真实 smoke 通过:精确重放、冲突、删除 fail-close、并发和孤儿检查 - Encoding check:5594 files - git diff --check 通过 - Gitea Project CI run 1253:Repository checks、Frontend、Backend、Native shell tests 全部通过 - 当前 heada0b8415be已合并 origin/master 44ee28c43,PR 无冲突 ## 后续依赖 PR #176 暴露了这一公共账号身份缺陷。该 PR 合并后,#176 需要 rebase,并删除或接入其局部 canonical cache,不能保留第二套账号绑定系统。 Reviewed-on: http://192.168.35.82/git/GenarrativeAI/Genarrative/pulls/182 Co-authored-by: kdletters <kdletters@qq.com> Co-committed-by: kdletters <kdletters@qq.com>
84 lines
2.1 KiB
TypeScript
84 lines
2.1 KiB
TypeScript
import { spawn } from 'node:child_process';
|
|
|
|
import { describe, expect, it } from 'vitest';
|
|
|
|
import {
|
|
parseProcedureOutput,
|
|
parseSqlRows,
|
|
sanitizeDiagnostic,
|
|
stopStandalone,
|
|
} from './spacetime-editor-idempotency-smoke.mjs';
|
|
|
|
describe('SpacetimeDB editor idempotency smoke parsers', () => {
|
|
it('parses successful and failed procedure SATS results', () => {
|
|
expect(
|
|
parseProcedureOutput(
|
|
'[true,[0,["project-a","owner-a"]],[1,[]]]',
|
|
'create_editor_project_and_return',
|
|
),
|
|
).toEqual({
|
|
ok: true,
|
|
record: ['project-a', 'owner-a'],
|
|
errorMessage: null,
|
|
});
|
|
expect(
|
|
parseProcedureOutput(
|
|
'[false,[1,[]],[0,"幂等创建冲突"]]',
|
|
'create_editor_project_and_return',
|
|
),
|
|
).toEqual({
|
|
ok: false,
|
|
record: null,
|
|
errorMessage: '幂等创建冲突',
|
|
});
|
|
expect(
|
|
parseProcedureOutput(
|
|
'[true,[1,[]],[0,["receipt-owner",[],[]]],[1,[]]]',
|
|
'delete_editor_asset_folder_and_return',
|
|
),
|
|
).toEqual({
|
|
ok: true,
|
|
record: ['receipt-owner', [], []],
|
|
errorMessage: null,
|
|
});
|
|
});
|
|
|
|
it('parses only the rows from one JSON SQL statement', () => {
|
|
const stdout = JSON.stringify([
|
|
{
|
|
schema: { elements: [{ name: 'project_id' }] },
|
|
rows: [['project-a'], ['project-b']],
|
|
total_duration_micros: 12,
|
|
},
|
|
]);
|
|
|
|
expect(parseSqlRows(stdout, 'projects')).toEqual([
|
|
['project-a'],
|
|
['project-b'],
|
|
]);
|
|
expect(() => parseSqlRows('[]', 'projects')).toThrow(
|
|
'invalid result shape',
|
|
);
|
|
});
|
|
|
|
it('redacts an isolated CLI token from diagnostics', () => {
|
|
expect(sanitizeDiagnostic('failed token-private', ['token-private'])).toBe(
|
|
'failed [redacted]',
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('SpacetimeDB editor idempotency smoke cleanup', () => {
|
|
it('terminates a live standalone-shaped child process', async () => {
|
|
const child = spawn(
|
|
process.execPath,
|
|
['-e', 'setInterval(() => {}, 1000)'],
|
|
{ stdio: 'ignore' },
|
|
);
|
|
|
|
await stopStandalone(child);
|
|
|
|
expect(child.exitCode !== null || child.signalCode !== null).toBe(true);
|
|
});
|
|
});
|