文件
OmniCard/backend/test/comm/omni.test.ts

171 行
5.0 KiB
TypeScript

import {
CardProfile,
CardStatus,
BentoBlock,
BentoBlockType,
BentoColSpan,
BentoRowSpan,
LeadEntity,
LeadStatus,
LeadSource,
RadarTrack,
TouchType,
NFCRecord,
NFCMaterial,
NFCStatus,
NFCSceneMode,
TenantProfile,
TenantPlanType,
BrandKit,
} from '../../src/comm/types/omni';
describe('OmniCard AI 核心跨端数据契约与 TypeScript 类型体系测试', () => {
it('应正确支持 CardProfile 契约及其字段与状态枚举', () => {
const cardStatus: CardStatus = 'published';
const card: CardProfile = {
id: 'card_1001',
tenantId: 'tenant_888',
userId: 'user_001',
name: 'Alex Rivera',
title: 'Global VP of Business Development',
company: 'OmniCard Global Ltd.',
slogan: 'Empowering global trade with AI',
avatarUrl: 'https://cdn.omnicard.ai/avatars/alex.jpg',
phone: '+1-555-892-0199',
email: 'alex@omnicard.ai',
whatsapp: '+15558920199',
linkedin: 'https://linkedin.com/in/alex-rivera-global',
timezone: 'UTC+8',
audioPronunciationUrl: 'https://cdn.omnicard.ai/audio/alex.mp3',
status: cardStatus,
themeCode: 'corporate_navy',
};
expect(card.id).toBe('card_1001');
expect(card.name).toBe('Alex Rivera');
expect(card.status).toBe('published');
expect(card.themeCode).toBe('corporate_navy');
});
it('应正确支持 BentoBlock 契约与尺寸、网格类型约束', () => {
const blockType: BentoBlockType = 'hero';
const colSpan: BentoColSpan = 2;
const rowSpan: BentoRowSpan = 1;
const block: BentoBlock = {
id: 101,
cardId: 1001,
type: blockType,
colSpan,
rowSpan,
sortOrder: 0,
title: 'Hero Profile',
content: 'Leading AI-driven digital identity across MENA and APAC markets.',
mediaUrl: 'https://cdn.omnicard.ai/media/hero.png',
linkUrl: 'https://omnicard.ai',
metaJson: {
accentColor: '#0B5CFF',
badge: 'Top Speaker',
},
};
expect(block.type).toBe('hero');
expect(block.colSpan).toBe(2);
expect(block.rowSpan).toBe(1);
expect(typeof block.sortOrder).toBe('number');
});
it('应正确支持 LeadEntity 潜客线索契约与意向评分、状态流转', () => {
const leadStatus: LeadStatus = 'hot';
const leadSource: LeadSource = 'nfc';
const lead: LeadEntity = {
id: 'lead_5001',
tenantId: 'tenant_888',
cardId: 'card_1001',
visitorId: 'vis_ae_9921',
name: 'Tariq Mansour',
company: 'Dubai Energy Holding',
phone: '+971-50-1234567',
email: 'tariq@dubaienergy.ae',
status: leadStatus,
intentScore: 92,
source: leadSource,
notes: 'Met at GITEX 2026. Very interested in enterprise NFC fleet and multi-tenant branding.',
};
expect(lead.status).toBe('hot');
expect(lead.intentScore).toBe(92);
expect(lead.source).toBe('nfc');
expect(lead.company).toBe('Dubai Energy Holding');
});
it('应正确支持 RadarTrack 实时访客足迹契约与时空数据追踪', () => {
const touch: TouchType = 'qr';
const now = new Date();
const track: RadarTrack = {
id: 'radar_8001',
tenantId: 'tenant_888',
cardId: 'card_1001',
visitorId: 'vis_de_4432',
ip: '194.12.88.4',
country: 'Germany',
city: 'Frankfurt',
touchType: touch,
stayDurationMs: 185000,
scrollDepth: 88,
viewedBlocks: ['hero', 'case_energy', 'article_ai_2026'],
createdAt: now,
};
expect(track.touchType).toBe('qr');
expect(track.country).toBe('Germany');
expect(track.stayDurationMs).toBeGreaterThan(0);
expect(track.viewedBlocks).toHaveLength(3);
});
it('应正确支持 NFCRecord 实体卡设备台账契约与生命周期状态', () => {
const material: NFCMaterial = 'metal';
const status: NFCStatus = 'active';
const sceneMode: NFCSceneMode = 'business';
const nfcCard: NFCRecord = {
id: 'nfc_9001',
uid: '04:7A:B2:8F:1C:6D:80',
tenantId: 'tenant_888',
cardId: 'card_1001',
batchNo: 'BATCH-2026-Q1-METAL',
material,
status,
sceneMode,
lastScannedAt: '2026-09-20T14:30:00.000Z',
};
expect(nfcCard.material).toBe('metal');
expect(nfcCard.status).toBe('active');
expect(nfcCard.sceneMode).toBe('business');
expect(nfcCard.uid).toBe('04:7A:B2:8F:1C:6D:80');
});
it('应正确支持 TenantProfile 企业租户与 BrandKit 品牌 VI 契约', () => {
const planType: TenantPlanType = 'enterprise';
const brandKit: BrandKit = {
logoUrl: 'https://cdn.omnicard.ai/brands/omnitech-logo.svg',
primaryColor: '#0B5CFF',
};
const tenant: TenantProfile = {
id: 'tenant_888',
companyName: 'OmniTech Global Inc.',
planType,
customDomain: 'vip.omnitech.com',
brandKit,
};
expect(tenant.planType).toBe('enterprise');
expect(tenant.brandKit.primaryColor).toBe('#0B5CFF');
expect(tenant.customDomain).toBe('vip.omnitech.com');
});
});