Files
Ivan Fontosh 4b568ceb56 Add period-based license keys alongside fixed expiry dates.
New keys default to validDays with countdown starting on first activation; existing expiresAtSec keys behave unchanged.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-01 22:46:10 +08:00

68 lines
2.0 KiB
JavaScript

import assert from 'node:assert/strict';
import test from 'node:test';
import {
DEFAULT_VALID_DAYS,
ensurePeriodActivated,
enrichLicenseEntry,
getEffectiveExpSec,
isFixedKey,
isPeriodKey,
parseProductKeyExpiry,
resolveTokenExp,
SECONDS_PER_DAY,
} from '../lib/licenseLogic.mjs';
void test('parseProductKeyExpiry defaults to period', () => {
const r = parseProductKeyExpiry({});
assert.equal(r.ok, true);
assert.equal(r.validDays, DEFAULT_VALID_DAYS);
});
void test('parseProductKeyExpiry rejects conflicting expiry fields', () => {
const r = parseProductKeyExpiry({ expiresAtSec: 100, validDays: 30 });
assert.equal(r.ok, false);
assert.equal(r.error, 'conflicting_expiry');
});
void test('ensurePeriodActivated sets exp once for period keys', () => {
const pk = { validDays: 10 };
const first = ensurePeriodActivated(pk, 1000);
assert.equal(first.changed, true);
assert.equal(first.exp, 1000 + 10 * SECONDS_PER_DAY);
assert.equal(pk.activatedAtSec, 1000);
const second = ensurePeriodActivated(pk, 5000);
assert.equal(second.changed, false);
assert.equal(second.exp, first.exp);
});
void test('resolveTokenExp for fixed and period keys', () => {
const fixed = { expiresAtSec: 9999 };
assert.equal(resolveTokenExp(fixed, 100), 9999);
assert.ok(isFixedKey(fixed));
const period = { validDays: 7, licenseExpSec: 7000 };
assert.equal(resolveTokenExp(period, 100), 7000);
assert.ok(isPeriodKey(period));
});
void test('enrichLicenseEntry exposes expiry metadata', () => {
const fixed = enrichLicenseEntry(
{ key: 'k', sub: 's', pid: 'p', maxDevices: 1, expiresAtSec: 123 },
[],
false,
);
assert.equal(fixed.expiryMode, 'fixed');
assert.equal(fixed.effectiveExpSec, 123);
const period = enrichLicenseEntry(
{ key: 'k', sub: 's', pid: 'p', maxDevices: 1, validDays: 30 },
[],
false,
);
assert.equal(period.expiryMode, 'period');
assert.equal(period.effectiveExpSec, null);
assert.equal(getEffectiveExpSec({ validDays: 30, licenseExpSec: 555 }), 555);
});