Files
gridpilot.gg/core/media/domain/services/MediaGenerationService.test.ts
Marc Mintel 0a37454171
Some checks failed
Contract Testing / contract-tests (pull_request) Failing after 5m51s
Contract Testing / contract-snapshot (pull_request) Has been skipped
view data tests
2026-01-22 17:28:09 +01:00

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);
});
});
});