Files
Jyotisha/frontend/tests/database-billing-admin.test.ts

502 lines
39 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 { Client } from "pg";
import { startPostgresFixture } from "./helpers/postgres-fixture.ts";
const runnerPath = fileURLToPath(new URL("../scripts/db-migrate.mjs", import.meta.url));
const ids = {
owner: "10000000-0000-4000-8000-000000000001",
billing: "10000000-0000-4000-8000-000000000002",
model: "10000000-0000-4000-8000-000000000003",
support: "10000000-0000-4000-8000-000000000004",
auditor: "10000000-0000-4000-8000-000000000005",
subscriber: "20000000-0000-4000-8000-000000000001",
trialUser: "20000000-0000-4000-8000-000000000002",
annualUser: "20000000-0000-4000-8000-000000000003",
creditUser: "20000000-0000-4000-8000-000000000004",
snapshotUser: "20000000-0000-4000-8000-000000000005",
failedGrantUser: "20000000-0000-4000-8000-000000000006",
concurrentRenewalUser: "20000000-0000-4000-8000-000000000007",
concurrentOverlapUser: "20000000-0000-4000-8000-000000000008",
};
function orderNo(suffix: string) {
return `JYTEST${suffix.padEnd(18, "0")}`;
}
function sqlJson(value: unknown) {
return JSON.stringify(value).replaceAll("'", "''");
}
test("billing, subscriptions, usage authorization, RBAC, and model publication remain transactional", async () => {
const fixture = startPostgresFixture();
const sql = (statement: string) => fixture.psql(statement);
const sqlAsOwner = (statement: string) => fixture.psqlAs(
"schema_owner",
"schema-owner-test-password",
statement,
);
const expectSqlError = (statement: string, pattern: RegExp) => {
assert.throws(() => sqlAsOwner(statement), pattern);
};
const expectAdminRuntimeError = (statement: string, pattern: RegExp) => {
assert.throws(
() => fixture.psqlAs("admin_runtime", "admin-runtime-test-password", statement),
pattern,
);
};
const insertOrder = (input: {
suffix: string;
userId: string;
productId: string;
code: string;
version?: number;
money: number;
credits?: number;
}) => sql(`
insert into public.payment_orders (
order_no,user_id,package_id,product_id,product_code,product_version,
product_snapshot,entitlement_snapshot,money_cents,currency,credits,grant_status
)
select
'${orderNo(input.suffix)}','${input.userId}',null,p.id,p.code,p.version,
jsonb_build_object(
'id',p.id,'code',p.code,'version',p.version,'name',p.name,'description',p.description,
'productType',p.product_type,'billingPeriod',p.billing_period,'intervalCount',p.interval_count,
'priceCents',p.price_cents,'currency',p.currency,'oneTimePerUser',p.one_time_per_user
),
coalesce((select jsonb_agg(jsonb_build_object(
'featureKey',e.feature_key,'allowanceType',e.allowance_type,'allowanceCount',e.allowance_count,
'resetPeriod',e.reset_period,'modelTier',e.model_tier,'fairUsePolicyId',e.fair_use_policy_id,
'metadata',e.metadata
) order by e.feature_key) from public.product_entitlements e where e.product_id=p.id),'[]'::jsonb),
${input.money},'CNY',${input.credits ?? 0},'pending'
from public.billing_products p
where p.id='${input.productId}' and p.code='${input.code}' and p.version=${input.version ?? 1}
returning id
`);
const settleConcurrently = async (orders: Array<{ suffix: string; trade: string; money: number; hash: string }>) => {
const clients = orders.map(() => new Client({
connectionString: fixture.connectionUrl("postgres", "postgres-test-password"),
}));
await Promise.all(clients.map((client) => client.connect()));
try {
return await Promise.all(orders.map((order, index) => clients[index].query(
"select * from public.settle_order($1,$2,$3,$4)",
[orderNo(order.suffix), order.trade, order.money, order.hash],
)));
} finally {
await Promise.all(clients.map((client) => client.end()));
}
};
const completeUsageConcurrently = async (userId: string, requestId: string, events: Array<Record<string, unknown>>) => {
const clients = events.map(() => new Client({
connectionString: fixture.connectionUrl("postgres", "postgres-test-password"),
}));
await Promise.all(clients.map((client) => client.connect()));
try {
return await Promise.all(events.map((event, index) => clients[index].query(
"select * from public.complete_usage($1,$2,$3::jsonb)",
[userId, requestId, JSON.stringify(event)],
)));
} finally {
await Promise.all(clients.map((client) => client.end()));
}
};
try {
const migration = spawnSync(process.execPath, [runnerPath], {
encoding: "utf8",
env: {
...process.env,
SCHEMA_DATABASE_URL: fixture.connectionUrl("schema_owner", "schema-owner-test-password"),
},
});
assert.equal(migration.status, 0, migration.stderr);
assert.match(migration.stdout, /applied 20260807160000_model_provider_encrypted_credentials\.sql/);
fixture.psqlAs("identity_runtime", "identity-runtime-test-password", `
insert into identity.users (id,name,email,email_verified,email_verified_at,role) values
('${ids.owner}','Owner','owner@example.com',true,now(),'admin'),
('${ids.billing}','Billing','billing@example.com',true,now(),'user'),
('${ids.model}','Model','model@example.com',true,now(),'user'),
('${ids.support}','Support','support@example.com',true,now(),'user'),
('${ids.auditor}','Auditor','auditor@example.com',true,now(),'user'),
('${ids.subscriber}','Subscriber','subscriber@example.com',true,now(),'user'),
('${ids.trialUser}','Trial','trial@example.com',true,now(),'user'),
('${ids.annualUser}','Annual','annual@example.com',true,now(),'user'),
('${ids.creditUser}','Credit','credit@example.com',true,now(),'user'),
('${ids.snapshotUser}','Snapshot','snapshot@example.com',true,now(),'user'),
('${ids.failedGrantUser}','Failed Grant','failed-grant@example.com',true,now(),'user'),
('${ids.concurrentRenewalUser}','Concurrent Renewal','renewal@example.com',true,now(),'user'),
('${ids.concurrentOverlapUser}','Concurrent Overlap','overlap@example.com',true,now(),'user')
`);
sql(`
update public.profiles set credits=10 where id in ('${ids.subscriber}','${ids.creditUser}');
insert into public.admin_users(user_id,created_by) values
('${ids.owner}','${ids.owner}'),('${ids.billing}','${ids.owner}'),
('${ids.model}','${ids.owner}'),('${ids.support}','${ids.owner}'),('${ids.auditor}','${ids.owner}');
insert into public.admin_user_roles(admin_user_id,role_id,assigned_by)
select v.user_id,r.id,'${ids.owner}'::uuid
from (values
('${ids.owner}'::uuid,'owner'),('${ids.billing}'::uuid,'billing_admin'),
('${ids.model}'::uuid,'model_admin'),('${ids.support}'::uuid,'support'),
('${ids.auditor}'::uuid,'auditor')
) v(user_id,role_code) join public.admin_roles r on r.code=v.role_code
`);
assert.equal(sql(`select public.admin_has_permission('${ids.billing}','billing.products.publish')`), "t");
assert.equal(sql(`select public.admin_has_permission('${ids.billing}','models.publish')`), "f");
assert.equal(sql(`select public.admin_has_permission('${ids.model}','models.rollback')`), "t");
assert.equal(sql(`select public.admin_has_permission('${ids.model}','billing.adjustments.write')`), "f");
assert.equal(sql(`select public.admin_has_permission('${ids.support}','billing.orders.read')`), "t");
assert.equal(sql(`select public.admin_has_permission('${ids.support}','billing.products.write')`), "f");
assert.equal(sql(`select public.admin_has_permission('${ids.auditor}','audit.read')`), "t");
assert.equal(sql(`select public.admin_has_permission('${ids.auditor}','ops.flags.write')`), "f");
assert.equal(sql(`select public.admin_has_permission('${ids.owner}','admin.customers.birth_data.read')`), "t");
assert.equal(sql(`select public.admin_has_permission('${ids.support}','admin.customers.read')`), "t");
assert.equal(sql(`select public.admin_has_permission('${ids.support}','admin.customers.birth_data.read')`), "f");
assert.equal(sql("select pg_has_role('admin_runtime','service_role','MEMBER')"), "f");
assert.equal(sql("select has_function_privilege('admin_runtime','public.admin_permission_keys(uuid)','execute')"), "t");
assert.equal(sql("select has_column_privilege('admin_runtime','public.profiles','birth_date','select')"), "f");
expectAdminRuntimeError("set role service_role", /permission denied to set role/);
expectSqlError(
`select * from public.admin_manage_role('${ids.owner}','${ids.owner}','owner',false,'不得移除最后 Owner','last-owner')`,
/last_owner_protected/,
);
expectSqlError(
`update public.admin_users set revoked_at=clock_timestamp(),revoked_by='${ids.owner}' where user_id='${ids.owner}'`,
/last_owner_protected/,
);
sql(`select * from public.admin_manage_role('${ids.owner}','${ids.billing}','owner',true,'增加第二位 Owner','second-owner')`);
sql(`update public.admin_users set revoked_at=clock_timestamp(),revoked_by='${ids.billing}' where user_id='${ids.owner}'`);
assert.equal(sql(`select public.admin_has_permission('${ids.owner}','admin.access')`), "f");
expectSqlError(
`update public.admin_users set revoked_at=clock_timestamp(),revoked_by='${ids.billing}' where user_id='${ids.billing}'`,
/last_owner_protected/,
);
expectSqlError(
`delete from public.admin_user_roles where admin_user_id='${ids.billing}' and role_id=(select id from public.admin_roles where code='owner')`,
/last_owner_protected/,
);
sql(`update public.admin_users set revoked_at=null,revoked_by=null where user_id='${ids.owner}'`);
sql(`delete from public.admin_user_roles where admin_user_id='${ids.billing}' and role_id=(select id from public.admin_roles where code='owner')`);
sql(`
update public.profiles
set birth_date='1990-01-02', birth_time_status='reported', birth_place_label='Taipei'
where id='${ids.subscriber}'
`);
expectAdminRuntimeError(
`select * from public.admin_read_customer_birth_data('${ids.support}',array['${ids.subscriber}'::uuid],'support-birth-read')`,
/admin_permission_denied/,
);
assert.equal(
fixture.psqlAs(
"admin_runtime",
"admin-runtime-test-password",
`select birth_date||':'||birth_time_status||':'||birth_place_label
from public.admin_read_customer_birth_data('${ids.owner}',array['${ids.subscriber}'::uuid],'owner-birth-read')`,
),
"1990-01-02:reported:Taipei",
);
assert.equal(
sql(`select action||':'||permission_used from audit.admin_audit_logs where request_id='owner-birth-read'`),
"admin.customer.birth_data.read:admin.customers.birth_data.read",
);
sql(`
insert into public.admin_role_permissions(role_id,permission_id)
select r.id,p.id from public.admin_roles r cross join public.admin_permissions p
where r.code='support' and p.permission_key='admin.users.manage_roles'
on conflict do nothing;
insert into public.admin_user_roles(admin_user_id,role_id,assigned_by)
select '${ids.billing}',id,'${ids.owner}' from public.admin_roles where code='owner'
on conflict do nothing
`);
const ownerRaceClients = Array.from({ length: 3 }, () => new Client({
connectionString: fixture.connectionUrl("postgres", "postgres-test-password"),
}));
await Promise.all(ownerRaceClients.map(async (client) => {
await client.connect();
await client.query("set plpgsql.variable_conflict = use_column");
}));
const [blocker, firstOwnerRevoke, secondOwnerRevoke] = ownerRaceClients;
let revocations: Promise<unknown>[] = [];
try {
await blocker.query("begin");
await blocker.query("select pg_advisory_xact_lock(1096040772, 1)");
const first = firstOwnerRevoke.query(
"select * from public.admin_manage_role($1,$2,'owner',false,$3,$4)",
[ids.support, ids.owner, "并发移除 Owner A", "owner-race-a"],
);
const second = secondOwnerRevoke.query(
"select * from public.admin_manage_role($1,$2,'owner',false,$3,$4)",
[ids.support, ids.billing, "并发移除 Owner B", "owner-race-b"],
);
revocations = [first, second];
let waiters = 0;
for (let attempt = 0; attempt < 40 && waiters < 2; attempt += 1) {
await new Promise((resolve) => setTimeout(resolve, 25));
const result = await blocker.query<{ count: string }>(`
select count(*)::text as count from pg_stat_activity
where pid <> pg_backend_pid()
and query like '%admin_manage_role%'
and wait_event_type='Lock'
and wait_event='advisory'
`);
waiters = Number(result.rows[0]?.count ?? 0);
}
assert.equal(waiters, 2, "both Owner revocations must wait on the fixed advisory lock");
await blocker.query("commit");
const outcomes = await Promise.allSettled([first, second]);
assert.equal(
outcomes.filter((outcome) => outcome.status === "fulfilled").length,
1,
outcomes.map((outcome) => outcome.status === "fulfilled" ? "fulfilled" : String(outcome.reason?.message)).join(" | "),
);
const rejected = outcomes.find((outcome): outcome is PromiseRejectedResult => outcome.status === "rejected");
assert.match(String(rejected?.reason?.message), /last_owner_protected/);
assert.equal(sql(`select count(*) from public.admin_user_roles ur join public.admin_roles r on r.id=ur.role_id where r.code='owner'`), "1");
} finally {
await blocker.query("rollback").catch(() => undefined);
await Promise.allSettled(revocations);
await Promise.all(ownerRaceClients.map((client) => client.end()));
}
sql(`
insert into public.admin_user_roles(admin_user_id,role_id,assigned_by)
select '${ids.owner}',id,'${ids.owner}' from public.admin_roles where code='owner'
on conflict do nothing;
delete from public.admin_user_roles
where admin_user_id='${ids.billing}' and role_id=(select id from public.admin_roles where code='owner');
delete from public.admin_role_permissions
where role_id=(select id from public.admin_roles where code='support')
and permission_id=(select id from public.admin_permissions where permission_key='admin.users.manage_roles')
`);
const creditProduct = "30000000-0000-4000-8000-000000000001";
sql(`
insert into public.billing_products(id,code,version,name,product_type,billing_period,interval_count,price_cents,enabled,status,effective_from)
values('${creditProduct}','credits_10',1,'10 点积分','credit_pack','none',0,1000,true,'published',now());
insert into public.product_entitlements(product_id,feature_key,allowance_type,allowance_count,reset_period)
values('${creditProduct}','chat.standard','credits',10,'none')
`);
insertOrder({ suffix: "CREDIT", userId: ids.creditUser, productId: creditProduct, code: "credits_10", money: 1000, credits: 10 });
for (let attempt = 0; attempt < 5; attempt += 1) {
assert.equal(sql(`select success||':'||status from public.settle_order('${orderNo("CREDIT")}','trade-credit',1000,'hash-credit')`), "true:paid");
}
assert.equal(sql(`select credits from public.profiles where id='${ids.creditUser}'`), "20");
assert.equal(sql(`select count(*) from public.credit_transactions where user_id='${ids.creditUser}' and transaction_type='payment'`), "1");
const snapshotProduct = "30000000-0000-4000-8000-000000000002";
sql(`
insert into public.billing_products(id,code,version,name,product_type,billing_period,interval_count,price_cents,enabled,status,effective_from)
values('${snapshotProduct}','snapshot_monthly',1,'快照月卡','subscription','month',1,1200,true,'published',now());
insert into public.product_entitlements(product_id,feature_key,allowance_type,allowance_count,reset_period,model_tier)
values('${snapshotProduct}','chat.standard','quota',2,'billing_period','standard')
`);
insertOrder({ suffix: "SNAPSHOT", userId: ids.snapshotUser, productId: snapshotProduct, code: "snapshot_monthly", money: 1200 });
sql(`
update public.billing_products set billing_period='year',interval_count=2 where id='${snapshotProduct}';
update public.product_entitlements set allowance_count=99 where product_id='${snapshotProduct}'
`);
assert.equal(sql(`select success||':'||status from public.settle_order('${orderNo("SNAPSHOT")}','trade-snapshot',1200,'hash-snapshot')`), "true:paid");
assert.equal(sql(`select (ends_at=starts_at+interval '1 month')||':'||(entitlement_snapshot#>>'{0,allowanceCount}') from public.user_subscriptions where source_order_id=(select id from public.payment_orders where order_no='${orderNo("SNAPSHOT")}')`), "true:2");
assert.equal(sql(`select (s.product_snapshot=o.product_snapshot)||':'||(s.entitlement_snapshot=o.entitlement_snapshot) from public.user_subscriptions s join public.payment_orders o on o.id=s.source_order_id where o.order_no='${orderNo("SNAPSHOT")}'`), "true:true");
sql(`
create function public.test_fail_subscription_grant() returns trigger language plpgsql as $$
begin
if new.user_id='${ids.failedGrantUser}' then raise exception 'forced_grant_failure'; end if;
return new;
end $$;
create trigger test_fail_subscription_grant before insert on public.user_subscriptions
for each row execute function public.test_fail_subscription_grant()
`);
insertOrder({ suffix: "FAILGRANT", userId: ids.failedGrantUser, productId: "00000000-0000-4000-8000-000000000902", code: "standard_monthly", money: 9900 });
assert.equal(sql(`select success||':'||status from public.settle_order('${orderNo("FAILGRANT")}','trade-failed',9900,'hash-failed')`), "f:grant_failed");
const failedPaidAt = sql(`select paid_at from public.payment_orders where order_no='${orderNo("FAILGRANT")}'`);
assert.equal(sql(`select status||':'||grant_status||':'||(grant_error like '%forced_grant_failure%')||':'||epay_trade_no||':'||raw_notify_payload_hash||':'||(paid_at is not null) from public.payment_orders where order_no='${orderNo("FAILGRANT")}'`), "grant_pending:failed:true:trade-failed:hash-failed:true");
assert.equal(sql(`select success||':'||status from public.settle_order('${orderNo("FAILGRANT")}','trade-failed',9900,'hash-failed-retry')`), "f:grant_failed");
assert.equal(sql(`select count(*) from public.user_subscriptions where source_order_id=(select id from public.payment_orders where order_no='${orderNo("FAILGRANT")}')`), "0");
sql(`drop trigger test_fail_subscription_grant on public.user_subscriptions; drop function public.test_fail_subscription_grant()`);
assert.equal(sql(`select success||':'||status from public.settle_order('${orderNo("FAILGRANT")}','trade-failed',9900,'hash-failed-retry')`), "true:paid");
assert.equal(sql(`select (paid_at='${failedPaidAt}'::timestamptz)||':'||raw_notify_payload_hash||':'||grant_status from public.payment_orders where order_no='${orderNo("FAILGRANT")}'`), "true:hash-failed:granted");
assert.equal(sql(`select success||':'||status from public.settle_order('${orderNo("FAILGRANT")}','trade-failed',9900,'hash-after-grant')`), "true:paid");
assert.equal(sql(`select raw_notify_payload_hash from public.payment_orders where order_no='${orderNo("FAILGRANT")}'`), "hash-failed");
insertOrder({ suffix: "TRIAL1", userId: ids.trialUser, productId: "00000000-0000-4000-8000-000000000901", code: "trial_7d", money: 990 });
assert.equal(sql(`select success||':'||status from public.settle_order('${orderNo("TRIAL1")}','trade-trial-1',990,'hash-trial-1')`), "true:paid");
insertOrder({ suffix: "TRIAL2", userId: ids.trialUser, productId: "00000000-0000-4000-8000-000000000901", code: "trial_7d", money: 990 });
assert.equal(sql(`select success||':'||status from public.settle_order('${orderNo("TRIAL2")}','trade-trial-2',990,'hash-trial-2')`), "f:one_time_limit");
assert.equal(sql(`select count(*) from public.user_product_redemptions where user_id='${ids.trialUser}' and product_code='trial_7d'`), "1");
insertOrder({ suffix: "MONTH1", userId: ids.subscriber, productId: "00000000-0000-4000-8000-000000000902", code: "standard_monthly", money: 9900 });
assert.equal(sql(`select success||':'||status from public.settle_order('${orderNo("MONTH1")}','trade-month-1',9900,'hash-month-1')`), "true:paid");
const monthlySubscription = sql(`select grant_reference_id from public.payment_orders where order_no='${orderNo("MONTH1")}'`);
sql(`update public.user_subscriptions set starts_at='2026-07-31 10:00:00+00',ends_at='2026-08-31 10:00:00+00' where id='${monthlySubscription}'`);
insertOrder({ suffix: "MONTH2", userId: ids.subscriber, productId: "00000000-0000-4000-8000-000000000902", code: "standard_monthly", money: 9900 });
assert.equal(sql(`select success||':'||status from public.settle_order('${orderNo("MONTH2")}','trade-month-2',9900,'hash-month-2')`), "true:paid");
assert.equal(sql(`select to_char(starts_at at time zone 'UTC','YYYY-MM-DD HH24:MI')||':'||to_char(ends_at at time zone 'UTC','YYYY-MM-DD HH24:MI') from public.user_subscriptions where source_order_id=(select id from public.payment_orders where order_no='${orderNo("MONTH2")}')`), "2026-08-31 10:00:2026-09-30 10:00");
insertOrder({ suffix: "OVERLAP", userId: ids.subscriber, productId: "00000000-0000-4000-8000-000000000903", code: "standard_yearly", money: 59900 });
assert.equal(sql(`select success||':'||status from public.settle_order('${orderNo("OVERLAP")}','trade-overlap',59900,'hash-overlap')`), "f:overlapping_subscription");
insertOrder({ suffix: "YEAR1", userId: ids.annualUser, productId: "00000000-0000-4000-8000-000000000903", code: "standard_yearly", money: 59900 });
assert.equal(sql(`select success||':'||status from public.settle_order('${orderNo("YEAR1")}','trade-year-1',59900,'hash-year-1')`), "true:paid");
const annualSubscription = sql(`select grant_reference_id from public.payment_orders where order_no='${orderNo("YEAR1")}'`);
sql(`update public.user_subscriptions set starts_at='2027-02-28 00:00:00+00',ends_at='2028-02-29 00:00:00+00' where id='${annualSubscription}'`);
insertOrder({ suffix: "YEAR2", userId: ids.annualUser, productId: "00000000-0000-4000-8000-000000000903", code: "standard_yearly", money: 59900 });
assert.equal(sql(`select success||':'||status from public.settle_order('${orderNo("YEAR2")}','trade-year-2',59900,'hash-year-2')`), "true:paid");
assert.equal(sql(`select to_char(ends_at at time zone 'UTC','YYYY-MM-DD') from public.user_subscriptions where source_order_id=(select id from public.payment_orders where order_no='${orderNo("YEAR2")}')`), "2029-02-28");
sql(`update public.user_subscriptions set starts_at=clock_timestamp()-interval '1 day',ends_at=clock_timestamp()+interval '1 year' where id='${annualSubscription}'`);
assert.equal(sql(`select source||':'||credits from public.authorize_usage('${ids.annualUser}','rectification',null,'annual-monthly-release-1',1)`), "subscription:0");
assert.equal(sql(`select success||':'||reason||':'||credits from public.authorize_usage('${ids.annualUser}','rectification',null,'annual-monthly-release-2',1)`), "f:feature_quota_exhausted:0");
sql(`update public.user_subscriptions set starts_at=clock_timestamp()-interval '1 month 1 day' where id='${annualSubscription}'`);
assert.equal(sql(`select source||':'||credits from public.authorize_usage('${ids.annualUser}','rectification',null,'annual-monthly-release-2',1)`), "subscription:0");
sql(`
create function public.test_delay_concurrent_subscription_grant() returns trigger language plpgsql as $$
begin
if new.user_id in ('${ids.concurrentRenewalUser}','${ids.concurrentOverlapUser}') then perform pg_sleep(0.35); end if;
return new;
end $$;
create trigger test_delay_concurrent_subscription_grant before insert on public.user_subscriptions
for each row execute function public.test_delay_concurrent_subscription_grant()
`);
insertOrder({ suffix: "RENEW1", userId: ids.concurrentRenewalUser, productId: "00000000-0000-4000-8000-000000000902", code: "standard_monthly", money: 9900 });
insertOrder({ suffix: "RENEW2", userId: ids.concurrentRenewalUser, productId: "00000000-0000-4000-8000-000000000902", code: "standard_monthly", money: 9900 });
const renewalResults = await settleConcurrently([
{ suffix: "RENEW1", trade: "trade-renew-1", money: 9900, hash: "hash-renew-1" },
{ suffix: "RENEW2", trade: "trade-renew-2", money: 9900, hash: "hash-renew-2" },
]);
assert.deepEqual(renewalResults.map((result) => result.rows[0].success), [true, true]);
assert.equal(sql(`select count(*) from public.user_subscriptions where user_id='${ids.concurrentRenewalUser}'`), "2");
assert.equal(sql(`select count(*) from (select starts_at,lag(ends_at) over(order by starts_at) previous_ends_at from public.user_subscriptions where user_id='${ids.concurrentRenewalUser}') s where starts_at=previous_ends_at`), "1");
insertOrder({ suffix: "MIXED1", userId: ids.concurrentOverlapUser, productId: "00000000-0000-4000-8000-000000000902", code: "standard_monthly", money: 9900 });
insertOrder({ suffix: "MIXED2", userId: ids.concurrentOverlapUser, productId: "00000000-0000-4000-8000-000000000903", code: "standard_yearly", money: 59900 });
const overlapResults = await settleConcurrently([
{ suffix: "MIXED1", trade: "trade-mixed-1", money: 9900, hash: "hash-mixed-1" },
{ suffix: "MIXED2", trade: "trade-mixed-2", money: 59900, hash: "hash-mixed-2" },
]);
assert.equal(overlapResults.filter((result) => result.rows[0].success).length, 1);
assert.equal(overlapResults.filter((result) => result.rows[0].status === "overlapping_subscription").length, 1);
assert.equal(sql(`select count(*) from public.user_subscriptions where user_id='${ids.concurrentOverlapUser}'`), "1");
assert.equal(sql(`select count(*) from public.payment_orders where user_id='${ids.concurrentOverlapUser}' and grant_status='failed' and grant_error='overlapping_subscription'`), "1");
sql(`drop trigger test_delay_concurrent_subscription_grant on public.user_subscriptions; drop function public.test_delay_concurrent_subscription_grant()`);
const agenticCaseKey = "rectification:40000000-0000-4000-8000-000000000007";
const agenticReservation = sql(`select reservation_id from public.authorize_usage('${ids.creditUser}','rectification',null,'${agenticCaseKey}',2)`);
assert.equal(sql(`select reservation_id||':'||credits from public.authorize_usage('${ids.creditUser}','rectification',null,'${agenticCaseKey}',2)`), `${agenticReservation}:18`);
assert.equal(sql(`select success||':'||reason from public.authorize_usage('${ids.creditUser}','report.full',null,'${agenticCaseKey}',2)`), "f:request_conflict");
assert.equal(sql(`select success||':'||reason from public.authorize_usage('${ids.creditUser}','rectification','standard-model','${agenticCaseKey}',2)`), "f:request_conflict");
assert.equal(sql(`select success||':'||reason from public.authorize_usage('${ids.creditUser}','rectification',null,'${agenticCaseKey}',3)`), "f:request_conflict");
const firstTurnUsage = { eventKey: "turn-1", actualModelId: "standard-model", inputTokens: 10, outputTokens: 5, costMicrousd: 100, durationMs: 1000 };
assert.equal(sql(`select success||':'||credits from public.complete_usage('${ids.creditUser}','${agenticCaseKey}','${sqlJson(firstTurnUsage)}'::jsonb)`), "true:18");
assert.equal(sql(`select success||':'||credits from public.complete_usage('${ids.creditUser}','${agenticCaseKey}','${sqlJson(firstTurnUsage)}'::jsonb)`), "true:18");
assert.equal(sql(`select success||':'||error_code from public.complete_usage('${ids.creditUser}','${agenticCaseKey}','${sqlJson({ ...firstTurnUsage, outputTokens: 6 })}'::jsonb)`), "f:event_payload_conflict");
const concurrentUsage = await completeUsageConcurrently(ids.creditUser, agenticCaseKey, [
{ eventKey: "turn-2", actualModelId: "standard-model", inputTokens: 20, outputTokens: 10, costMicrousd: 200, durationMs: 2000 },
{ eventKey: "turn-3", actualModelId: "standard-model", inputTokens: 30, outputTokens: 15, costMicrousd: 300, durationMs: 3000 },
]);
assert.deepEqual(concurrentUsage.map((result) => result.rows[0].success), [true, true]);
assert.equal(sql(`select reservation_id||':'||credits from public.authorize_usage('${ids.creditUser}','rectification',null,'${agenticCaseKey}',2)`), `${agenticReservation}:18`);
assert.equal(sql(`select count(*) from public.usage_reservations where user_id='${ids.creditUser}' and request_id='${agenticCaseKey}'`), "1");
assert.equal(sql(`select count(*) from public.credit_transactions where user_id='${ids.creditUser}' and request_id='${agenticCaseKey}' and transaction_type='reserve'`), "1");
assert.equal(sql(`select count(*) from public.usage_events where reservation_id='${agenticReservation}'`), "3");
assert.equal(sql(`select input_tokens||':'||output_tokens||':'||cost_microusd||':'||duration_ms from public.usage_ledger where reservation_id='${agenticReservation}'`), "60:30:600:6000");
sql(`update public.user_subscriptions set entitlement_snapshot='[{"featureKey":"chat.standard","allowanceType":"quota","allowanceCount":1,"resetPeriod":"billing_period","modelTier":"standard","metadata":{}}]'::jsonb where id='${monthlySubscription}'`);
assert.equal(sql(`select source||':'||credits from public.authorize_usage('${ids.subscriber}','chat.standard',null,'quota-covered',1)`), "subscription:10");
assert.equal(sql(`select source||':'||credits from public.authorize_usage('${ids.subscriber}','chat.standard',null,'quota-fallback',1)`), "credits:9");
sql(`select * from public.release_usage('${ids.subscriber}','quota-covered','quota test cleanup')`);
sql(`select * from public.release_usage('${ids.subscriber}','quota-fallback','quota test cleanup')`);
sql(`update public.user_subscriptions set entitlement_snapshot='[{"featureKey":"chat.standard","allowanceType":"unlimited","allowanceCount":null,"resetPeriod":"billing_period","modelTier":"standard","metadata":{"minuteLimit":1}}]'::jsonb where id='${monthlySubscription}'`);
assert.equal(sql(`select source||':'||credits from public.authorize_usage('${ids.subscriber}','chat.standard',null,'fair-covered',1)`), "subscription:10");
assert.equal(sql(`select source||':'||credits from public.authorize_usage('${ids.subscriber}','chat.standard',null,'fair-fallback',1)`), "credits:9");
sql(`select * from public.release_usage('${ids.subscriber}','fair-covered','fair use test cleanup')`);
sql(`select * from public.release_usage('${ids.subscriber}','fair-fallback','fair use test cleanup')`);
sql(`update public.user_subscriptions s set entitlement_snapshot=o.entitlement_snapshot from public.payment_orders o where s.id='${monthlySubscription}' and o.id=s.source_order_id`);
assert.equal(sql(`select source||':'||credits from public.authorize_usage('${ids.subscriber}','chat.standard',null,'subscription-chat',1)`), "subscription:10");
assert.equal(sql(`select success from public.complete_usage('${ids.subscriber}','subscription-chat','{"actualModelId":"standard-model","modelConfigVersion":7,"inputTokens":120,"outputTokens":45,"costMicrousd":321,"durationMs":900}'::jsonb)`), "t");
assert.equal(sql(`select actual_model_id||':'||model_config_version||':'||input_tokens||':'||output_tokens||':'||cost_microusd from public.usage_ledger where user_id='${ids.subscriber}' and request_id='subscription-chat'`), "standard-model:7:120:45:321");
assert.equal(sql(`select credits from public.profiles where id='${ids.subscriber}'`), "10");
assert.equal(sql(`select error_code from public.release_usage('${ids.subscriber}','subscription-chat','late release')`), "request_completed");
sql(`update public.feature_flags set enabled=false,rollout_percentage=0 where flag_key='billing.subscriptions' and status='published'`);
assert.equal(sql(`select source||':'||credits from public.authorize_usage('${ids.subscriber}','chat.standard',null,'flag-off-chat',1)`), "credits:9");
assert.equal(sql(`select success from public.complete_usage('${ids.subscriber}','flag-off-chat','{"eventKey":"flag-off-turn"}'::jsonb)`), "t");
assert.equal(sql(`select count(*) from public.usage_reservations where request_id='flag-off-chat' and source='subscription'`), "0");
assert.equal(sql(`select credits from public.profiles where id='${ids.subscriber}'`), "9");
assert.equal(sql(`select success||':'||status from public.settle_order('${orderNo("SNAPSHOT")}','trade-snapshot',1200,'hash-snapshot-flag-off')`), "true:paid");
assert.equal(sql(`select success||':'||status from public.settle_epay_order('${orderNo("SNAPSHOT")}','trade-snapshot',1200,'hash-snapshot-notify-flag-off')`), "true:paid");
assert.equal(sql(`select count(*) from public.user_subscriptions where source_order_id=(select id from public.payment_orders where order_no='${orderNo("SNAPSHOT")}')`), "1");
sql(`update public.profiles set credits=10 where id='${ids.subscriber}'`);
sql(`update public.feature_flags set enabled=true,rollout_percentage=100 where flag_key='billing.subscriptions' and status='published'`);
assert.equal(sql(`select source||':'||credits from public.authorize_usage('${ids.subscriber}','chat.standard',null,'flag-on-chat',1)`), "subscription:10");
sql(`select * from public.release_usage('${ids.subscriber}','flag-on-chat','feature flag test cleanup')`);
sql(`update public.user_subscriptions set starts_at=clock_timestamp()-interval '2 months',ends_at=clock_timestamp()-interval '1 second' where id='${monthlySubscription}'`);
assert.equal(sql(`select source||':'||credits from public.authorize_usage('${ids.subscriber}','chat.standard',null,'credit-chat',1)`), "credits:9");
assert.equal(sql(`select source||':'||credits from public.authorize_usage('${ids.subscriber}','chat.standard',null,'credit-chat',1)`), "credits:9");
assert.equal(sql(`select count(*) from public.credit_transactions where user_id='${ids.subscriber}' and request_id='credit-chat' and transaction_type='reserve'`), "1");
assert.equal(sql(`select success||':'||credits from public.release_usage('${ids.subscriber}','credit-chat','generation failed')`), "true:10");
assert.equal(sql(`select count(*) from public.credit_transactions where user_id='${ids.subscriber}' and request_id='credit-chat' and transaction_type='refund'`), "1");
sql(`update public.user_subscriptions set starts_at=clock_timestamp()-interval '1 day',ends_at=clock_timestamp()+interval '1 month' where id='${monthlySubscription}'`);
const provider = sql(`select public.admin_save_model_provider('${ids.model}',null,'Test Provider','openai',null,'test-encrypted-api-key',true,'新增测试供应商','provider-1')`);
const premiumDraft = sql(`select public.admin_save_model_draft('${ids.model}','premium-model',null,'${provider}','Premium','', 'premium-v1','premium',2,128000,100,200,true,true,null,'{}','新增高级模型','premium-draft-1')`);
sql(`select public.admin_record_model_connection_test('${ids.model}','${premiumDraft}',200,'premium-test-1')`);
sql(`select public.admin_publish_model('${ids.model}','${premiumDraft}','发布高级模型','premium-publish-1')`);
assert.equal(sql(`select source||':'||credits from public.authorize_usage('${ids.subscriber}','chat.standard','premium-model','premium-fallback',2)`), "credits:8");
sql(`select * from public.release_usage('${ids.subscriber}','premium-fallback','premium not covered')`);
const currentEnds = sql(`select ends_at from public.user_subscriptions where id='${monthlySubscription}'`);
sql(`select public.admin_adjust_subscription('${ids.billing}','${monthlySubscription}','extend',3,'${currentEnds}','人工补偿三天','adjust-1')`);
expectSqlError(
`select public.admin_adjust_subscription('${ids.billing}','${monthlySubscription}','extend',1,'${currentEnds}','使用过期版本调整','adjust-stale')`,
/subscription_version_conflict/,
);
sql(`update public.model_config_versions set is_default=false where id='${premiumDraft}'`);
const nonDefaultDraft = sql(`select public.admin_save_model_draft('${ids.model}','standard-model',null,'${provider}','Standard','', 'standard-v1','standard',1,64000,10,20,true,false,null,'{}','新增标准模型','standard-draft-1')`);
sql(`select public.admin_record_model_connection_test('${ids.model}','${nonDefaultDraft}',200,'standard-test-invalid')`);
expectSqlError(
`select public.admin_publish_model('${ids.model}','${nonDefaultDraft}','无默认模型不得发布','standard-publish-invalid')`,
/default_model_required/,
);
sql(`select public.admin_save_model_draft('${ids.model}','standard-model','${nonDefaultDraft}','${provider}','Standard','', 'standard-v1','standard',1,64000,10,20,true,true,null,'{}','设为默认模型','standard-draft-default')`);
sql(`select public.admin_record_model_connection_test('${ids.model}','${nonDefaultDraft}',200,'standard-test-1')`);
sql(`select public.admin_publish_model('${ids.model}','${nonDefaultDraft}','发布默认模型','standard-publish-1')`);
assert.equal(sql(`select count(*) from public.model_config_versions where status='published' and enabled and is_default`), "1");
const standardV2 = sql(`select public.admin_save_model_draft('${ids.model}','standard-model',null,'${provider}','Standard 2','', 'standard-v2','standard',1,64000,11,21,true,true,null,'{}','新建第二版','standard-draft-2')`);
sql(`select public.admin_record_model_connection_test('${ids.model}','${standardV2}',200,'standard-test-2')`);
sql(`select public.admin_publish_model('${ids.model}','${standardV2}','发布第二版','standard-publish-2')`);
const standardConfig = sql("select id from public.model_configs where model_id='standard-model'");
sql(`select public.admin_record_model_connection_test('${ids.model}','${nonDefaultDraft}',200,'standard-rollback-1')`);
sql(`select public.admin_rollback_model('${ids.model}','${standardConfig}',1,'回滚第一版','standard-rollback-1')`);
assert.equal(sql("select version from public.model_config_versions where config_id=(select id from public.model_configs where model_id='standard-model') and status='published'"), "1");
const standardV3 = sql(`select public.admin_save_model_draft('${ids.model}','standard-model',null,'${provider}','Standard 3','', 'standard-v3','standard',1,64000,12,22,true,false,'premium-model','{}','设置回退到高级模型','standard-draft-3')`);
sql(`select public.admin_record_model_connection_test('${ids.model}','${standardV3}',200,'standard-test-3')`);
sql(`select public.admin_publish_model('${ids.model}','${standardV3}','发布第三版','standard-publish-3')`);
const premiumV2 = sql(`select public.admin_save_model_draft('${ids.model}','premium-model',null,'${provider}','Premium 2','', 'premium-v2','premium',2,128000,101,201,true,true,'standard-model','{}','构造循环回退草稿','premium-draft-2')`);
sql(`select public.admin_record_model_connection_test('${ids.model}','${premiumV2}',200,'premium-test-cycle')`);
expectSqlError(
`select public.admin_publish_model('${ids.model}','${premiumV2}','循环回退不得发布','premium-publish-cycle')`,
/model_fallback_cycle/,
);
assert.equal(sql(`select count(*) from public.model_config_versions where status='published' and enabled and is_default`), "1");
assert.equal(sql(`select count(*) from public.model_publish_events where action='rollback'`), "1");
} finally {
fixture.stop();
}
});