import { describe, expect, it } from "vitest"; import { describeTimezoneArea, getLocationContext, localeRegion, utcOffsetLabel, weekdayName, } from "../lib/location"; describe("describeTimezoneArea", () => { it("keeps the zone's own label", () => { expect(describeTimezoneArea("Asia/Manila")).toEqual({ area: "Manila" }); }); it("handles zones with more than two segments", () => { expect(describeTimezoneArea("America/Argentina/Salta")).toEqual({ area: "Salta" }); }); it("turns underscores into spaces", () => { expect(describeTimezoneArea("America/New_York")).toEqual({ area: "New York" }); }); it("drops the continent grouping, which answers a question nobody asked", () => { // "Asia" beside a locale region of "Philippines" reads as two answers to // the same question. expect(describeTimezoneArea("Asia/Manila")).not.toHaveProperty("region"); }); it("returns nothing for a bare zone like UTC", () => { expect(describeTimezoneArea("UTC")).toEqual({}); }); }); describe("localeRegion", () => { it("reads the region the user configured, rather than inferring one", () => { expect(localeRegion("en-PH")).toEqual({ code: "PH", name: "Philippines" }); }); it("handles other regions", () => { expect(localeRegion("de-DE")?.name).toBe("Germany"); expect(localeRegion("en-US")?.code).toBe("US"); }); it("has nothing to say for a locale with no region", () => { expect(localeRegion("en")).toBeUndefined(); }); it("does not throw on a malformed locale", () => { expect(localeRegion("not a locale")).toBeUndefined(); expect(localeRegion("")).toBeUndefined(); }); }); describe("utcOffsetLabel", () => { it("renders a GMT offset for a fixed zone", () => { const date = new Date("2026-01-02T03:04:05Z"); expect(utcOffsetLabel(date, "Asia/Manila")).toContain("+08:00"); }); it("reflects daylight saving rather than a fixed offset", () => { const winter = utcOffsetLabel(new Date("2026-01-15T12:00:00Z"), "America/New_York"); const summer = utcOffsetLabel(new Date("2026-07-15T12:00:00Z"), "America/New_York"); expect(winter).not.toBe(summer); expect(winter).toContain("-05:00"); expect(summer).toContain("-04:00"); }); }); describe("weekdayName", () => { it("names the weekday in the requested zone", () => { // 2026-01-02T03:04:05Z is a Friday in UTC. expect(weekdayName(new Date("2026-01-02T03:04:05Z"), "UTC")).toBe("Friday"); }); it("respects the zone when the local date differs from UTC", () => { // 2026-01-02T23:30Z is still Friday in UTC but already Saturday in Manila. const late = new Date("2026-01-02T23:30:00Z"); expect(weekdayName(late, "UTC")).toBe("Friday"); expect(weekdayName(late, "Asia/Manila")).toBe("Saturday"); }); }); describe("getLocationContext", () => { it("reports the requested zone with its parts", () => { const context = getLocationContext(new Date("2026-01-02T03:04:05Z"), "Asia/Manila"); expect(context.timezone).toBe("Asia/Manila"); expect(context.utcOffset).toContain("+08:00"); expect(context.locale.length).toBeGreaterThan(0); // The zone's label is reported as such, never as the user's city. expect(context.timezoneArea).toBe("Manila"); expect(context).not.toHaveProperty("city"); }); it("still returns a usable context for an unknown zone", () => { const context = getLocationContext(new Date("2026-01-02T03:04:05Z"), "Not/AReal_Zone"); expect(context.timezone).toBe("Not/AReal_Zone"); expect(context.utcOffset).toBe("UTC"); }); it("carries the configured place through verbatim", () => { const context = getLocationContext(new Date(), "Asia/Manila", " Cebu City, Philippines "); expect(context.place).toBe("Cebu City, Philippines"); }); it("treats an empty or whitespace place as unset", () => { expect(getLocationContext(new Date(), "Asia/Manila", "").place).toBeUndefined(); expect(getLocationContext(new Date(), "Asia/Manila", " ").place).toBeUndefined(); expect(getLocationContext(new Date(), "Asia/Manila").place).toBeUndefined(); }); });