feat(round-12): 实体卡外贸生产工单/雷达多渠道归因漏斗/AI地道外联草拟/现代图片自适应协商 (87套件1007测试全绿)
这个提交包含在:
@@ -0,0 +1,78 @@
|
||||
import {
|
||||
negotiateOptimalMediaUrl,
|
||||
MediaNegotiationContext,
|
||||
SupportedImageFormat,
|
||||
} from '../../../src/modules/card/service/media-negotiator';
|
||||
|
||||
describe('Point 48: 移动微官网现代图片自适应协商与弱网资源压缩', () => {
|
||||
const originalUrl = 'https://cdn.omnicard.ai/uploads/cards/vip-avatar.png';
|
||||
|
||||
describe('1. 格式协商 (Image Format Negotiation: AVIF > WebP > JPEG/PNG)', () => {
|
||||
it('客户端声明支持 AVIF 时应优先协商为 AVIF 格式', () => {
|
||||
const ctx: MediaNegotiationContext = {
|
||||
acceptHeader: 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
|
||||
networkType: '4g',
|
||||
};
|
||||
|
||||
const result = negotiateOptimalMediaUrl(originalUrl, ctx);
|
||||
expect(result.format).toBe('avif');
|
||||
expect(result.optimizedUrl).toContain('format=avif');
|
||||
});
|
||||
|
||||
it('客户端不支持 AVIF 但支持 WebP 时应协商为 WebP', () => {
|
||||
const ctx: MediaNegotiationContext = {
|
||||
acceptHeader: 'image/webp,*/*',
|
||||
networkType: 'wifi',
|
||||
};
|
||||
|
||||
const result = negotiateOptimalMediaUrl(originalUrl, ctx);
|
||||
expect(result.format).toBe('webp');
|
||||
expect(result.optimizedUrl).toContain('format=webp');
|
||||
});
|
||||
|
||||
it('旧版客户端不包含新现代格式时保留原有格式或转为 jpg', () => {
|
||||
const ctx: MediaNegotiationContext = {
|
||||
acceptHeader: 'image/png,image/*,*/*',
|
||||
};
|
||||
|
||||
const result = negotiateOptimalMediaUrl(originalUrl, ctx);
|
||||
expect(result.format).toBe('png');
|
||||
expect(result.optimizedUrl).toContain('format=png');
|
||||
});
|
||||
});
|
||||
|
||||
describe('2. 网络环境与屏幕自适应 (Network & DPR Adaptive Scaling)', () => {
|
||||
it('弱网 (2g/3g) 环境应自动降低图片质量与宽度以保障极致加载速度', () => {
|
||||
const ctx: MediaNegotiationContext = {
|
||||
acceptHeader: 'image/webp,*/*',
|
||||
networkType: '3g',
|
||||
targetWidth: 800,
|
||||
};
|
||||
|
||||
const result = negotiateOptimalMediaUrl(originalUrl, ctx);
|
||||
expect(result.quality).toBeLessThanOrEqual(70);
|
||||
expect(result.width).toBeLessThanOrEqual(600);
|
||||
expect(result.optimizedUrl).toContain(`w=${result.width}`);
|
||||
expect(result.optimizedUrl).toContain(`q=${result.quality}`);
|
||||
});
|
||||
|
||||
it('高速 WiFi 且高 DPR (dpr >= 2) 时应保障高清晰度', () => {
|
||||
const ctx: MediaNegotiationContext = {
|
||||
acceptHeader: 'image/avif,image/webp',
|
||||
networkType: 'wifi',
|
||||
targetWidth: 400,
|
||||
dpr: 2,
|
||||
};
|
||||
|
||||
const result = negotiateOptimalMediaUrl(originalUrl, ctx);
|
||||
expect(result.width).toBe(800); // 400 * 2 = 800
|
||||
expect(result.quality).toBeGreaterThanOrEqual(85);
|
||||
expect(result.optimizedUrl).toContain('w=800');
|
||||
});
|
||||
|
||||
it('无效或空 URL 时应安全回退', () => {
|
||||
const res = negotiateOptimalMediaUrl('', {});
|
||||
expect(res.optimizedUrl).toBe('');
|
||||
});
|
||||
});
|
||||
});
|
||||
在新工单中引用
屏蔽一个用户