From feb636ded47d0ab717dca8ac1c88c129be597ec1 Mon Sep 17 00:00:00 2001 From: pjaudiomv Date: Sat, 30 May 2026 13:15:55 -0400 Subject: [PATCH] add tersts for i18n changes (#528) --- tests/unit/__tests__/settings.spec.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/unit/__tests__/settings.spec.ts b/tests/unit/__tests__/settings.spec.ts index 91e4645..a2bb101 100644 --- a/tests/unit/__tests__/settings.spec.ts +++ b/tests/unit/__tests__/settings.spec.ts @@ -3,6 +3,8 @@ import { createElement } from 'react'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { SettingsProvider, useSettings } from '../../../src/hooks'; +import { defaults } from '../../../src/hooks/settings'; +import { en } from '../../../src/i18n'; describe('settings', () => { let languageGetter: ReturnType; @@ -97,4 +99,26 @@ describe('settings', () => { const { result } = renderSettings({ language: 'fr' }); expect(result.current.settings.language).toBe('fr'); }); + + it('fills missing keys from english for a partial translation', () => { + // reproduces #526: a partial strings object (e.g. injected by the + // WordPress plugin) omits required keys like title, which crashed the UI + languageGetter.mockReturnValue('af-ZA'); + const { result } = renderSettings({ + strings: { af: { modes: { search: 'Soek' } } }, + } as unknown as Partial); + expect(result.current.settings.language).toBe('af'); + // provided key overrides english + expect(result.current.strings.modes.search).toBe('Soek'); + // sibling within the same partial object still falls back + expect(result.current.strings.modes.location).toBe(en.modes.location); + // top-level key absent from the partial object falls back instead of crashing + expect(result.current.strings.title).toEqual(en.title); + }); + + it('does not mutate the shared defaults when resolving the language', () => { + languageGetter.mockReturnValue('es-MX'); + renderSettings(); + expect(defaults.language).toBe('en'); + }); });