mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-10-22 08:25:21 +08:00
- 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]>
28 lines
2.0 KiB
JavaScript
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));
|
|
});
|