fix(frontend): isolate subscription language preference (#6394)

* fix(frontend): isolate subscription language preference

* fix(frontend): defer date locale resolution
This commit is contained in:
dawn
2026-09-03 22:33:37 +08:00
committed by GitHub
parent 0c72dd8384
commit ded2aa150c
5 changed files with 95 additions and 23 deletions
+52
View File
@@ -0,0 +1,52 @@
import { afterEach, describe, expect, it, vi } from 'vitest';
describe('subscription language scope', () => {
afterEach(() => {
vi.restoreAllMocks();
vi.unstubAllGlobals();
});
it('initializes lazily and changes the subscription language without changing the panel', async () => {
vi.resetModules();
const utils = await import('@/utils');
const cookies = new Map<string, string>([['lang', 'en-US']]);
vi.spyOn(utils.CookieManager, 'getCookie').mockImplementation(
(name) => cookies.get(name) ?? '',
);
vi.spyOn(utils.CookieManager, 'setCookie').mockImplementation((name, value) => {
cookies.set(name, value);
});
const getLanguage = vi.spyOn(utils.LanguageManager, 'getLanguage');
const reload = vi.fn();
vi.stubGlobal('window', { navigator: { language: 'en-US' }, location: { reload } });
const { readyI18n } = await import('@/i18n/react');
expect(getLanguage).not.toHaveBeenCalled();
await readyI18n('subscription');
expect(cookies.get('subLang')).toBe('en-US');
utils.LanguageManager.setLanguage('fa-IR', 'subscription');
expect(cookies.get('lang')).toBe('en-US');
expect(cookies.get('subLang')).toBe('fa-IR');
expect(reload).toHaveBeenCalledOnce();
const dateTimeFormat = vi.spyOn(Intl, 'DateTimeFormat').mockImplementation(function (
locale?: Intl.LocalesArgument,
) {
return { format: () => String(locale) } as Intl.DateTimeFormat;
} as typeof Intl.DateTimeFormat);
expect(utils.IntlUtil.formatDate(0, 'gregorian', 'fa-IR')).toBe('fa-IR');
expect(dateTimeFormat).toHaveBeenLastCalledWith('fa-IR', expect.any(Object));
});
it('does not resolve the language for empty or invalid dates', async () => {
const utils = await import('@/utils');
const getLanguage = vi.spyOn(utils.LanguageManager, 'getLanguage').mockReturnValue('en-US');
expect(utils.IntlUtil.formatDate(null)).toBe('');
expect(utils.IntlUtil.formatDate(undefined)).toBe('');
expect(utils.IntlUtil.formatDate('not-a-date')).toBe('');
expect(getLanguage).not.toHaveBeenCalled();
});
});