import { test } from 'node:test' import assert from 'node:assert/strict' import { http } from '../src/shared/api/http.ts' import { parseAppearancePatent, getAppearancePatentParsedPayload, getAppearancePatentQueuePayload, getAppearancePatentDashboard, getAppearancePatentHistory, getAppearancePatentTaskProgressBatch, activateAppearancePatentTask, deleteAppearancePatentTask, deleteAppearancePatentHistory, getAppearancePatentResultDownloadUrl, } from '../src/shared/api/types/modules/appearance-patent.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 } }) test('test_appearance_patent_parse_url_payload', async (t) => { setupWindow() let captured: { url?: string; method?: string; data?: unknown } = {} mockRequest(t, (config) => { captured = config return okResponse({ taskId: 1, totalRows: 1, acceptedRows: 1, droppedRows: 0, items: [] }) }) await parseAppearancePatent([{ fileKey: 'k1' }], '请识别', 'api-1', 'tk-1') assert.equal(captured.url, '/newApi/api/appearance-patent/parse') assert.equal(captured.method, 'POST') assert.deepEqual(captured.data, { user_id: 42, files: [{ fileKey: 'k1' }], ai_prompt: '请识别', api_key: 'api-1', patent_token: 'tk-1', }) }) test('test_appearance_patent_parsed_payload', async (t) => { setupWindow() let captured: { url?: string; params?: Record } = {} mockRequest(t, (config) => { captured = config return okResponse({ items: [] }) }) const result = await getAppearancePatentParsedPayload(7) assert.equal(captured.url, '/newApi/api/appearance-patent/tasks/7/parsed-payload') assert.deepEqual(captured.params, { user_id: 42 }) assert.deepEqual(result.items, []) }) test('test_appearance_patent_queue_payload', async (t) => { setupWindow() let captured: { url?: string; params?: Record } = {} mockRequest(t, (config) => { captured = config return okResponse({ aiPrompt: '请识别' }) }) const result = await getAppearancePatentQueuePayload(7) assert.equal(captured.url, '/newApi/api/appearance-patent/tasks/7/queue-payload') assert.deepEqual(captured.params, { user_id: 42 }) assert.equal(result.aiPrompt, '请识别') }) test('test_appearance_patent_dashboard_history', async (t) => { setupWindow() const calls: { url?: string; params?: Record }[] = [] mockRequest(t, (config) => { calls.push(config) return okResponse({ pendingTaskCount: 0, processedTaskCount: 0, successTaskCount: 1, failedTaskCount: 0 }) }) await getAppearancePatentDashboard() await getAppearancePatentHistory() assert.equal(calls[0].url, '/newApi/api/appearance-patent/dashboard') assert.deepEqual(calls[0].params, { user_id: 42 }) assert.equal(calls[1].url, '/newApi/api/appearance-patent/history') assert.deepEqual(calls[1].params, { user_id: 42, limit: 50 }) }) test('test_appearance_patent_progress_batch_timeout', 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 getAppearancePatentTaskProgressBatch([5, 3]) assert.equal(captured.url, '/newApi/api/appearance-patent/tasks/progress/batch') assert.equal(captured.method, 'POST') assert.deepEqual(captured.data, { taskIds: [3, 5] }) assert.equal(captured.timeout, 10000) assert.deepEqual(result, { items: [], missingTaskIds: [] }) }) test('test_appearance_patent_activate', async (t) => { setupWindow() let captured: { url?: string; method?: string } = {} mockRequest(t, (config) => { captured = config return okResponse(null) }) await activateAppearancePatentTask(7) assert.equal(captured.url, '/newApi/api/appearance-patent/tasks/7/activate?user_id=42') assert.equal(captured.method, 'POST') }) test('test_appearance_patent_delete_task_history', async (t) => { setupWindow() const calls: { url?: string; method?: string; params?: Record }[] = [] mockRequest(t, (config) => { calls.push(config) return okResponse(null) }) await deleteAppearancePatentTask(7) await deleteAppearancePatentHistory(9) assert.equal(calls[0].url, '/newApi/api/appearance-patent/tasks/7') assert.equal(calls[0].method, 'DELETE') assert.deepEqual(calls[0].params, { user_id: 42 }) assert.equal(calls[1].url, '/newApi/api/appearance-patent/history/9') assert.equal(calls[1].method, 'DELETE') assert.deepEqual(calls[1].params, { user_id: 42 }) }) test('test_appearance_patent_download_url', async (t) => { setupWindow() const url = getAppearancePatentResultDownloadUrl(7) assert.equal(url, 'http://localhost/newApi/api/appearance-patent/results/7/download?user_id=42') }) test('test_appearance_patent_export_compat', async (t) => { setupWindow() const fromJavaModules = await import('../src/shared/api/java-modules.ts') const fromAppearance = await import('../src/shared/api/types/modules/appearance-patent.ts') const names = [ 'parseAppearancePatent', 'getAppearancePatentParsedPayload', 'getAppearancePatentQueuePayload', 'getAppearancePatentDashboard', 'getAppearancePatentHistory', 'getAppearancePatentTaskProgressBatch', 'activateAppearancePatentTask', 'deleteAppearancePatentTask', 'deleteAppearancePatentHistory', 'getAppearancePatentResultDownloadUrl', ] for (const name of names) { assert.equal(fromJavaModules[name], fromAppearance[name], `${name} 应为同一引用`) } const row = { rowIndex: 1, sourceId: 's1', displayId: 'd1', asin: 'B001', country: 'US' } assert.equal(row.country, 'US') })