package jhaushalt.service;
import static org.fest.assertions.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import jhaushalt.domain.Datenbasis;
import jhaushalt.domain.Geldbetrag;
import jhaushalt.domain.Register;
import jhaushalt.domain.gui.BookEntry;
import jhaushalt.domain.kategorie.EinzelKategorie;
import jhaushalt.domain.zeitraum.Jahr;
import jhaushalt.domain.zeitraum.Zeitraum;
import org.junit.Before;
import org.junit.Test;
public class DataServiceTest {
private static final String SECOND_REGISTER_NAME = "bar";
private static final String FIRST_REGISTER_NAME = "foo";
private DataServiceImpl service = new DataServiceImpl();
private DatenbasisService datenbasisService;
private Datenbasis datenbasis;
private EinzelKategorie kategorie;
@Before
public void setup() {
datenbasis = mock(Datenbasis.class);
datenbasisService = mock(DatenbasisService.class);
when(datenbasisService.getDatenbasis()).thenReturn(datenbasis);
service.setDatenbasisService(datenbasisService);
kategorie = new EinzelKategorie("Einzahlung", null);
kategorie.addiereWert(new Geldbetrag(500D), true);
}
@Test
public void getBuchungenDeliversListOfBookEntries() {
createRegisterAndBuchung();
EinzelKategorie[] kategorien = { kategorie };
Zeitraum zeitraum = new Jahr(2005);
boolean unterkategorienVerwenden = true;
List<BookEntry> actualList = service.getBuchungen(zeitraum, null, kategorien, unterkategorienVerwenden);
assertThat(actualList).isNotNull();
assertThat(actualList).hasSize(2);
assertThatBookEntryIsFilledOutCorrectly(actualList);
}
@Test
public void getBuchungenDeliversListOfBookEntriesForGivenRegisterName() {
createRegisterAndBuchung();
EinzelKategorie[] kategorien = { kategorie };
Zeitraum zeitraum = new Jahr(2005);
String regname = FIRST_REGISTER_NAME;
boolean unterkategorienVerwenden = true;
List<BookEntry> actualList = service.getBuchungen(zeitraum, regname, kategorien, unterkategorienVerwenden);
assertThat(actualList).isNotNull();
assertThat(actualList).hasSize(1);
assertThatBookEntryIsFilledOutCorrectly(actualList);
}
@Test
public void findeRegisterGetsCorrectRegister() {
createRegisterAndBuchung();
Register register = service.findeRegister(FIRST_REGISTER_NAME);
assertThat(register.getName()).isEqualTo(FIRST_REGISTER_NAME);
}
@Test
public void findeRegisterReactsCaseSensitive() {
createRegisterAndBuchung();
Register register = service.findeRegister(FIRST_REGISTER_NAME.toUpperCase());
assertThat(register).isNull();
}
private void assertThatBookEntryIsFilledOutCorrectly(List<BookEntry> actualList) {
BookEntry firstActualEntry = actualList.get(0);
assertThat(firstActualEntry.getValue().getBetrag()).isEqualTo(200000L);
assertThat(firstActualEntry.getDate().getMonat()).isEqualTo(7);
assertThat(firstActualEntry.getDate().getJahr()).isEqualTo(2005);
assertThat(firstActualEntry.getDate().getTag()).isEqualTo(1);
assertThat(firstActualEntry.getDescription()).isEqualTo("Testeintrag");
}
private void createRegisterAndBuchung() {
List<Register> registerList = new ArrayList<Register>();
registerList.add(
new RegisterBuilder(FIRST_REGISTER_NAME, kategorie)
.addBooking(1, 7, 2005, "Testeintrag", 2000D)
.addBooking(23, 12, 2004, "Old Entry", 4000D)
.addBooking(23, 1, 2006, "Entry in 2006", 3000D)
.addBooking(2,7, 2005, "Null amount entry", 0D)
.getRegister()
);
registerList.add(
new RegisterBuilder(SECOND_REGISTER_NAME, kategorie)
.addBooking(2,7, 2005, "Another amount entry", 150D)
.getRegister()
);
when(datenbasis.getRegisterList()).thenReturn(registerList);
}
}