Skip to content

Commit 6057e0a

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

2 files changed

Lines changed: 97 additions & 1 deletion

File tree

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

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)