package xyz.lgvalle.tddpersistence;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Arrays;
import java.util.List;
import xyz.lgvalle.tddpersistence.db.TaskReaderDbHelper;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static xyz.lgvalle.tddpersistence.TaskRepositoryTest.TaskBuilder.aTask;
@RunWith(AndroidJUnit4.class)
public class PersistabilityTest {
private TaskRepository taskRepository;
List<TestBuilder<Task>> persistentObjectBuilders = Arrays.<TestBuilder<Task>>asList(
aTask().withName("A task").withExpirationDate("2017-03-16"),
aTask().withName("A task (with date in the past)").withExpirationDate("2017-01-01")
);
private TaskDBStorage storage;
@Before
public void setUp() throws Exception {
Context appContext = InstrumentationRegistry.getTargetContext();
TaskReaderDbHelper dbHelper = new TaskReaderDbHelper(appContext);
storage = new TaskDBStorage(dbHelper);
TaskMapper mapper = new TaskMapper();
taskRepository = new TaskRepository(mapper, storage);
DatabaseCleaner cleaner = new DatabaseCleaner(dbHelper);
cleaner.clean();
}
@Test
public void roundTripsPersistentObjects() {
for (TestBuilder builder : persistentObjectBuilders) {
assertCanBePersisted(builder);
}
}
private void assertCanBePersisted(TestBuilder<Task> builder) {
assertReloadsWithSameStateAs(persistedObjectFrom(builder));
}
private void assertReloadsWithSameStateAs(Task original) {
Task savedTask = taskRepository.taskWithName(original.getName());
// Without reflection this can fail:
// If a new field is added to the object without including it on the equals method and it is wrongly mapped this matcher won't pick it up.
assertThat(savedTask, equalTo(original));
}
private Task persistedObjectFrom(TestBuilder<Task> builder) {
Task original = builder.build();
taskRepository.persistTask(original);
return original;
}
}