diff --git a/src/App.test.ts b/src/App.test.ts index 49362c9..bebec99 100644 --- a/src/App.test.ts +++ b/src/App.test.ts @@ -1,13 +1,66 @@ -import { mount } from '@vue/test-utils' -import { beforeEach, describe, expect, it } from 'vitest' +import { flushPromises, mount } from '@vue/test-utils' +import { beforeEach, describe, expect, it, vi } from 'vitest' import App from './App.vue' +import { createEmptyBook } from './domain/teachingDesign' +import * as booksApi from './services/booksApi' + +vi.mock('./services/booksApi') describe('App', () => { - beforeEach(() => localStorage.clear()) + beforeEach(() => { + vi.clearAllMocks() + }) + + it('starts with the book list entry page', async () => { + vi.mocked(booksApi.listBooks).mockResolvedValue([]) - it('starts with the multi-file upload screen', () => { const wrapper = mount(App) - expect(wrapper.get('input[type="file"]').attributes('multiple')).toBeDefined() - expect(wrapper.text()).toContain('上传 Markdown') + await flushPromises() + + expect(wrapper.text()).toContain('教学设计整本') + expect(wrapper.text()).toContain('新建整本') + }) + + it('switches to the workspace view when a book is opened', async () => { + vi.mocked(booksApi.listBooks).mockResolvedValue([ + { id: 'b1', name: '示例整本', updatedAt: '2026-01-01T00:00:00.000Z', lessonCount: 0 }, + ]) + vi.mocked(booksApi.getBook).mockResolvedValue({ + id: 'b1', + name: '示例整本', + updatedAt: '2026-01-01T00:00:00.000Z', + data: createEmptyBook(), + }) + + const wrapper = mount(App) + await flushPromises() + + await wrapper.get('[data-testid="open-b1"]').trigger('click') + await flushPromises() + + expect(wrapper.find('[data-testid="back"]').exists()).toBe(true) + }) + + it('returns to the book list when back is emitted', async () => { + vi.mocked(booksApi.listBooks).mockResolvedValue([ + { id: 'b1', name: '示例整本', updatedAt: '2026-01-01T00:00:00.000Z', lessonCount: 0 }, + ]) + vi.mocked(booksApi.getBook).mockResolvedValue({ + id: 'b1', + name: '示例整本', + updatedAt: '2026-01-01T00:00:00.000Z', + data: createEmptyBook(), + }) + + const wrapper = mount(App) + await flushPromises() + + await wrapper.get('[data-testid="open-b1"]').trigger('click') + await flushPromises() + + await wrapper.get('[data-testid="back"]').trigger('click') + await flushPromises() + + expect(wrapper.text()).toContain('教学设计整本') }) }) diff --git a/src/App.vue b/src/App.vue index ee87a60..6ff8242 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,174 +1,20 @@