package jhaushalt.service.factories;
import static org.fest.assertions.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import jhaushalt.domain.Datenbasis;
import jhaushalt.domain.Register;
import jhaushalt.service.factories.io.DataInputFacade;
import jhaushalt.service.factories.io.DataOutputFacade;
import org.junit.Before;
import org.junit.Test;
public class DatenbasisFactoryUnitTest {
private static final String ANY_VERSION_INFORMATION = "any version information";
private static final String ANY_STRING_VALUE = "any String";
private static final String ANY_REGISTER_NAME = "Any Register Name";
private DatenbasisFactory datenbasisFactory;
private RegisterFactory registerFactory;
private DataInputFacade dataInputFacade;
private DataOutputFacade dataOutputFacade;
@Before
public void setUp() {
datenbasisFactory = new DatenbasisFactory();
registerFactory = mock(RegisterFactory.class);
datenbasisFactory.setRegisterFactory(registerFactory);
dataInputFacade = mock(DataInputFacade.class);
dataOutputFacade = mock(DataOutputFacade.class);
}
@Test
public void getInstanceCallsFacadeCorrectly() throws IOException, UnknownBuchungTypeException, ParseException {
when(dataInputFacade.getDataString()).thenReturn(ANY_STRING_VALUE);
when(dataInputFacade.getInt()).thenReturn(33);
datenbasisFactory.getInstance(dataInputFacade);
verify(dataInputFacade, times(34)).getDataString(); // 1x version; 33x register name
verify(dataInputFacade).getInt();
}
@Test
public void getInstanceProducesThreeRegisterEntriesWithSameName() throws IOException, UnknownBuchungTypeException, ParseException {
when(dataInputFacade.getDataString()).thenReturn(ANY_STRING_VALUE);
when(dataInputFacade.getInt()).thenReturn(3);
when(registerFactory.getInstance(any(DataInputFacade.class), anyString())).thenReturn(new Register(ANY_STRING_VALUE));
datenbasisFactory.getInstance(dataInputFacade);
verify(registerFactory, times(3)).getInstance(dataInputFacade, ANY_STRING_VALUE);
}
@Test
public void getInstanceCallsRegisterFactorySeveralTimes() throws IOException, UnknownBuchungTypeException, ParseException {
when(dataInputFacade.getDataString()).thenReturn(ANY_REGISTER_NAME);
when(dataInputFacade.getInt()).thenReturn(3);
when(registerFactory.getInstance(any(DataInputFacade.class), anyString())).thenReturn(new Register(ANY_REGISTER_NAME));
Datenbasis actualDatenbasis = datenbasisFactory.getInstance(dataInputFacade);
List<Register> registers = actualDatenbasis.getRegisterList();
assertThat(registers).hasSize(3);
assertThat(registers.get(0).getName()).isEqualTo(ANY_REGISTER_NAME);
assertThat(registers.get(1).getName()).isEqualTo(ANY_REGISTER_NAME);
assertThat(registers.get(2).getName()).isEqualTo(ANY_REGISTER_NAME);
verify(registerFactory, times(3)).getInstance(dataInputFacade, ANY_REGISTER_NAME);
}
@Test
public void saveDatenbasis() throws IOException {
Datenbasis datenbasis = new Datenbasis();
datenbasis.setVersionInfo(ANY_VERSION_INFORMATION);
List<Register> registerList = createRegisterList();
datenbasis.setRegisterList(registerList);
datenbasisFactory.saveData(dataOutputFacade, datenbasis);
verify(dataOutputFacade).writeString(ANY_VERSION_INFORMATION);
verify(dataOutputFacade).writeInt(registerList.size());
verify(registerFactory).saveData(dataOutputFacade, registerList.get(0));
verify(registerFactory).saveData(dataOutputFacade, registerList.get(1));
}
private List<Register> createRegisterList() {
List<Register> registerList = new ArrayList<Register>();
registerList.add(new Register("register 1"));
registerList.add(new Register("register 2"));
return registerList;
}
}