Files
dodo/frontend/src/PomodoroIntegration.test.ts
T
bboysoul 64f25a39c0
ci / gitleaks (push) Successful in 9s
ci / docker (push) Successful in 6m43s
feat: pomodoro duration settings sheet, honest announcements, done-state reset
2026-09-23 07:16:51 +08:00

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')
})
})