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;
}
}