package jhaushalt.service.factories;
import static org.fest.assertions.Assertions.assertThat;
import java.io.DataInputStream;
import java.io.IOException;
import java.text.ParseException;
import java.util.List;
import jhaushalt.domain.Datenbasis;
import jhaushalt.domain.Geldbetrag;
import jhaushalt.domain.Register;
import jhaushalt.domain.buchung.Buchung;
import jhaushalt.domain.buchung.SplitBuchung;
import jhaushalt.domain.buchung.StandardBuchung;
import jhaushalt.domain.buchung.Umbuchung;
import jhaushalt.domain.kategorie.EinzelKategorie;
import jhaushalt.domain.kategorie.MehrfachKategorie;
import jhaushalt.domain.kategorie.UmbuchungKategorie;
import jhaushalt.domain.zeitraum.Datum;
import jhaushalt.service.factories.io.DataInputStreamFacade;
import org.junit.Test;
public class DatenbasisIntegrationTest {
DatenbasisFactory datenbasisFactory = new DatenbasisFactory();
@Test
public void doSomeRawChecksOnDatenbasisFactory() throws IOException, UnknownBuchungTypeException, ParseException {
DataInputStreamFacade holder = createDataInputStream("testdatenbank.jhh");
BuchungFactory buchungFactory = new BuchungFactory();
RegisterFactory registerFactory = new RegisterFactory();
registerFactory.setBookingFactory(buchungFactory);
datenbasisFactory.setRegisterFactory(registerFactory);
Datenbasis datenbasis = datenbasisFactory.getInstance(holder);
assertThat(datenbasis).isNotNull();
assertThat(datenbasis.getVersionInfo()).isEqualTo("jHaushalt2.1.2");
assertThat(datenbasis.getAnzahlAutoStandardBuchungen()).isEqualTo(0);
assertThat(datenbasis.getAnzahlAutoUmbuchungen()).isEqualTo(0);
List<Register> registers = datenbasis.getRegisterList();
assertThat(registers.size()).isEqualTo(2);
assertThatFirstRegisterIsSetCorrectly(registers.get(0));
assertThatSecondRegisterIsSetCorrectly(registers.get(1));
}
private void assertThatFirstRegisterIsSetCorrectly(Register register) {
assertThat(register.getAnzahlBuchungen()).isEqualTo(4);
assertThat(register.getName()).isEqualTo("[Girokonto]");
List<Buchung> registerBookings = register.getBookings();
assertThat(registerBookings).hasSize(4);
assertThatBookingEntryIsCorrect(registerBookings.get(0), Umbuchung.class, new Datum("16.11.12"), "Eröffnungssaldo", UmbuchungKategorie.class, new Geldbetrag("200000"));
assertThatBookingEntryIsCorrect(registerBookings.get(1), StandardBuchung.class, new Datum("17.11.12"), "Einzahlung", EinzelKategorie.class, new Geldbetrag("430000"));
assertThatBookingEntryIsCorrect(registerBookings.get(2), StandardBuchung.class, new Datum("18.11.12"), "Stromrechnung", EinzelKategorie.class, new Geldbetrag("-3467"));
assertThatBookingEntryIsCorrect(registerBookings.get(3), SplitBuchung.class, new Datum("02.12.12"), "Barauszahlung", MehrfachKategorie.class, new Geldbetrag("-30000"));
}
private void assertThatSecondRegisterIsSetCorrectly(Register register) {
assertThat(register.getAnzahlBuchungen()).isEqualTo(2);
assertThat(register.getName()).isEqualTo("[Sparkonto]");
List<Buchung> registerBookings = register.getBookings();
assertThat(registerBookings).hasSize(2);
assertThatBookingEntryIsCorrect(registerBookings.get(0), Umbuchung.class, new Datum("02.12.12"), "Eröffnungssaldo", UmbuchungKategorie.class, new Geldbetrag("30014"));
assertThatBookingEntryIsCorrect(registerBookings.get(1), StandardBuchung.class, new Datum("02.12.12"), "Auszahlung", EinzelKategorie.class, new Geldbetrag("-5000"));
}
private void assertThatBookingEntryIsCorrect(Buchung bookingEntry, Class<?> expectedBookingType, Datum expectedDate, String entryText, Class<?> expectedClassType, Geldbetrag expectedAmount) {
assertThat(bookingEntry).isInstanceOf(expectedBookingType);
assertThat(bookingEntry.getDatum()).isEqualTo(expectedDate);
assertThat(bookingEntry.getText()).isEqualTo(entryText);
assertThat(bookingEntry.getKategorie()).isInstanceOf(expectedClassType);
assertThat(bookingEntry.getWert()).isEqualTo(expectedAmount);
}
private DataInputStreamFacade createDataInputStream(String resourceName) {
DataInputStream dis = new DataInputStream(DatenbasisFactory.class.getResourceAsStream(resourceName));
return new DataInputStreamFacade(dis);
}
}