SPB Git forge

spb/market-atlas

Public
12commits 1branches 0releases
1.1 MBsize
maindefault branch
10 days agolast push
TypeScript 96.7% SQL 1.6% CSS 0.8% JavaScript 0.5%
2.5 KB · 45 lines typescript
Raw Blame History
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