From 126a204b2a8f281c933e2be72f1456de3aa0ca6e Mon Sep 17 00:00:00 2001 From: InfinityPacer <160988576+InfinityPacer@users.noreply.github.com> Date: Sat, 18 Jul 2026 20:46:38 +0800 Subject: [PATCH] test(media): cover media detail flows (#559) --- eslint-suppressions.json | 13 - src/pages/__tests__/media.spec.ts | 57 + src/pages/media.vue | 4 - src/views/discover/MediaDetailView.vue | 171 ++- .../__tests__/MediaDetailView.spec.ts | 1085 +++++++++++++++++ tests/support/factories/media.ts | 8 + tests/support/msw/handlers/media.ts | 31 +- vite.config.ts | 14 + 8 files changed, 1302 insertions(+), 81 deletions(-) create mode 100644 src/pages/__tests__/media.spec.ts create mode 100644 src/views/discover/__tests__/MediaDetailView.spec.ts diff --git a/eslint-suppressions.json b/eslint-suppressions.json index bd937828..039cdc1f 100644 --- a/eslint-suppressions.json +++ b/eslint-suppressions.json @@ -832,11 +832,6 @@ "count": 1 } }, - "src/pages/media.vue": { - "@typescript-eslint/no-unused-vars": { - "count": 1 - } - }, "src/pages/resource.vue": { "@typescript-eslint/no-explicit-any": { "count": 6 @@ -1025,14 +1020,6 @@ "count": 1 } }, - "src/views/discover/MediaDetailView.vue": { - "@typescript-eslint/no-explicit-any": { - "count": 4 - }, - "@typescript-eslint/no-unused-vars": { - "count": 1 - } - }, "src/views/discover/PersonCardListView.vue": { "@typescript-eslint/no-explicit-any": { "count": 2 diff --git a/src/pages/__tests__/media.spec.ts b/src/pages/__tests__/media.spec.ts new file mode 100644 index 00000000..6285ad2c --- /dev/null +++ b/src/pages/__tests__/media.spec.ts @@ -0,0 +1,57 @@ +import MediaPage from '@/pages/media.vue' +import { screen } from '@testing-library/vue' +import { renderWithProviders } from '@tests/support/render' +import { defineComponent, h } from 'vue' +import { describe, expect, it } from 'vitest' + +const MediaDetailViewStub = defineComponent({ + name: 'MediaDetailView', + props: { + mediaid: String, + title: String, + type: String, + year: String, + }, + setup(props) { + return () => h('output', { 'aria-label': '媒体详情参数' }, JSON.stringify(props)) + }, +}) + +async function renderPage(query: Record) { + return renderWithProviders(MediaPage, { + initialRoute: { path: '/media', query }, + global: { + stubs: { + MediaDetailView: MediaDetailViewStub, + }, + }, + }) +} + +function projectedProps() { + return JSON.parse(screen.getByRole('status', { name: '媒体详情参数' }).textContent || '{}') as Record +} + +describe('media page', () => { + it('projects route query values as strings to the detail view', async () => { + await renderPage({ + mediaid: ['tmdb:101', 'ignored'], + title: '测试电影', + type: '电影', + year: '2026', + }) + + expect(projectedProps()).toEqual({ + mediaid: 'tmdb:101,ignored', + title: '测试电影', + type: '电影', + year: '2026', + }) + }) + + it('keeps missing query values undefined', async () => { + await renderPage({}) + + expect(projectedProps()).toEqual({}) + }) +}) diff --git a/src/pages/media.vue b/src/pages/media.vue index c3e32879..8629a863 100644 --- a/src/pages/media.vue +++ b/src/pages/media.vue @@ -1,9 +1,5 @@