package org.openlmis.core.service; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.openlmis.core.LMISTestRunner; import org.openlmis.core.manager.SharedPreferenceMgr; import org.openlmis.core.manager.UserInfoMgr; import org.openlmis.core.model.Lot; import org.openlmis.core.model.LotOnHand; import org.openlmis.core.model.Product; import org.openlmis.core.model.ProductProgram; import org.openlmis.core.model.ProgramDataForm; import org.openlmis.core.model.StockCard; import org.openlmis.core.model.StockMovementItem; import org.openlmis.core.model.User; import org.openlmis.core.model.repository.LotRepository; import org.openlmis.core.model.repository.ProductProgramRepository; import org.openlmis.core.model.repository.ProductRepository; import org.openlmis.core.model.repository.ProgramDataFormRepository; import org.openlmis.core.model.repository.StockMovementRepository; import org.openlmis.core.model.repository.StockRepository; import org.openlmis.core.model.repository.UserRepository; import org.openlmis.core.network.LMISRestManagerMock; import org.openlmis.core.utils.Constants; import org.openlmis.core.utils.DateUtil; import org.openlmis.core.utils.JsonFileReader; import org.robolectric.RuntimeEnvironment; import java.util.Calendar; import java.util.Date; import java.util.List; import roboguice.RoboGuice; import rx.observers.TestSubscriber; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; @RunWith(LMISTestRunner.class) public class SyncDownManagerIT { private SyncDownManager syncDownManager; private ProductRepository productRepository; private ProductProgramRepository productProgramRepository; private UserRepository userRepository; private StockRepository stockRepository; private LotRepository lotRepository; private User defaultUser; private SharedPreferenceMgr sharedPreferenceMgr; private ProgramDataFormRepository programDataFormRepository; private StockMovementRepository stockMovementRepository; @Before public void setup() { userRepository = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(UserRepository.class); productRepository = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(ProductRepository.class); productProgramRepository = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(ProductProgramRepository.class); stockRepository = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(StockRepository.class); lotRepository = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(LotRepository.class); programDataFormRepository = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(ProgramDataFormRepository.class); stockMovementRepository = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(StockMovementRepository.class); syncDownManager = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(SyncDownManager.class); sharedPreferenceMgr = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(SharedPreferenceMgr.class); defaultUser = new User(); defaultUser.setUsername("username"); defaultUser.setPassword("password"); defaultUser.setFacilityId("10"); defaultUser.setFacilityName("facility"); defaultUser.setFacilityCode("F1"); userRepository.createOrUpdate(defaultUser); UserInfoMgr.getInstance().setUser(defaultUser); } @Test @Ignore public void shouldSyncDownLatestProductWithArchivedStatus() throws Exception { //given String json = JsonFileReader.readJson(getClass(), "SyncDownLatestProductResponse.json"); LMISRestManagerMock lmisRestManager = LMISRestManagerMock.getRestManagerWithMockClient("/rest-api/latest-products", 200, "OK", json, RuntimeEnvironment.application); syncDownManager.lmisRestApi = lmisRestManager.getLmisRestApi(); //when syncDownManager.syncDownServerData(); //then Product product = productRepository.getByCode("01A01"); assertTrue(product.isArchived()); assertEquals("Estavudina+Lamivudina+Nevirapi 6mg + 30mg +50mg, 60 Cps (BabyEmbalagem", product.getPrimaryName()); assertEquals("Embalagem", product.getType()); assertEquals("6mg + 30mg +50mg, 60 Cps (Baby", product.getStrength()); ProductProgram productProgram = productProgramRepository.queryByCode("01A01", "ESS_MEDS"); assertTrue(productProgram.isActive()); } @Test @Ignore public void shouldSyncDownStockCardsWithMovements() throws Exception { //set shared preferences to have synced all historical data already Calendar cal = Calendar.getInstance(); cal.setTime(new Date()); cal.add(Calendar.YEAR, -1); sharedPreferenceMgr.getPreference().edit().putLong(SharedPreferenceMgr.KEY_STOCK_SYNC_END_TIME, cal.getTimeInMillis()).apply(); sharedPreferenceMgr.getPreference().edit().putBoolean(SharedPreferenceMgr.KEY_HAS_SYNCED_DOWN_RAPID_TESTS, true).apply(); //given String productJson = JsonFileReader.readJson(getClass(), "SyncDownLatestProductResponse.json"); LMISRestManagerMock lmisRestManager = LMISRestManagerMock.getRestManagerWithMockClient("/rest-api/latest-products", 200, "OK", productJson, RuntimeEnvironment.application); Date now = new Date(); Date startDate = DateUtil.minusDayOfMonth(now, 30); String startDateStr = DateUtil.formatDate(startDate, DateUtil.DB_DATE_FORMAT); Date endDate = DateUtil.addDayOfMonth(now, 1); String endDateStr = DateUtil.formatDate(endDate, DateUtil.DB_DATE_FORMAT); String stockMovementJson = JsonFileReader.readJson(getClass(), "SyncDownStockMovementsResponse.json"); lmisRestManager.addNewMockedResponse("/rest-api/facilities/" + defaultUser.getFacilityId() + "/stockCards?startTime=" + startDateStr + "&endTime=" + endDateStr, 200, "OK", stockMovementJson); String emptyRequisitions = "{\"requisitions\": []}"; lmisRestManager.addNewMockedResponse("/rest-api/requisitions?facilityCode=" + defaultUser.getFacilityCode(), 200, "OK", emptyRequisitions); syncDownManager.lmisRestApi = lmisRestManager.getLmisRestApi(); //when TestSubscriber<SyncDownManager.SyncProgress> subscriber = new TestSubscriber<>(); syncDownManager.syncDownServerData(subscriber); subscriber.awaitTerminalEvent(); subscriber.assertNoErrors(); List<StockCard> stockCards = stockRepository.list(); assertEquals(1, stockCards.size()); List<StockMovementItem> stockMovementItems = stockMovementRepository.queryStockMovementHistory(stockCards.get(0).getId(), 0L, 1000L); assertEquals(1, stockMovementItems.size()); Product product = productRepository.getByCode("01A01"); Lot lot = lotRepository.getLotByLotNumberAndProductId("TEST5", product.getId()); assertEquals("2016-10-30", DateUtil.formatDate(lot.getExpirationDate(), DateUtil.DB_DATE_FORMAT)); LotOnHand lotOnHand = lotRepository.getLotOnHandByLot(lot); assertEquals(5, lotOnHand.getQuantityOnHand(), 0L); } @Test @Ignore public void shouldSyncDownRapidTests() throws Exception { //set shared preferences to have synced all historical data already Calendar cal = Calendar.getInstance(); cal.setTime(new Date()); cal.add(Calendar.YEAR, -1); sharedPreferenceMgr.getPreference().edit().putLong(SharedPreferenceMgr.KEY_STOCK_SYNC_END_TIME, cal.getTimeInMillis()).apply(); //given String productJson = JsonFileReader.readJson(getClass(), "SyncDownLatestProductResponse.json"); LMISRestManagerMock lmisRestManager = LMISRestManagerMock.getRestManagerWithMockClient("/rest-api/latest-products", 200, "OK", productJson, RuntimeEnvironment.application); sharedPreferenceMgr.setLastMonthStockCardDataSynced(true); sharedPreferenceMgr.setRequisitionDataSynced(true); String rapidTestsResponseJson = JsonFileReader.readJson(getClass(), "SyncDownRapidTestsResponse.json"); lmisRestManager.addNewMockedResponse("/rest-api/programData/facilities/" + defaultUser.getFacilityId(), 200, "OK", rapidTestsResponseJson); syncDownManager.lmisRestApi = lmisRestManager.getLmisRestApi(); //when TestSubscriber<SyncDownManager.SyncProgress> subscriber = new TestSubscriber<>(); syncDownManager.syncDownServerData(subscriber); subscriber.awaitTerminalEvent(); subscriber.assertNoErrors(); List<ProgramDataForm> programDataForms = programDataFormRepository.listByProgramCode(Constants.RAPID_TEST_CODE); assertEquals(1, programDataForms.size()); assertEquals("2016-02-21", DateUtil.formatDate(programDataForms.get(0).getPeriodBegin(), DateUtil.DB_DATE_FORMAT)); assertEquals("2016-03-20", DateUtil.formatDate(programDataForms.get(0).getPeriodEnd(), DateUtil.DB_DATE_FORMAT)); assertEquals(8, programDataForms.get(0).getProgramDataFormItemListWrapper().size()); } }