73 lines
2.8 KiB
TypeScript
73 lines
2.8 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import {
|
|
OPEN_SETTINGS_EVENT,
|
|
SETTINGS_TAB_ORDER,
|
|
isSettingsTabId,
|
|
openSettings,
|
|
readOpenSettingsTab,
|
|
resolveSettingsTab,
|
|
settingsTabIndex,
|
|
} from '../../src/renderer/navigation/settingsTabs'
|
|
import type { SettingsTabId } from '../../src/renderer/navigation/settingsTabs'
|
|
|
|
// 로그인 CTA 가 detail.tab='cloud' 를 보내면 AppLayout 이 그대로 숫자 인덱스 자리에 넣어
|
|
// 아무 패널도 없는 빈 설정 창이 열리던 회귀.
|
|
|
|
function capture(target: EventTarget): () => SettingsTabId | null {
|
|
let received: SettingsTabId | null = null
|
|
target.addEventListener(OPEN_SETTINGS_EVENT, (e) => {
|
|
received = readOpenSettingsTab(e)
|
|
})
|
|
return () => received
|
|
}
|
|
|
|
describe('settingsTabs', () => {
|
|
it('탭 순서는 SettingsModal 의 8개 탭과 같고 cloud 는 6번째(0 기준)다', () => {
|
|
expect(SETTINGS_TAB_ORDER).toEqual(['general', 'audio', 'stt', 'llm', 'input', 'license', 'cloud', 'about'])
|
|
expect(settingsTabIndex('cloud')).toBe(6)
|
|
expect(settingsTabIndex('stt')).toBe(2)
|
|
expect(settingsTabIndex('audio')).toBe(1)
|
|
})
|
|
|
|
it('알려진 id 는 그대로, 모르는 값은 general 로 바꾼다', () => {
|
|
expect(resolveSettingsTab('cloud')).toBe('cloud')
|
|
expect(resolveSettingsTab('nope')).toBe('general')
|
|
expect(resolveSettingsTab(undefined)).toBe('general')
|
|
expect(resolveSettingsTab(null)).toBe('general')
|
|
expect(resolveSettingsTab(99)).toBe('general')
|
|
expect(resolveSettingsTab(1.5)).toBe('general')
|
|
})
|
|
|
|
it('예전 숫자 인덱스 딥링크도 같은 탭으로 연다', () => {
|
|
expect(resolveSettingsTab(2)).toBe('stt')
|
|
expect(resolveSettingsTab(1)).toBe('audio')
|
|
})
|
|
|
|
it('isSettingsTabId 는 문자열 id 만 통과시킨다', () => {
|
|
expect(isSettingsTabId('about')).toBe(true)
|
|
expect(isSettingsTabId(0)).toBe(false)
|
|
expect(isSettingsTabId('Cloud')).toBe(false)
|
|
})
|
|
|
|
it("openSettings('cloud') 를 받은 쪽은 cloud 탭을 연다", () => {
|
|
const target = new EventTarget()
|
|
const received = capture(target)
|
|
openSettings('cloud', target)
|
|
expect(received()).toBe('cloud')
|
|
})
|
|
|
|
it('탭 없이 열거나 detail 없는 이벤트는 general', () => {
|
|
const target = new EventTarget()
|
|
const received = capture(target)
|
|
openSettings(undefined, target)
|
|
expect(received()).toBe('general')
|
|
target.dispatchEvent(new Event(OPEN_SETTINGS_EVENT))
|
|
expect(received()).toBe('general')
|
|
})
|
|
|
|
it("예전 문자열 'cloud' detail 을 보내던 이벤트도 빈 창이 아니라 cloud 로 읽힌다", () => {
|
|
const event = new CustomEvent(OPEN_SETTINGS_EVENT, { detail: { tab: 'cloud' } })
|
|
expect(readOpenSettingsTab(event)).toBe('cloud')
|
|
expect(readOpenSettingsTab(new CustomEvent(OPEN_SETTINGS_EVENT, { detail: { tab: 'bogus' } }))).toBe('general')
|
|
})
|
|
})
|