mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-09-24 16:05:44 +08:00
test(i18n): 新增语言包 spread 组装键冲突守卫测试
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
|
||||
import enAdminAccounts from '../locales/en/admin/accounts'
|
||||
import enAdminChannels from '../locales/en/admin/channels'
|
||||
import enAdminOps from '../locales/en/admin/ops'
|
||||
import enAdminOverview from '../locales/en/admin/overview'
|
||||
import enAdminResources from '../locales/en/admin/resources'
|
||||
import enAdminSettings from '../locales/en/admin/settings'
|
||||
import enCommon from '../locales/en/common'
|
||||
import enDashboard from '../locales/en/dashboard'
|
||||
import enLanding from '../locales/en/landing'
|
||||
import enMisc from '../locales/en/misc'
|
||||
import zhAdminAccounts from '../locales/zh/admin/accounts'
|
||||
import zhAdminChannels from '../locales/zh/admin/channels'
|
||||
import zhAdminOps from '../locales/zh/admin/ops'
|
||||
import zhAdminOverview from '../locales/zh/admin/overview'
|
||||
import zhAdminResources from '../locales/zh/admin/resources'
|
||||
import zhAdminSettings from '../locales/zh/admin/settings'
|
||||
import zhCommon from '../locales/zh/common'
|
||||
import zhDashboard from '../locales/zh/dashboard'
|
||||
import zhLanding from '../locales/zh/landing'
|
||||
import zhMisc from '../locales/zh/misc'
|
||||
|
||||
// locales/{zh,en}/index.ts 与 admin/index.ts 使用对象展开聚合各域模块,
|
||||
// 展开模块之间若出现同名顶层键会静默覆盖。本测试将该风险固化为显式失败。
|
||||
type Modules = Record<string, Record<string, unknown>>
|
||||
|
||||
function collisions(modules: Modules): string[] {
|
||||
const seen = new Map<string, string>()
|
||||
const out: string[] = []
|
||||
for (const [name, mod] of Object.entries(modules)) {
|
||||
for (const key of Object.keys(mod)) {
|
||||
const prev = seen.get(key)
|
||||
if (prev) {
|
||||
out.push(`"${key}" in both ${prev} and ${name}`)
|
||||
} else {
|
||||
seen.set(key, name)
|
||||
}
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
const roots: Record<string, Modules> = {
|
||||
zh: { landing: zhLanding, common: zhCommon, dashboard: zhDashboard, misc: zhMisc },
|
||||
en: { landing: enLanding, common: enCommon, dashboard: enDashboard, misc: enMisc }
|
||||
}
|
||||
|
||||
const admins: Record<string, Modules> = {
|
||||
zh: {
|
||||
overview: zhAdminOverview,
|
||||
channels: zhAdminChannels,
|
||||
accounts: zhAdminAccounts,
|
||||
resources: zhAdminResources,
|
||||
ops: zhAdminOps,
|
||||
settings: zhAdminSettings
|
||||
},
|
||||
en: {
|
||||
overview: enAdminOverview,
|
||||
channels: enAdminChannels,
|
||||
accounts: enAdminAccounts,
|
||||
resources: enAdminResources,
|
||||
ops: enAdminOps,
|
||||
settings: enAdminSettings
|
||||
}
|
||||
}
|
||||
|
||||
describe.each(Object.keys(roots))('locale %s spread assembly', (locale) => {
|
||||
it('root modules have no overlapping top-level keys', () => {
|
||||
expect(collisions(roots[locale])).toEqual([])
|
||||
})
|
||||
|
||||
it('root modules do not shadow the explicit "admin" namespace', () => {
|
||||
for (const [name, mod] of Object.entries(roots[locale])) {
|
||||
expect(Object.keys(mod), `module ${name} must not define "admin"`).not.toContain('admin')
|
||||
}
|
||||
})
|
||||
|
||||
it('admin modules have no overlapping top-level keys', () => {
|
||||
expect(collisions(admins[locale])).toEqual([])
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user