Files
jrshikoku/tests/jrDataSystemEnvironment.test.ts

116 lines
3.8 KiB
TypeScript

import { strict as assert } from "node:assert";
import { test } from "node:test";
import {
BACKEND_API_BASE_URLS,
getBackendApiBaseUrl,
getDiagramTodayUrl,
getOfficialPositionResolverConfig,
normalizeJrDataSystemEnvironment,
resolveJrDataSystemEnvironment,
rewriteBackendApiUrl,
rewriteJrDataSystemUrl,
} from "../lib/jrDataSystemEnvironment";
import { buildOfficialPositionEditUrl } from "../lib/officialPositionEditUrl";
test("legacy environment keys normalize without inventing new environments", () => {
assert.equal(normalizeJrDataSystemEnvironment("production"), "production_release");
assert.equal(normalizeJrDataSystemEnvironment("chatgpt"), "production_beta");
assert.equal(normalizeJrDataSystemEnvironment("claude"), "production_beta");
assert.equal(normalizeJrDataSystemEnvironment("unknown"), "production_release");
});
test("track and UI choices resolve to the three supported environments", () => {
assert.equal(
resolveJrDataSystemEnvironment("production", "release"),
"production_release",
);
assert.equal(
resolveJrDataSystemEnvironment("production", "beta"),
"production_beta",
);
assert.equal(
resolveJrDataSystemEnvironment("experimental", "beta"),
"experimental",
);
});
test("experimental environment changes both backend and diagram endpoints", () => {
assert.equal(
getBackendApiBaseUrl("experimental"),
BACKEND_API_BASE_URLS.experimental,
);
assert.match(getDiagramTodayUrl("experimental"), /diagram-today-beta\.json$/);
assert.match(
getDiagramTodayUrl("production_release"),
/diagram-today\.json$/,
);
});
test("all environments use the canonical OfficialPosition Backend", () => {
assert.equal(
getOfficialPositionResolverConfig("experimental").backendApiBaseUrl,
BACKEND_API_BASE_URLS.experimental,
);
assert.equal(
getOfficialPositionResolverConfig("production_release").backendApiBaseUrl,
BACKEND_API_BASE_URLS.production,
);
assert.equal(
getOfficialPositionResolverConfig("production_beta").backendApiBaseUrl,
BACKEND_API_BASE_URLS.production,
);
});
test("OfficialPosition edit URL follows the selected Frontend environment", () => {
const positionId = "b754e5fc-789b-419c-b5bc-97585cba793f";
const experimental = buildOfficialPositionEditUrl(
positionId,
"push/token",
getOfficialPositionResolverConfig("experimental"),
"eachTrainInfo",
);
assert.ok(experimental);
const experimentalUrl = new URL(experimental);
assert.equal(experimentalUrl.origin, "https://experimental.shikoku-railinfo.haruk.in");
assert.equal(experimentalUrl.pathname, `/train-position/${positionId}/edit`);
assert.equal(experimentalUrl.searchParams.get("userID"), "push/token");
assert.equal(experimentalUrl.searchParams.get("from"), "eachTrainInfo");
assert.equal(experimentalUrl.searchParams.get("position_id"), null);
const production = buildOfficialPositionEditUrl(
positionId,
"machine",
getOfficialPositionResolverConfig("production_release"),
);
assert.ok(production);
assert.equal(new URL(production).origin, "https://shikoku-railinfo.haruk.in");
assert.equal(
buildOfficialPositionEditUrl(positionId, "machine", {
...getOfficialPositionResolverConfig("experimental"),
officialPositionEditEnabled: false,
}),
undefined,
);
});
test("URL rewriting only changes known JR data-system origins", () => {
assert.equal(
rewriteBackendApiUrl(
`${BACKEND_API_BASE_URLS.production}/train-data`,
"experimental",
),
`${BACKEND_API_BASE_URLS.experimental}/train-data`,
);
assert.equal(
rewriteJrDataSystemUrl(
"https://shikoku-railinfo.haruk.in/path?q=1",
"production_beta",
),
"https://nightly.shikoku-railinfo.haruk.in/path?q=1",
);
assert.equal(
rewriteJrDataSystemUrl("https://example.com/path", "experimental"),
"https://example.com/path",
);
});