119 lines
4.9 KiB
JavaScript
119 lines
4.9 KiB
JavaScript
const wc = require('../../src/data/worldcup2026');
|
|
|
|
describe('worldcup2026 static reference data', () => {
|
|
describe('VENUES', () => {
|
|
test('has 16 venues (the official 2026 host venue count)', () => {
|
|
const count = Object.keys(wc.VENUES).length;
|
|
expect(count).toBe(16);
|
|
});
|
|
|
|
test('every venue has altitude_ft, climate, country, city', () => {
|
|
for (const [name, data] of Object.entries(wc.VENUES)) {
|
|
expect(typeof data.altitude_ft).toBe('number');
|
|
expect(typeof data.climate).toBe('string');
|
|
expect(typeof data.country).toBe('string');
|
|
expect(typeof data.city).toBe('string');
|
|
expect(['USA', 'Canada', 'Mexico']).toContain(data.country);
|
|
// Sanity check — no venue at impossible altitude.
|
|
expect(data.altitude_ft).toBeGreaterThanOrEqual(0);
|
|
expect(data.altitude_ft).toBeLessThan(10000);
|
|
// Test the data is shaped right, not the actual venue altitudes.
|
|
if (!name) throw new Error('empty venue name'); // touch `name`
|
|
}
|
|
});
|
|
|
|
test('Mexico City venue is the highest-altitude host site', () => {
|
|
const altitudes = Object.values(wc.VENUES).map((v) => v.altitude_ft);
|
|
const max = Math.max(...altitudes);
|
|
expect(wc.VENUES['Estadio Azteca'].altitude_ft).toBe(max);
|
|
expect(max).toBeGreaterThan(7000); // ~7,349 ft per public elevation data
|
|
});
|
|
});
|
|
|
|
describe('altitudeImpact', () => {
|
|
test('high above 4,000 ft', () => {
|
|
expect(wc.altitudeImpact(7349)).toBe('high');
|
|
expect(wc.altitudeImpact(5138)).toBe('high');
|
|
expect(wc.altitudeImpact(4001)).toBe('high');
|
|
});
|
|
test('moderate between 1,500 and 4,000 ft', () => {
|
|
expect(wc.altitudeImpact(1765)).toBe('moderate');
|
|
expect(wc.altitudeImpact(2000)).toBe('moderate');
|
|
});
|
|
test('none at sea level / typical US altitudes', () => {
|
|
expect(wc.altitudeImpact(7)).toBe('none');
|
|
expect(wc.altitudeImpact(820)).toBe('none');
|
|
expect(wc.altitudeImpact(1499)).toBe('none');
|
|
});
|
|
test('returns none for nullable inputs (graceful)', () => {
|
|
expect(wc.altitudeImpact(null)).toBe('none');
|
|
expect(wc.altitudeImpact(undefined)).toBe('none');
|
|
expect(wc.altitudeImpact(NaN)).toBe('none');
|
|
});
|
|
});
|
|
|
|
describe('isHomeContinent', () => {
|
|
test('returns true for the three 2026 hosts', () => {
|
|
expect(wc.isHomeContinent('USA')).toBe(true);
|
|
expect(wc.isHomeContinent('Canada')).toBe(true);
|
|
expect(wc.isHomeContinent('Mexico')).toBe(true);
|
|
});
|
|
test('returns false for European squads', () => {
|
|
expect(wc.isHomeContinent('France')).toBe(false);
|
|
expect(wc.isHomeContinent('Brazil')).toBe(false);
|
|
});
|
|
test('returns false for unknown teams', () => {
|
|
expect(wc.isHomeContinent('Atlantis')).toBe(false);
|
|
expect(wc.isHomeContinent(null)).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('penalty / corner / free-kick role lookups', () => {
|
|
test('isPenaltyTaker — known taker', () => {
|
|
expect(wc.isPenaltyTaker('Lionel Messi', 'Argentina')).toBe(true);
|
|
expect(wc.isPenaltyTaker('Harry Kane', 'England')).toBe(true);
|
|
});
|
|
test('isPenaltyTaker — case-insensitive', () => {
|
|
expect(wc.isPenaltyTaker('lionel messi', 'Argentina')).toBe(true);
|
|
});
|
|
test('isPenaltyTaker — wrong team returns false', () => {
|
|
expect(wc.isPenaltyTaker('Lionel Messi', 'France')).toBe(false);
|
|
});
|
|
test('isPenaltyTaker — null inputs return false', () => {
|
|
expect(wc.isPenaltyTaker(null, 'Argentina')).toBe(false);
|
|
expect(wc.isPenaltyTaker('X', null)).toBe(false);
|
|
});
|
|
test('isCornerTaker — multi-name array picks up secondaries', () => {
|
|
// England has 3+ corner takers — verify the second is found too.
|
|
expect(wc.isCornerTaker('Phil Foden', 'England')).toBe(true);
|
|
expect(wc.isCornerTaker('Trent Alexander-Arnold', 'England')).toBe(true);
|
|
});
|
|
test('isFreeKickTaker — sparse map (not every team has one)', () => {
|
|
expect(wc.isFreeKickTaker('Lionel Messi', 'Argentina')).toBe(true);
|
|
// Australia not in FK takers map at all
|
|
expect(wc.isFreeKickTaker('Anyone', 'Australia')).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('getTournamentHistory', () => {
|
|
test('returns career WC stats for documented players', () => {
|
|
const messi = wc.getTournamentHistory('Lionel Messi');
|
|
expect(messi.wc_goals_career).toBeGreaterThanOrEqual(3);
|
|
expect(messi.wc_appearances).toBeGreaterThan(0);
|
|
});
|
|
test('returns null for unknown player', () => {
|
|
expect(wc.getTournamentHistory('Nobody Joe')).toBeNull();
|
|
expect(wc.getTournamentHistory(null)).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe('immutability', () => {
|
|
test('VENUES is frozen (cannot mutate top-level)', () => {
|
|
expect(Object.isFrozen(wc.VENUES)).toBe(true);
|
|
});
|
|
test('CONCACAF_TEAMS is frozen', () => {
|
|
expect(Object.isFrozen(wc.CONCACAF_TEAMS)).toBe(true);
|
|
});
|
|
});
|
|
});
|