|
1 | 1 | import * as modUtil from "@/common/extension/worker/util"; |
2 | | -import { parse } from "@/common/utils/date"; |
3 | 2 | import { getDb } from "@/entrypoints/offscreen/worker/database"; |
4 | | -import { |
5 | | - METHOD_ADD_OR_UPDATE, METHOD_BATCH_ADD_OR_UPDATE, METHOD_DELETE_BY_ID, METHOD_DELETE_BY_IDS, |
6 | | - METHOD_GET_BY_ID, METHOD_GET_BY_IDS, METHOD_SEARCH |
7 | | -} from "@/entrypoints/offscreen/worker/service/baseBridgeService"; |
8 | | -import JobPublicService from "@/entrypoints/offscreen/worker/service/jobPublicService"; |
| 3 | +import { _jobPublicBatchAddJobPublicAndUpdateJob } from "@/entrypoints/offscreen/worker/service/jobPublicService"; |
9 | 4 | import { PGlite } from "@electric-sql/pglite"; |
10 | 5 | import { expect, test, vi } from "vitest"; |
11 | | -test('job public service method name correct', async () => { |
12 | | - const result = JobPublicService.getMethodNameMap(); |
13 | | - expect(result.size).greaterThan(0); |
14 | | -}); |
15 | 6 |
|
16 | | -test('job public service crud logic correct', async () => { |
17 | | - const item = { id: null, jobId: "jobId1", createDatetime: parse("2025-05-18"), updateDatetime: parse("2025-05-18") }; |
18 | | - const item2 = { id: null, jobId: "jobId2", createDatetime: parse("2025-05-19"), updateDatetime: parse("2025-05-19") }; |
| 7 | +test('forEach bug: source with single quote no longer masks error as "transaction aborted"', async () => { |
19 | 8 | vi.spyOn(modUtil, 'postErrorMessage').mockImplementation(async (message, error) => { |
20 | 9 | throw error; |
21 | 10 | }); |
22 | 11 | const db = await getDb({ dataDir: 'memory://' }); |
23 | 12 | expect(db).toBeInstanceOf(PGlite); |
24 | | - let itemId = null; |
25 | | - let itemId2 = null; |
26 | | - vi.spyOn(modUtil, 'postSuccessMessage').mockImplementation(async (message, data) => { |
27 | | - const item = data; |
28 | | - expect(item.jobId).toBe(("jobId1")); |
29 | | - expect(parse(item.createDatetime).valueOf()).toMatchObject(parse("2025-05-18").valueOf()); |
30 | | - expect(parse(item.updateDatetime).valueOf()).toMatchObject(parse("2025-05-18").valueOf()); |
31 | | - itemId = item.id; |
32 | | - }); |
33 | | - await JobPublicService[JobPublicService.getMethodName(METHOD_ADD_OR_UPDATE)]({}, item); |
34 | | - vi.spyOn(modUtil, 'postSuccessMessage').mockImplementation(async (message, data) => { |
35 | | - const item = data[0]; |
36 | | - expect(item.jobId).toBe(("jobId2")); |
37 | | - expect(parse(item.createDatetime).valueOf()).toMatchObject(parse("2025-05-19").valueOf()); |
38 | | - expect(parse(item.updateDatetime).valueOf()).toMatchObject(parse("2025-05-19").valueOf()); |
39 | | - itemId2 = item.id; |
40 | | - }); |
41 | | - await JobPublicService[JobPublicService.getMethodName(METHOD_BATCH_ADD_OR_UPDATE)]({}, { items: [item2] }); |
42 | | - vi.spyOn(modUtil, 'postSuccessMessage').mockImplementation(async (message, data) => { |
43 | | - let item = data.items[0]; |
44 | | - expect(item.jobId).toBe(("jobId1")); |
45 | | - expect(parse(item.createDatetime).valueOf()).toMatchObject(parse("2025-05-18").valueOf()); |
46 | | - expect(parse(item.updateDatetime).valueOf()).toMatchObject(parse("2025-05-18").valueOf()); |
47 | | - expect(data.total).toBe(2); |
48 | | - }); |
49 | | - await JobPublicService[JobPublicService.getMethodName(METHOD_SEARCH)]({}, { pageNum: 1, pageSize: 1 }); |
50 | | - vi.spyOn(modUtil, 'postSuccessMessage').mockImplementation(async (message, data) => { |
51 | | - let item = data; |
52 | | - expect(item.jobId).toBe(("jobId1")); |
53 | | - expect(parse(item.createDatetime).valueOf()).toMatchObject(parse("2025-05-18").valueOf()); |
54 | | - expect(parse(item.updateDatetime).valueOf()).toMatchObject(parse("2025-05-18").valueOf()); |
55 | | - }); |
56 | | - await JobPublicService[JobPublicService.getMethodName(METHOD_GET_BY_ID)]({}, itemId); |
57 | | - vi.spyOn(modUtil, 'postSuccessMessage').mockImplementation(async (message, data) => { |
58 | | - let item = data[0]; |
59 | | - expect(item.jobId).toBe(("jobId1")); |
60 | | - expect(parse(item.createDatetime).valueOf()).toMatchObject(parse("2025-05-18").valueOf()); |
61 | | - expect(parse(item.updateDatetime).valueOf()).toMatchObject(parse("2025-05-18").valueOf()); |
62 | | - }); |
63 | | - await JobPublicService[JobPublicService.getMethodName(METHOD_GET_BY_IDS)]({}, [itemId]); |
64 | | - vi.spyOn(modUtil, 'postSuccessMessage').mockImplementation(async (message, data) => { |
65 | | - expect(data[0].affectedRows).toBe(1); |
66 | | - }); |
67 | | - await JobPublicService[JobPublicService.getMethodName(METHOD_DELETE_BY_ID)]({}, itemId); |
68 | | - vi.spyOn(modUtil, 'postSuccessMessage').mockImplementation(async (message, data) => { |
69 | | - expect(data.total).toBe(1); |
70 | | - }); |
71 | | - await JobPublicService[JobPublicService.getMethodName(METHOD_SEARCH)]({}, { pageNum: 1, pageSize: 1 }); |
72 | | - vi.spyOn(modUtil, 'postSuccessMessage').mockImplementation(async (message, data) => { |
73 | | - expect(data[0].affectedRows).toBe(1); |
74 | | - }); |
75 | | - await JobPublicService[JobPublicService.getMethodName(METHOD_DELETE_BY_IDS)]({}, [itemId2]); |
76 | | - vi.spyOn(modUtil, 'postSuccessMessage').mockImplementation(async (message, data) => { |
77 | | - expect(data.total).toBe(0); |
| 13 | + |
| 14 | + await db.exec(`INSERT INTO job_public (id, job_id, source_type, source, create_datetime, update_datetime) VALUES |
| 15 | + ('old-x', 'job-x', 0, NULL, NOW(), NOW()), |
| 16 | + ('old-y', 'job-y', 0, 'normal', NOW(), NOW())`); |
| 17 | + |
| 18 | + const error = await (await getDb()).transaction(async (tx) => { |
| 19 | + try { |
| 20 | + await _jobPublicBatchAddJobPublicAndUpdateJob({ |
| 21 | + jobPublicList: [ |
| 22 | + { id: 'new-x', jobId: 'job-x', sourceType: 0, source: null, createDatetime: new Date().toISOString(), updateDatetime: new Date().toISOString() }, |
| 23 | + { id: 'new-y', jobId: 'job-y', sourceType: 0, source: "it's", createDatetime: new Date().toISOString(), updateDatetime: new Date().toISOString() }, |
| 24 | + ] |
| 25 | + }, { connection: tx }); |
| 26 | + return null; |
| 27 | + } catch (e) { |
| 28 | + return e.message; |
| 29 | + } |
78 | 30 | }); |
79 | | - await JobPublicService[JobPublicService.getMethodName(METHOD_SEARCH)]({}, { pageNum: 1, pageSize: 1 }); |
80 | | -}) |
| 31 | + |
| 32 | + expect(error).not.toBeNull(); |
| 33 | + expect(error).not.toContain('current transaction is aborted'); |
| 34 | + expect(error).toContain('syntax error'); |
| 35 | +}); |
0 commit comments