import { describe, expect, test } from 'bun:test'; import { renderToStaticMarkup } from 'react-dom/server'; import { AppReleaseNotes, releaseNotesUrl } from '../src/components/AppReleaseNotes'; import { I18nProvider, supportedLocales, translate, type AppLocale } from '../src/i18n'; const translations = { 'zh-CN': '## 新增\n\n- 支持 **更新说明**。\n', 'zh-TW': '## 新增\n\n- 支援 **更新說明**。\n', en: '## Added\n\n- Supports **release notes**.\n', ja: '## 新機能\n\n- **更新内容**を表示します。\n', }; const info = { latestVersion: '0.2.98', publishedAt: '2026-09-19T00:00:00Z', releaseNotes: translations, }; function renderNotes(overrides: Partial[0]> = {}, locale: AppLocale = 'zh-CN') { const previousWindow = Object.getOwnPropertyDescriptor(globalThis, 'window'); // The provider reads the saved UI language on mount; effects do not run during SSR. Object.defineProperty(globalThis, 'window', { configurable: true, value: { localStorage: { getItem: () => locale } }, }); try { return renderToStaticMarkup( {}} {...overrides} /> , ); } finally { if (previousWindow) Object.defineProperty(globalThis, 'window', previousWindow); else Reflect.deleteProperty(globalThis, 'window'); } } describe('localized release notes display', () => { test('renders versioned Markdown with date and release link without requiring an available update', () => { const html = renderNotes(); expect(html).toContain('v0.2.98'); expect(html).toMatch(/