import { test } from 'node:test' import assert from 'node:assert/strict' import { http } from '../src/shared/api/http.ts' import { runDeleteBrand, getDeleteBrandHistory, deleteDeleteBrandHistory, getDeleteBrandTaskDetail, getDeleteBrandTaskDetails, getDeleteBrandTaskDownloadUrl, getDeleteBrandResultDownloadUrl, submitDeleteBrandResult, getDeleteBrandTaskProgress, type DeleteBrandRunRequest, type DeleteBrandSubmitResultRequest, } from '../src/shared/api/types/modules/delete-brand.ts' function setupWindow() { ;(globalThis as Record).window = { localStorage: { getItem: () => '42' }, location: { origin: 'http://localhost' }, } } function mockRequest( t: Parameters[1] extends (t: infer T) => unknown ? T : never, impl: (config: { url?: string; method?: string; params?: Record; data?: unknown; timeout?: number }) => Promise, ) { t.mock.method(http, 'request', impl as never) } const okResponse = (data: unknown) => Promise.resolve({ data: { success: true, message: 'ok', data } }) const runRequest: Omit = { files: [{ fileKey: 'k1' }], } test('test_delete_brand_run_url_payload', async (t) => { setupWindow() let captured: { url?: string; method?: string; data?: unknown; timeout?: number } = {} mockRequest(t, (config) => { captured = config return okResponse({ total: 1, successCount: 0, failedCount: 1, items: [] }) }) await runDeleteBrand(runRequest) assert.equal(captured.url, '/newApi/api/delete-brand/run') assert.equal(captured.method, 'POST') assert.deepEqual(captured.data, { ...runRequest, user_id: 42 }) assert.equal(captured.timeout, 180000) }) test('test_delete_brand_history', async (t) => { setupWindow() let captured: { url?: string; params?: Record } = {} mockRequest(t, (config) => { captured = config return okResponse({ items: [] }) }) await getDeleteBrandHistory() assert.equal(captured.url, '/newApi/api/delete-brand/history') assert.deepEqual(captured.params, { user_id: 42 }) }) test('test_delete_brand_delete_history', async (t) => { setupWindow() let captured: { url?: string; method?: string; params?: Record } = {} mockRequest(t, (config) => { captured = config return okResponse(null) }) await deleteDeleteBrandHistory(7) assert.equal(captured.url, '/newApi/api/delete-brand/history/7') assert.equal(captured.method, 'DELETE') assert.deepEqual(captured.params, { user_id: 42 }) }) test('test_delete_brand_task_detail', async (t) => { setupWindow() let captured: { url?: string } = {} mockRequest(t, (config) => { captured = config return okResponse({ task: { id: 7 }, line_progress: { has_progress: true }, items: [] }) }) const result = await getDeleteBrandTaskDetail(7) assert.equal(captured.url, '/newApi/api/delete-brand/tasks/7') assert.equal(result.task.id, 7) assert.equal(result.line_progress.has_progress, true) }) test('test_delete_brand_task_details', async (t) => { setupWindow() let captured: { url?: string; method?: string; data?: unknown } = {} mockRequest(t, (config) => { captured = config return okResponse({ items: [], missingTaskIds: [] }) }) await getDeleteBrandTaskDetails([5, 3]) assert.equal(captured.url, '/newApi/api/delete-brand/tasks/batch') assert.equal(captured.method, 'POST') assert.deepEqual(captured.data, { taskIds: [5, 3], userId: 42 }) }) test('test_delete_brand_task_download_url', async (t) => { setupWindow() assert.equal( getDeleteBrandTaskDownloadUrl(7), 'http://localhost/newApi/api/delete-brand/tasks/7/download?user_id=42', ) }) test('test_delete_brand_result_download_url', async (t) => { setupWindow() assert.equal( getDeleteBrandResultDownloadUrl(9), 'http://localhost/newApi/api/delete-brand/results/9/download?user_id=42', ) }) test('test_delete_brand_submit_result_body', async (t) => { setupWindow() let captured: { url?: string; method?: string; data?: unknown } = {} mockRequest(t, (config) => { captured = config return okResponse(null) }) const body: DeleteBrandSubmitResultRequest = { submissionId: 'sub-1', files: [{ sourceFilename: 'a.xlsx', countries: [] }], } await submitDeleteBrandResult(7, body) assert.equal(captured.url, '/newApi/api/delete-brand/tasks/7/result') assert.equal(captured.method, 'POST') assert.deepEqual(captured.data, body) }) test('test_delete_brand_progress_batch', async (t) => { setupWindow() let captured: { url?: string; method?: string; data?: unknown; timeout?: number } = {} mockRequest(t, (config) => { captured = config return okResponse({ items: [], missingTaskIds: [] }) }) const result = await getDeleteBrandTaskProgress([5, 3]) assert.equal(captured.url, '/newApi/api/delete-brand/tasks/progress/batch') assert.equal(captured.method, 'POST') assert.deepEqual(captured.data, { taskIds: [3, 5], userId: 42 }) assert.equal(captured.timeout, 10000) assert.deepEqual(result, { items: [], missingTaskIds: [] }) }) test('test_delete_brand_export_compat', async (t) => { setupWindow() const fromJavaModules = await import('../src/shared/api/java-modules.ts') const fromDeleteBrand = await import('../src/shared/api/types/modules/delete-brand.ts') const names = [ 'runDeleteBrand', 'getDeleteBrandHistory', 'deleteDeleteBrandHistory', 'getDeleteBrandTaskDetail', 'getDeleteBrandTaskDetails', 'getDeleteBrandTaskDownloadUrl', 'getDeleteBrandResultDownloadUrl', 'submitDeleteBrandResult', 'getDeleteBrandTaskProgress', ] for (const name of names) { assert.equal(fromJavaModules[name], fromDeleteBrand[name], `${name} 应为同一引用`) } const item = { id: 1, taskNo: 'T1', status: 'RUNNING' } assert.equal(item.taskNo, 'T1') const status: 'MATCHED' | 'PENDING' = 'MATCHED' assert.equal(status, 'MATCHED') })