Files
Jyotisha/frontend/tests/rectification-segment-opening-route.test.ts
T
66f087b588 feat(rectification): submit varga-resolution implementation for review
Review-only snapshot for BUG-1115 through BUG-1117; not merge-ready. New opening and append-turn PostgreSQL permission failures remain blocked. Persisted joint replay has zero completed questions; segment ordering remains off by default. The existing offline replay JSON is retained stale and unchanged after a denied overwrite, including its CRLF line endings. Browser/provider validation and final serial gates remain pending. No deployment, role permission changes, or staging/main push.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-01 08:04:04 +08:00

59 lines
4.6 KiB
TypeScript

import assert from "node:assert/strict";
import { spawnSync } from "node:child_process";
import { fileURLToPath } from "node:url";
import test from "node:test";
// Fictional full-window route control, not engine calibration or a real database.
test("unique product targets finish the production opening route before model selection, billing or collect focus", () => {
const script = String.raw`
import assert from 'node:assert/strict';
import { mock } from 'node:test';
import { pathToFileURL } from 'node:url';
import { CASE_ID, SESSION_ID, USER_ID, TURN_ID, dossierFixture, computeFixture } from './tests/rectification-v9-test-support.ts';
import { buildSegmentSummary } from './src/lib/rectification-agentic/core/segment-summary.ts';
import { candidateRangeFingerprint } from './src/lib/rectification-agentic/v9/tool-service.ts';
const range = { start_time: '09:00', end_time: '09:20' };
const minutes = Array.from({length:21},(_,offset)=>({offset,date:'2000-06-14',time:'09:'+String(offset).padStart(2,'0'),signs:{D1:1,D9:2,D10:3}}));
const summary = buildSegmentSummary({minutes,candidates:[],targets:['D1','D9','D10'],windowMinutes:21,scanComplete:true});
const compute = computeFixture({ baselineBirthSnapshot: { birth_date:'2000-06-14',reported_birth_time:'09:10',latitude:40,longitude:-74,timezone_offset:-4 } });
const checks = {contract:'segment-opening-v1',domain:'general',range_fingerprint:candidateRangeFingerprint(range,compute.baseline_profile_fingerprint),status:'complete',summary};
const calls=[];
const dossier=dossierFixture({candidateRange:range,evidence:[],evidenceCount:0,turns:[],turnCount:0,latestResult:null});
dossier.case.status='draft'; dossier.case.rectification_domain='general'; dossier.case.checks=checks;
const accounting={rpc:async(fn,args)=>{
calls.push(fn);
if(fn==='get_agentic_rectification_case')return {error:null,data:dossier.case};
if(fn==='get_agentic_rectification_case_dossier')return {error:null,data:dossier};
if(fn==='get_agentic_rectification_case_compute')return {error:null,data:{...compute,candidate_range:range}};
if(fn==='finalize_agentic_rectification_segment_consistency_v1') {
assert.equal(args.p_range_fingerprint,checks.range_fingerprint);
return {error:null,data:{turn_id:TURN_ID}};
}
throw new Error('unexpected RPC '+fn);
}};
mock.module('server-only',{namedExports:{}});
mock.module('@/lib/supabase/server',{namedExports:{createServerSupabaseClient:async()=>({
auth:{getUser:async()=>({data:{user:{id:USER_ID}},error:null})},
from:()=>({select(){return this},eq(){return this},maybeSingle:async()=>({data:{id:SESSION_ID,session_type:'birth_time_rectification',agentic_rectification_case_id:CASE_ID,model_id:'synthetic',model_config_version:1},error:null})})
})}});
mock.module('@/lib/supabase/admin',{namedExports:{createAdminSupabaseClient:()=>accounting}});
mock.module('@/lib/product-access',{namedExports:{isProductEnabled:async()=>true}});
mock.module('@/lib/feature-flags',{namedExports:{loadRuntimeFeatureFlags:async()=>new Map([['rectification_runtime_version',{enabled:true}]])}});
mock.module('@/lib/model-catalog',{namedExports:{resolveSessionLanguageModel:async()=>{throw new Error('model selection must not run')}}});
mock.module('@/mastra/agentic-rectification',{namedExports:{getRectificationV9Agent:async()=>{throw new Error('agent must not run')}}});
const {POST}=await import(pathToFileURL(process.cwd()+'/src/app/api/rectification/agent/route.ts').href);
const response=await POST(new Request('https://example.invalid/api/rectification/agent',{method:'POST',headers:{'content-type':'application/json'},
body:JSON.stringify({caseId:CASE_ID,sessionId:SESSION_ID,requestId:TURN_ID,action:'opening'})}));
const body=await response.text(); assert.equal(response.status,200,body);
const events=body.trim().split('\n').map(line=>JSON.parse(line));
assert.match(events[0].text,/盘型一致,不用校正/);
assert.deepEqual(events.at(-1),{type:'run.completed',turnId:TURN_ID});
assert.equal(calls.filter(fn=>fn==='finalize_agentic_rectification_segment_consistency_v1').length,1);
assert.ok(!calls.some(fn=>/focus|billing|reserve|attempt|append/.test(fn)));
`;
const result = spawnSync(process.execPath, ["--experimental-test-module-mocks", "--import", "tsx", "--input-type=module", "--eval", script], {
cwd: fileURLToPath(new URL("../", import.meta.url)), encoding: "utf8", timeout: 60_000,
});
assert.equal(result.status, 0, result.stderr + result.stdout);
});