From 53c887d3536a16b1e317ce6a28318a73bd75da46 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Sun, 20 Sep 2026 15:03:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pda-releases/api/pdaReleases.test.ts | 37 +++++++++++++++++++ .../pages/PdaReleasesView.test.ts | 27 ++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 src/modules/pda-releases/api/pdaReleases.test.ts create mode 100644 src/modules/pda-releases/pages/PdaReleasesView.test.ts diff --git a/src/modules/pda-releases/api/pdaReleases.test.ts b/src/modules/pda-releases/api/pdaReleases.test.ts new file mode 100644 index 00000000..e0c3f186 --- /dev/null +++ b/src/modules/pda-releases/api/pdaReleases.test.ts @@ -0,0 +1,37 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest' +import { http } from '@/shared/api/http' +import { listPdaReleases, publishPdaRelease, uploadPdaRelease, withdrawPdaRelease } from './pdaReleases' + +vi.mock('@/shared/api/http', async () => { + const actual = await vi.importActual('@/shared/api/http') + return { ...actual, http: { get: vi.fn(), post: vi.fn() } } +}) + +describe('PDA release API', () => { + beforeEach(() => vi.clearAllMocks()) + + it('keeps domestic and overseas lists isolated and uses only File service admin routes', async () => { + vi.mocked(http.get).mockResolvedValue({ code: '200', data: [], message: 'success' }) + await listPdaReleases('domestic') + await listPdaReleases('overseas') + expect(http.get).toHaveBeenNthCalledWith(1, '/platform/v1/files/pda-releases/domestic') + expect(http.get).toHaveBeenNthCalledWith(2, '/platform/v1/files/pda-releases/overseas') + }) + + it('uploads a draft with compatibility fields and publishes or withdraws by release identity', async () => { + vi.mocked(http.post).mockResolvedValue({ code: '200', data: { id: 'release-1' }, message: 'success' }) + const file = new File(['PK\u0003\u0004'], 'app.wgt', { type: 'application/octet-stream' }) + await uploadPdaRelease('overseas', { packageType: 'wgt', versionName: '0.0.4', versionCode: 3, + minAppVersionCode: 3, mandatory: true, releaseNotes: '修复扫码', file }) + const [url, form, options] = vi.mocked(http.post).mock.calls[0]! + expect(url).toBe('/platform/v1/files/pda-releases/overseas') + expect(form).toBeInstanceOf(FormData) + expect((form as FormData).get('file')).toBe(file) + expect((form as FormData).get('minAppVersionCode')).toBe('3') + expect(options).toMatchObject({ timeout: 600_000 }) + await publishPdaRelease('release-1') + await withdrawPdaRelease('release-1') + expect(http.post).toHaveBeenNthCalledWith(2, '/platform/v1/files/pda-releases/release-1/publish', {}) + expect(http.post).toHaveBeenNthCalledWith(3, '/platform/v1/files/pda-releases/release-1/withdraw', {}) + }) +}) diff --git a/src/modules/pda-releases/pages/PdaReleasesView.test.ts b/src/modules/pda-releases/pages/PdaReleasesView.test.ts new file mode 100644 index 00000000..25766476 --- /dev/null +++ b/src/modules/pda-releases/pages/PdaReleasesView.test.ts @@ -0,0 +1,27 @@ +import { readFileSync } from 'node:fs' +import { resolve } from 'node:path' +import { describe, expect, it } from 'vitest' +import { pdaReleaseRoutes } from '../routes' +import { adminNavigation } from '@/core/navigation/adminNavigation' + +const page = readFileSync(resolve(process.cwd(), 'src/modules/pda-releases/pages/PdaReleasesView.vue'), 'utf8') + +describe('PDA release workbench', () => { + it('registers one permission-gated route and a system menu entry', () => { + expect(pdaReleaseRoutes[0]?.meta?.permission).toBe('platform:pda-release:list') + const system = adminNavigation.find((item) => item.key === 'system') + expect(system?.children?.find((item) => item.key === 'pda-releases')).toMatchObject({ + path: '/system/pda-releases', permission: 'platform:pda-release:list', + }) + }) + + it('provides separate apps, an APK download and manage-only upload/publish/withdraw controls', () => { + expect(page).toContain('value="domestic"') + expect(page).toContain('value="overseas"') + expect(page).toContain('row.packageType === \'apk\' && row.downloadUrl') + expect(page).toContain('v-if="canManage"') + expect(page).toContain('row.status === \'DRAFT\'') + expect(page).toContain('row.current') + expect(page).toContain('ElMessageBox.confirm') + }) +})