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); }); });