Files
prompt-optimizer/packages/ui/tests/unit/components/LanguageSwitchDropdown.test.js
linshen c75afa89e9 feat(i18n): establish english-first locale baseline
- split UI locale packs into en-US, zh-CN, and zh-TW modules
- switch runtime defaults, docs, and repository guidance toward an English-first baseline
- update core, MCP, and UI runtime copy to remove hardcoded Chinese fallbacks
- add locale parity and no-hardcoded-runtime guardrails across the repo
2026-04-08 20:18:27 +08:00

106 lines
3.0 KiB
JavaScript

import { describe, it, expect, vi, beforeEach } from 'vitest'
import { mount } from '@vue/test-utils'
import { nextTick } from 'vue'
import LanguageSwitchDropdown from '../../../src/components/LanguageSwitchDropdown.vue'
vi.mock('vue-i18n', async (importOriginal) => {
const actual = await importOriginal()
return {
...actual,
useI18n: () => ({
t: (key, params = {}) => {
const dictionary = {
'settings.languageSwitcher.label': 'Switch language',
'settings.languageSwitcher.ariaLabel': `Switch language (${params.language ?? ''})`,
'settings.languageSwitcher.languages.zh-CN': 'Chinese (Simplified)',
'settings.languageSwitcher.languages.zh-TW': 'Chinese (Traditional)',
'settings.languageSwitcher.languages.en-US': 'English'
}
return dictionary[key] ?? key
}
})
}
})
// Mock Naive UI components
vi.mock('naive-ui', () => ({
NButton: {
name: 'NButton',
template: '<button><slot name="icon"></slot><slot></slot></button>',
props: ['title', 'ariaLabel']
},
NDropdown: {
name: 'NDropdown',
template: '<div><slot></slot></div>',
emits: ['select'],
props: ['options', 'placement', 'trigger']
}
}))
// Mock服务注入
const mockServices = {
value: {
preferenceService: {
get: vi.fn().mockResolvedValue('zh-CN'),
set: vi.fn().mockResolvedValue(true)
}
}
}
describe('LanguageSwitchDropdown', () => {
let wrapper
beforeEach(() => {
vi.clearAllMocks()
})
const createWrapper = (props = {}) => {
return mount(LanguageSwitchDropdown, {
global: {
provide: {
services: mockServices
}
},
props
})
}
describe('基本功能', () => {
it('应该正确渲染组件', () => {
wrapper = createWrapper()
expect(wrapper.vm).toBeDefined()
})
it('应该通过 locale 提供语言选项文案', () => {
wrapper = createWrapper()
const vm = wrapper.vm
expect(vm.availableLanguages).toHaveLength(3)
expect(vm.availableLanguages[0].key).toBe('zh-CN')
expect(vm.availableLanguages[0].label).toBe('Chinese (Simplified)')
expect(vm.availableLanguages[1].key).toBe('zh-TW')
expect(vm.availableLanguages[1].label).toBe('Chinese (Traditional)')
expect(vm.availableLanguages[2].key).toBe('en-US')
expect(vm.availableLanguages[2].label).toBe('English')
})
it('应该通过 locale 生成当前语言提示文案', () => {
wrapper = createWrapper()
const vm = wrapper.vm
expect(vm.currentLanguageLabel).toBe('Switch language (English)')
})
it('应该能够调用语言切换方法', async () => {
wrapper = createWrapper()
const vm = wrapper.vm
// 只验证方法能被调用,不测试具体的切换逻辑
expect(typeof vm.handleLanguageSelect).toBe('function')
await vm.handleLanguageSelect('en-US')
expect(mockServices.value.preferenceService.set).toHaveBeenCalled()
})
})
})