From cc09696394a344c2ca28c24ae1d4e2cffbe364e1 Mon Sep 17 00:00:00 2001 From: GouJ Date: Mon, 14 Sep 2026 16:32:24 +0800 Subject: [PATCH] test: cover project scroll loading and filter reset --- tests/features/workflows/pages.test.ts | 47 +++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/tests/features/workflows/pages.test.ts b/tests/features/workflows/pages.test.ts index 230fed4..ea595e3 100644 --- a/tests/features/workflows/pages.test.ts +++ b/tests/features/workflows/pages.test.ts @@ -1,5 +1,5 @@ import { computed, ref } from 'vue' -import { NImage, NRadioGroup, NScrollbar } from 'naive-ui' +import { NDataTable, NImage, NRadioGroup, NScrollbar } from 'naive-ui' import { createMemoryHistory, createRouter } from 'vue-router' import { flushPromises, mount, type VueWrapper } from '@vue/test-utils' import { afterEach, describe, expect, it, vi } from 'vitest' @@ -1444,6 +1444,51 @@ describe('工作台页面交互', () => { expect(wrapper.findAll('tbody tr')).toHaveLength(1) }) + it('项目列表滚动追加,搜索覆盖未展示项目且清除后回到首批', async () => { + const projects = Array.from({ length: 45 }, (_, index) => ({ + ...fixture, + id: 'project-' + index, + title: '剧本' + index + })) + const fetcher = vi.fn().mockImplementation(async () => + new Response(JSON.stringify({ data: projects })) + ) + vi.stubGlobal('fetch', fetcher) + const router = createRouter({ + history: createMemoryHistory(), + routes: [{ path: '/', component: ProjectsPage }] + }) + await router.push('/') + wrapper = mount(ProjectsPage, { attachTo: document.body, global: { plugins: [router] } }) + await flushPromises() + const table = wrapper.getComponent(NDataTable) + expect(table.props('data')).toHaveLength(20) + expect(wrapper.find('.n-pagination').exists()).toBe(false) + expect(wrapper.text()).not.toContain('个项目') + expect(wrapper.text()).not.toContain('更新于') + // 远离底部不追加;抵达底部后逐批追加,末批不重复。 + const scroll = async (scrollTop: number) => { + table.vm.$emit('scroll', { target: { scrollHeight: 1000, clientHeight: 200, scrollTop } }) + await flushPromises() + } + await scroll(100) + expect(table.props('data')).toHaveLength(20) + await scroll(800) + expect(table.props('data')).toHaveLength(40) + await scroll(800) + expect(table.props('data')).toHaveLength(45) + await scroll(800) + expect(table.props('data')).toHaveLength(45) + await wrapper.get('input[aria-label="搜索项目"]').setValue('剧本44') + await flushPromises() + expect(table.props('data')).toHaveLength(1) + expect(wrapper.text()).toContain('剧本44') + await wrapper.get('input[aria-label="搜索项目"]').setValue('') + await flushPromises() + expect(table.props('data')).toHaveLength(20) + expect(fetcher).toHaveBeenCalledTimes(1) + }) + it('新建弹窗提交真实参数并返回 202 的项目 ID', async () => { const fetcher = vi .fn()