From b39945fcda6ed0b3e3d0c6761d2b099a6d868acf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98=E9=98=BF=E6=B1=9F=28Relakkes?= =?UTF-8?q?=29?= Date: Sun, 13 Sep 2026 21:33:04 +0800 Subject: [PATCH] fix(desktop): rename provider settings to model management across locales --- .../src/__tests__/generalSettings.test.tsx | 51 +++++++++++++------ desktop/src/i18n/locales/en.ts | 18 +++---- desktop/src/i18n/locales/jp.ts | 18 +++---- desktop/src/i18n/locales/kr.ts | 18 +++---- desktop/src/i18n/locales/zh-TW.ts | 18 +++---- desktop/src/i18n/locales/zh.ts | 18 +++---- desktop/src/pages/SettingsNavigation.test.tsx | 2 +- .../pages/settings/ProviderSettings.test.tsx | 6 +-- 8 files changed, 84 insertions(+), 65 deletions(-) diff --git a/desktop/src/__tests__/generalSettings.test.tsx b/desktop/src/__tests__/generalSettings.test.tsx index bb2d12bc..b2b48f4e 100644 --- a/desktop/src/__tests__/generalSettings.test.tsx +++ b/desktop/src/__tests__/generalSettings.test.tsx @@ -2190,7 +2190,7 @@ describe('Settings > Providers tab', () => { expect(MOCK_DELETE_PROVIDER).not.toHaveBeenCalled() expect(screen.getByRole('dialog')).toBeInTheDocument() - expect(screen.getByText('Delete provider "MiniMax-M2.7-highspeed(openai)"? This cannot be undone.')).toBeInTheDocument() + expect(screen.getByText('Delete model configuration "MiniMax-M2.7-highspeed(openai)"? This cannot be undone.')).toBeInTheDocument() const dialog = screen.getByRole('dialog') await act(async () => { @@ -2201,12 +2201,31 @@ describe('Settings > Providers tab', () => { expect(MOCK_DELETE_PROVIDER).toHaveBeenCalledWith('provider-1') }) + it.each([ + ['zh', '模型配置', '模型管理', '添加模型', '配置名称'], + ['zh-TW', '模型設定', '模型管理', '新增模型', '設定名稱'], + ['en', 'Model Settings', 'Model Management', 'Add Model', 'Configuration name'], + ['jp', 'モデル設定', 'モデル管理', 'モデルを追加', '設定名'], + ['kr', '모델 설정', '모델 관리', '모델 추가', '설정 이름'], + ] as const)('uses model terminology throughout settings in %s', (locale, menu, title, add, name) => { + useSettingsStore.setState({ locale }) + render() + + expect(screen.getByRole('button', { name: new RegExp(menu) })).toBeInTheDocument() + expect(screen.getByRole('heading', { name: title })).toBeInTheDocument() + fireEvent.click(screen.getByRole('button', { name: new RegExp(add) })) + + const dialog = screen.getByRole('dialog') + expect(within(dialog).getByRole('heading', { name: add })).toBeInTheDocument() + expect(within(dialog).getByLabelText(new RegExp(name))).toBeInTheDocument() + }) + it('keeps custom provider creation available when presets are unavailable', async () => { providerStoreState.presets = [] render() - const addButton = screen.getByRole('button', { name: /Add Provider/i }) + const addButton = screen.getByRole('button', { name: /Add Model/i }) expect(addButton).toBeEnabled() fireEvent.click(addButton) @@ -2232,7 +2251,7 @@ describe('Settings > Providers tab', () => { providerStoreState.presets = [ZHIPU_REGIONAL_PRESET] render() - fireEvent.click(screen.getByRole('button', { name: /Add Provider/i })) + fireEvent.click(screen.getByRole('button', { name: /Add Model/i })) const dialog = screen.getByRole('dialog') await waitFor(() => expect(settleSettings).toBeTypeOf('function')) @@ -2266,7 +2285,7 @@ describe('Settings > Providers tab', () => { providerStoreState.presets = [ZHIPU_REGIONAL_PRESET] render() - fireEvent.click(screen.getByRole('button', { name: /Add Provider/i })) + fireEvent.click(screen.getByRole('button', { name: /Add Model/i })) const dialog = screen.getByRole('dialog') await waitFor(() => expect(resolveSettings).toBeTypeOf('function')) @@ -2317,7 +2336,7 @@ describe('Settings > Providers tab', () => { render() - fireEvent.click(screen.getByRole('button', { name: /Add Provider/i })) + fireEvent.click(screen.getByRole('button', { name: /Add Model/i })) const dialog = screen.getByRole('dialog') expect(within(dialog).queryByRole('combobox')).not.toBeInTheDocument() @@ -2351,7 +2370,7 @@ describe('Settings > Providers tab', () => { }] render() - fireEvent.click(screen.getByRole('button', { name: /Add Provider/i })) + fireEvent.click(screen.getByRole('button', { name: /Add Model/i })) const dialog = screen.getByRole('dialog') const mediaSupport = within(dialog).getByLabelText('Preserve nested tool result media') @@ -2407,7 +2426,7 @@ describe('Settings > Providers tab', () => { render() - fireEvent.click(screen.getByRole('button', { name: /添加服务商/i })) + fireEvent.click(screen.getByRole('button', { name: /添加模型/i })) const dialog = screen.getByRole('dialog') expect(within(dialog).getByPlaceholderText('例如: deepseek-v4-flash')).toBeInTheDocument() @@ -2449,7 +2468,7 @@ describe('Settings > Providers tab', () => { render() - fireEvent.click(screen.getByRole('button', { name: /Add Provider|添加服务商/i })) + fireEvent.click(screen.getByRole('button', { name: /Add Model|添加模型/i })) const dialog = screen.getByRole('dialog') await waitFor(() => { const settingsTextarea = dialog.querySelector('textarea') @@ -2514,7 +2533,7 @@ describe('Settings > Providers tab', () => { render() - fireEvent.click(screen.getByRole('button', { name: /Add Provider|添加服务商/i })) + fireEvent.click(screen.getByRole('button', { name: /Add Model|添加模型/i })) const dialog = screen.getByRole('dialog') const settingsTextarea = await waitFor(() => { const textarea = dialog.querySelector('textarea') @@ -2603,7 +2622,7 @@ describe('Settings > Providers tab', () => { render() - fireEvent.click(screen.getByRole('button', { name: /Add Provider|添加服务商/i })) + fireEvent.click(screen.getByRole('button', { name: /Add Model|添加模型/i })) const dialog = screen.getByRole('dialog') await waitFor(() => { const settingsTextarea = dialog.querySelector('textarea') @@ -2685,7 +2704,7 @@ describe('Settings > Providers tab', () => { render() - fireEvent.click(screen.getByRole('button', { name: /Add Provider/i })) + fireEvent.click(screen.getByRole('button', { name: /Add Model/i })) const dialog = screen.getByRole('dialog') const toolSearchCheckbox = within(dialog).getByRole('checkbox', { name: 'Enable Tool Search' }) @@ -2763,7 +2782,7 @@ describe('Settings > Providers tab', () => { render() - fireEvent.click(screen.getByRole('button', { name: /Add Provider/i })) + fireEvent.click(screen.getByRole('button', { name: /Add Model/i })) const dialog = screen.getByRole('dialog') const disableBetasCheckbox = within(dialog).getByRole('checkbox', { name: 'Disable experimental beta headers' }) expect(within(dialog).getByText( @@ -2840,7 +2859,7 @@ describe('Settings > Providers tab', () => { render() - fireEvent.click(screen.getByRole('button', { name: /Add Provider|添加服务商/i })) + fireEvent.click(screen.getByRole('button', { name: /Add Model|添加模型/i })) const dialog = screen.getByRole('dialog') await waitFor(() => { const settingsTextarea = dialog.querySelector('textarea') @@ -2902,7 +2921,7 @@ describe('Settings > Providers tab', () => { render() - fireEvent.click(screen.getByRole('button', { name: /Add Provider/i })) + fireEvent.click(screen.getByRole('button', { name: /Add Model/i })) const dialog = screen.getByRole('dialog') const apiKeyInput = within(dialog).getByPlaceholderText('sk-...') @@ -2940,7 +2959,7 @@ describe('Settings > Providers tab', () => { render() - fireEvent.click(screen.getByRole('button', { name: /Add Provider|添加服务商/i })) + fireEvent.click(screen.getByRole('button', { name: /Add Model|添加模型/i })) const dialog = screen.getByRole('dialog') await waitFor(() => { expect(dialog.querySelector('textarea')?.value).toContain('"ANTHROPIC_MODEL"') @@ -2977,7 +2996,7 @@ describe('Settings > Providers tab', () => { render() - fireEvent.click(screen.getByRole('button', { name: /Add Provider|添加服务商/i })) + fireEvent.click(screen.getByRole('button', { name: /Add Model|添加模型/i })) const dialog = screen.getByRole('dialog') const fetchButton = within(dialog).getByRole('button', { name: /Fetch models|获取模型/i }) diff --git a/desktop/src/i18n/locales/en.ts b/desktop/src/i18n/locales/en.ts index 468be8fa..0fc54b73 100644 --- a/desktop/src/i18n/locales/en.ts +++ b/desktop/src/i18n/locales/en.ts @@ -418,7 +418,7 @@ export const en = { // ─── Settings ────────────────────────────────────── 'settings.title': 'Settings', - 'settings.tab.providers': 'Providers', + 'settings.tab.providers': 'Model Settings', 'settings.tab.permissions': 'Permissions', 'settings.tab.activity': 'Token usage', 'settings.tab.trace': 'Trace', @@ -821,9 +821,9 @@ Row 9, all 8 cells: continuing from straight down, turning left through lower-le 'settings.grokOfficialLogin.errorPrefix': 'Grok OAuth error: ', // Settings > Providers - 'settings.providers.title': 'Providers', - 'settings.providers.description': 'Manage API providers for model access.', - 'settings.providers.addProvider': 'Add Provider', + 'settings.providers.title': 'Model Management', + 'settings.providers.description': 'Configure models, API endpoints, and credentials.', + 'settings.providers.addProvider': 'Add Model', 'settings.providers.officialName': 'Claude Official', 'settings.providers.officialDesc': 'Anthropic native — no API key required', 'settings.providers.openaiOfficialName': 'ChatGPT Official', @@ -836,7 +836,7 @@ Row 9, all 8 cells: continuing from straight down, turning left through lower-le 'settings.providers.connectivityFailed': '① Connectivity failed: {error}', 'settings.providers.proxyOk': '② Proxy pipeline ({latency}ms)', 'settings.providers.proxyFailed': '② Proxy failed: {error}', - 'settings.providers.confirmDelete': 'Delete provider "{name}"? This cannot be undone.', + 'settings.providers.confirmDelete': 'Delete model configuration "{name}"? This cannot be undone.', 'settings.providers.activate': 'Activate', 'settings.providers.default': 'Default', 'settings.providers.setDefault': 'Set default', @@ -844,11 +844,11 @@ Row 9, all 8 cells: continuing from straight down, turning left through lower-le 'settings.providers.edit': 'Edit', 'settings.providers.dragToReorder': 'Drag to reorder', 'settings.providers.requestFailed': 'Request failed', - 'settings.providers.addTitle': 'Add Provider', - 'settings.providers.editTitle': 'Edit Provider', + 'settings.providers.addTitle': 'Add Model', + 'settings.providers.editTitle': 'Edit Model', 'settings.providers.preset': 'Preset', - 'settings.providers.name': 'Name', - 'settings.providers.namePlaceholder': 'Provider name', + 'settings.providers.name': 'Configuration name', + 'settings.providers.namePlaceholder': 'Configuration name', 'settings.providers.notes': 'Notes', 'settings.providers.notesPlaceholder': 'Optional notes...', 'settings.providers.baseUrl': 'Base URL', diff --git a/desktop/src/i18n/locales/jp.ts b/desktop/src/i18n/locales/jp.ts index f8176095..172d506b 100644 --- a/desktop/src/i18n/locales/jp.ts +++ b/desktop/src/i18n/locales/jp.ts @@ -420,7 +420,7 @@ export const jp: Record = { // ─── Settings ────────────────────────────────────── 'settings.title': '設定', - 'settings.tab.providers': 'プロバイダー', + 'settings.tab.providers': 'モデル設定', 'settings.tab.permissions': '権限', 'settings.tab.activity': 'トークン使用量', 'settings.tab.trace': 'Trace', @@ -823,9 +823,9 @@ export const jp: Record = { 'settings.grokOfficialLogin.errorPrefix': 'Grok OAuth エラー: ', // Settings > Providers - 'settings.providers.title': 'プロバイダー', - 'settings.providers.description': 'モデルにアクセスするための API プロバイダーを管理します。', - 'settings.providers.addProvider': 'プロバイダーを追加', + 'settings.providers.title': 'モデル管理', + 'settings.providers.description': 'モデル、API エンドポイント、認証情報を設定します。', + 'settings.providers.addProvider': 'モデルを追加', 'settings.providers.officialName': 'Claude 公式', 'settings.providers.officialDesc': 'Anthropic ネイティブ — API キー不要', 'settings.providers.openaiOfficialName': 'ChatGPT 公式', @@ -838,7 +838,7 @@ export const jp: Record = { 'settings.providers.connectivityFailed': '① 接続に失敗しました: {error}', 'settings.providers.proxyOk': '② プロキシパイプライン ({latency}ms)', 'settings.providers.proxyFailed': '② プロキシ失敗: {error}', - 'settings.providers.confirmDelete': 'プロバイダー「{name}」を削除しますか?この操作は取り消せません。', + 'settings.providers.confirmDelete': 'モデル設定「{name}」を削除しますか?この操作は取り消せません。', 'settings.providers.activate': '有効化', 'settings.providers.default': 'デフォルト', 'settings.providers.setDefault': 'デフォルトに設定', @@ -846,11 +846,11 @@ export const jp: Record = { 'settings.providers.edit': '編集', 'settings.providers.dragToReorder': 'ドラッグして並べ替え', 'settings.providers.requestFailed': 'リクエストに失敗しました', - 'settings.providers.addTitle': 'プロバイダーを追加', - 'settings.providers.editTitle': 'プロバイダーを編集', + 'settings.providers.addTitle': 'モデルを追加', + 'settings.providers.editTitle': 'モデルを編集', 'settings.providers.preset': 'プリセット', - 'settings.providers.name': '名前', - 'settings.providers.namePlaceholder': 'プロバイダー名', + 'settings.providers.name': '設定名', + 'settings.providers.namePlaceholder': '設定名', 'settings.providers.notes': 'メモ', 'settings.providers.notesPlaceholder': '任意のメモ...', 'settings.providers.baseUrl': 'ベース URL', diff --git a/desktop/src/i18n/locales/kr.ts b/desktop/src/i18n/locales/kr.ts index 7576ce2a..772ef5f6 100644 --- a/desktop/src/i18n/locales/kr.ts +++ b/desktop/src/i18n/locales/kr.ts @@ -420,7 +420,7 @@ export const kr: Record = { // ─── Settings ────────────────────────────────────── 'settings.title': '설정', - 'settings.tab.providers': '공급자', + 'settings.tab.providers': '모델 설정', 'settings.tab.permissions': '권한', 'settings.tab.activity': '토큰 사용량', 'settings.tab.trace': 'Trace', @@ -823,9 +823,9 @@ export const kr: Record = { 'settings.grokOfficialLogin.errorPrefix': 'Grok OAuth 오류: ', // Settings > Providers - 'settings.providers.title': '공급자', - 'settings.providers.description': '모델 액세스를 위한 API 공급자를 관리합니다.', - 'settings.providers.addProvider': '공급자 추가', + 'settings.providers.title': '모델 관리', + 'settings.providers.description': '모델, API 엔드포인트 및 인증 정보를 설정합니다.', + 'settings.providers.addProvider': '모델 추가', 'settings.providers.officialName': 'Claude 공식', 'settings.providers.officialDesc': 'Anthropic 네이티브 — API 키 불필요', 'settings.providers.openaiOfficialName': 'ChatGPT 공식', @@ -838,7 +838,7 @@ export const kr: Record = { 'settings.providers.connectivityFailed': '① 연결 실패: {error}', 'settings.providers.proxyOk': '② 프록시 파이프라인 ({latency}ms)', 'settings.providers.proxyFailed': '② 프록시 실패: {error}', - 'settings.providers.confirmDelete': '공급자 "{name}"을(를) 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.', + 'settings.providers.confirmDelete': '모델 설정 "{name}"을(를) 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.', 'settings.providers.activate': '활성화', 'settings.providers.default': '기본값', 'settings.providers.setDefault': '기본값으로 설정', @@ -846,11 +846,11 @@ export const kr: Record = { 'settings.providers.edit': '편집', 'settings.providers.dragToReorder': '드래그하여 순서 변경', 'settings.providers.requestFailed': '요청에 실패했습니다', - 'settings.providers.addTitle': '공급자 추가', - 'settings.providers.editTitle': '공급자 편집', + 'settings.providers.addTitle': '모델 추가', + 'settings.providers.editTitle': '모델 편집', 'settings.providers.preset': '사전 설정', - 'settings.providers.name': '이름', - 'settings.providers.namePlaceholder': '공급자 이름', + 'settings.providers.name': '설정 이름', + 'settings.providers.namePlaceholder': '설정 이름', 'settings.providers.notes': '메모', 'settings.providers.notesPlaceholder': '선택 사항 메모...', 'settings.providers.baseUrl': '기본 URL', diff --git a/desktop/src/i18n/locales/zh-TW.ts b/desktop/src/i18n/locales/zh-TW.ts index 01fe6942..d517ceeb 100644 --- a/desktop/src/i18n/locales/zh-TW.ts +++ b/desktop/src/i18n/locales/zh-TW.ts @@ -420,7 +420,7 @@ export const zh: Record = { // ─── Settings ────────────────────────────────────── 'settings.title': '設定', - 'settings.tab.providers': '服務商', + 'settings.tab.providers': '模型設定', 'settings.tab.permissions': '許可權', 'settings.tab.activity': 'Token 用量', 'settings.tab.trace': 'Trace', @@ -822,9 +822,9 @@ export const zh: Record = { 'settings.grokOfficialLogin.errorPrefix': 'Grok OAuth 錯誤:', // Settings > Providers - 'settings.providers.title': '服務商', - 'settings.providers.description': '管理 API 服務商以訪問模型。', - 'settings.providers.addProvider': '新增服務商', + 'settings.providers.title': '模型管理', + 'settings.providers.description': '設定模型、API 端點與存取憑證。', + 'settings.providers.addProvider': '新增模型', 'settings.providers.officialName': 'Claude 官方', 'settings.providers.officialDesc': 'Anthropic 原生接入 — 無需 API 金鑰', 'settings.providers.openaiOfficialName': 'ChatGPT 官方', @@ -837,7 +837,7 @@ export const zh: Record = { 'settings.providers.connectivityFailed': '① 連通失敗: {error}', 'settings.providers.proxyOk': '② 代理轉換 ({latency}ms)', 'settings.providers.proxyFailed': '② 代理轉換失敗: {error}', - 'settings.providers.confirmDelete': '刪除服務商 "{name}"?此操作不可撤銷。', + 'settings.providers.confirmDelete': '刪除模型設定 "{name}"?此操作無法復原。', 'settings.providers.activate': '啟用', 'settings.providers.default': '預設', 'settings.providers.setDefault': '設為預設', @@ -845,11 +845,11 @@ export const zh: Record = { 'settings.providers.edit': '編輯', 'settings.providers.dragToReorder': '拖曳排序', 'settings.providers.requestFailed': '請求失敗', - 'settings.providers.addTitle': '新增服務商', - 'settings.providers.editTitle': '編輯服務商', + 'settings.providers.addTitle': '新增模型', + 'settings.providers.editTitle': '編輯模型', 'settings.providers.preset': '預設', - 'settings.providers.name': '名稱', - 'settings.providers.namePlaceholder': '服務商名稱', + 'settings.providers.name': '設定名稱', + 'settings.providers.namePlaceholder': '設定名稱', 'settings.providers.notes': '備註', 'settings.providers.notesPlaceholder': '可選備註...', 'settings.providers.baseUrl': '介面地址', diff --git a/desktop/src/i18n/locales/zh.ts b/desktop/src/i18n/locales/zh.ts index 152b1aa2..43ceacbe 100644 --- a/desktop/src/i18n/locales/zh.ts +++ b/desktop/src/i18n/locales/zh.ts @@ -420,7 +420,7 @@ export const zh: Record = { // ─── Settings ────────────────────────────────────── 'settings.title': '设置', - 'settings.tab.providers': '服务商', + 'settings.tab.providers': '模型配置', 'settings.tab.permissions': '权限', 'settings.tab.activity': 'Token 用量', 'settings.tab.trace': 'Trace', @@ -822,9 +822,9 @@ export const zh: Record = { 'settings.grokOfficialLogin.errorPrefix': 'Grok OAuth 错误:', // Settings > Providers - 'settings.providers.title': '服务商', - 'settings.providers.description': '管理 API 服务商以访问模型。', - 'settings.providers.addProvider': '添加服务商', + 'settings.providers.title': '模型管理', + 'settings.providers.description': '配置模型、API 接口与访问凭证。', + 'settings.providers.addProvider': '添加模型', 'settings.providers.officialName': 'Claude 官方', 'settings.providers.officialDesc': 'Anthropic 原生接入 — 无需 API 密钥', 'settings.providers.openaiOfficialName': 'ChatGPT 官方', @@ -837,7 +837,7 @@ export const zh: Record = { 'settings.providers.connectivityFailed': '① 连通失败: {error}', 'settings.providers.proxyOk': '② 代理转换 ({latency}ms)', 'settings.providers.proxyFailed': '② 代理转换失败: {error}', - 'settings.providers.confirmDelete': '删除服务商 "{name}"?此操作不可撤销。', + 'settings.providers.confirmDelete': '删除模型配置 "{name}"?此操作不可撤销。', 'settings.providers.activate': '激活', 'settings.providers.default': '默认', 'settings.providers.setDefault': '设为默认', @@ -845,11 +845,11 @@ export const zh: Record = { 'settings.providers.edit': '编辑', 'settings.providers.dragToReorder': '拖动排序', 'settings.providers.requestFailed': '请求失败', - 'settings.providers.addTitle': '添加服务商', - 'settings.providers.editTitle': '编辑服务商', + 'settings.providers.addTitle': '添加模型', + 'settings.providers.editTitle': '编辑模型', 'settings.providers.preset': '预设', - 'settings.providers.name': '名称', - 'settings.providers.namePlaceholder': '服务商名称', + 'settings.providers.name': '配置名称', + 'settings.providers.namePlaceholder': '配置名称', 'settings.providers.notes': '备注', 'settings.providers.notesPlaceholder': '可选备注...', 'settings.providers.baseUrl': '接口地址', diff --git a/desktop/src/pages/SettingsNavigation.test.tsx b/desktop/src/pages/SettingsNavigation.test.tsx index e3fcdbb0..b8c70dfb 100644 --- a/desktop/src/pages/SettingsNavigation.test.tsx +++ b/desktop/src/pages/SettingsNavigation.test.tsx @@ -78,7 +78,7 @@ describe('Settings section navigation', () => { it('keeps the rail on paper so the Settings tab meets its own content', () => { render() - const rail = screen.getByRole('button', { name: 'Providers' }) + const rail = screen.getByRole('button', { name: 'Model Settings' }) .closest('div[class*="w-[195px]"]') // This rail is what sits directly under the Settings tab, and the tab is diff --git a/desktop/src/pages/settings/ProviderSettings.test.tsx b/desktop/src/pages/settings/ProviderSettings.test.tsx index d8050058..e42c06f1 100644 --- a/desktop/src/pages/settings/ProviderSettings.test.tsx +++ b/desktop/src/pages/settings/ProviderSettings.test.tsx @@ -46,7 +46,7 @@ describe('ApiSmart sponsor provider', () => { provider: { ...input, id: 'saved-apismart', apiFormat: input.apiFormat ?? 'anthropic' }, })) render() - fireEvent.click(await screen.findByRole('button', { name: /Add Provider/ })) + fireEvent.click(await screen.findByRole('button', { name: /Add Model/ })) const dialog = within(screen.getByRole('dialog')) const sponsor = dialog.getByRole('button', { name: 'ApiSmart' }) expect(sponsor.parentElement).toBe(dialog.getByRole('button', { name: 'Atlas Cloud' }).parentElement) @@ -83,7 +83,7 @@ describe('ApiSmart sponsor provider', () => { it('resets image credentials and defaults when switching presets', async () => { render() - fireEvent.click(await screen.findByRole('button', { name: /Add Provider/ })) + fireEvent.click(await screen.findByRole('button', { name: /Add Model/ })) const dialog = within(screen.getByRole('dialog')) fireEvent.click(dialog.getByRole('button', { name: 'ApiSmart' })) fireEvent.change(dialog.getAllByPlaceholderText('sk-...')[1]!, { target: { value: 'fake-image-only-key' } }) @@ -128,7 +128,7 @@ describe('retired sponsor providers', () => { } expect(useProviderStore.getState().providers).toEqual(savedProviders) - fireEvent.click(screen.getByRole('button', { name: /Add Provider/ })) + fireEvent.click(screen.getByRole('button', { name: /Add Model/ })) const dialog = within(screen.getByRole('dialog')) for (const provider of savedProviders) { expect(dialog.queryByRole('button', { name: provider.name })).not.toBeInTheDocument()