224 lines
7.5 KiB
TypeScript
224 lines
7.5 KiB
TypeScript
import { MediaGenerationService } from './MediaGenerationService';
|
|
|
|
describe('MediaGenerationService', () => {
|
|
let service: MediaGenerationService;
|
|
|
|
beforeEach(() => {
|
|
service = new MediaGenerationService();
|
|
});
|
|
|
|
describe('generateTeamLogo', () => {
|
|
it('generates a deterministic logo URL for a team', () => {
|
|
const url1 = service.generateTeamLogo('team-123');
|
|
const url2 = service.generateTeamLogo('team-123');
|
|
|
|
expect(url1).toBe(url2);
|
|
expect(url1).toContain('https://picsum.photos/seed/team-123/200/200');
|
|
});
|
|
|
|
it('generates different URLs for different team IDs', () => {
|
|
const url1 = service.generateTeamLogo('team-123');
|
|
const url2 = service.generateTeamLogo('team-456');
|
|
|
|
expect(url1).not.toBe(url2);
|
|
});
|
|
|
|
it('generates URL with correct format', () => {
|
|
const url = service.generateTeamLogo('team-123');
|
|
|
|
expect(url).toMatch(/^https:\/\/picsum\.photos\/seed\/team-123\/200\/200$/);
|
|
});
|
|
});
|
|
|
|
describe('generateLeagueLogo', () => {
|
|
it('generates a deterministic logo URL for a league', () => {
|
|
const url1 = service.generateLeagueLogo('league-123');
|
|
const url2 = service.generateLeagueLogo('league-123');
|
|
|
|
expect(url1).toBe(url2);
|
|
expect(url1).toContain('https://picsum.photos/seed/l-league-123/200/200');
|
|
});
|
|
|
|
it('generates different URLs for different league IDs', () => {
|
|
const url1 = service.generateLeagueLogo('league-123');
|
|
const url2 = service.generateLeagueLogo('league-456');
|
|
|
|
expect(url1).not.toBe(url2);
|
|
});
|
|
|
|
it('generates URL with correct format', () => {
|
|
const url = service.generateLeagueLogo('league-123');
|
|
|
|
expect(url).toMatch(/^https:\/\/picsum\.photos\/seed\/l-league-123\/200\/200$/);
|
|
});
|
|
});
|
|
|
|
describe('generateDriverAvatar', () => {
|
|
it('generates a deterministic avatar URL for a driver', () => {
|
|
const url1 = service.generateDriverAvatar('driver-123');
|
|
const url2 = service.generateDriverAvatar('driver-123');
|
|
|
|
expect(url1).toBe(url2);
|
|
expect(url1).toContain('https://i.pravatar.cc/150?u=driver-123');
|
|
});
|
|
|
|
it('generates different URLs for different driver IDs', () => {
|
|
const url1 = service.generateDriverAvatar('driver-123');
|
|
const url2 = service.generateDriverAvatar('driver-456');
|
|
|
|
expect(url1).not.toBe(url2);
|
|
});
|
|
|
|
it('generates URL with correct format', () => {
|
|
const url = service.generateDriverAvatar('driver-123');
|
|
|
|
expect(url).toMatch(/^https:\/\/i\.pravatar\.cc\/150\?u=driver-123$/);
|
|
});
|
|
});
|
|
|
|
describe('generateLeagueCover', () => {
|
|
it('generates a deterministic cover URL for a league', () => {
|
|
const url1 = service.generateLeagueCover('league-123');
|
|
const url2 = service.generateLeagueCover('league-123');
|
|
|
|
expect(url1).toBe(url2);
|
|
expect(url1).toContain('https://picsum.photos/seed/c-league-123/800/200');
|
|
});
|
|
|
|
it('generates different URLs for different league IDs', () => {
|
|
const url1 = service.generateLeagueCover('league-123');
|
|
const url2 = service.generateLeagueCover('league-456');
|
|
|
|
expect(url1).not.toBe(url2);
|
|
});
|
|
|
|
it('generates URL with correct format', () => {
|
|
const url = service.generateLeagueCover('league-123');
|
|
|
|
expect(url).toMatch(/^https:\/\/picsum\.photos\/seed\/c-league-123\/800\/200$/);
|
|
});
|
|
});
|
|
|
|
describe('generateDefaultPNG', () => {
|
|
it('generates a PNG buffer for a variant', () => {
|
|
const buffer = service.generateDefaultPNG('test-variant');
|
|
|
|
expect(buffer).toBeInstanceOf(Buffer);
|
|
expect(buffer.length).toBeGreaterThan(0);
|
|
});
|
|
|
|
it('generates deterministic PNG for same variant', () => {
|
|
const buffer1 = service.generateDefaultPNG('test-variant');
|
|
const buffer2 = service.generateDefaultPNG('test-variant');
|
|
|
|
expect(buffer1.equals(buffer2)).toBe(true);
|
|
});
|
|
|
|
it('generates different PNGs for different variants', () => {
|
|
const buffer1 = service.generateDefaultPNG('variant-1');
|
|
const buffer2 = service.generateDefaultPNG('variant-2');
|
|
|
|
expect(buffer1.equals(buffer2)).toBe(false);
|
|
});
|
|
|
|
it('generates valid PNG header', () => {
|
|
const buffer = service.generateDefaultPNG('test-variant');
|
|
|
|
// PNG signature: 89 50 4E 47 0D 0A 1A 0A
|
|
expect(buffer[0]).toBe(0x89);
|
|
expect(buffer[1]).toBe(0x50); // 'P'
|
|
expect(buffer[2]).toBe(0x4E); // 'N'
|
|
expect(buffer[3]).toBe(0x47); // 'G'
|
|
expect(buffer[4]).toBe(0x0D);
|
|
expect(buffer[5]).toBe(0x0A);
|
|
expect(buffer[6]).toBe(0x1A);
|
|
expect(buffer[7]).toBe(0x0A);
|
|
});
|
|
|
|
it('generates PNG with IHDR chunk', () => {
|
|
const buffer = service.generateDefaultPNG('test-variant');
|
|
|
|
// IHDR chunk starts at byte 8
|
|
// Length: 13 (0x00 0x00 0x00 0x0D)
|
|
expect(buffer[8]).toBe(0x00);
|
|
expect(buffer[9]).toBe(0x00);
|
|
expect(buffer[10]).toBe(0x00);
|
|
expect(buffer[11]).toBe(0x0D);
|
|
// Type: IHDR (0x49 0x48 0x44 0x52)
|
|
expect(buffer[12]).toBe(0x49); // 'I'
|
|
expect(buffer[13]).toBe(0x48); // 'H'
|
|
expect(buffer[14]).toBe(0x44); // 'D'
|
|
expect(buffer[15]).toBe(0x52); // 'R'
|
|
});
|
|
|
|
it('generates PNG with 1x1 dimensions', () => {
|
|
const buffer = service.generateDefaultPNG('test-variant');
|
|
|
|
// Width: 1 (0x00 0x00 0x00 0x01) at byte 16
|
|
expect(buffer[16]).toBe(0x00);
|
|
expect(buffer[17]).toBe(0x00);
|
|
expect(buffer[18]).toBe(0x00);
|
|
expect(buffer[19]).toBe(0x01);
|
|
// Height: 1 (0x00 0x00 0x00 0x01) at byte 20
|
|
expect(buffer[20]).toBe(0x00);
|
|
expect(buffer[21]).toBe(0x00);
|
|
expect(buffer[22]).toBe(0x00);
|
|
expect(buffer[23]).toBe(0x01);
|
|
});
|
|
|
|
it('generates PNG with RGB color type', () => {
|
|
const buffer = service.generateDefaultPNG('test-variant');
|
|
|
|
// Color type: RGB (0x02) at byte 25
|
|
expect(buffer[25]).toBe(0x02);
|
|
});
|
|
|
|
it('generates PNG with RGB pixel data', () => {
|
|
const buffer = service.generateDefaultPNG('test-variant');
|
|
|
|
// RGB pixel data should be present in IDAT chunk
|
|
// IDAT chunk starts after IHDR (byte 37)
|
|
// We should find RGB values somewhere in the buffer
|
|
const hasRGB = buffer.some((byte, index) => {
|
|
// Check if we have a sequence that looks like RGB data
|
|
// This is a simplified check
|
|
return index > 37 && index < buffer.length - 10;
|
|
});
|
|
|
|
expect(hasRGB).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('deterministic generation', () => {
|
|
it('generates same team logo for same team ID across different instances', () => {
|
|
const service1 = new MediaGenerationService();
|
|
const service2 = new MediaGenerationService();
|
|
|
|
const url1 = service1.generateTeamLogo('team-123');
|
|
const url2 = service2.generateTeamLogo('team-123');
|
|
|
|
expect(url1).toBe(url2);
|
|
});
|
|
|
|
it('generates same driver avatar for same driver ID across different instances', () => {
|
|
const service1 = new MediaGenerationService();
|
|
const service2 = new MediaGenerationService();
|
|
|
|
const url1 = service1.generateDriverAvatar('driver-123');
|
|
const url2 = service2.generateDriverAvatar('driver-123');
|
|
|
|
expect(url1).toBe(url2);
|
|
});
|
|
|
|
it('generates same PNG for same variant across different instances', () => {
|
|
const service1 = new MediaGenerationService();
|
|
const service2 = new MediaGenerationService();
|
|
|
|
const buffer1 = service1.generateDefaultPNG('test-variant');
|
|
const buffer2 = service2.generateDefaultPNG('test-variant');
|
|
|
|
expect(buffer1.equals(buffer2)).toBe(true);
|
|
});
|
|
});
|
|
});
|