flnxi-Wu/license-server/lib/__tests__/premium-module-manifest.test.ts
2026-06-02 19:25:48 +08:00

91 lines
4.0 KiB
TypeScript

jest.mock('../crypto', () => ({
signData: jest.fn((data) => `signed:${data}`),
}));
describe('premium-module-manifest', () => {
beforeEach(() => {
jest.useFakeTimers();
jest.setSystemTime(new Date('2026-05-26T00:00:00.000Z'));
process.env.PREMIUM_MODULE_PACKAGE_SECRET = 'p'.repeat(32);
process.env.PREMIUM_MODULE_REGISTRY_BASE = 'registry.test/flnxi/premium';
process.env.PREMIUM_MODULE_VERSION = '1.0.0';
});
afterEach(() => {
jest.useRealTimers();
delete process.env.PREMIUM_MODULE_PACKAGE_SECRET;
delete process.env.PREMIUM_MODULE_REGISTRY_BASE;
delete process.env.PREMIUM_MODULE_VERSION;
});
it('应为标准版生成自定义模板核心模块清单', async () => {
const { buildSignedPremiumModuleManifest } = await import('../premium-module-manifest');
const result = buildSignedPremiumModuleManifest('STANDARD', new Date('2026-06-25T00:00:00.000Z'), 'instance-1');
expect(result.manifest.licenseType).toBe('STANDARD');
expect(result.manifest.instanceId).toBe('instance-1');
expect(result.manifest.modules.map((module) => module.id)).toEqual([
'license-limits-core',
'custom-templates-core',
]);
expect(result.manifest.modules[0].artifact).toEqual({
type: 'registry-image',
image: 'registry.test/flnxi/premium/license-limits-core:1.0.0',
digest: null,
version: '1.0.0',
});
expect(result.manifest.modules[0].limits).toEqual({ maxUsers: -1, maxMaterials: -1 });
expect(result.manifest.modules[0].sizeBytes).toBeGreaterThan(0);
expect(result.manifest.modules[0].sha256).toMatch(/^[a-f0-9]{64}$/);
expect(result.signature).toContain('signed:');
});
it('应为免费版生成限额授权模块清单', async () => {
const { buildSignedPremiumModuleManifest } = await import('../premium-module-manifest');
const result = buildSignedPremiumModuleManifest('FREE', new Date('2026-06-05T00:00:00.000Z'), 'instance-1');
expect(result.manifest.licenseType).toBe('FREE');
expect(result.manifest.modules.map((module) => module.id)).toEqual(['license-limits-core']);
expect(result.manifest.modules[0].minLicenseType).toBe('FREE');
expect(result.manifest.modules[0].limits).toEqual({ maxUsers: 10, maxMaterials: 100 });
});
it('应为专业版生成全部授权模块清单', async () => {
const { buildSignedPremiumModuleManifest } = await import('../premium-module-manifest');
const result = buildSignedPremiumModuleManifest('PRO', new Date('2026-07-25T00:00:00.000Z'), 'instance-1');
expect(result.manifest.modules.map((module) => module.id)).toEqual([
'license-limits-core',
'custom-templates-core',
'intranet-penetration-core',
]);
});
it('应生成和清单 hash 匹配的实例绑定授权凭证', async () => {
const { buildPremiumModuleEntitlement, buildSignedPremiumModuleManifest } = await import('../premium-module-manifest');
const leaseExpiresAt = new Date('2026-07-25T00:00:00.000Z');
const manifest = buildSignedPremiumModuleManifest('PRO', leaseExpiresAt, 'instance-1').manifest;
const entitlement = buildPremiumModuleEntitlement({
moduleId: 'intranet-penetration-core',
licenseType: 'PRO',
instanceId: 'instance-1',
leaseExpiresAt,
});
const manifestModule = manifest.modules.find((module) => module.id === 'intranet-penetration-core');
expect(entitlement.sha256).toBe(manifestModule?.sha256);
expect(entitlement.sizeBytes).toBe(manifestModule?.sizeBytes);
expect(entitlement.artifact).toEqual(manifestModule?.artifact);
expect(entitlement.entitlementBase64).not.toContain('intranetPenetration');
});
it('未配置授权模块镜像站时应拒绝生成清单', async () => {
delete process.env.PREMIUM_MODULE_REGISTRY_BASE;
const { buildSignedPremiumModuleManifest } = await import('../premium-module-manifest');
expect(() =>
buildSignedPremiumModuleManifest('STANDARD', new Date('2026-06-25T00:00:00.000Z'), 'instance-1')
).toThrow('PREMIUM_MODULE_REGISTRY_BASE');
});
});