Skip to content

Commit ddfc159

Browse files
committed
fix(jobs): correct mission event type when mission deleted is null
1 parent 7f10060 commit ddfc159

2 files changed

Lines changed: 99 additions & 1 deletion

File tree

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import { beforeEach, describe, expect, it, vi } from "vitest";
2+
3+
const mocks = vi.hoisted(() => ({
4+
findMissionsBy: vi.fn(),
5+
createMission: vi.fn(),
6+
updateMission: vi.fn(),
7+
createMissionEvents: vi.fn(),
8+
findPublisherOrganizations: vi.fn(),
9+
buildPublisherOrganizationPayload: vi.fn(),
10+
isPublisherOrganizationUpToDate: vi.fn(),
11+
upsertPublisherOrganizationPayload: vi.fn(),
12+
getMissionChanges: vi.fn(),
13+
}));
14+
15+
vi.mock("../../../../services/mission", () => ({
16+
missionService: {
17+
findMissionsBy: mocks.findMissionsBy,
18+
create: mocks.createMission,
19+
update: mocks.updateMission,
20+
},
21+
}));
22+
23+
vi.mock("../../../../services/mission-event", () => ({
24+
missionEventService: {
25+
createMissionEvents: mocks.createMissionEvents,
26+
},
27+
}));
28+
29+
vi.mock("../../../../repositories/publisher-organization", () => ({
30+
publisherOrganizationRepository: {
31+
findMany: mocks.findPublisherOrganizations,
32+
},
33+
}));
34+
35+
vi.mock("../organization", () => ({
36+
buildPublisherOrganizationPayload: mocks.buildPublisherOrganizationPayload,
37+
isPublisherOrganizationUpToDate: mocks.isPublisherOrganizationUpToDate,
38+
upsertPublisherOrganizationPayload: mocks.upsertPublisherOrganizationPayload,
39+
}));
40+
41+
vi.mock("../../../../utils/mission", () => ({
42+
EVENT_TYPES: {
43+
CREATE: "create",
44+
UPDATE: "update",
45+
DELETE: "delete",
46+
},
47+
getMissionChanges: mocks.getMissionChanges,
48+
}));
49+
50+
import { bulkDB } from "../db";
51+
52+
describe("bulkDB mission event type", () => {
53+
beforeEach(() => {
54+
vi.clearAllMocks();
55+
mocks.buildPublisherOrganizationPayload.mockReturnValue(null);
56+
mocks.isPublisherOrganizationUpToDate.mockReturnValue(true);
57+
mocks.findPublisherOrganizations.mockResolvedValue([]);
58+
mocks.createMissionEvents.mockResolvedValue(1);
59+
});
60+
61+
it("tracks undelete (deletedAt -> null) as update", async () => {
62+
mocks.findMissionsBy.mockResolvedValue([
63+
{
64+
id: "mission-1",
65+
clientId: "client-1",
66+
organizationClientId: null,
67+
},
68+
]);
69+
mocks.updateMission.mockResolvedValue({
70+
id: "mission-1",
71+
clientId: "client-1",
72+
organizationClientId: null,
73+
deletedAt: null,
74+
});
75+
mocks.getMissionChanges.mockReturnValue({
76+
deletedAt: {
77+
previous: "2026-01-05T05:15:09.598Z",
78+
current: null,
79+
},
80+
});
81+
82+
const result = await bulkDB(
83+
[{ clientId: "client-1", organizationClientId: null } as any],
84+
{ id: "publisher-1", name: "Publisher 1" } as any,
85+
{ createdCount: 0, updatedCount: 0, deletedCount: 0 } as any,
86+
{ recordMissionEvents: true }
87+
);
88+
89+
expect(result).toBe(true);
90+
expect(mocks.createMissionEvents).toHaveBeenCalledWith([
91+
expect.objectContaining({
92+
missionId: "mission-1",
93+
type: "update",
94+
}),
95+
]);
96+
});
97+
});

api/src/jobs/import-missions/utils/db.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,10 @@ export const bulkDB = async (
114114
if (changes) {
115115
const updated = await missionService.update(current.id, missionInput as MissionUpdatePatch);
116116
existingMap.set(missionInput.clientId, updated);
117+
const isDeletion = changes.deletedAt ? changes.deletedAt.current !== null : false;
117118
missionEvents.push({
118119
missionId: current.id,
119-
type: changes.deletedAt?.current === null ? EVENT_TYPES.DELETE : EVENT_TYPES.UPDATE,
120+
type: isDeletion ? EVENT_TYPES.DELETE : EVENT_TYPES.UPDATE,
120121
changes,
121122
});
122123
importDoc.updatedCount += 1;

0 commit comments

Comments
 (0)