45 lines
2.5 KiB
TypeScript
45 lines
2.5 KiB
TypeScript
import { readFileSync } from 'node:fs'
|
|
import { describe, expect, it } from 'vitest'
|
|
|
|
describe('pomodoro integration', () => {
|
|
const app = readFileSync('src/App.vue', 'utf8')
|
|
const css = readFileSync('src/style.css', 'utf8')
|
|
const panel = readFileSync('src/PomodoroPanel.vue', 'utf8')
|
|
|
|
it('adds focus to desktop navigation and keeps the five-item mobile navigation unchanged', () => {
|
|
const primary = app.slice(app.indexOf('<nav class="primary-nav">'), app.indexOf('</nav>', app.indexOf('<nav class="primary-nav">')))
|
|
const bottom = app.slice(app.indexOf('<nav class="bottom"'), app.indexOf('</nav>', app.indexOf('<nav class="bottom"')))
|
|
|
|
expect(primary).toContain("switchView('focus')")
|
|
expect(primary.indexOf("switchView('focus')")).toBeGreaterThan(primary.indexOf("switchView('habits')"))
|
|
expect(bottom).not.toContain("switchView('focus')")
|
|
expect(bottom.match(/aria-current=/g)).toHaveLength(5)
|
|
})
|
|
|
|
it('renders the focus panel without the shared FAB and includes accessible stage controls', () => {
|
|
expect(app).toContain("<PomodoroPanel v-else-if=\"activeView==='focus'\"")
|
|
expect(app).not.toContain("'focus'].includes(activeView)")
|
|
expect(css).toContain('.pomodoro-controls button{min-height:44px')
|
|
expect(css).toContain('@media(prefers-reduced-motion:reduce)')
|
|
})
|
|
|
|
it('coordinates writes across tabs with unique writers and a localStorage conflict check', () => {
|
|
expect(panel).toContain('const WRITER_ID = crypto.randomUUID()')
|
|
expect(panel).toContain('const stored = loadPomodoroState(window.localStorage, STORAGE_KEY)')
|
|
expect(panel).toContain('shouldAcceptPomodoroState(stored, next) ? stored : next')
|
|
expect(panel).toContain('Date.now(), WRITER_ID')
|
|
expect(panel).toContain('savePomodoroState(window.localStorage, STORAGE_KEY, state.value)')
|
|
})
|
|
|
|
it('offers duration settings and keeps announcements honest about the running state', () => {
|
|
expect(panel).toContain("import AppSheet from './components/AppSheet.vue'")
|
|
expect(panel).toContain('@click="settingsOpen = true"')
|
|
expect(panel).toContain('已跳过休息,下一轮专注已开始')
|
|
expect(panel).toContain('专注完成,休息已开始')
|
|
expect(panel).toContain('休息完成,下一轮专注已开始')
|
|
expect(panel).toContain("v-if=\"state.status !== 'idle'\"")
|
|
expect(panel).toContain("setPomodoroDurations(state.value, minutes, state.value.breakMinutes")
|
|
expect(css).toContain('.pomodoro-settings__options button{min-height:44px')
|
|
})
|
|
})
|