101 lines
3.6 KiB
TypeScript
101 lines
3.6 KiB
TypeScript
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();
|
|
});
|
|
});
|