65 lines
2.4 KiB
JavaScript
65 lines
2.4 KiB
JavaScript
// Session 13 — Africa geo-restriction set. The pricing component
|
|
// relies on isAfricanCountry() to gate the $4.99 tier. Tests pin
|
|
// the membership list so adding/removing a country is a visible,
|
|
// reviewed change rather than a silent edit.
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
const FILE = path.join(__dirname, '..', '..', 'web', 'src', 'lib', 'locales.ts');
|
|
const source = fs.readFileSync(FILE, 'utf8');
|
|
|
|
// Pull the AFRICAN_COUNTRIES set out of the TS source by regex. Tests
|
|
// the values, not the implementation — if the format changes, the
|
|
// failure is on the parse and tells us to update the test loader.
|
|
function parseAfricanCountries() {
|
|
const start = source.indexOf('AFRICAN_COUNTRIES');
|
|
if (start === -1) throw new Error('AFRICAN_COUNTRIES not found in locales.ts');
|
|
const slice = source.slice(start, start + 4000);
|
|
const codes = [...slice.matchAll(/'([A-Z]{2})'/g)].map((m) => m[1]);
|
|
return new Set(codes);
|
|
}
|
|
|
|
function reimplementIsAfrican(set) {
|
|
return (code) => {
|
|
if (!code) return false;
|
|
return set.has(String(code).toUpperCase());
|
|
};
|
|
}
|
|
|
|
describe('AFRICAN_COUNTRIES gate (Session 13)', () => {
|
|
const COUNTRIES = parseAfricanCountries();
|
|
const isAfricanCountry = reimplementIsAfrican(COUNTRIES);
|
|
|
|
test('covers all 54 sovereign African nations', () => {
|
|
expect(COUNTRIES.size).toBeGreaterThanOrEqual(50);
|
|
});
|
|
|
|
test('includes the major mobile-betting markets', () => {
|
|
const required = ['NG', 'KE', 'ZA', 'GH', 'TZ', 'UG', 'EG', 'MA'];
|
|
for (const code of required) expect(COUNTRIES.has(code)).toBe(true);
|
|
});
|
|
|
|
test('rejects non-African codes', () => {
|
|
const notAfrican = ['US', 'GB', 'CA', 'IN', 'BR', 'JP', 'DE', 'AU', 'CN', 'FR'];
|
|
for (const code of notAfrican) expect(COUNTRIES.has(code)).toBe(false);
|
|
});
|
|
|
|
test('isAfricanCountry — case-insensitive', () => {
|
|
expect(isAfricanCountry('ng')).toBe(true);
|
|
expect(isAfricanCountry('Ng')).toBe(true);
|
|
expect(isAfricanCountry('NG')).toBe(true);
|
|
});
|
|
|
|
test('isAfricanCountry — degrades closed on empty/null/undefined', () => {
|
|
expect(isAfricanCountry('')).toBe(false);
|
|
expect(isAfricanCountry(null)).toBe(false);
|
|
expect(isAfricanCountry(undefined)).toBe(false);
|
|
});
|
|
|
|
test('isAfricanCountry — degrades closed on unknown codes', () => {
|
|
expect(isAfricanCountry('ZZ')).toBe(false);
|
|
expect(isAfricanCountry('XX')).toBe(false);
|
|
});
|
|
});
|