Keep full consultation tool contracts unchanged. Persist short replies and refund the original reservation atomically while recording actual model usage. Verify Linux frontend 3566/3566, database 40/40, Static home and gzip +0.0493%. Co-Authored-By: Claude Code <noreply@anthropic.com>
91 lines
7.9 KiB
TypeScript
91 lines
7.9 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import { spawnSync } from "node:child_process";
|
|
import { fileURLToPath } from "node:url";
|
|
import test from "node:test";
|
|
import pg from "pg";
|
|
import { startPostgresFixture } from "./helpers/postgres-fixture.ts";
|
|
|
|
const runner = fileURLToPath(new URL("../scripts/db-migrate.mjs", import.meta.url));
|
|
const docker = spawnSync("docker", ["version", "--format", "{{.Server.Version}}"], { stdio: "ignore" }).status === 0;
|
|
const session = "99999999-9999-4999-8999-999999999971";
|
|
const otherSession = "99999999-9999-4999-8999-999999999972";
|
|
|
|
test("free completion atomically persists, refunds exact credits, records actual cost and guards trust/idempotency", { skip: docker ? false : "docker unavailable" }, async () => {
|
|
const fixture = startPostgresFixture();
|
|
try {
|
|
const migration = spawnSync(process.execPath, [runner], { encoding: "utf8", env: { ...process.env, SCHEMA_DATABASE_URL: fixture.connectionUrl("schema_owner", "schema-owner-test-password") } });
|
|
assert.equal(migration.status, 0, migration.stderr);
|
|
fixture.psqlAs("identity_runtime", "identity-runtime-test-password", `insert into identity.users(name,email,email_verified,email_verified_at) values ('Fictional Free','free@example.com',true,now()),('Fictional Other','other-free@example.com',true,now());`);
|
|
const user = fixture.psql("select id from identity.users where email='free@example.com'");
|
|
const other = fixture.psql("select id from identity.users where email='other-free@example.com'");
|
|
fixture.psql(`update public.profiles set credits=20 where id='${user}';
|
|
insert into public.chat_sessions(id,user_id,title,theme,model_id,messages,session_type,updated_at) values
|
|
('${session}','${user}','test','general','test-model','[]','consultation',now()),
|
|
('${otherSession}','${other}','test','general','test-model','[]','consultation',now());`);
|
|
const reserve = (id: string) => fixture.psql(`select success from public.reserve_consultation_usage('${user}','${id}','${session}','test-model',3)`);
|
|
const balance = () => fixture.psql(`select credits from public.profiles where id='${user}'`);
|
|
const completeSql = (id: string, reply = "你好", owner = user, sid = session, usage = '{"inputTokens":23,"outputTokens":7,"costMicrousd":91,"actualModelId":"test-model","modelConfigVersion":1}') =>
|
|
`select success::text || ':' || coalesce(error_code,'null') from public.complete_consultation_free('${owner}','${id}','${sid}','{"role":"assistant","text":"${reply}","responseKind":"smalltalk"}', '${usage}')`;
|
|
for (const role of ["authenticated", "anon", "app_runtime"]) {
|
|
assert.equal(fixture.psql(`select has_function_privilege('${role}','public.complete_consultation_free(uuid,text,uuid,jsonb,jsonb)','execute')`), "f");
|
|
}
|
|
assert.equal(fixture.psql("select has_function_privilege('service_role','public.complete_consultation_free(uuid,text,uuid,jsonb,jsonb)','execute')"), "t");
|
|
assert.equal(reserve("free-1"), "t"); assert.equal(balance(), "17");
|
|
assert.equal(fixture.psql(completeSql("free-1", "你好", other)), "f:request_missing");
|
|
assert.equal(fixture.psql(completeSql("free-1", "你好", user, otherSession)), "f:request_missing");
|
|
assert.equal(balance(), "17");
|
|
assert.equal(fixture.psql(`set role service_role; ${completeSql("free-1")}`).split("\n").at(-1), "true:null");
|
|
assert.equal(balance(), "20");
|
|
assert.equal(fixture.psql(completeSql("free-1")), "true:null");
|
|
assert.equal(fixture.psql(completeSql("free-1", "再见")), "f:response_conflict");
|
|
assert.equal(balance(), "20");
|
|
assert.equal(fixture.psql(`select jsonb_array_length(messages) from public.chat_sessions where id='${session}'`), "1");
|
|
assert.equal(fixture.psql(`select status || ':' || (response_message->>'responseKind') from public.consultation_requests where user_id='${user}' and request_id='free-1'`), "completed:smalltalk");
|
|
assert.equal(fixture.psql(`select input_tokens || ':' || output_tokens || ':' || cost_microusd || ':' || (metadata->>'freeCompletion') from public.usage_ledger where user_id='${user}' and request_id='free-1'`), "23:7:91:true");
|
|
assert.equal(fixture.psql(`select count(*) || ':' || sum(amount) from public.credit_transactions where user_id='${user}' and request_id='free-1' and transaction_type='refund'`), "1:3");
|
|
assert.equal(fixture.psql(`select status from public.usage_reservations where user_id='${user}' and request_id='free-1'`), "released");
|
|
assert.equal(fixture.psql(`select success::text || ':' || coalesce(error_code,'null') from public.cancel_consultation_credit('${user}','free-1')`), "f:request_completed");
|
|
|
|
assert.equal(reserve("cancelled"), "t");
|
|
fixture.psql(`select * from public.cancel_consultation_credit('${user}','cancelled')`);
|
|
assert.equal(fixture.psql(completeSql("cancelled")), "f:request_cancelled"); assert.equal(balance(), "20");
|
|
|
|
assert.equal(reserve("paid"), "t");
|
|
fixture.psql(`select * from public.complete_consultation_response('${user}','paid','${session}','{"role":"assistant","text":"paid consultation"}','{}')`);
|
|
assert.equal(fixture.psql(completeSql("paid")), "f:response_conflict"); assert.equal(balance(), "17");
|
|
assert.equal(fixture.psql(`select count(*) from public.credit_transactions where user_id='${user}' and request_id='paid' and transaction_type='refund'`), "0");
|
|
|
|
assert.equal(reserve("bad-usage"), "t");
|
|
assert.throws(() => fixture.psql(completeSql("bad-usage", "你好", user, session, '{"inputTokens":-1}')));
|
|
assert.equal(balance(), "14");
|
|
assert.equal(fixture.psql(`select status from public.consultation_requests where user_id='${user}' and request_id='bad-usage'`), "reserved");
|
|
assert.equal(fixture.psql(`select jsonb_array_length(messages) from public.chat_sessions where id='${session}'`), "2");
|
|
// A successful retry after a transaction rollback refunds once and persists once.
|
|
assert.equal(fixture.psql(completeSql("bad-usage")), "true:null"); assert.equal(balance(), "17");
|
|
|
|
// A subscription-shaped reservation has no credit debit/refund, and releases
|
|
// the same quota counter (reserved/completed rows) while preserving cost.
|
|
assert.equal(reserve("subscription-free"), "t");
|
|
fixture.psql(`update public.profiles set credits=credits+3 where id='${user}';
|
|
update public.usage_reservations set source='subscription',credit_amount=0 where user_id='${user}' and request_id='subscription-free';`);
|
|
assert.equal(fixture.psql(completeSql("subscription-free")), "true:null");
|
|
assert.equal(balance(), "17");
|
|
assert.equal(fixture.psql(`select count(*) from public.credit_transactions where user_id='${user}' and request_id='subscription-free' and transaction_type='refund'`), "0");
|
|
assert.equal(fixture.psql(`select count(*) from public.usage_reservations where user_id='${user}' and request_id='subscription-free' and status in ('reserved','completed')`), "0");
|
|
|
|
// Genuine concurrent connections: cancellation/free completion share one lock.
|
|
assert.equal(reserve("race"), "t");
|
|
const clients = [new pg.Client({ connectionString: fixture.connectionUrl("schema_owner", "schema-owner-test-password") }), new pg.Client({ connectionString: fixture.connectionUrl("schema_owner", "schema-owner-test-password") })];
|
|
try {
|
|
await Promise.all(clients.map((client) => client.connect()));
|
|
await Promise.all([
|
|
clients[0]!.query(completeSql("race")),
|
|
clients[1]!.query(`select * from public.cancel_consultation_credit('${user}','race')`),
|
|
]);
|
|
assert.equal(balance(), "17");
|
|
assert.equal(fixture.psql(`select count(*) from public.credit_transactions where user_id='${user}' and request_id='race' and transaction_type='refund'`), "1");
|
|
assert.match(fixture.psql(`select status from public.consultation_requests where user_id='${user}' and request_id='race'`), /^(completed|cancelled)$/);
|
|
} finally { await Promise.all(clients.map((client) => client.end())); }
|
|
} finally { fixture.stop(); }
|
|
});
|