diff --git a/apps/frontend/src/components/command/CommandSearchTasksItem.vue b/apps/frontend/src/components/command/CommandSearchTasksItem.vue index bc913bf..6dc2ae0 100644 --- a/apps/frontend/src/components/command/CommandSearchTasksItem.vue +++ b/apps/frontend/src/components/command/CommandSearchTasksItem.vue @@ -8,7 +8,7 @@ const props = defineProps<{ title: string desc: string done: boolean - from: TasksSelector + from: TasksSelector | undefined id: string }>() diff --git a/apps/frontend/src/components/command/searchTasks.ts b/apps/frontend/src/components/command/searchTasks.ts index a4bf19d..ac4302e 100644 --- a/apps/frontend/src/components/command/searchTasks.ts +++ b/apps/frontend/src/components/command/searchTasks.ts @@ -8,7 +8,7 @@ interface SearchTaskItem { title: string desc: string done: boolean - from: TasksSelector + from: TasksSelector | undefined } export const filteredTasks = ref[]>([]) @@ -19,6 +19,7 @@ const fuse = new Fuse([] as SearchTaskItem[], { export async function searchTasks(input: string) { const tasksStore = useTasksStore() const projectsStore = useListProjectsStore() + const rawTasks = await tasksStore.findAllTasksNotRemoved() const tasks = rawTasks.map((task) => { const done = task.status === TaskStatus.COMPLETED diff --git a/apps/frontend/src/components/command/tests/searchTasks.spec.ts b/apps/frontend/src/components/command/tests/searchTasks.spec.ts index c79f3b6..9fee4cb 100644 --- a/apps/frontend/src/components/command/tests/searchTasks.spec.ts +++ b/apps/frontend/src/components/command/tests/searchTasks.spec.ts @@ -1,21 +1,11 @@ -import { afterEach, beforeEach, describe, expect, it } from 'vitest' +import { describe, expect, it, vi } from 'vitest' import { filteredTasks, resetSearchTasks, searchTasks } from '../searchTasks' +import { completeSmartProject } from '@/store' -describe.skip('SearchTasks', () => { - beforeEach(() => { - // TODO 需要去解决2个依赖 - // 1. projectsStore.findProject 需要返回一个 Project - // 2. tasksStore.findAllTasksNotRemoved 需要返回没有处理过的 task - // vi.spyOn(TaskService, 'findAllTasksNotRemoved').mockResolvedValue([ - // createMockTask('吃饭'), - // createMockTask('写代码', '一杯茶,一包烟,一行代码写一天'), - // ]) - }) - - afterEach(() => { - resetSearchTasks() - }) +vi.mock('@/store/tasks') +vi.mock('@/store/listProjects') +describe('SearchTasks', () => { it('should be search a task by title', async () => { await searchTasks('写代码') @@ -31,7 +21,7 @@ describe.skip('SearchTasks', () => { }) it('should not be found when the task does not exist', async () => { - await searchTasks('睡觉') + await searchTasks('运动') expect(filteredTasks.value.length).toBe(0) }) @@ -43,14 +33,18 @@ describe.skip('SearchTasks', () => { expect(filteredTasks.value.length).toBe(0) }) -}) -// function createMockTask(title: string, content = '') { -// return { -// id: 0, -// title, -// content, -// project: undefined, -// index: 1, -// } -// } + it('should be task’s project is listProject when status is active', async () => { + await searchTasks('写代码') + + const task = filteredTasks.value[0].item + expect(task.from!.type).toBe('listProject') + }) + + it('should be task’s project is completeSmartProject when status is completed', async () => { + await searchTasks('睡觉') + + const task = filteredTasks.value[0].item + expect(task.from!.name).toBe(completeSmartProject.name) + }) +}) diff --git a/apps/frontend/src/components/task/TaskItem.vue b/apps/frontend/src/components/task/TaskItem.vue index a8e444a..8f5e5a9 100644 --- a/apps/frontend/src/components/task/TaskItem.vue +++ b/apps/frontend/src/components/task/TaskItem.vue @@ -3,7 +3,7 @@ import { NPopover } from 'naive-ui' import { ref } from 'vue' import { useTaskOperationMessage, useTaskRightContextMenu } from '@/composables' import { TaskStatus, useTasksStore, useThemeStore } from '@/store' -import type { Project, Task } from '@/store' +import type { ListProject, Task } from '@/store' interface Props { task: Task diff --git a/apps/frontend/src/store/__mocks__/listProjects.ts b/apps/frontend/src/store/__mocks__/listProjects.ts new file mode 100644 index 0000000..26b8801 --- /dev/null +++ b/apps/frontend/src/store/__mocks__/listProjects.ts @@ -0,0 +1,14 @@ +import { vi } from 'vitest' +import type { ListProject } from '../listProjects' + +export const useListProjectsStore = vi.fn(() => { + return { + findProject() { + return { + id: '1', + name: '集草器', + type: 'listProject', + } as ListProject + }, + } +}) diff --git a/apps/frontend/src/store/__mocks__/tasks.ts b/apps/frontend/src/store/__mocks__/tasks.ts new file mode 100644 index 0000000..e195e37 --- /dev/null +++ b/apps/frontend/src/store/__mocks__/tasks.ts @@ -0,0 +1,39 @@ +import { vi } from 'vitest' +export { TaskStatus } from '../tasks' + +// 这里还是缺了一个类型 +// TODO 这里要等后端处理好返回的类型之后在解决 +const tasks = [ + { + _id: '0', + title: '吃饭', + content: '今天吃什么', + status: 'active', + projectId: '1', + position: 0, + }, + { + _id: '1', + title: '写代码', + content: '一杯茶,一包烟,一行代码写一天', + status: 'active', + projectId: '1', + position: 1, + }, + { + _id: '2', + title: '睡觉', + content: '一睡睡一天', + status: 'completed', + projectId: '1', + position: 2, + }, +] + +export const useTasksStore = vi.fn(() => { + return { + findAllTasksNotRemoved() { + return tasks + }, + } +}) diff --git a/apps/frontend/src/store/listProjects.ts b/apps/frontend/src/store/listProjects.ts index 297a55c..58fe6d1 100644 --- a/apps/frontend/src/store/listProjects.ts +++ b/apps/frontend/src/store/listProjects.ts @@ -1,19 +1,19 @@ import { defineStore } from 'pinia' import { ref } from 'vue' import { TaskStatus } from './tasks' +import { TasksSelectorType } from './tasksSelector' import { fetchAllProjects, fetchAllTasks, fetchCreateProject } from '@/api' import { useTasksSelectorStore } from '@/store' -type ProjectType = 'listProject' | 'smartProject' -export interface Project { +export interface ListProject { id: string name: string - type: ProjectType + type: TasksSelectorType.listProject } export const useListProjectsStore = defineStore('newProjects', () => { const tasksSelectorStore = useTasksSelectorStore() - const projects = ref([]) + const projects = ref([]) async function init() { const rawProjects: any = await fetchAllProjects() @@ -23,11 +23,11 @@ export const useListProjectsStore = defineStore('newProjects', () => { tasksSelectorStore.setCurrentSelector(projects.value[0]) } - function selectProject(project: Project): void - function selectProject(projectId: Project['id']): void - function selectProject(projectName: Project['name']): void - function selectProject(projectOrNameOrId: Project | string): void { - let project: Project | undefined + function selectProject(project: ListProject): void + function selectProject(projectId: ListProject['id']): void + function selectProject(projectName: ListProject['name']): void + function selectProject(projectOrNameOrId: ListProject | string): void { + let project: ListProject | undefined if (typeof projectOrNameOrId === 'string') project = findProject(projectOrNameOrId) @@ -39,7 +39,7 @@ export const useListProjectsStore = defineStore('newProjects', () => { tasksSelectorStore.setCurrentSelector(project) } - function findProject(projectIdOrName: string): Project | undefined { + function findProject(projectIdOrName: string): ListProject | undefined { return projects.value.find(p => p.name === projectIdOrName || p.id === projectIdOrName) } @@ -71,11 +71,11 @@ export const useListProjectsStore = defineStore('newProjects', () => { }) // TODO 需要提供后端返回的 project 的 type shape -function normalizeProject(rawProject: any): Project { +function normalizeProject(rawProject: any): ListProject { return { id: `${rawProject._id}`, name: rawProject.name, - type: 'listProject', + type: TasksSelectorType.listProject, } } diff --git a/apps/frontend/src/store/smartProjects.ts b/apps/frontend/src/store/smartProjects.ts index b48f4ed..b652f69 100644 --- a/apps/frontend/src/store/smartProjects.ts +++ b/apps/frontend/src/store/smartProjects.ts @@ -1,17 +1,18 @@ import { defineStore } from 'pinia' import { TaskStatus } from './tasks' +import { TasksSelectorType } from './tasksSelector' import { fetchAllTasks } from '@/api' import { useTasksSelectorStore } from '@/store' export interface SmartProject { name: string - type: 'smartProject' + type: TasksSelectorType.smartProject } function createSmartProject(name: string): SmartProject { return { name, - type: 'smartProject', + type: TasksSelectorType.smartProject, } } diff --git a/apps/frontend/src/store/tasks.ts b/apps/frontend/src/store/tasks.ts index 278da1a..f7ffb33 100644 --- a/apps/frontend/src/store/tasks.ts +++ b/apps/frontend/src/store/tasks.ts @@ -41,7 +41,6 @@ export const useTasksStore = defineStore('tasksStore', () => { async function addTask(title: string) { if (!tasksSelectorStore.currentSelector) return - if (tasksSelectorStore.currentSelector.type !== 'listProject') return diff --git a/apps/frontend/src/store/tasksSelector.ts b/apps/frontend/src/store/tasksSelector.ts index 7fb9e04..eca69db 100644 --- a/apps/frontend/src/store/tasksSelector.ts +++ b/apps/frontend/src/store/tasksSelector.ts @@ -1,9 +1,13 @@ import { defineStore } from 'pinia' import { ref } from 'vue' -import type { Project, SmartProject } from '@/store' +import type { ListProject, SmartProject } from '@/store' import { loadListProjectTasks, loadSmartProjectTasks, useTasksStore } from '@/store' -export type TasksSelector = Project | SmartProject | undefined +export type TasksSelector = ListProject | SmartProject +export enum TasksSelectorType { + listProject = 'listProject', + smartProject = 'smartProject', +} export const useTasksSelectorStore = defineStore('tasksSelectorStore', () => { const tasksStore = useTasksStore()