diff --git a/src/test/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImplTest.java b/src/test/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImplTest.java new file mode 100644 index 00000000..e5690b2e --- /dev/null +++ b/src/test/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImplTest.java @@ -0,0 +1,594 @@ +/* +* AMRIT – Accessible Medical Records via Integrated Technology +* Integrated EHR (Electronic Health Records) Solution +* +* Copyright (C) "Piramal Swasthya Management and Research Institute" +* +* This file is part of AMRIT. +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see https://www.gnu.org/licenses/. +*/ +package com.iemr.mmu.service.dataSyncLayerCentral; + +import com.iemr.mmu.data.syncActivity_syncLayer.SyncUploadDataDigester; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class GetDataFromVanAndSyncToDBImplTest { + @Mock + private DataSyncRepositoryCentral dataSyncRepositoryCentral; + @InjectMocks + private GetDataFromVanAndSyncToDBImpl service; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + void testUpdate_M_BeneficiaryRegIdMapping_for_provisioned_benID_allBranches() { + SyncUploadDataDigester digester = mock(SyncUploadDataDigester.class); + when(digester.getSyncData()).thenReturn(Arrays.asList( + new HashMap() {{ + put("BenRegId", "ben1"); + put("BeneficiaryID", "b1"); + put("VanID", "v1"); + }}, + new HashMap() {{ + put("BenRegId", null); + put("BeneficiaryID", null); + put("VanID", null); + }} + )); + when(digester.getSchemaName()).thenReturn("schema"); + when(digester.getTableName()).thenReturn("table"); + when(digester.getSyncedBy()).thenReturn("user"); + when(dataSyncRepositoryCentral.syncDataToCentralDB(anyString(), anyString(), any(), anyString(), anyList())).thenReturn(new int[]{1}); + String result = service.update_M_BeneficiaryRegIdMapping_for_provisioned_benID(digester); + assertEquals("data sync passed", result); + } + + @Test + void testUpdate_M_BeneficiaryRegIdMapping_for_provisioned_benID_emptySyncData() { + SyncUploadDataDigester digester = mock(SyncUploadDataDigester.class); + when(digester.getSyncData()).thenReturn(Collections.emptyList()); + String result = service.update_M_BeneficiaryRegIdMapping_for_provisioned_benID(digester); + assertEquals("data sync passed", result); + } + + @Test + void testSyncDataToServer_m_beneficiaryregidmapping() throws Exception { + SyncUploadDataDigester digester = mock(SyncUploadDataDigester.class); + when(digester.getTableName()).thenReturn("m_beneficiaryregidmapping"); + when(digester.getSyncData()).thenReturn(Collections.emptyList()); + when(digester.getSchemaName()).thenReturn("schema"); + when(digester.getSyncedBy()).thenReturn("user"); + GetDataFromVanAndSyncToDBImpl spyService = spy(service); + doReturn("data sync passed").when(spyService).update_M_BeneficiaryRegIdMapping_for_provisioned_benID(any()); + String json = "{\"tableName\":\"m_beneficiaryregidmapping\"}"; + String result = spyService.syncDataToServer(json, "auth"); + assertEquals("data sync passed", result); + } + + @Test + void testSyncDataToServer_otherTable_insertAndUpdate() throws Exception { + SyncUploadDataDigester digester = mock(SyncUploadDataDigester.class); + when(digester.getTableName()).thenReturn("t_indent"); + when(digester.getSyncData()).thenReturn(Arrays.asList( + new HashMap() {{ + put("FromFacilityID", 1.0); + put("SyncFacilityID", 1); + put("VanID", "v1"); + put("date_format(SyncedDate,'%Y-%m-%d %H:%i:%s')", ""); + }} + )); + when(digester.getVanAutoIncColumnName()).thenReturn("FromFacilityID"); + when(digester.getFacilityID()).thenReturn(1); + when(digester.getSchemaName()).thenReturn("schema"); + when(digester.getServerColumns()).thenReturn("col1,col2"); + when(dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot(anyString(), anyString(), anyString(), anyString(), anyString(), anyInt())).thenReturn(0); + when(dataSyncRepositoryCentral.syncDataToCentralDB(anyString(), anyString(), any(), anyString(), anyList())).thenReturn(new int[]{1}); + GetDataFromVanAndSyncToDBImpl spyService = spy(service); + doReturn("t_indent").when(digester).getTableName(); + String json = "{\"tableName\":\"t_indent\"}"; + String result = spyService.syncDataToServer(json, "auth"); + assertEquals("data sync passed", result); + } + + @Test + void testSyncDataToServer_otherTable_updateBranch() throws Exception { + SyncUploadDataDigester digester = mock(SyncUploadDataDigester.class); + when(digester.getTableName()).thenReturn("t_indent"); + when(digester.getSyncData()).thenReturn(Arrays.asList( + new HashMap() {{ + put("FromFacilityID", 1.0); + put("SyncFacilityID", 1); + put("VanID", "v1"); + put("date_format(SyncedDate,'%Y-%m-%d %H:%i:%s')", ""); + put("Processed", "P"); + }} + )); + when(digester.getVanAutoIncColumnName()).thenReturn("FromFacilityID"); + when(digester.getFacilityID()).thenReturn(1); + when(digester.getSchemaName()).thenReturn("schema"); + when(digester.getServerColumns()).thenReturn("col1,col2"); + when(dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot(anyString(), anyString(), anyString(), anyString(), anyString(), anyInt())).thenReturn(1); + when(dataSyncRepositoryCentral.syncDataToCentralDB(anyString(), anyString(), any(), anyString(), anyList())).thenReturn(new int[]{1}); + GetDataFromVanAndSyncToDBImpl spyService = spy(service); + doReturn("t_indent").when(digester).getTableName(); + String json = "{\"tableName\":\"t_indent\"}"; + String result = spyService.syncDataToServer(json, "auth"); + assertEquals("data sync passed", result); + } + + @Test + void testGetQueryToInsertDataToServerDB_allBranches() { + GetDataFromVanAndSyncToDBImpl service = new GetDataFromVanAndSyncToDBImpl(); + // Case: serverColumns is null + String query1 = service.getQueryToInsertDataToServerDB("schema", "table", null); + assertTrue(query1.contains("INSERT INTO schema.table")); + // Case: serverColumns is empty string + String query2 = service.getQueryToInsertDataToServerDB("schema", "table", ""); + assertTrue(query2.contains("INSERT INTO schema.table")); + // Case: serverColumns has one column + String query3 = service.getQueryToInsertDataToServerDB("schema", "table", "col1"); + assertTrue(query3.contains("col1")); + // Case: serverColumns has multiple columns + String query4 = service.getQueryToInsertDataToServerDB("schema", "table", "col1,col2"); + assertTrue(query4.contains("col1,col2")); + } + + @Test + void testGetQueryToUpdateDataToServerDB_allBranches() { + GetDataFromVanAndSyncToDBImpl service = new GetDataFromVanAndSyncToDBImpl(); + // Case: serverColumns is null + String query1 = service.getQueryToUpdateDataToServerDB("schema", null, "table"); + assertTrue(query1.contains("UPDATE")); + // Case: serverColumns is empty string + String query2 = service.getQueryToUpdateDataToServerDB("schema", "", "table"); + assertTrue(query2.contains("UPDATE")); + // Case: serverColumns has one column + String query3 = service.getQueryToUpdateDataToServerDB("schema", "col1", "table"); + assertTrue(query3.contains("col1= ?")); + // Case: serverColumns has multiple columns + String query4 = service.getQueryToUpdateDataToServerDB("schema", "col1,col2", "table"); + assertTrue(query4.contains("col1= ?, col2= ?")); + // Case: tableName matches special tables + String query5 = service.getQueryToUpdateDataToServerDB("schema", "col1,col2", "t_indent"); + assertTrue(query5.contains("SyncFacilityID")); + String query6 = service.getQueryToUpdateDataToServerDB("schema", "col1,col2", "t_patientissue"); + assertTrue(query6.contains("SyncFacilityID")); + // Case: tableName does not match special tables + String query7 = service.getQueryToUpdateDataToServerDB("schema", "col1,col2", "other_table"); + assertTrue(query7.contains("VanID")); + } + + @Test + void testSyncDataToServer_insertMismatch() throws Exception { + SyncUploadDataDigester digester = mock(SyncUploadDataDigester.class); + when(digester.getTableName()).thenReturn("t_indent"); + when(digester.getSyncData()).thenReturn(Arrays.asList( + new HashMap() {{ + put("FromFacilityID", 1.0); + put("SyncFacilityID", 1); + put("VanID", "v1"); + put("date_format(SyncedDate,'%Y-%m-%d %H:%i:%s')", ""); + }} + )); + when(digester.getVanAutoIncColumnName()).thenReturn("FromFacilityID"); + when(digester.getFacilityID()).thenReturn(1); + when(digester.getSchemaName()).thenReturn("schema"); + when(digester.getServerColumns()).thenReturn("col1,col2"); + when(dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot(anyString(), anyString(), anyString(), anyString(), anyString(), anyInt())).thenReturn(0); + // Return array of length matching syncDataListInsert size + when(dataSyncRepositoryCentral.syncDataToCentralDB(anyString(), anyString(), any(), anyString(), anyList())).thenReturn(new int[]{1}); + GetDataFromVanAndSyncToDBImpl spyService = spy(service); + doReturn("t_indent").when(digester).getTableName(); + String json = "{\"tableName\":\"t_indent\"}"; + String result = spyService.syncDataToServer(json, "auth"); + assertEquals("data sync passed", result); + } + + @Test + void testSyncDataToServer_updateMismatch() throws Exception { + SyncUploadDataDigester digester = mock(SyncUploadDataDigester.class); + when(digester.getTableName()).thenReturn("t_indent"); + when(digester.getSyncData()).thenReturn(Arrays.asList( + new HashMap() {{ + put("FromFacilityID", 1.0); + put("SyncFacilityID", 1); + put("VanID", "v1"); + put("date_format(SyncedDate,'%Y-%m-%d %H:%i:%s')", ""); + put("Processed", "P"); + }} + )); + when(digester.getVanAutoIncColumnName()).thenReturn("FromFacilityID"); + when(digester.getFacilityID()).thenReturn(1); + when(digester.getSchemaName()).thenReturn("schema"); + when(digester.getServerColumns()).thenReturn("col1,col2"); + when(dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot(anyString(), anyString(), anyString(), anyString(), anyString(), anyInt())).thenReturn(1); + // Return array of length matching syncDataListUpdate size + when(dataSyncRepositoryCentral.syncDataToCentralDB(anyString(), anyString(), any(), anyString(), anyList())).thenReturn(new int[]{1}); + GetDataFromVanAndSyncToDBImpl spyService = spy(service); + doReturn("t_indent").when(digester).getTableName(); + String json = "{\"tableName\":\"t_indent\"}"; + String result = spyService.syncDataToServer(json, "auth"); + assertEquals("data sync passed", result); + } + + @Test + void testSyncDataToServer_nullSyncData() throws Exception { + SyncUploadDataDigester digester = mock(SyncUploadDataDigester.class); + when(digester.getTableName()).thenReturn("t_indent"); + when(digester.getSyncData()).thenReturn(null); // null sync data + when(digester.getVanAutoIncColumnName()).thenReturn("FromFacilityID"); + when(digester.getFacilityID()).thenReturn(1); + when(digester.getSchemaName()).thenReturn("schema"); + when(digester.getServerColumns()).thenReturn("col1,col2"); + when(dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot(anyString(), anyString(), anyString(), anyString(), anyString(), anyInt())).thenReturn(0); + when(dataSyncRepositoryCentral.syncDataToCentralDB(anyString(), anyString(), any(), anyString(), anyList())).thenReturn(new int[]{}); + GetDataFromVanAndSyncToDBImpl spyService = spy(service); + doReturn("t_indent").when(digester).getTableName(); + String json = "{\"tableName\":\"t_indent\"}"; + String result = spyService.syncDataToServer(json, "auth"); + assertEquals("data sync passed", result); + } + + @Test + void testSyncDataToServer_emptySyncData() throws Exception { + SyncUploadDataDigester digester = mock(SyncUploadDataDigester.class); + when(digester.getTableName()).thenReturn("t_indent"); + when(digester.getSyncData()).thenReturn(Collections.emptyList()); // empty sync data + when(digester.getVanAutoIncColumnName()).thenReturn("FromFacilityID"); + when(digester.getFacilityID()).thenReturn(1); + when(digester.getSchemaName()).thenReturn("schema"); + when(digester.getServerColumns()).thenReturn("col1,col2"); + GetDataFromVanAndSyncToDBImpl spyService = spy(service); + doReturn("t_indent").when(digester).getTableName(); + String json = "{\"tableName\":\"t_indent\"}"; + String result = spyService.syncDataToServer(json, "auth"); + assertEquals("data sync passed", result); + } + + @Test + void testSyncDataToServer_nullTableName() throws Exception { + SyncUploadDataDigester digester = mock(SyncUploadDataDigester.class); + when(digester.getTableName()).thenReturn(null); // null table name + when(digester.getSyncData()).thenReturn(Collections.emptyList()); + GetDataFromVanAndSyncToDBImpl spyService = spy(service); + String json = "{\"tableName\":null}"; + String result = spyService.syncDataToServer(json, "auth"); + assertEquals("data sync passed", result); + } + + @Test + void testSyncDataToServer_nullRequestObj() throws Exception { + GetDataFromVanAndSyncToDBImpl spyService = spy(service); + Exception exception = assertThrows(Exception.class, () -> spyService.syncDataToServer(null, "auth")); + assertNotNull(exception); + } + + @Test + void testSyncDataToServer_invalidJson() throws Exception { + GetDataFromVanAndSyncToDBImpl spyService = spy(service); + String invalidJson = "{invalid}"; + Exception exception = assertThrows(Exception.class, () -> spyService.syncDataToServer(invalidJson, "auth")); + assertNotNull(exception); + } + + @Test + void testSyncDataToServer_specialTableNames() throws Exception { + String[] specialTables = {"t_indent", "t_indentorder", "t_indentissue", "t_stocktransfer", "t_itemstockentry"}; + for (String table : specialTables) { + SyncUploadDataDigester digester = mock(SyncUploadDataDigester.class); + when(digester.getTableName()).thenReturn(table); + Map map = new HashMap<>(); + map.put("FromFacilityID", 1.0); + map.put("SyncFacilityID", 1); + map.put("VanID", "v1"); + map.put("date_format(SyncedDate,'%Y-%m-%d %H:%i:%s')", ""); + when(digester.getSyncData()).thenReturn(Arrays.asList(map)); + when(digester.getVanAutoIncColumnName()).thenReturn("FromFacilityID"); + when(digester.getFacilityID()).thenReturn(1); + when(digester.getSchemaName()).thenReturn("schema"); + when(digester.getServerColumns()).thenReturn("col1,col2"); + when(dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot(anyString(), anyString(), anyString(), anyString(), anyString(), anyInt())).thenReturn(0); + when(dataSyncRepositoryCentral.syncDataToCentralDB(anyString(), anyString(), any(), anyString(), anyList())).thenReturn(new int[]{1}); + GetDataFromVanAndSyncToDBImpl spyService = spy(service); + doReturn(table).when(digester).getTableName(); + String json = String.format("{\"tableName\":\"%s\"}", table); + String result = spyService.syncDataToServer(json, "auth"); + assertEquals("data sync passed", result); + } + } + + @Test + void testSyncDataToServer_insertFailure() throws Exception { + SyncUploadDataDigester digester = mock(SyncUploadDataDigester.class); + when(digester.getTableName()).thenReturn("t_indent"); + when(digester.getSyncData()).thenReturn(Arrays.asList( + new HashMap() {{ + put("FromFacilityID", 1.0); + put("SyncFacilityID", 1); + put("VanID", "v1"); + put("date_format(SyncedDate,'%Y-%m-%d %H:%i:%s')", ""); + }} + )); + when(digester.getVanAutoIncColumnName()).thenReturn("FromFacilityID"); + when(digester.getFacilityID()).thenReturn(1); + when(digester.getSchemaName()).thenReturn("schema"); + when(digester.getServerColumns()).thenReturn("col1,col2"); + when(dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot(anyString(), anyString(), anyString(), anyString(), anyString(), anyInt())).thenReturn(0); + // Return array of length not matching syncDataListInsert size + when(dataSyncRepositoryCentral.syncDataToCentralDB(anyString(), anyString(), any(), anyString(), anyList())).thenReturn(new int[]{}); + GetDataFromVanAndSyncToDBImpl spyService = spy(service); + doReturn("t_indent").when(digester).getTableName(); + String json = "{\"tableName\":\"t_indent\"}"; + String result = spyService.syncDataToServer(json, "auth"); + assertEquals("data sync passed", result); + } + + @Test + void testSyncDataToServer_updateFailure() throws Exception { + SyncUploadDataDigester digester = mock(SyncUploadDataDigester.class); + when(digester.getTableName()).thenReturn("t_indent"); + when(digester.getSyncData()).thenReturn(Arrays.asList( + new HashMap() {{ + put("FromFacilityID", 1.0); + put("SyncFacilityID", 1); + put("VanID", "v1"); + put("date_format(SyncedDate,'%Y-%m-%d %H:%i:%s')", ""); + put("Processed", "P"); + }} + )); + when(digester.getVanAutoIncColumnName()).thenReturn("FromFacilityID"); + when(digester.getFacilityID()).thenReturn(1); + when(digester.getSchemaName()).thenReturn("schema"); + when(digester.getServerColumns()).thenReturn("col1,col2"); + when(dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot(anyString(), anyString(), anyString(), anyString(), anyString(), anyInt())).thenReturn(1); + // Return array of length not matching syncDataListUpdate size + when(dataSyncRepositoryCentral.syncDataToCentralDB(anyString(), anyString(), any(), anyString(), anyList())).thenReturn(new int[]{}); + GetDataFromVanAndSyncToDBImpl spyService = spy(service); + doReturn("t_indent").when(digester).getTableName(); + String json = "{\"tableName\":\"t_indent\"}"; + String result = spyService.syncDataToServer(json, "auth"); + assertEquals("data sync passed", result); + } + + @Test + void testSyncDataToServer_realLengthMismatch_insert() throws Exception { + SyncUploadDataDigester digester = mock(SyncUploadDataDigester.class); + when(digester.getTableName()).thenReturn("t_indent"); + when(digester.getSyncData()).thenReturn(Arrays.asList( + new HashMap() {{ + put("FromFacilityID", 1.0); + put("SyncFacilityID", 1); + put("VanID", "v1"); + put("date_format(SyncedDate,'%Y-%m-%d %H:%i:%s')", ""); + }}, + new HashMap() {{ + put("FromFacilityID", 2.0); + put("SyncFacilityID", 2); + put("VanID", "v2"); + put("date_format(SyncedDate,'%Y-%m-%d %H:%i:%s')", ""); + }} + )); + when(digester.getVanAutoIncColumnName()).thenReturn("FromFacilityID"); + when(digester.getFacilityID()).thenReturn(1); + when(digester.getSchemaName()).thenReturn("schema"); + when(digester.getServerColumns()).thenReturn("col1,col2"); + when(dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot(anyString(), anyString(), anyString(), anyString(), anyString(), anyInt())).thenReturn(0); + // Return array with length 1 but we have 2 records to insert + when(dataSyncRepositoryCentral.syncDataToCentralDB(anyString(), anyString(), any(), anyString(), anyList())).thenReturn(new int[]{1}); + GetDataFromVanAndSyncToDBImpl spyService = spy(service); + doReturn("t_indent").when(digester).getTableName(); + String json = "{\"tableName\":\"t_indent\"}"; + String result = spyService.syncDataToServer(json, "auth"); + assertEquals("data sync passed", result); + } + + @Test + void testSyncDataToServer_realLengthMismatch_update() throws Exception { + SyncUploadDataDigester digester = mock(SyncUploadDataDigester.class); + when(digester.getTableName()).thenReturn("t_indent"); + when(digester.getSyncData()).thenReturn(Arrays.asList( + new HashMap() {{ + put("FromFacilityID", 1.0); + put("SyncFacilityID", 1); + put("VanID", "v1"); + put("date_format(SyncedDate,'%Y-%m-%d %H:%i:%s')", ""); + put("Processed", "P"); + }}, + new HashMap() {{ + put("FromFacilityID", 2.0); + put("SyncFacilityID", 2); + put("VanID", "v2"); + put("date_format(SyncedDate,'%Y-%m-%d %H:%i:%s')", ""); + put("Processed", "P"); + }} + )); + when(digester.getVanAutoIncColumnName()).thenReturn("FromFacilityID"); + when(digester.getFacilityID()).thenReturn(1); + when(digester.getSchemaName()).thenReturn("schema"); + when(digester.getServerColumns()).thenReturn("col1,col2"); + when(dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot(anyString(), anyString(), anyString(), anyString(), anyString(), anyInt())).thenReturn(1); + // Return array with length 1 but we have 2 records to update + when(dataSyncRepositoryCentral.syncDataToCentralDB(anyString(), anyString(), any(), anyString(), anyList())).thenReturn(new int[]{1}); + GetDataFromVanAndSyncToDBImpl spyService = spy(service); + doReturn("t_indent").when(digester).getTableName(); + String json = "{\"tableName\":\"t_indent\"}"; + String result = spyService.syncDataToServer(json, "auth"); + assertEquals("data sync passed", result); + } + + @Test + void testSyncDataToServer_facilityID_null() throws Exception { + SyncUploadDataDigester digester = mock(SyncUploadDataDigester.class); + when(digester.getTableName()).thenReturn("t_indent"); + when(digester.getSyncData()).thenReturn(Arrays.asList( + new HashMap() {{ + put("FromFacilityID", 1.0); + put("SyncFacilityID", 1); + put("VanID", "v1"); + put("date_format(SyncedDate,'%Y-%m-%d %H:%i:%s')", ""); + }} + )); + when(digester.getVanAutoIncColumnName()).thenReturn("FromFacilityID"); + when(digester.getFacilityID()).thenReturn(null); // null facility ID + when(digester.getSchemaName()).thenReturn("schema"); + when(digester.getServerColumns()).thenReturn("col1,col2"); + when(dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot(anyString(), anyString(), anyString(), anyString(), anyString(), anyInt())).thenReturn(0); + when(dataSyncRepositoryCentral.syncDataToCentralDB(anyString(), anyString(), any(), anyString(), anyList())).thenReturn(new int[]{1}); + GetDataFromVanAndSyncToDBImpl spyService = spy(service); + doReturn("t_indent").when(digester).getTableName(); + String json = "{\"tableName\":\"t_indent\"}"; + String result = spyService.syncDataToServer(json, "auth"); + assertEquals("data sync passed", result); + } + + @Test + void testSyncDataToServer_booleanValues() throws Exception { + SyncUploadDataDigester digester = mock(SyncUploadDataDigester.class); + when(digester.getTableName()).thenReturn("t_indent"); + when(digester.getSyncData()).thenReturn(Arrays.asList( + new HashMap() {{ + put("FromFacilityID", 1.0); + put("SyncFacilityID", 1); + put("VanID", "v1"); + put("date_format(SyncedDate,'%Y-%m-%d %H:%i:%s')", ""); + put("booleanField1", true); + put("booleanField2", false); + put("stringBoolTrue", "true"); + put("stringBoolFalse", "false"); + put("nullField", null); + }} + )); + when(digester.getVanAutoIncColumnName()).thenReturn("FromFacilityID"); + when(digester.getFacilityID()).thenReturn(1); + when(digester.getSchemaName()).thenReturn("schema"); + when(digester.getServerColumns()).thenReturn("col1,col2"); + when(dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot(anyString(), anyString(), anyString(), anyString(), anyString(), anyInt())).thenReturn(0); + when(dataSyncRepositoryCentral.syncDataToCentralDB(anyString(), anyString(), any(), anyString(), anyList())).thenReturn(new int[]{1}); + GetDataFromVanAndSyncToDBImpl spyService = spy(service); + doReturn("t_indent").when(digester).getTableName(); + String json = "{\"tableName\":\"t_indent\"}"; + String result = spyService.syncDataToServer(json, "auth"); + assertEquals("data sync passed", result); + } + + @Test + void testSyncDataToServer_switchCaseFallthrough() throws Exception { + SyncUploadDataDigester digester = mock(SyncUploadDataDigester.class); + when(digester.getTableName()).thenReturn("t_indentorder"); + when(digester.getSyncData()).thenReturn(Arrays.asList( + new HashMap() {{ + put("FromFacilityID", 1.0); + put("SyncFacilityID", 1); + put("VanID", "v1"); + put("date_format(SyncedDate,'%Y-%m-%d %H:%i:%s')", ""); + }} + )); + when(digester.getVanAutoIncColumnName()).thenReturn("FromFacilityID"); + when(digester.getFacilityID()).thenReturn(1); + when(digester.getSchemaName()).thenReturn("schema"); + when(digester.getServerColumns()).thenReturn("col1,col2"); + when(dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot(anyString(), anyString(), anyString(), anyString(), anyString(), anyInt())).thenReturn(0); + when(dataSyncRepositoryCentral.syncDataToCentralDB(anyString(), anyString(), any(), anyString(), anyList())).thenReturn(new int[]{1}); + GetDataFromVanAndSyncToDBImpl spyService = spy(service); + doReturn("t_indentorder").when(digester).getTableName(); + String json = "{\"tableName\":\"t_indentorder\"}"; + String result = spyService.syncDataToServer(json, "auth"); + assertEquals("data sync passed", result); + } + + @Test + void testSyncDataToServer_mapWithoutSyncFacilityID() throws Exception { + SyncUploadDataDigester digester = mock(SyncUploadDataDigester.class); + when(digester.getTableName()).thenReturn("t_other"); + when(digester.getSyncData()).thenReturn(Arrays.asList( + new HashMap() {{ + put("FromFacilityID", 1.0); + put("VanID", "v1"); + put("date_format(SyncedDate,'%Y-%m-%d %H:%i:%s')", ""); + }} + )); + when(digester.getVanAutoIncColumnName()).thenReturn("FromFacilityID"); + when(digester.getFacilityID()).thenReturn(1); + when(digester.getSchemaName()).thenReturn("schema"); + when(digester.getServerColumns()).thenReturn("col1,col2"); + when(dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot(anyString(), anyString(), anyString(), anyString(), anyString(), anyInt())).thenReturn(1); + when(dataSyncRepositoryCentral.syncDataToCentralDB(anyString(), anyString(), any(), anyString(), anyList())).thenReturn(new int[]{1}); + GetDataFromVanAndSyncToDBImpl spyService = spy(service); + doReturn("t_other").when(digester).getTableName(); + String json = "{\"tableName\":\"t_other\"}"; + String result = spyService.syncDataToServer(json, "auth"); + assertEquals("data sync passed", result); + } + + @Test + void testUpdate_M_BeneficiaryRegIdMapping_mismatchLength() { + SyncUploadDataDigester digester = mock(SyncUploadDataDigester.class); + when(digester.getSyncData()).thenReturn(Arrays.asList( + new HashMap() {{ + put("BenRegId", "ben1"); + put("BeneficiaryID", "b1"); + put("VanID", "v1"); + }}, + new HashMap() {{ + put("BenRegId", "ben2"); + put("BeneficiaryID", "b2"); + put("VanID", "v2"); + }} + )); + when(digester.getSchemaName()).thenReturn("schema"); + when(digester.getTableName()).thenReturn("table"); + when(digester.getSyncedBy()).thenReturn("user"); + // Return array with length 1 but we have 2 valid records + when(dataSyncRepositoryCentral.syncDataToCentralDB(anyString(), anyString(), any(), anyString(), anyList())).thenReturn(new int[]{1}); + String result = service.update_M_BeneficiaryRegIdMapping_for_provisioned_benID(digester); + assertNull(result); + } + + @Test + void testGetqueryFor_M_BeneficiaryRegIdMapping() { + GetDataFromVanAndSyncToDBImpl service = new GetDataFromVanAndSyncToDBImpl(); + // Using reflection to test the private method + try { + java.lang.reflect.Method method = GetDataFromVanAndSyncToDBImpl.class.getDeclaredMethod("getqueryFor_M_BeneficiaryRegIdMapping", String.class, String.class); + method.setAccessible(true); + String query = (String) method.invoke(service, "testSchema", "testTable"); + assertTrue(query.contains("UPDATE testSchema.testTable")); + String normalizedQuery = query.replaceAll("\\s+", " ").trim(); + if (!normalizedQuery.contains("SET Provisioned = true, SyncedDate = now(), syncedBy = ?")) { + System.out.println("Actual query: " + normalizedQuery); + } + assertTrue(normalizedQuery.contains("SET Provisioned = true, SyncedDate = now(), syncedBy = ?")); // actual query uses lowercase 'syncedBy' + assertTrue(normalizedQuery.contains("AND BeneficiaryID = ?")); + assertTrue(normalizedQuery.contains("AND VanID = ?")); + } catch (Exception e) { + fail("Failed to test getqueryFor_M_BeneficiaryRegIdMapping: " + e.getMessage()); + } + } + + // Utility method for JSON parsing stub + // You may need to add this to the class for full testability +}