package de.dhbw.humbuch.viewmodel; import static de.dhbw.humbuch.test.TestUtils.borrowedMaterialReceivedInPast; import static de.dhbw.humbuch.test.TestUtils.borrowedMaterialReceivedInPastBorrowUntil; import static de.dhbw.humbuch.test.TestUtils.schoolYearFirstTermEnded; import static de.dhbw.humbuch.test.TestUtils.schoolYearFirstTermEndedPlusDays; import static de.dhbw.humbuch.test.TestUtils.schoolYearSecondTermEndedPlusDays; import static de.dhbw.humbuch.test.TestUtils.studentInGrade; import static de.dhbw.humbuch.test.TestUtils.teachingMaterialInFirstTermOfGrade; import static de.dhbw.humbuch.test.TestUtils.teachingMaterialInSecondTermOfGrade; import static de.dhbw.humbuch.test.TestUtils.todayPlusDays; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.util.HashMap; import javax.persistence.EntityManager; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import com.google.inject.Inject; import com.google.inject.Provider; import de.dhbw.humbuch.guice.GuiceJUnitRunner; import de.dhbw.humbuch.guice.GuiceJUnitRunner.GuiceModules; import de.dhbw.humbuch.guice.TestModule; import de.dhbw.humbuch.model.DAO; import de.dhbw.humbuch.model.entity.BorrowedMaterial; import de.dhbw.humbuch.model.entity.Dunning; import de.dhbw.humbuch.model.entity.Dunning.Status; import de.dhbw.humbuch.model.entity.SchoolYear; import de.dhbw.humbuch.model.entity.TestPersistenceInitialiser; @RunWith(GuiceJUnitRunner.class) @GuiceModules({ TestModule.class }) /** * @author Martin Wentzel * @author David Hermann */ public class DunningViewModelTest extends BaseTest { private final int DEADLINE_FIRST_DUNNING = 15; private final int DEADLINE_SECOND_DUNNING = 15; private DunningViewModel dunningViewModel; private DAO<Dunning> daoDunning; private DAO<SchoolYear> daoSchoolYear; private DAO<BorrowedMaterial> daoBorrowedMaterial; private Properties properties; @Inject public void setInjected(TestPersistenceInitialiser persistenceInitialiser, Provider<EntityManager> emProvider, DunningViewModel dunningViewModel, DAO<Dunning> daoDunning, DAO<SchoolYear> daoSchoolYear, DAO<BorrowedMaterial> daoBorrowedMaterial, Properties properties) { super.setInjected(persistenceInitialiser, emProvider); this.dunningViewModel = dunningViewModel; this.daoDunning = daoDunning; this.daoSchoolYear = daoSchoolYear; this.daoBorrowedMaterial = daoBorrowedMaterial; this.properties = properties; } private void persistSomeEmptyDunnings(int amount, Status status) { for (int i = 0; i < amount; i++) { Dunning dunning = new Dunning.Builder(null).status(status).build(); daoDunning.insert(dunning); } } /** * Persist a {@link BorrowedMaterial} which is due after the term end */ private void persistBorrowedMaterialDueAfterFirstTerm() { daoBorrowedMaterial.insert(borrowedMaterialReceivedInPast( studentInGrade(6), teachingMaterialInFirstTermOfGrade(6))); } /** * Persist a {@link BorrowedMaterial} which is due after manual borrowUntil * date */ private void persistBorrowedMaterialDueAfterManualEndDate() { daoBorrowedMaterial.insert(borrowedMaterialReceivedInPastBorrowUntil( studentInGrade(6), teachingMaterialInFirstTermOfGrade(6), todayPlusDays(-DEADLINE_FIRST_DUNNING))); } private void persistBorrowedMaterialManualEndDateInFuture() { daoBorrowedMaterial.insert(borrowedMaterialReceivedInPastBorrowUntil( studentInGrade(6), teachingMaterialInFirstTermOfGrade(6), todayPlusDays(1))); } private void persistBorrowedMaterialDueAfterFirstTermEndInLastSchoolYear() { daoBorrowedMaterial.insert(borrowedMaterialReceivedInPast( studentInGrade(7), teachingMaterialInFirstTermOfGrade(6))); } private void persistBorrowedMaterialDueAfterSecondTermEndInLastSchoolYear() { daoBorrowedMaterial.insert(borrowedMaterialReceivedInPast( studentInGrade(7), teachingMaterialInSecondTermOfGrade(6))); } @Before public void refreshDunningViewModel() { HashMap<String, String> map = new HashMap<String, String>(); map.put("dun_firstDunningDeadline", "" + DEADLINE_FIRST_DUNNING); properties.settings.set(map); map.put("dun_secondDunningDeadline", "" + DEADLINE_SECOND_DUNNING); properties.settings.set(map); dunningViewModel.refresh(); } @Test public void testStateInitialisation() { // states should be initialised (not null) assertNotNull(dunningViewModel.dunnings.get()); } @Test public void testInitialDunningAmount() { // amount of dunnings should be 0 with an empty database assertEquals(0, dunningViewModel.dunnings.get().size()); } @Test public void testAddTwoSentDunnings() { // add two sent dunnings, check amount persistSomeEmptyDunnings(2, Status.SENT); dunningViewModel.refresh(); assertEquals(2, dunningViewModel.dunnings.get().size()); } public void testAddTwoSentThreeClosedDunnings() { // add two sent dunnings persistSomeEmptyDunnings(2, Status.SENT); // add three closed dunnings, check amount persistSomeEmptyDunnings(3, Status.CLOSED); dunningViewModel.refresh(); assertEquals(5, dunningViewModel.dunnings.get().size()); } @Test public void testAddFourOpenedDunnings() { // add four opened dunnings, check amount persistSomeEmptyDunnings(4, Status.OPENED); dunningViewModel.refresh(); assertEquals(4, dunningViewModel.dunnings.get().size()); } @Test public void testAutoDunningAfterFirstTerm() { // BorrowedMaterial due after end of term daoSchoolYear .insert(schoolYearFirstTermEndedPlusDays(DEADLINE_FIRST_DUNNING)); persistBorrowedMaterialDueAfterFirstTerm(); dunningViewModel.refresh(); assertEquals(1, dunningViewModel.dunnings.get().size()); } @Test public void testAutoDunningAfterManualLendingDate() { // BorrowedMaterial due after manual lending date daoSchoolYear.insert(schoolYearFirstTermEnded()); persistBorrowedMaterialDueAfterManualEndDate(); dunningViewModel.refresh(); assertEquals(1, dunningViewModel.dunnings.get().size()); } @Test public void testNoActionBeforeManualLendingDate() { // BorrowedMaterial due in future (manual lending date) daoSchoolYear.insert(schoolYearFirstTermEnded()); persistBorrowedMaterialManualEndDateInFuture(); dunningViewModel.refresh(); assertEquals(0, dunningViewModel.dunnings.get().size()); } @Test public void testAutoDunningAfterFirstTermEndOfLastSchoolYear() { // BorrowedMaterial due after term end of last school year daoSchoolYear.insert(schoolYearSecondTermEndedPlusDays(DEADLINE_FIRST_DUNNING)); persistBorrowedMaterialDueAfterFirstTermEndInLastSchoolYear(); dunningViewModel.refresh(); assertEquals(1, dunningViewModel.dunnings.get().size()); } @Test public void testAutoDunningAfterSecondTermInLastSchoolYear() { // BorrowedMaterial due after term end of last school year daoSchoolYear.insert(schoolYearSecondTermEndedPlusDays(DEADLINE_FIRST_DUNNING)); persistBorrowedMaterialDueAfterSecondTermEndInLastSchoolYear(); dunningViewModel.refresh(); assertEquals(1, dunningViewModel.dunnings.get().size()); } }