mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-11 05:42:22 +00:00
test(news): take Jordan as the sample country
This commit is contained in:
1 parent
2fe0110f8d
commit
525543d08a
3 files changed
+38
-38
No files matched your search
@@ -70,13 +70,13 @@ test('without GEV_NEWS_ORIGIN Core answers itself: Conflicts from GDELT, Local s
|
||||
const hotspots = await call('/hotspots');
|
||||
assert.equal(hotspots.status, 502);
|
||||
assert.deepEqual(hotspots.json, { error: 'news_upstream_error' });
|
||||
const local = await call('/feed?hotspot=all&at=51.13,71.43');
|
||||
const local = await call('/feed?hotspot=all&at=31.95,35.93');
|
||||
assert.equal(local.status, 503);
|
||||
assert.deepEqual(local.json, { error: 'no_key', key: 'worldnewsapi' });
|
||||
// The area is read from the bundled countries, with no key.
|
||||
const area = await call('/outline?at=51.13,71.43&v=4');
|
||||
const area = await call('/outline?at=31.95,35.93&v=4');
|
||||
assert.equal(area.status, 200);
|
||||
assert.equal(area.json.area.name, 'Kazakhstan');
|
||||
assert.equal(area.json.area.name, 'Jordan');
|
||||
// The client's allowlist still holds.
|
||||
assert.equal((await call('/feed?side=UA')).status, 400);
|
||||
assert.ok(hosts.length > 0);
|
||||
@@ -206,7 +206,7 @@ test('a host that serves news only from its own server turns the built-in backen
|
||||
for (const url of [
|
||||
'/hotspots',
|
||||
'/feed?hotspot=all',
|
||||
'/outline?at=51.13,71.43&v=4',
|
||||
'/outline?at=31.95,35.93&v=4',
|
||||
]) {
|
||||
const answer = await call(url);
|
||||
assert.equal(answer.status, 503, url);
|
||||
|
||||
@@ -282,7 +282,7 @@ const RULES = {
|
||||
['president', 0.5],
|
||||
['minister', 0.5],
|
||||
['statement', 0.5],
|
||||
// A state visit ("King of Jordan arrives in Astana").
|
||||
// A state visit ("Emir of Qatar arrives in Amman").
|
||||
['visit', 0.5],
|
||||
['delegation', 0.5],
|
||||
['agreement', 0.5],
|
||||
@@ -345,7 +345,7 @@ const RULES = {
|
||||
|
||||
// Business, trade, industry and energy, counted only when nothing physical
|
||||
// happened (categorizeText): an oil depot struck is a strike. English,
|
||||
// Russian, Ukrainian, Kazakh-press Russian, Turkish and the European stems.
|
||||
// Russian, Ukrainian, Turkish and the European stems.
|
||||
RULES.economy = [
|
||||
'econom',
|
||||
'gdp$',
|
||||
|
||||
@@ -37,12 +37,12 @@ const LIVEUAMAP = {
|
||||
},
|
||||
{
|
||||
id: 102,
|
||||
name: 'Floods kill dozens in Astana',
|
||||
lat: '51.16940',
|
||||
lng: '71.44910',
|
||||
location: 'Astana',
|
||||
name: 'Floods kill dozens in Amman',
|
||||
lat: '31.95390',
|
||||
lng: '35.91060',
|
||||
location: 'Amman',
|
||||
timestamp: seconds('2026-11-05T10:00:00Z'),
|
||||
link: 'https://asia.liveuamap.com/en/2026/5-november-astana',
|
||||
link: 'https://mideast.liveuamap.com/en/2026/5-november-amman',
|
||||
img_share: '',
|
||||
video: '',
|
||||
},
|
||||
@@ -83,8 +83,8 @@ const WORLD_NEWS = {
|
||||
news: [
|
||||
{
|
||||
id: 9001,
|
||||
title: 'Visiting minister arrives in Astana for talks',
|
||||
url: 'https://www.daily.example/en/minister-astana-talks',
|
||||
title: 'Visiting minister arrives in Amman for talks',
|
||||
url: 'https://www.daily.example/en/minister-amman-talks',
|
||||
image: 'https://www.daily.example/pics/visit.jpg',
|
||||
publish_date: '2026-11-05 08:30:00',
|
||||
language: 'en',
|
||||
@@ -102,7 +102,7 @@ const WORLD_NEWS = {
|
||||
// Sport is left out.
|
||||
{
|
||||
id: 9004,
|
||||
title: 'Astana Arlan win the cup final',
|
||||
title: 'Al-Faisaly win the cup final',
|
||||
url: 'https://sport.example/cup',
|
||||
publish_date: '2026-11-05 09:00:00',
|
||||
category: 'sports',
|
||||
@@ -452,13 +452,13 @@ test('an export not published yet is looked for again, and the day is kept a day
|
||||
|
||||
test('Local names the country at the point and outlines it, with no key', async () => {
|
||||
const { ask, calls } = keyed({ env: {} });
|
||||
const answer = await ask('/outline', 'at=51.13,71.43&v=4');
|
||||
const answer = await ask('/outline', 'at=31.95,35.93&v=4');
|
||||
const outline = normalizeOutlinePayload(answer.body);
|
||||
assert.deepEqual(outline.area, {
|
||||
key: 'KZ',
|
||||
name: 'Kazakhstan',
|
||||
key: 'JO',
|
||||
name: 'Jordan',
|
||||
kind: 'country',
|
||||
country: 'KZ',
|
||||
country: 'JO',
|
||||
});
|
||||
assert.ok(outline.polygons.length > 0);
|
||||
const sea = await ask('/outline', 'at=0,-30&v=4');
|
||||
@@ -472,12 +472,12 @@ test("Local in a country is its outlets' everyday news, pinned inside it, plus t
|
||||
const { ask, calls } = keyed();
|
||||
const answer = await ask(
|
||||
'/feed',
|
||||
'hotspot=all&geo=1&today=1&events=1&limit=40&at=51.13,71.43',
|
||||
'hotspot=all&geo=1&today=1&events=1&limit=40&at=31.95,35.93',
|
||||
);
|
||||
assert.equal(answer.status, 200);
|
||||
const search = calls.find((c) => host(c) === 'api.worldnewsapi.com');
|
||||
assert.equal(search.url.pathname, '/search-news');
|
||||
assert.equal(search.url.searchParams.get('source-country'), 'kz');
|
||||
assert.equal(search.url.searchParams.get('source-country'), 'jo');
|
||||
assert.equal(search.url.searchParams.has('categories'), false);
|
||||
assert.equal(
|
||||
search.url.searchParams.get('earliest-publish-date'),
|
||||
@@ -497,13 +497,13 @@ test("Local in a country is its outlets' everyday news, pinned inside it, plus t
|
||||
assert.equal(visit.publisher, 'daily.example');
|
||||
assert.equal(visit.snippet, null, 'titles and links only');
|
||||
assert.equal(visit.geo.precision, 'country');
|
||||
assert.equal(visit.geo.place, 'Kazakhstan');
|
||||
assert.equal(visit.geo.place, 'Jordan');
|
||||
assert.equal(visit.event.image.publisher, 'daily.example');
|
||||
assert.equal(exploration.category, 'economy');
|
||||
|
||||
// The point each is pinned at lies in the area Local outlines.
|
||||
const outline = normalizeOutlinePayload(
|
||||
(await ask('/outline', 'at=51.13,71.43&v=4')).body,
|
||||
(await ask('/outline', 'at=31.95,35.93&v=4')).body,
|
||||
);
|
||||
const { inPolygons } = await import('../../../src/layers/news/model.js');
|
||||
for (const report of reports)
|
||||
@@ -555,7 +555,7 @@ test("GDELT's places are named by their town and the area there, not its old reg
|
||||
|
||||
test("a country's news is read once per half hour and Liveuamap's feed once per five minutes", async () => {
|
||||
const { ask, calls, clock } = keyed();
|
||||
const local = 'hotspot=all&at=51.13,71.43';
|
||||
const local = 'hotspot=all&at=31.95,35.93';
|
||||
await ask('/feed', local);
|
||||
await ask('/feed', local);
|
||||
await ask('/hotspots');
|
||||
@@ -573,7 +573,7 @@ test("a country's news is read once per half hour and Liveuamap's feed once per
|
||||
|
||||
test('Local without its key says which key it needs and reads nothing', async () => {
|
||||
const noLocal = keyed({ env: { LIVEUAMAP_API_KEY: 'live-key' } });
|
||||
assert.deepEqual(await noLocal.ask('/feed', 'at=51.13,71.43'), {
|
||||
assert.deepEqual(await noLocal.ask('/feed', 'at=31.95,35.93'), {
|
||||
status: 503,
|
||||
body: { error: 'no_key', key: 'worldnewsapi' },
|
||||
});
|
||||
@@ -589,7 +589,7 @@ test('a refused Liveuamap key leaves GDELT; World News API refusing names its ke
|
||||
const conflicts = await refused.ask('/hotspots');
|
||||
assert.equal(conflicts.status, 200);
|
||||
assert.equal(conflicts.body.hotspots[0].counts.last24h, 4);
|
||||
assert.deepEqual(await refused.ask('/feed', 'at=51.13,71.43'), {
|
||||
assert.deepEqual(await refused.ask('/feed', 'at=31.95,35.93'), {
|
||||
status: 503,
|
||||
body: { error: 'key_rejected', key: 'worldnewsapi' },
|
||||
});
|
||||
@@ -766,10 +766,10 @@ test('Local where only Conflicts reports speak answers 502 when they fail; in a
|
||||
UPSTREAM_ERROR,
|
||||
);
|
||||
assert.equal(count(calls, 'api.worldnewsapi.com'), 0);
|
||||
const kazakhstan = await ask('/feed', 'hotspot=all&at=51.13,71.43');
|
||||
assert.equal(kazakhstan.status, 200);
|
||||
const jordan = await ask('/feed', 'hotspot=all&at=31.95,35.93');
|
||||
assert.equal(jordan.status, 200);
|
||||
assert.deepEqual(
|
||||
kazakhstan.body.reports.map((r) => r.id),
|
||||
jordan.body.reports.map((r) => r.id),
|
||||
['wna-9001', 'wna-9002'],
|
||||
);
|
||||
});
|
||||
@@ -809,7 +809,7 @@ test('a territory without a code is named as itself, not read as sea', async ()
|
||||
test('a stale Liveuamap or World News API read is served while it is read again', async () => {
|
||||
const answers = {};
|
||||
const { ask, calls, clock, settle } = keyed({ answers });
|
||||
const local = 'hotspot=all&at=51.13,71.43';
|
||||
const local = 'hotspot=all&at=31.95,35.93';
|
||||
const ids = (answer) => answer.body.reports.map((r) => r.id);
|
||||
assert.deepEqual(ids(await ask('/feed', local)), [
|
||||
'lum-102',
|
||||
@@ -877,14 +877,14 @@ test("World News API's reads are a daily budget: spent, Local says key_quota and
|
||||
env: { WORLDNEWSAPI_KEY: 'wna-key', WORLDNEWSAPI_DAILY_READS: '2' },
|
||||
});
|
||||
const at = (point) => ask('/feed', `hotspot=all&at=${point}`);
|
||||
assert.equal((await at('51.13,71.43')).status, 200);
|
||||
assert.equal((await at('31.95,35.93')).status, 200);
|
||||
assert.equal((await at('48.85,2.35')).status, 200);
|
||||
// Germany would be the third read today.
|
||||
assert.deepEqual(await at('52.52,13.4'), KEY_QUOTA);
|
||||
assert.equal(count(calls, 'api.worldnewsapi.com'), 2);
|
||||
// Kazakhstan, read earlier, is served from what was read.
|
||||
// Jordan, read earlier, is served from what was read.
|
||||
clock.now += 31 * MINUTE;
|
||||
const kept = await at('51.13,71.43');
|
||||
const kept = await at('31.95,35.93');
|
||||
assert.equal(kept.status, 200);
|
||||
assert.equal(kept.body.reports.length, 2);
|
||||
assert.equal(count(calls, 'api.worldnewsapi.com'), 2);
|
||||
@@ -901,13 +901,13 @@ test("World News API's reads are a daily budget: spent, Local says key_quota and
|
||||
|
||||
test('World News API answering 402 is key_quota, and nothing more is asked today; a 429 is no quota', async () => {
|
||||
const paid = keyed({ answers: { worldnews: 402 } });
|
||||
assert.deepEqual(await paid.ask('/feed', 'at=51.13,71.43'), KEY_QUOTA);
|
||||
assert.deepEqual(await paid.ask('/feed', 'at=31.95,35.93'), KEY_QUOTA);
|
||||
paid.clock.now += 2 * MINUTE;
|
||||
assert.deepEqual(await paid.ask('/feed', 'at=48.85,2.35'), KEY_QUOTA);
|
||||
assert.equal(count(paid.calls, 'api.worldnewsapi.com'), 1);
|
||||
// A 429 is its per-second limit: an ordinary failure, tried again soon.
|
||||
const busy = keyed({ answers: { worldnews: 429 } });
|
||||
assert.deepEqual(await busy.ask('/feed', 'at=51.13,71.43'), UPSTREAM_ERROR);
|
||||
assert.deepEqual(await busy.ask('/feed', 'at=31.95,35.93'), UPSTREAM_ERROR);
|
||||
await paid.settle();
|
||||
await busy.settle();
|
||||
});
|
||||
@@ -965,7 +965,7 @@ test('a town a disputed area is named after is named as the town alone', () => {
|
||||
test('World News API is credited on each of its reports', async () => {
|
||||
const { ask, settle } = keyed();
|
||||
const { reports } = normalizeFeedPayload(
|
||||
(await ask('/feed', 'hotspot=all&at=51.13,71.43')).body,
|
||||
(await ask('/feed', 'hotspot=all&at=31.95,35.93')).body,
|
||||
);
|
||||
const national = reports.filter((r) => r.kind === 'worldnewsapi');
|
||||
assert.ok(national.length > 0);
|
||||
@@ -1056,7 +1056,7 @@ test('a failing file gets one strike a round, not three within seconds', async (
|
||||
test("a country's own news keeps World News API's category and no severity, whatever its words", async () => {
|
||||
const { worldNewsReport } = await import('./keyed.js');
|
||||
const { countryByCode } = await import('./areas.js');
|
||||
const country = countryByCode('KZ');
|
||||
const country = countryByCode('JO');
|
||||
const read = (title, category) =>
|
||||
worldNewsReport(
|
||||
{
|
||||
@@ -1070,7 +1070,7 @@ test("a country's own news keeps World News API's category and no severity, what
|
||||
country,
|
||||
);
|
||||
const rankings = read(
|
||||
'Kazakhstan Advances in Global Digital Rankings as AI Infrastructure Expands',
|
||||
'Jordan Advances in Global Digital Rankings as AI Infrastructure Expands',
|
||||
'technology',
|
||||
);
|
||||
assert.equal(rankings.category, 'other');
|
||||
@@ -1079,6 +1079,6 @@ test("a country's own news keeps World News API's category and no severity, what
|
||||
read('Startup advances to the next funding round', 'business').category,
|
||||
'economy',
|
||||
);
|
||||
assert.equal(read('King visits Astana', 'politics').category, 'political');
|
||||
assert.equal(read('King visits Amman', 'politics').category, 'political');
|
||||
assert.equal(read('Parliament session opens', null).category, 'other');
|
||||
});
|
||||
Reference in new issue
Block a user