-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathMergeServiceTest.java
More file actions
96 lines (71 loc) · 3.66 KB
/
MergeServiceTest.java
File metadata and controls
96 lines (71 loc) · 3.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package gov.cdc.nbs.deduplication.merge;
import gov.cdc.nbs.deduplication.SecurityTestUtil;
import gov.cdc.nbs.deduplication.merge.handler.AdminCommentMergeHandler;
import gov.cdc.nbs.deduplication.merge.handler.PersonTableMergeHandler;
import gov.cdc.nbs.deduplication.merge.handler.SectionMergeHandler;
import gov.cdc.nbs.deduplication.merge.model.PatientMergeAudit;
import gov.cdc.nbs.deduplication.merge.model.PatientMergeRequest;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.jdbc.core.simple.JdbcClient;
import org.springframework.jdbc.core.simple.JdbcClient.StatementSpec;
import java.util.Arrays;
import java.util.List;
import com.fasterxml.jackson.databind.ObjectMapper;
import static org.mockito.Mockito.*;
@ExtendWith(MockitoExtension.class)
class MergeServiceTest {
@Mock
private PersonTableMergeHandler personTableMergeHandler;
@Mock
private AdminCommentMergeHandler adminCommentMergeHandler;
@Mock
private JdbcClient deduplicationClient;
@Mock
private ObjectMapper objectMapper;
private MergeService mergeService;
@BeforeEach
void setUp() {
List<SectionMergeHandler> handlers = Arrays.asList(personTableMergeHandler, adminCommentMergeHandler);
StatementSpec mockStatementSpec = Mockito.mock(StatementSpec.class);
when(deduplicationClient.sql(MergeService.MARK_PATIENTS_AS_MERGED)).thenReturn(mockStatementSpec);
when(mockStatementSpec.param("mergeGroup", 123L)).thenReturn(mockStatementSpec);
when(mockStatementSpec.param("userId", 220L)).thenReturn(mockStatementSpec);
when(mockStatementSpec.update()).thenReturn(1); // simulate update success
StatementSpec auditStatementSpec = Mockito.mock(StatementSpec.class);
when(deduplicationClient.sql(MergeService.SAVE_PATIENT_MERGE_AUDIT)).thenReturn(auditStatementSpec);
when(auditStatementSpec.param(anyString(), any())).thenReturn(auditStatementSpec);
when(auditStatementSpec.update()).thenReturn(1); // simulate audit insert success
mergeService = new MergeService(handlers, deduplicationClient, objectMapper);
}
@Test
void testPerformMerge_CallsAllHandlersInOrder_AndSavesAudit() throws Exception {
// Arrange
long matchId = 123L;
String matchIdStr = "123";
PatientMergeRequest request = mock(PatientMergeRequest.class);
when(request.survivingRecord()).thenReturn("999");
String relatedAuditsJson = "[{\"table\":\"person\",\"action\":\"update\"}]";
String mergeRequestJson = "{\"survivingRecord\":\"999\"}";
// Mock objectMapper serialization
when(objectMapper.writeValueAsString(any())).thenReturn(relatedAuditsJson, mergeRequestJson);
SecurityTestUtil.mockSecurityContext(220L);
// Act
mergeService.performMerge(matchId, request);
// Assert: Verify handlers are called in order
InOrder inOrder = inOrder(personTableMergeHandler, adminCommentMergeHandler, deduplicationClient);
inOrder.verify(personTableMergeHandler).handleMerge(eq(matchIdStr), eq(request), any(PatientMergeAudit.class));
inOrder.verify(adminCommentMergeHandler).handleMerge(eq(matchIdStr), eq(request), any(PatientMergeAudit.class));
// Assert: Verify markPatientsMerged is called
inOrder.verify(deduplicationClient).sql(MergeService.MARK_PATIENTS_AS_MERGED);
// Assert: Verify audit is saved
inOrder.verify(deduplicationClient).sql(MergeService.SAVE_PATIENT_MERGE_AUDIT);
// Assert: Verify ObjectMapper was used to serialize
verify(objectMapper, times(2)).writeValueAsString(any());
}
}