package no.dusken.barweb.plugin.statisticsplugin.control; import no.dusken.barweb.model.*; import no.dusken.barweb.plugin.statisticsplugin.model.StatisticsElement; import no.dusken.barweb.plugin.statisticsplugin.service.StatisticsService; import no.dusken.barweb.service.BarPersonService; import no.dusken.barweb.service.GjengService; import no.dusken.barweb.service.TransaksjonService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.kantega.jexmec.store.PluginStore; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; import java.util.Calendar; import java.util.LinkedList; import java.util.List; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** * @author Marvin B. Lillehaug <lillehau@underdusken.no> */ @RunWith(MockitoJUnitRunner.class) public class TestCreateStatisticsController { @Mock private BarPersonService barPersonService; @Mock private GjengService gjengService; @Mock private StatisticsService statisticsService; private CreateStatisticsController controller; @Mock private TransaksjonService transaksjonService; @Mock private PluginStore pluginStore; @Before public void onSetup(){ controller = new CreateStatisticsController(); controller.setBarPersonService(barPersonService); controller.setGjengService(gjengService); controller.setStatisticsService(statisticsService); controller.setTransaksjonService(transaksjonService); controller.setPluginStore(pluginStore); Gjeng g = new Gjeng(){ @Override public Long getId() { return 3L; } }; when(gjengService.getByDefaultGjengTrue()).thenReturn(g); } @Test public void testCreatePersonBalance(){ populatePersons(); List<StatisticsElement> savedElements = createPrivateStatisticsServiceMock(); controller.createPersonBalance(); assertEquals("Two elements should have been saved.", 2, savedElements.size()); StatisticsElement el1 = savedElements.get(0); assertEquals("Element should belong to p1", (Object) 1L, el1.getTrackedObjectId()); assertEquals("Element should have 50 in amount", (Object) 50L, el1.getAmount()); StatisticsElement el2 = savedElements.get(1); assertEquals("Element should belong to p2", (Object) 2L, el2.getTrackedObjectId()); assertEquals("Element should have 150 in amount", (Object) 150L, el2.getAmount()); } @Test public void testCreatePersonBeersLastWeek(){ List<BarPerson> barPersons = populatePersons(); List<Transaksjon> transaksjons = new LinkedList<Transaksjon>(); Transaksjon t = new Transaksjon(); transaksjons.add(t); TransaksjonVare tv = new TransaksjonVare(); Vare v = new Vare(); v.setName("ØL"); tv.setVare(v); tv.setAmount(10); tv.setTransaksjon(t); List<TransaksjonVare> tvs = new LinkedList<TransaksjonVare>(); tvs.add(tv); t.setTransaksjoner(tvs); when(transaksjonService.getByBarPersonAndTimeCreatedBetween(eq(barPersons.get(0)), any(Calendar.class), any(Calendar.class))).thenReturn(transaksjons); List<Transaksjon> transaksjons2 = new LinkedList<Transaksjon>(); Transaksjon t2 = new Transaksjon(); transaksjons2.add(t2); TransaksjonVare tv2 = new TransaksjonVare(); tv2.setVare(v); tv2.setAmount(20); tv2.setTransaksjon(t2); List<TransaksjonVare> tvs2 = new LinkedList<TransaksjonVare>(); tvs2.add(tv2); t2.setTransaksjoner(tvs2); when(transaksjonService.getByBarPersonAndTimeCreatedBetween(eq(barPersons.get(1)), any(Calendar.class), any(Calendar.class))).thenReturn(transaksjons2); List<StatisticsElement> elements = createPrivateStatisticsServiceMock(); controller.createPersonBeersLastWeek(); assertEquals("There should be two elements", 2, elements.size()); assertEquals("Wrong number beers", (Object) 10L, elements.get(0).getAmount()); assertEquals("Wrong person", (Object) 1L, elements.get(0).getTrackedObjectId()); assertEquals("Wrong number beers", (Object) 20L, elements.get(1).getAmount()); assertEquals("Wrong person", (Object) 2L, elements.get(1).getTrackedObjectId()); } @Test public void testCreatePersonMoneyLastWeek(){ BarPerson p = populatePersons().get(0); Vare v = new Vare(Vare.VareName.NOK, 1, 1, 1, true); List<Transaksjon> transaksjons = new LinkedList<Transaksjon>(); Transaksjon t1 = new Transaksjon(); t1.setBarPerson(p); TransaksjonVare transaksjonVare = new TransaksjonVare(); transaksjonVare.setVare(v); transaksjonVare.setAmount(100); t1.getTransaksjoner().add(transaksjonVare); Transaksjon t2 = new Transaksjon(); t2.setBarPerson(p); TransaksjonVare transaksjonVare2 = new TransaksjonVare(); transaksjonVare2.setVare(v); transaksjonVare2.setAmount(1010); t1.getTransaksjoner().add(transaksjonVare2); transaksjons.add(t1); transaksjons.add(t2); when(transaksjonService.getByBarPersonAndTimeCreatedBetween(eq(p), any(Calendar.class), any(Calendar.class))).thenReturn(transaksjons); List<StatisticsElement> savedElements = createPrivateStatisticsServiceMock(); controller.createPersonMoneyLastWeek(); assertEquals("Two statisticsElement should have been created", 2, savedElements.size()); StatisticsElement el = savedElements.get(0); assertEquals("BarPerson should be 1L", (Object) 1L, el.getTrackedObjectId()); assertEquals("Amount was wrong", (Object) 1110L, el.getAmount()); StatisticsElement el2 = savedElements.get(1); assertEquals("BarPerson should be 2L", (Object) 2L, el2.getTrackedObjectId()); assertEquals("Amount was wrong", (Object) 0L, el2.getAmount()); } @Test public void testCreateTotalBeersLastWeek(){ List<BarPerson> barPersons = populatePersons(); createBeerTransaksjons(barPersons); List<StatisticsElement> elements = createPrivateStatisticsServiceMock(); controller.createTotalBeersLastWeek(); assertEquals("Wrong number of elements", 1, elements.size()); assertEquals("Wrong tracked Id", (Object) 3L, elements.get(0).getTrackedObjectId()); assertEquals("Wrong amount", (Object) 30L, elements.get(0).getAmount()); } @Test public void testCreateTotalMoneySpentLastWeek(){ List<BarPerson> barPersons = populatePersons(); createBeerTransaksjons(barPersons); List<StatisticsElement> elements = createPrivateStatisticsServiceMock(); controller.createTotalMoneySpentLastWeek(); assertEquals("Wrong number of elements", 1, elements.size()); assertEquals("Wrong tracked Id", (Object) 3L, elements.get(0).getTrackedObjectId()); assertEquals("Wrong amount", (Object) 300L, elements.get(0).getAmount()); } private void createBeerTransaksjons(List<BarPerson> barPersons){ List<Transaksjon> transaksjons = new LinkedList<Transaksjon>(); Transaksjon t = new Transaksjon(); transaksjons.add(t); TransaksjonVare tv = new TransaksjonVare(); Vare v = new Vare(); v.setName("ØL"); v.setInternalPrice(10); tv.setVare(v); t.setExternal(false); tv.setAmount(10); tv.setTransaksjon(t); List<TransaksjonVare> tvs = new LinkedList<TransaksjonVare>(); tvs.add(tv); t.setTransaksjoner(tvs); when(transaksjonService.getByBarPersonAndTimeCreatedBetween(eq(barPersons.get(0)), any(Calendar.class), any(Calendar.class))).thenReturn(transaksjons); List<Transaksjon> transaksjons2 = new LinkedList<Transaksjon>(); Transaksjon t2 = new Transaksjon(); transaksjons2.add(t2); TransaksjonVare tv2 = new TransaksjonVare(); tv2.setVare(v); tv2.setAmount(20); tv2.setTransaksjon(t2); List<TransaksjonVare> tvs2 = new LinkedList<TransaksjonVare>(); tvs2.add(tv2); t2.setTransaksjoner(tvs2); t2.setExternal(false); when(transaksjonService.getByBarPersonAndTimeCreatedBetween(eq(barPersons.get(1)), any(Calendar.class), any(Calendar.class))).thenReturn(transaksjons2); } @Test public void testCreateSumPersonBalance(){ populatePersons(); List<StatisticsElement> savedElements = createPrivateStatisticsServiceMock(); controller.createSumPersonBalance(); assertEquals("One elements should have been saved.", 1, savedElements.size()); StatisticsElement el1 = savedElements.get(0); assertEquals("Element should belong to gjeng", (Object) 3L, el1.getTrackedObjectId()); assertEquals("Element should have 200 in amount", (Object) 200L, el1.getAmount()); assertTrue("Should only be visible in admin", el1.getShowOnlyInAdmin()); } @Test public void testCreateValueInBar(){ when(pluginStore.getString("valuesinbar", "0")).thenReturn("1000"); List<StatisticsElement> savedElements = createPrivateStatisticsServiceMock(); controller.createValueInBar(); assertEquals("One elements should have been saved.", 1, savedElements.size()); StatisticsElement el1 = savedElements.get(0); assertEquals("Element should belong to gjeng", (Object) 3L, el1.getTrackedObjectId()); assertEquals("Element should have 1000 in amount", (Object) 1000L, el1.getAmount()); assertTrue("Element should be only admin", el1.getShowOnlyInAdmin()); } @Test public void testCreateValueInBank(){ when(pluginStore.getString("valuesinbank", "0")).thenReturn("1000"); List<StatisticsElement> savedElements = createPrivateStatisticsServiceMock(); controller.createValueInBank(); assertEquals("One elements should have been saved.", 1, savedElements.size()); StatisticsElement el1 = savedElements.get(0); assertEquals("Element should belong to gjeng", (Object) 3L, el1.getTrackedObjectId()); assertEquals("Element should have 1000 in amount", (Object) 1000L, el1.getAmount()); assertTrue("Element should be only admin", el1.getShowOnlyInAdmin()); } @Test public void testCreateLiquidity(){ populatePersons(); when(pluginStore.getString("valuesinbar", "0")).thenReturn("500"); when(pluginStore.getString("valuesinbank", "0")).thenReturn("500"); when(barPersonService.getSumPersonBalances(gjengService.getByDefaultGjengTrue())).thenReturn(200L); List<StatisticsElement> savedElements = createPrivateStatisticsServiceMock(); controller.createLiquidity(); assertEquals("One elements should have been saved.", 1, savedElements.size()); StatisticsElement el1 = savedElements.get(0); assertEquals("Element should belong to gjeng", (Object) 3L, el1.getTrackedObjectId()); assertEquals("Element should have 800 in amount", (Object) 800L, el1.getAmount()); assertTrue("Element should be only admin", el1.getShowOnlyInAdmin()); } private List<StatisticsElement> createPrivateStatisticsServiceMock(){ final List<StatisticsElement> elements = new LinkedList<StatisticsElement>(); statisticsService = mock(StatisticsService.class); when(statisticsService.save(any(StatisticsElement.class))).thenAnswer(new Answer<StatisticsElement>() { @Override public StatisticsElement answer(InvocationOnMock invocationOnMock) throws Throwable { StatisticsElement statisticsElement = (StatisticsElement) invocationOnMock.getArguments()[0]; elements.add(statisticsElement); return statisticsElement; } }); controller.setStatisticsService(statisticsService); return elements; } public List<BarPerson> populatePersons(){ List<BarPerson> barPersons = new LinkedList<BarPerson>(); BarPerson p1 = new BarPerson(){ @Override public Long getId() { return 1L; } }; p1.setMoney(50); BarPerson p2 = new BarPerson(){ @Override public Long getId() { return 2L; } }; p2.setMoney(150); barPersons.add(p1); barPersons.add(p2); when(barPersonService.getActivePersons(gjengService.getByDefaultGjengTrue())).thenReturn(barPersons); when(barPersonService.getNonActivePersons(gjengService.getByDefaultGjengTrue())).thenReturn(new LinkedList<BarPerson>()); return barPersons; } }