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", ); });