From efb46d9df011775da442eef5f14305a4ad0584dc Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Mon, 15 Jun 2026 20:15:06 -0600 Subject: [PATCH] feat: add generate and back actions to workspace toolbar --- src/components/WorkspaceToolbar.test.ts | 41 +++++++++++++++++++++++++ src/components/WorkspaceToolbar.vue | 14 ++++++--- 2 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 src/components/WorkspaceToolbar.test.ts diff --git a/src/components/WorkspaceToolbar.test.ts b/src/components/WorkspaceToolbar.test.ts new file mode 100644 index 0000000..1ab7649 --- /dev/null +++ b/src/components/WorkspaceToolbar.test.ts @@ -0,0 +1,41 @@ +import { mount } from '@vue/test-utils' +import { describe, expect, it } from 'vitest' +import WorkspaceToolbar from './WorkspaceToolbar.vue' + +function mountToolbar(lessonCount: number): ReturnType { + return mount(WorkspaceToolbar, { + props: { lessonCount, warningCount: 0, saveStatus: 'idle' }, + }) +} + +describe('WorkspaceToolbar', () => { + it('renders the lesson count', () => { + const wrapper = mountToolbar(3) + expect(wrapper.text()).toContain('共 3 课') + }) + + it('emits generate when the generate button is clicked', async () => { + const wrapper = mountToolbar(3) + await wrapper.get('button[data-testid="generate"]').trigger('click') + expect(wrapper.emitted('generate')).toHaveLength(1) + }) + + it('emits back when the back button is clicked', async () => { + const wrapper = mountToolbar(0) + await wrapper.get('button[data-testid="back"]').trigger('click') + expect(wrapper.emitted('back')).toHaveLength(1) + }) + + it('keeps generate and back enabled even with no lessons', () => { + const wrapper = mountToolbar(0) + expect(wrapper.get('button[data-testid="generate"]').attributes('disabled')).toBeUndefined() + expect(wrapper.get('button[data-testid="back"]').attributes('disabled')).toBeUndefined() + }) + + it('disables print, export and clear when there are no lessons', () => { + const wrapper = mountToolbar(0) + expect(wrapper.get('button[data-testid="print"]').attributes('disabled')).toBeDefined() + expect(wrapper.get('button[data-testid="export"]').attributes('disabled')).toBeDefined() + expect(wrapper.get('button[data-testid="clear"]').attributes('disabled')).toBeDefined() + }) +}) diff --git a/src/components/WorkspaceToolbar.vue b/src/components/WorkspaceToolbar.vue index 4730d11..1f2e467 100644 --- a/src/components/WorkspaceToolbar.vue +++ b/src/components/WorkspaceToolbar.vue @@ -12,22 +12,26 @@ defineEmits<{ print: [] export: [] clear: [] + generate: [] + back: [] }>() const saveStatusLabel: Record = { idle: '', saving: '保存中…', - saved: '已保存到本地', + saved: '已保存', error: '保存失败', }