package com.napa.pulse.dao.impl; import com.napa.pulse.dao.interfaces.SiteGroupDAO; import com.napa.pulse.dto.ProductLinesData; import com.napa.pulse.entity.pulseui.CustomGroupCodeProductGroup; import com.napa.pulse.entity.pulseui.CustomProductGroup; import com.napa.pulse.entity.pulseui.ProductGroupOrderReturn; import com.napa.pulse.entity.security.User; import com.napa.pulse.enums.AccessItem; import com.napa.pulse.service.interfaces.SessionService; import org.junit.Before; import org.junit.Test; import org.junit.jupiter.api.BeforeEach; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.*; import org.mockito.runners.MockitoJUnitRunner; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.PreparedStatementCreator; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.core.namedparam.SqlParameterSource; import org.springframework.jdbc.core.simple.SimpleJdbcCall; import org.springframework.jdbc.support.KeyHolder; import org.springframework.test.util.ReflectionTestUtils; import javax.sql.DataSource; import java.math.BigDecimal; import java.sql.*; import java.util.*; import java.util.Date; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.*; import static org.mockito.Mockito.when; /** * @author Rahul Chaudhary * 6/1/2022 */ @SpringBootTest @RunWith(MockitoJUnitRunner.class) public class SessionDAOImplUnitTest { @InjectMocks SessionDAOImpl sessionDAOImplMock; @Mock User user; @Mock private JdbcTemplate jdbcTemplate; @Mock private Connection connection; @Mock private NamedParameterJdbcTemplate namedParameterJdbcTemplate; @Mock private SiteGroupDAO siteGroupDAO; @Mock private DataSource dataSource; @Mock private PreparedStatement ps; @Mock private ResultSet rs; private static final int DEFER_SITE_LIMIT = 10; // Example limit @Before public void setup() throws Exception{ assertNotNull(dataSource); MockitoAnnotations.initMocks(this); jdbcTemplate = mock(JdbcTemplate.class); when(connection.prepareStatement(any(String.class))).thenReturn(ps); when(dataSource.getConnection()).thenReturn(connection); User user1 = buildUser(); Integer num = 1; Integer[] sitesArray = {1309,1346}; Boolean perCarOrder = true; Boolean includeFleets = false; Boolean includeSystems = true; Boolean includeSpecials = true; Boolean includeObsoletes = true; Boolean includeOverstocks = true; Boolean includeSupersede = true; Boolean includeKeylinesOrders = true; Boolean includeKeylinesReturns= true; Boolean includeLessThanStdPkg = true; Double includeWeekSupplyOption = null; String weekSupplyOptionName = null; Boolean useInvestmentCollections = true; Boolean provideStoreDepth = true; Boolean includeSoldNotStocked = false; Boolean includeNewNumbers= false ; Boolean orderAllSkus= false ; Boolean returnAllSKUs= false ; Integer dollarLimit = 0; String comment=null; Integer siteGroupId = 0; String siteGroupName = null; ProductGroupOrderReturn productGroupOrderReturn = new ProductGroupOrderReturn(); productGroupOrderReturn.setProductGroupId(8839); productGroupOrderReturn.setOrders(true); productGroupOrderReturn.setProductGroupName("*Pulse Round 1 2023"); productGroupOrderReturn.setReturns(true); ProductGroupOrderReturn[] productGroupsArray = {productGroupOrderReturn}; // productGroupsArray.set ProductGroupOrderReturn[] groupCodeArray = null; Integer[] fleetGroupsIds = null; CustomProductGroup customProductGroup = null; CustomGroupCodeProductGroup customGroupCodeProductGroupObj = null; Boolean isGroupCode = false; String savedGroup = null; String userAccessSites = null; Integer[] skuArray = null; ProductLinesData[] productLineIdArray = null; ProductLinesData[] allProductLines = null; ProductLinesData[] siteProductLines = null; Integer includeOrders = 0; Integer includeReturns = 0; Date expirationDate = null; String includeDaysCount = "365"; Integer perCarMinMaxValue = 1; String salesHistoryValue = null; BigDecimal ans = new BigDecimal("589734"); int row = 1; String displayQty= null; String sessionType = "MM"; String includeHubSpokeOrderOption = "B"; String includeHubSpokeReturnOption = "B"; Long createdFromSessionId = null; Boolean applicationPartsOnly = true; sessionDAOImplMock.createNewSession(user1 , perCarOrder , includeFleets , includeSystems , includeSpecials , includeObsoletes , includeOverstocks , includeSupersede , includeKeylinesOrders , includeKeylinesReturns , includeLessThanStdPkg ,includeWeekSupplyOption,weekSupplyOptionName, useInvestmentCollections , provideStoreDepth , includeSoldNotStocked , includeNewNumbers , orderAllSkus , returnAllSKUs , dollarLimit , comment , siteGroupId , "Custom Group" , sitesArray , productGroupsArray , groupCodeArray , fleetGroupsIds , customProductGroup , customGroupCodeProductGroupObj , isGroupCode , savedGroup , userAccessSites , skuArray , productLineIdArray , allProductLines , siteProductLines, includeOrders , includeReturns , expirationDate , includeDaysCount , perCarMinMaxValue , salesHistoryValue , displayQty , sessionType , includeHubSpokeOrderOption , includeHubSpokeReturnOption , null , applicationPartsOnly ); when(rs.getBoolean(10)).thenReturn(includeLessThanStdPkg); when(rs.getString(11)).thenReturn(sessionType); when(rs.getInt(12)).thenReturn(user1.getRoleId()); when(rs.getString(24)).thenReturn(includeDaysCount); when(rs.getString(26)).thenReturn(includeHubSpokeOrderOption); when(rs.getBoolean(16)).thenReturn(useInvestmentCollections); when(rs.getBoolean(18)).thenReturn(provideStoreDepth); when(rs.getInt(1)).thenReturn(2); when(ps.executeQuery()).thenReturn(rs); } /* @Before public void setUpp(){ MockitoAnnotations.initMocks(this); namedParameterJdbcTemplate = mock(namedParameterJdbcTemplate.class); }*/ @Test public void testRecalculateSessionTotals() { sessionDAOImplMock = mock(SessionDAOImpl.class); Map inParamMap = new HashMap<>(); inParamMap.put("SESSIONID_IN", 0); inParamMap.put("SITEID_IN", 2); sessionDAOImplMock.reCalculateSessionTotals(0, 2); verify(sessionDAOImplMock, times(1)).reCalculateSessionTotals(0, 2); } @Test(expected = Exception.class) public void testRecalculateSessionTotalsForException() { sessionDAOImplMock = mock(SessionDAOImpl.class); Map inParamMap = new HashMap<>(); inParamMap.put("SESSIONID_IN", 0); inParamMap.put("SITEID_IN", null); SqlParameterSource in = new MapSqlParameterSource(inParamMap); SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate).withProcedureName("RECALC_SESSION_TOTALS"); when(simpleJdbcCall.execute(in)).thenThrow(Exception.class); } @Test public void getMinMaxSessionProductsTest() { //sessionDAOImplMock = mock(SessionDAOImpl.class); Integer[] sites = {1309,1346}; //String sql = "" List> obj = new ArrayList<>(); Map map = new HashMap<>(); map.put("ac",1309); obj.add(map); Map>> ans = new HashMap<>(); ans.put("ad",obj); ReflectionTestUtils.setField(sessionDAOImplMock, "jdbcTemplate", jdbcTemplate); when(jdbcTemplate.queryForList(anyString())).thenReturn(obj); sessionDAOImplMock.getMinMaxSessionProducts(sites); assertThat(ans).isNotNull(); } @Test public void testCreateNewSession() throws Exception { // Set up your test data and mock responses /*User user1 = buildUser(); Integer num = 1; Integer[] sitesArray = {1309,1346}; Boolean perCarOrder = true; Boolean includeFleets = false; Boolean includeSystems = true; Boolean includeSpecials = true; Boolean includeObsoletes = true; Boolean includeOverstocks = true; Boolean includeSupersede = true; Boolean includeKeylinesOrders = true; Boolean includeKeylinesReturns= true; Boolean includeLessThanStdPkg = true; Double includeWeekSupplyOption = null; String weekSupplyOptionName = null; Boolean useInvestmentCollections = true; Boolean provideStoreDepth = true; Boolean includeSoldNotStocked = false; Boolean includeNewNumbers= false ; Boolean orderAllSkus= false ; Boolean returnAllSKUs= false ; Integer dollarLimit = 0; String comment=null; Integer siteGroupId = 0; String siteGroupName = null; ProductGroupOrderReturn productGroupOrderReturn = new ProductGroupOrderReturn(); productGroupOrderReturn.setProductGroupId(8839); productGroupOrderReturn.setOrders(true); productGroupOrderReturn.setProductGroupName("*Pulse Round 1 2023"); productGroupOrderReturn.setReturns(true); ProductGroupOrderReturn[] productGroupsArray = {productGroupOrderReturn}; // productGroupsArray.set ProductGroupOrderReturn[] groupCodeArray = null; Integer[] fleetGroupsIds = null; CustomProductGroup customProductGroup = null; CustomGroupCodeProductGroup customGroupCodeProductGroupObj = null; Boolean isGroupCode = false; String savedGroup = null; String userAccessSites = null; Integer[] skuArray = null; ProductLinesData[] productLineIdArray = null; ProductLinesData[] allProductLines = null; ProductLinesData[] siteProductLines = null; Integer includeOrders = 0; Integer includeReturns = 0; Date expirationDate = null; String includeDaysCount = "365"; Integer perCarMinMaxValue = 1; String salesHistoryValue = null; BigDecimal ans = new BigDecimal("589734"); int row = 1; String displayQty= null; String sessionType = "MM"; String includeHubSpokeOrderOption = "B"; String includeHubSpokeReturnOption = "B"; Long createdFromSessionId = null; Boolean applicationPartsOnly = true;*/ when(user.getAccessItemIds()).thenReturn(Arrays.asList(AccessItem.DELAY_SESSION_CREATION.getNumVal())); when(siteGroupDAO.getSiteCount(anyInt(), any(User.class), anyString(), anyString())).thenReturn(DEFER_SITE_LIMIT + 1); // Call the method to test // when(row >0).thenT //sessionDAOImplMock = new SessionDAOImpl(); //ReflectionTestUtils.setField(sessionDAOImplMock, "jdbcTemplate", jdbcTemplate); //when(jdbcTemplate.update((PreparedStatementCreator)sessionDAOImplMock.createNewSession(), any(KeyHolder.class))).thenReturn(row); // when(ps.executeQuery()).thenReturn(); /* sessionDAOImplMock.createNewSession(user1 , perCarOrder , includeFleets , includeSystems , includeSpecials , includeObsoletes , includeOverstocks , includeSupersede , includeKeylinesOrders , includeKeylinesReturns , includeLessThanStdPkg ,includeWeekSupplyOption,weekSupplyOptionName, useInvestmentCollections , provideStoreDepth , includeSoldNotStocked , includeNewNumbers , orderAllSkus , returnAllSKUs , dollarLimit , comment , siteGroupId , "Custom Group" , sitesArray , productGroupsArray , groupCodeArray , fleetGroupsIds , customProductGroup , customGroupCodeProductGroupObj , isGroupCode , savedGroup , userAccessSites , skuArray , productLineIdArray , allProductLines , siteProductLines, includeOrders , includeReturns , expirationDate , includeDaysCount , perCarMinMaxValue , salesHistoryValue , displayQty , sessionType , includeHubSpokeOrderOption , includeHubSpokeReturnOption , null , applicationPartsOnly );*/ //when(row > 0).thenReturn(true); // Verify the results assertThat(rs).isNotNull(); // Add more assertions here based on expected results // Verify interactions with the mock objects // when(jdbcTemplate.update(any(PreparedStatementCreator.class), any(KeyHolder.class))).thenReturn(row); // Add more verifications here } // Additional test cases to cover different branches and conditions // ... private User buildUser() { User testUser = new User(); testUser.setUserId(15600); testUser.setFirstName("Test"); testUser.setLastName("user"); testUser.setLogin("login"); testUser.setRoleId(1); testUser.setAccessItemIds(Arrays.asList(1, 2, 3)); testUser.setLanguage("EN"); testUser.setBusinessUnit(1); testUser.setDeactivated("N"); testUser.setSiteTypes(Arrays.asList("dc", "sku", "ab")); return testUser; } /* @Test public void testCreateSessionException() throws Exception { //sessionDAOImplMock = mock(SessionDAOImpl.class); Integer num = 1; //Integer num1 = 589734; User user = buildUser(); // user.setFirstName("Gayathri"); //user.setLastName("Rayala"); Integer[] sitesArray = {1309,1346}; Boolean perCarOrder = true; Boolean includeFleets = false; Boolean includeSystems = true; Boolean includeSpecials = true; Boolean includeObsoletes = true; Boolean includeOverstocks = true; Boolean includeSupersede = true; Boolean includeKeylinesOrders = true; Boolean includeKeylinesReturns= true; Boolean includeLessThanStdPkg = false; Double includeWeekSupplyOption = 19.0; String weekSupplyOptionName = null; Boolean useInvestmentCollections = null; Boolean provideStoreDepth = false; Boolean includeSoldNotStocked = false; Boolean includeNewNumbers= false ; Boolean orderAllSkus= false ; Boolean returnAllSKUs= false ; Integer dollarLimit = 0; String comment=null; Integer siteGroupId = 0; String siteGroupName = null; ProductGroupOrderReturn[] productGroupsArray = null; ProductGroupOrderReturn[] groupCodeArray = null; Integer[] fleetGroupsIds = null; CustomProductGroup customProductGroup = null; CustomGroupCodeProductGroup customGroupCodeProductGroupObj = null; Boolean isGroupCode = false; String savedGroup = null; String userAccessSites = null; Integer[] skuArray = null; ProductLinesData[] productLineIdArray = null; ProductLinesData[] allProductLines = null; ProductLinesData[] siteProductLines = null; Integer includeOrders = 0; Integer includeReturns = 0; Date expirationDate = null; String includeDaysCount = null; Integer perCarMinMaxValue = 1; String salesHistoryValue = null; BigDecimal ans = new BigDecimal("589734"); String displayQty= null; String sessionType = "MM"; String includeHubSpokeOrderOption = null; String includeHubSpokeReturnOption = null; Long createdFromSessionId = null; Boolean applicationPartsOnly = true; // when(jdbcTemplate.queryForObject("select SETTING_ID from MIN_MAX_SESSION_SETTING where SETTING_CODE = 'MINGTPERCAR' AND SETTING_TYPE = 'MIN' ", Integer.class)).thenReturn(num); when(sessionDAOImplMock.createNewSession(user , perCarOrder , includeFleets , includeSystems , includeSpecials , includeObsoletes , includeOverstocks , includeSupersede , includeKeylinesOrders , includeKeylinesReturns , includeLessThanStdPkg ,includeWeekSupplyOption,weekSupplyOptionName, useInvestmentCollections , provideStoreDepth , includeSoldNotStocked , includeNewNumbers , orderAllSkus , returnAllSKUs , dollarLimit , comment , siteGroupId , "Custom Group" , sitesArray , productGroupsArray , groupCodeArray , fleetGroupsIds , customProductGroup , customGroupCodeProductGroupObj , isGroupCode , savedGroup , userAccessSites , skuArray , productLineIdArray , allProductLines , siteProductLines, includeOrders , includeReturns , expirationDate , includeDaysCount , perCarMinMaxValue , salesHistoryValue , displayQty , sessionType , includeHubSpokeOrderOption , includeHubSpokeReturnOption , null , applicationPartsOnly)).thenReturn(ans); sessionDAOImplMock.createNewSession(user , perCarOrder , includeFleets , includeSystems , includeSpecials , includeObsoletes , includeOverstocks , includeSupersede , includeKeylinesOrders , includeKeylinesReturns , includeLessThanStdPkg ,includeWeekSupplyOption,weekSupplyOptionName, useInvestmentCollections , provideStoreDepth , includeSoldNotStocked , includeNewNumbers , orderAllSkus , returnAllSKUs , dollarLimit , comment , siteGroupId , "Custom Group" , sitesArray , productGroupsArray , groupCodeArray , fleetGroupsIds , customProductGroup , customGroupCodeProductGroupObj , isGroupCode , savedGroup , userAccessSites , skuArray , productLineIdArray , allProductLines , siteProductLines, includeOrders , includeReturns , expirationDate , includeDaysCount , perCarMinMaxValue , salesHistoryValue , displayQty , sessionType , includeHubSpokeOrderOption , includeHubSpokeReturnOption , null , applicationPartsOnly ); assertThat(ans).isNotNull(); }*/ }