File size: 1,950 Bytes
ec8acdf | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | import { describe, it } from 'node:test';
import assert from 'node:assert/strict';
import { readFileSync } from 'node:fs';
describe('API plan-limit enforcement readiness contract', () => {
const notices = readFileSync('convex/apiPlanLimitNotices.ts', 'utf8');
const scanner = readFileSync('convex/apiPlanLimitUsage.ts', 'utf8');
const schema = readFileSync('convex/schema.ts', 'utf8');
const usageDocs = readFileSync('docs/usage-rate-limits.mdx', 'utf8');
const telemetryDocs = readFileSync('docs/architecture/usage-telemetry.md', 'utf8');
it('keeps scanner and readiness functions internal-only', () => {
assert.match(scanner, /export const scanApiPlanLimitUsageInternal = internalAction/);
assert.doesNotMatch(scanner, /export const scanApiPlanLimitUsage = action/);
assert.match(notices, /export const getEnforcementReadiness = internalQuery/);
});
it('blocks hard enforcement on missing notice lifecycle proof', () => {
assert.match(notices, /stale_notice_source/);
assert.match(notices, /email_pending/);
assert.match(notices, /email_failed/);
assert.match(notices, /blockedReason/);
assert.match(notices, /emailStatusAfterRescan/);
});
it('documents no automatic upgrade or overage charge', () => {
assert.match(usageDocs, /does \*\*not\*\* automatically upgrade/);
assert.match(usageDocs, /charge for overages/);
assert.match(usageDocs, /getEnforcementReadiness/);
});
it('documents scanner sources and the MCP limiter-hit dependency', () => {
assert.match(telemetryDocs, /AXIOM_QUERY_TOKEN/);
assert.match(telemetryDocs, /UPSTASH_REDIS_REST_URL/);
assert.match(telemetryDocs, /mcp\.rate_limit_hit/);
assert.match(telemetryDocs, /does not assume zero usage/);
assert.match(scanner, /tag == "mcp\.toolcall"/);
assert.match(scanner, /tag == "mcp\.rate_limit_hit"/);
assert.match(schema, /index\("by_validUntil", \["validUntil"\]\)/);
});
});
|