spb/market-atlas
Public
TypeScript 96.7%
SQL 1.6%
CSS 0.8%
JavaScript 0.5%
1import { describe, expect, it } from "vitest";2import { canonicalSymbol, makeInstrumentId, parseTimestamp, splitPair, tzOffsetMs, zonedParts, zonedTimeToUtc } from "./index.js";34describe("ids", () => {5 it("canonicalizes symbol variants to one form", () => {6 for (const v of ["BRK.B", "BRK-B", "BRK/B", "BRK B", "brk.b"]) expect(canonicalSymbol(v)).toBe("brk_b");7 });8 it("builds stable ids per asset class", () => {9 expect(makeInstrumentId("EQUITY", { symbol: "AAPL", mic: "XNAS", country: "US" })).toBe("eq_us_xnas_aapl");10 expect(makeInstrumentId("CRYPTO", { symbol: "BTC-USD", base: "BTC", quote: "USD" })).toBe("crypto_btc_usd");11 expect(makeInstrumentId("FOREX", { symbol: "EURUSD", base: "EUR", quote: "USD" })).toBe("fx_eur_usd");12 expect(makeInstrumentId("INDEX", { symbol: "_SPX", country: "US" })).toBe("index_us_spx");13 expect(makeInstrumentId("TREASURY", { symbol: "US10Y", country: "US" })).toBe("rate_us_us10y");14 expect(makeInstrumentId("ETF", { symbol: "SPY", mic: "ARCX", country: "US" })).toBe("etf_us_arcx_spy");15 });16 it("splits pairs", () => {17 expect(splitPair("BTC-USD")).toEqual({ base: "BTC", quote: "USD" });18 expect(splitPair("EURUSD")).toEqual({ base: "EUR", quote: "USD" });19 expect(splitPair("AAPL")).toBeNull();20 });21});2223describe("time", () => {24 it("converts Eastern wall clock to UTC across DST", () => {25 expect(new Date(zonedTimeToUtc("2026-09-11T15:59:59", "America/New_York")!).toISOString()).toBe("2026-09-11T19:59:59.000Z"); // EDT26 expect(new Date(zonedTimeToUtc("2026-01-15T16:00:00", "America/New_York")!).toISOString()).toBe("2026-01-15T21:00:00.000Z"); // EST27 expect(new Date(zonedTimeToUtc("2026-09-11", "UTC")!).toISOString()).toBe("2026-09-11T00:00:00.000Z");28 });29 it("computes offsets and parts", () => {30 expect(tzOffsetMs(Date.UTC(2026, 6, 1), "Asia/Tokyo")).toBe(9 * 3_600_000);31 const p = zonedParts(Date.UTC(2026, 8, 11, 19, 59, 59), "America/New_York");32 expect(p.date).toBe("2026-09-11");33 expect(p.time).toBe("15:59");34 expect(p.weekday).toBe(5);35 });36 it("parses timestamps in s, ms, µs, ns and ISO", () => {37 expect(parseTimestamp(1789199657)).toBe(1789199657000);38 expect(parseTimestamp(1789199657016)).toBe(1789199657016);39 expect(parseTimestamp("1789199660123")).toBe(1789199660123);40 expect(parseTimestamp(1789199657016000)).toBe(1789199657016);41 expect(parseTimestamp("2026-09-12T07:54:03.482921Z")).toBe(Date.parse("2026-09-12T07:54:03.482Z"));42 expect(parseTimestamp("garbage")).toBeNull();43 });44});45