Files
flights_web/src/i18n/resolver.test.ts
T

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();
});
});