Skip to content

Commit 37b16ca

Browse files
committed
add unit tests
1 parent e4e389c commit 37b16ca

2 files changed

Lines changed: 67 additions & 8 deletions

File tree

packages/web-forms/tests/lib/locale/useLocale.test.ts

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ describe('useLocale', () => {
1010
// onUnmounted state pollution (document.documentElement.lang) across tests
1111
let wrappers: Array<ReturnType<typeof mount>> = [];
1212

13-
const makeLanguage = (language: string, localeCode: string): FormLanguage => ({
14-
isDefault: false,
13+
const makeLanguage = (language: string, localeCode: string, isDefault = false): FormLanguage => ({
14+
isDefault,
1515
language,
1616
locale: new Intl.Locale(localeCode),
1717
});
@@ -49,7 +49,7 @@ describe('useLocale', () => {
4949
wrappers = [];
5050
});
5151

52-
describe('language priority order (saved > browser > first)', () => {
52+
describe('language priority order (saved > designer default > browser > first)', () => {
5353
it('prefers saved locale over browser language', () => {
5454
localStorage.setItem(STORAGE_KEY as string, 'fr');
5555
vi.spyOn(navigator, 'languages', 'get').mockReturnValue(['en']);
@@ -60,7 +60,19 @@ describe('useLocale', () => {
6060
expect(document.documentElement.lang).toBe('fr');
6161
});
6262

63-
it('uses browser language when no saved locale', () => {
63+
it('prefers designer default over browser language when no saved locale', () => {
64+
vi.spyOn(navigator, 'languages', 'get').mockReturnValue(['en']);
65+
66+
const formRef = makeFormRef([
67+
makeLanguage('English', 'en'),
68+
makeLanguage('French', 'fr', true),
69+
]);
70+
mountLocale(formRef);
71+
72+
expect(document.documentElement.lang).toBe('fr');
73+
});
74+
75+
it('uses browser language when no saved locale and no designer default', () => {
6476
vi.spyOn(navigator, 'languages', 'get').mockReturnValue(['jp']);
6577

6678
const formRef = makeFormRef([makeLanguage('English', 'en'), makeLanguage('Japanese', 'jp')]);
@@ -69,7 +81,7 @@ describe('useLocale', () => {
6981
expect(document.documentElement.lang).toBe('jp');
7082
});
7183

72-
it('falls back to first available language when no saved locale and no browser match', () => {
84+
it('falls back to first available language when no saved locale, no designer default, and no browser match', () => {
7385
vi.spyOn(navigator, 'languages', 'get').mockReturnValue(['de']);
7486

7587
const formRef = makeFormRef([makeLanguage('English', 'en'), makeLanguage('French', 'fr')]);

packages/xforms-engine/test/instance/PrimaryInstance.test.ts

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,10 +225,57 @@ describe('PrimaryInstance engine representation of instance state', () => {
225225
);
226226

227227
expect(lastObservedClientLanguage).toEqual({
228-
isDefault: false,
229-
language: 'Spanish',
230-
locale: undefined,
228+
isDefault: false,
229+
language: 'Spanish',
230+
locale: undefined,
231+
});
231232
});
233+
234+
it('marks the explicitly-designated default language with isDefault: true', () => {
235+
// prettier-ignore
236+
const xform = html(
237+
head(
238+
title('Form title'),
239+
model(
240+
t('itext',
241+
t('translation lang="English"', t('text id="q1:label"', t('value', '1. Question one'))),
242+
t('translation lang="Spanish" default="true()"', t('text id="q1:label"', t('value', '1. Pregunta uno')))
243+
),
244+
mainInstance(
245+
t('data id="test-form"', t('q1'))
246+
),
247+
bind('/data/q1').type('string')
248+
)
249+
),
250+
body(input('/data/first-question', label('First question')))
251+
);
252+
253+
const xformDOM = XFormDOM.from(xform.asXml());
254+
const def = new XFormDefinition(xformDOM);
255+
256+
const languages = reactiveTestScope(({ mutable }) => {
257+
return scope.runTask(
258+
() =>
259+
new PrimaryInstance({
260+
mode: 'create',
261+
initialState: null,
262+
scope,
263+
model: def.model,
264+
secondaryInstances: SecondaryInstancesDefinition.loadSync(xformDOM),
265+
config: {
266+
clientStateFactory: mutable,
267+
computeAttachmentName: () => null,
268+
preloadProperties: {},
269+
geolocationProvider: { getLocation: () => Promise.resolve('') },
270+
},
271+
}).root.languages
272+
);
273+
});
274+
275+
expect(languages).toEqual([
276+
{ isDefault: true, language: 'Spanish', locale: undefined },
277+
{ isDefault: false, language: 'English', locale: undefined },
278+
]);
232279
});
233280
});
234281

0 commit comments

Comments
 (0)