Files
LangBot/web/tests/unit/plan-revisions.test.mjs
T
RockChinQandClaude Opus 5.5 16cfb6f8bd feat(cloud): show purchased plan revision alongside the latest revision
- Expose the workspace's purchased plan revision from the entitlement
  snapshot.
- Stack the purchased revision card in front of the latest revision in
  the plan comparison dialog; both cards share the same layout, and the
  purchased card's copy and prices come from the Space revision endpoint
  while benefits stay on the entitlement snapshot.
- Add a cancel-first tooltip for subscribing to the newer revision.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 00:25:41 +08:00

28 lines
2.0 KiB
JavaScript

import assert from 'node:assert/strict';
import test from 'node:test';
import { readFileSync } from 'node:fs';
import ts from 'typescript';
const m = { exports: {} };
new Function('module', 'exports', ts.transpileModule(readFileSync(new URL('../../src/app/home/components/workspace-settings/plan-revisions.ts', import.meta.url), 'utf8'), {compilerOptions: {module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2022}}).outputText)(m, m.exports);
const { revisionRows } = m.exports;
const current = { name: 'pro', revision: 1, limits: {'bots.max': 2, 'chat_history.retention_days': 30}, monthly_bonus_credits: 10, entitlement_features: {'platform.telegram': false, mcp_stdio: false} };
test('same version and revision-only changes do not duplicate comparisons', () => {
assert.ok(revisionRows(current, current).every(row => !row.changed));
assert.ok(revisionRows(current, {...current, revision: 2}).every(row => !row.changed));
});
test('compares effective quotas, credits, retention, platforms and feature switches', () => {
const latest = {name:'pro', revision:2, limits:{'bots.max':5}, chat_history_retention_days:60, monthly_bonus_credits:20, entitlement_features:{mcp_stdio:true}, disabled_adapters:[]};
const changed = revisionRows(current, latest).filter(row => row.changed);
assert.deepEqual(changed.map(row => row.key).sort(), ['feature:mcp_stdio','feature:platform.telegram','limit:bots.max','limit:chat_history.retention_days','monthly_credits'].sort());
assert.equal(changed.find(row => row.key === 'feature:platform.telegram').after, true);
});
test('catalog representations normalize to snapshot values', () => {
const latest = {name:'pro',revision:2,limits:{'bots.max':2},chat_history_retention_days:30,monthly_bonus_credits:10,disabled_adapters:['telegram']};
assert.ok(revisionRows(current, latest).every(row => !row.changed));
});
test('missing latest keeps current values without invented changes', () => {
const rows=revisionRows(current);
assert.equal(rows.find(row=>row.key==='limit:bots.max').before,2);
assert.ok(rows.every(row=>!row.changed));
});