UNPKG

tabulator-tables

Version:

Interactive table generation JavaScript library

326 lines (256 loc) 11.4 kB
import Localize from "../../../src/js/modules/Localize/Localize"; describe("Localize module", () => { /** @type {Localize} */ let localizeMod; let mockTable; let mockOptionsList; beforeEach(() => { // Create mock optionsList mockOptionsList = { register: jest.fn(), generate: jest.fn().mockImplementation((defaults, options) => { return { ...defaults, ...options }; }) }; // Create a simplified mock of the table mockTable = { options: { locale: false, langs: { "es": { "groups": { "item": "artículo", "items": "artículos" }, "pagination": { "page_size": "Tamaño de página" } }, "fr": { "groups": { "item": "élément", "items": "éléments" } } }, columnDefaults: { headerFilterPlaceholder: false } }, optionsList: mockOptionsList, columnManager: { optionsList: mockOptionsList }, registerTableFunction: jest.fn() }; // Mock the prototype methods of the Module class jest.spyOn(Localize.prototype, 'registerTableOption').mockImplementation(function(key, value) { this.table.optionsList.register(key, value); }); // Mock console warn jest.spyOn(console, 'warn').mockImplementation(() => {}); // Create Localize module instance localizeMod = new Localize(mockTable); // Mock dispatchExternal localizeMod.dispatchExternal = jest.fn(); // Mock registerTableFunction const originalRegisterTableFunction = localizeMod.registerTableFunction; localizeMod.registerTableFunction = function(name, callback) { mockTable.registerTableFunction(name, callback); }; // Initialize the module localizeMod.initialize(); }); afterEach(() => { jest.clearAllMocks(); jest.restoreAllMocks(); }); it("should initialize with default locale", () => { expect(localizeMod.locale).toBe("default"); expect(localizeMod.lang).toBeDefined(); expect(localizeMod.bindings).toEqual({}); // Check table function registration expect(mockTable.registerTableFunction).toHaveBeenCalledWith("setLocale", expect.any(Function)); expect(mockTable.registerTableFunction).toHaveBeenCalledWith("getLocale", expect.any(Function)); expect(mockTable.registerTableFunction).toHaveBeenCalledWith("getLang", expect.any(Function)); }); it("should register table options during construction", () => { // Verify table options are registered expect(mockTable.optionsList.register).toHaveBeenCalledWith("locale", false); expect(mockTable.optionsList.register).toHaveBeenCalledWith("langs", {}); }); it("should install langs from table options", () => { // Check that Spanish lang is installed expect(localizeMod.langList.es).toBeDefined(); expect(localizeMod.langList.es.groups.item).toBe("artículo"); // Check that French lang is installed expect(localizeMod.langList.fr).toBeDefined(); expect(localizeMod.langList.fr.groups.item).toBe("élément"); }); it("should set header filter placeholder", () => { const placeholder = "Type to filter..."; localizeMod.setHeaderFilterPlaceholder(placeholder); expect(localizeMod.langList.default.headerFilters.default).toBe(placeholder); }); it("should install new language", () => { // Install a new language const germanLang = { "groups": { "item": "Element", "items": "Elemente" } }; localizeMod.installLang("de", germanLang); // Check that language was installed expect(localizeMod.langList.de).toBeDefined(); expect(localizeMod.langList.de.groups.item).toBe("Element"); }); it("should update existing language", () => { // Update existing Spanish language const updatedSpanish = { "data": { "loading": "Cargando" } }; localizeMod.installLang("es", updatedSpanish); // Check that language was updated expect(localizeMod.langList.es.groups.item).toBe("artículo"); // Original value retained expect(localizeMod.langList.es.data.loading).toBe("Cargando"); // New value added }); it("should set locale and update language", () => { // Set locale to Spanish localizeMod.setLocale("es"); // Check locale is set expect(localizeMod.locale).toBe("es"); // Check language values are correct expect(localizeMod.lang.groups.item).toBe("artículo"); expect(localizeMod.lang.pagination.page_size).toBe("Tamaño de página"); // Check that default values are inherited expect(localizeMod.lang.data.loading).toBe("Loading"); // Check dispatch is called expect(localizeMod.dispatchExternal).toHaveBeenCalledWith("localized", "es", localizeMod.lang); }); it("should handle setting locale with browser language", () => { // Mock navigator language const originalNavigator = global.navigator; const mockNavigator = { language: "es-ES" }; Object.defineProperty(global, 'navigator', { value: mockNavigator, writable: true }); // Mock traverseLang function const originalSetLocale = localizeMod.setLocale; jest.spyOn(localizeMod, 'setLocale').mockImplementation(function(desiredLocale) { if (desiredLocale === true) { desiredLocale = navigator.language.toLowerCase(); } this.locale = "es"; // Force to spanish for this test // Simulate dispatch this.dispatchExternal("localized", this.locale, this.lang); }); // Set locale to true to use browser language localizeMod.setLocale(true); // Check locale is set to es expect(localizeMod.locale).toBe("es"); // Restore original function localizeMod.setLocale.mockRestore(); // Restore navigator Object.defineProperty(global, 'navigator', { value: originalNavigator, writable: true }); }); it("should fall back to language prefix if exact match not found", () => { // Add Spanish to langList to test fallback localizeMod.langList = { "default": localizeMod.langList.default, "es": localizeMod.langList.es }; // Set locale to Spanish variant localizeMod.setLocale("es-MX"); // Should fall back to es expect(localizeMod.locale).toBe("es"); expect(console.warn).toHaveBeenCalled(); }); it("should fall back to default if no matching language found", () => { // Set locale to an unsupported language localizeMod.setLocale("ja"); // Should fall back to default expect(localizeMod.locale).toBe("default"); expect(console.warn).toHaveBeenCalled(); }); it("should get current locale", () => { // Set locale to Spanish localizeMod.setLocale("es"); // Check getLocale returns correct value expect(localizeMod.getLocale()).toBe("es"); }); it("should get language for specified locale", () => { // Get Spanish language const spanishLang = localizeMod.getLang("es"); // Check language is returned expect(spanishLang).toBe(localizeMod.langList.es); }); it("should get current language if no locale specified", () => { // Set locale to Spanish localizeMod.setLocale("es"); // Get current language const currentLang = localizeMod.getLang(); // Check language is returned expect(currentLang).toBe(localizeMod.lang); }); it("should get text for current locale", () => { // Set locale to Spanish localizeMod.setLocale("es"); // Get text const itemText = localizeMod.getText("groups|item"); // Check text is returned expect(itemText).toBe("artículo"); }); it("should get text using simplified path", () => { // Set locale to Spanish localizeMod.setLocale("es"); // Get text with path and value const itemText = localizeMod.getText("groups", "item"); // Check text is returned expect(itemText).toBe("artículo"); }); it("should return empty string if text not found", () => { // Get text for non-existent path const nonExistentText = localizeMod.getText("nonexistent|path"); // Check empty string is returned expect(nonExistentText).toBe(""); }); it("should bind callback to text path", () => { // Create mock callback const callback = jest.fn(); // Bind callback to path localizeMod.bind("groups|item", callback); // Check callback was called with current text expect(callback).toHaveBeenCalledWith(localizeMod.getText("groups|item"), localizeMod.lang); // Check binding was stored expect(localizeMod.bindings["groups|item"]).toContain(callback); }); it("should execute bindings when locale changes", () => { // Create mock callback const callback = jest.fn(); // Bind callback to path localizeMod.bind("groups|item", callback); // Reset mock to clear initial call callback.mockReset(); // Change locale localizeMod.setLocale("es"); // Check callback was called with updated text expect(callback).toHaveBeenCalledWith("artículo", localizeMod.lang); }); it("should handle multiple bindings to same path", () => { // Create mock callbacks const callback1 = jest.fn(); const callback2 = jest.fn(); // Bind callbacks to same path localizeMod.bind("groups|item", callback1); localizeMod.bind("groups|item", callback2); // Reset mocks to clear initial calls callback1.mockReset(); callback2.mockReset(); // Change locale localizeMod.setLocale("es"); // Check both callbacks were called expect(callback1).toHaveBeenCalledWith("artículo", localizeMod.lang); expect(callback2).toHaveBeenCalledWith("artículo", localizeMod.lang); }); });