Session 13: The Slate, Africa geo-restriction, OAuth providers, PropRow + GameCard (1311 tests)
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
// 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);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user