import { describe, expect, it } from "vitest"; import { LANGUAGES, isLanguage, resolveLocaleFromPath, stripLocaleFromPath, } from "./resolver.js"; describe("LANGUAGES", () => { it("contains exactly 9 supported languages", () => { expect(LANGUAGES).toHaveLength(9); expect(LANGUAGES).toContain("ru"); expect(LANGUAGES).toContain("en"); expect(LANGUAGES).toContain("de"); }); }); describe("isLanguage", () => { it("returns true for valid languages", () => { expect(isLanguage("ru")).toBe(true); expect(isLanguage("en")).toBe(true); expect(isLanguage("zh")).toBe(true); }); it("returns false for invalid strings", () => { expect(isLanguage("xx")).toBe(false); expect(isLanguage("")).toBe(false); expect(isLanguage("RU")).toBe(false); expect(isLanguage("russian")).toBe(false); }); }); describe("resolveLocaleFromPath", () => { it("extracts Angular country-language locale from the first path segment", () => { expect(resolveLocaleFromPath("/ru-ru/onlineboard")).toBe("ru-ru"); expect(resolveLocaleFromPath("/en-en/onlineboard/flight/SU100")).toBe("en-en"); expect(resolveLocaleFromPath("/de-de/schedule")).toBe("de-de"); }); it("accepts mixed country-language URLs and resolves language from the second part", () => { expect(resolveLocaleFromPath("/ru-en/onlineboard")).toBe("ru-en"); expect(resolveLocaleFromPath("/ru-de/schedule")).toBe("ru-de"); expect(resolveLocaleFromPath("/ad-fr/onlineboard")).toBe("ad-fr"); }); it("auto-promotes a bare short language code to its BCP-47 cousin", () => { expect(resolveLocaleFromPath("/ru/onlineboard")).toBe("ru-ru"); expect(resolveLocaleFromPath("/en/onlineboard/flight/SU100")).toBe("en-en"); expect(resolveLocaleFromPath("/de/schedule")).toBe("de-de"); }); it("returns null for paths without a valid locale prefix", () => { expect(resolveLocaleFromPath("/onlineboard")).toBeNull(); expect(resolveLocaleFromPath("/xx/onlineboard")).toBeNull(); expect(resolveLocaleFromPath("/xx-xx/onlineboard")).toBeNull(); expect(resolveLocaleFromPath("/russia-en/onlineboard")).toBeNull(); expect(resolveLocaleFromPath("/ru-eng/onlineboard")).toBeNull(); expect(resolveLocaleFromPath("/")).toBeNull(); expect(resolveLocaleFromPath("")).toBeNull(); }); it("handles bare locale path (e.g., /ru-ru)", () => { expect(resolveLocaleFromPath("/ru-ru")).toBe("ru-ru"); expect(resolveLocaleFromPath("/ru-ru/")).toBe("ru-ru"); }); }); describe("stripLocaleFromPath", () => { it("strips Angular country-language locale and returns the rest", () => { expect(stripLocaleFromPath("/ru-ru/onlineboard")).toEqual({ locale: "ru-ru", rest: "/onlineboard", }); expect(stripLocaleFromPath("/en-en/onlineboard/flight/SU100")).toEqual({ locale: "en-en", rest: "/onlineboard/flight/SU100", }); expect(stripLocaleFromPath("/ru-en/onlineboard")).toEqual({ locale: "ru-en", rest: "/onlineboard", }); }); it("auto-promotes short codes when stripping", () => { expect(stripLocaleFromPath("/ru/onlineboard")).toEqual({ locale: "ru-ru", rest: "/onlineboard", }); }); it("returns / as rest for bare locale path", () => { expect(stripLocaleFromPath("/ru-ru")).toEqual({ locale: "ru-ru", rest: "/" }); expect(stripLocaleFromPath("/ru-ru/")).toEqual({ locale: "ru-ru", rest: "/" }); }); it("returns null for paths without a valid locale prefix", () => { expect(stripLocaleFromPath("/onlineboard")).toBeNull(); expect(stripLocaleFromPath("/xx-xx/schedule")).toBeNull(); }); });