// Which hosts a Tradovate login's calls go to. Pure — never contacts a broker. import { test } from 'node:test'; import assert from 'node:assert/strict'; import { demoHosts, SHARED_DEMO_HOST, SHARED_DEMO_REPORTING_HOST } from '../lib/tradovate-helpers.ts'; const SHARED = { service: SHARED_DEMO_HOST, reporting: SHARED_DEMO_REPORTING_HOST }; test('a login without apiHosts keeps the shared hosts', () => { assert.deepEqual(demoHosts(undefined), SHARED); assert.deepEqual(demoHosts(null), SHARED); assert.deepEqual(demoHosts({}), SHARED); }); test("an organization's own hosts are followed (Lucid, 2026-11-01)", () => { const lucid = { live: 'live.tradovateapi.com', demo: 'demo-api.lucid.ninjatrader.com', mdLive: 'md.tradovateapi.com', mdDemo: 'md-demo-api.lucid.ninjatrader.com', reportingLive: 'rpt-live.tradovateapi.com', reportingDemo: 'rpt-demo-api.lucid.ninjatrader.com', replay: 'replay.tradovateapi.com', }; assert.deepEqual(demoHosts(lucid), { service: 'demo-api.lucid.ninjatrader.com', reporting: 'rpt-demo-api.lucid.ninjatrader.com', }); }); test('each host falls back on its own', () => { assert.deepEqual(demoHosts({ demo: 'demo-api.lucid.ninjatrader.com' }), { service: 'demo-api.lucid.ninjatrader.com', reporting: SHARED_DEMO_REPORTING_HOST, }); }); test("a value that isn't a plain host name is ignored", () => { for (const bad of ['', 'localhost', 'evil.com/path', 'https://demo.example.com', 'a.b:443', 'x .y', 42, null]) { assert.deepEqual(demoHosts({ demo: bad, reportingDemo: bad }), SHARED, String(bad)); } });