package de.avalax.fitbuddy.port.adapter.persistence; import android.content.Context; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import java.util.List; import de.avalax.fitbuddy.BuildConfig; import de.avalax.fitbuddy.R; import de.avalax.fitbuddy.domain.model.exercise.Exercise; import de.avalax.fitbuddy.domain.model.exercise.ExerciseRepository; import de.avalax.fitbuddy.domain.model.set.SetRepository; import de.avalax.fitbuddy.domain.model.workout.BasicWorkout; import de.avalax.fitbuddy.domain.model.workout.Workout; import de.avalax.fitbuddy.domain.model.workout.WorkoutException; import de.avalax.fitbuddy.domain.model.workout.WorkoutId; import de.avalax.fitbuddy.domain.model.workout.WorkoutListEntry; import de.avalax.fitbuddy.domain.model.workout.WorkoutRepository; import static org.hamcrest.CoreMatchers.any; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; @RunWith(RobolectricTestRunner.class) @Config(constants = BuildConfig.class, manifest = "src/main/AndroidManifest.xml", sdk = 21) public class SQLiteWorkoutRepositoryTest { private WorkoutRepository workoutRepository; private ExerciseRepository exerciseRepository; private WorkoutId createWorkout(String name) { Workout workout = new BasicWorkout(); workout.setName(name); workoutRepository.save(workout); return workout.getWorkoutId(); } @Before public void setUp() throws Exception { Context context = RuntimeEnvironment.application.getApplicationContext(); FitbuddySQLiteOpenHelper sqLiteOpenHelper = new FitbuddySQLiteOpenHelper("SQLiteWorkoutRepositoryTest", 1, context, R.raw.fitbuddy_db); SetRepository setRepository = new SQLiteSetRepository(sqLiteOpenHelper); exerciseRepository = new SQLiteExerciseRepository(sqLiteOpenHelper, setRepository); workoutRepository = new SQLiteWorkoutRepository(sqLiteOpenHelper, exerciseRepository); } @Test public void saveUnpersistedWorkout_shouldAssignNewWorkoutId() throws Exception { Workout workout = new BasicWorkout(); assertThat(workout.getWorkoutId(), nullValue()); workoutRepository.save(workout); assertThat(workout.getWorkoutId(), any(WorkoutId.class)); } @Test public void savePersistedWorkout_shouldKeepWorkoutId() throws Exception { Workout workout = new BasicWorkout(); workoutRepository.save(workout); WorkoutId workoutId = workout.getWorkoutId(); workoutRepository.save(workout); assertThat(workout.getWorkoutId(), equalTo(workoutId)); } @Test public void saveWorkout_shouldAlsoSaveExercises() throws Exception { Workout workout = new BasicWorkout(); Exercise exercise = workout.getExercises().createExercise(); workoutRepository.save(workout); List<Exercise> loadedExercises = exerciseRepository.allExercisesBelongsTo(workout.getWorkoutId()); assertThat(loadedExercises.size(), equalTo(1)); assertThat(loadedExercises.get(0), equalTo(exercise)); } @Test public void updateWorkout_shouldSaveTheCorrectEntity() throws Exception { WorkoutId workoutId1 = createWorkout("name1"); WorkoutId workoutId2 = createWorkout("name2"); Workout workout = workoutRepository.load(workoutId2); workout.setName("newname2"); workoutRepository.save(workout); Workout workout1 = workoutRepository.load(workoutId1); Workout workout2 = workoutRepository.load(workoutId2); assertThat(workout1.getWorkoutId(), equalTo(workoutId1)); assertThat(workout1.getName(), equalTo("name1")); assertThat(workout2.getWorkoutId(), equalTo(workoutId2)); assertThat(workout2.getName(), equalTo("newname2")); } @Test(expected = WorkoutException.class) public void loadWithNullInstance_shouldThrowWorkoutNotFoundException() throws Exception { workoutRepository.load(null); } @Test(expected = WorkoutException.class) public void loadByUnknownWorkoutId_shouldThrowWorkoutNotFoundException() throws Exception { workoutRepository.load(new WorkoutId("21")); } @Test public void loadByWorkoutId_shouldReturnWorkoutWithWorkoutId() throws Exception { Workout workout = new BasicWorkout(); workoutRepository.save(workout); WorkoutId workoutId = workout.getWorkoutId(); Workout loadedWorkout = workoutRepository.load(workoutId); assertThat(loadedWorkout.getWorkoutId(), equalTo(workoutId)); } @Test public void loadByWorkoutId_shouldReturnWorkoutWithExercises() throws Exception { Workout workout = new BasicWorkout(); Exercise exercise1 = workout.getExercises().createExercise(); Exercise exercise2 = workout.getExercises().createExercise(); workoutRepository.save(workout); WorkoutId workoutId = workout.getWorkoutId(); Workout loadedWorkout = workoutRepository.load(workoutId); assertThat(loadedWorkout.getExercises().size(), equalTo(2)); assertThat(loadedWorkout.getExercises().get(0), equalTo(exercise1)); assertThat(loadedWorkout.getExercises().get(1), equalTo(exercise2)); } @Test public void saveWorkout_shouldUpdateName() throws Exception { Workout workout = new BasicWorkout(); workoutRepository.save(workout); WorkoutId workoutId = workout.getWorkoutId(); Workout loadedWorkout = workoutRepository.load(workoutId); loadedWorkout.setName("new name"); workoutRepository.save(loadedWorkout); Workout reloadedWorkout = workoutRepository.load(workoutId); assertThat(reloadedWorkout.getName(), equalTo("new name")); } @Test public void emptyWorkoutList_shouldReturnTheListOfWorkouts() throws Exception { List<WorkoutListEntry> workoutList = workoutRepository.getWorkoutList(); assertThat(workoutList.size(), equalTo(0)); } @Test public void workoutList_shouldReturnTheListOfWorkouts() throws Exception { WorkoutId workoutId = createWorkout("workout1"); WorkoutId workoutId2 = createWorkout("workout2"); List<WorkoutListEntry> workoutList = workoutRepository.getWorkoutList(); assertThat(workoutList.size(), equalTo(2)); assertThat(workoutList.get(0).getWorkoutId(), equalTo(workoutId)); assertThat(workoutList.get(0).toString(), equalTo("workout1")); assertThat(workoutList.get(1).getWorkoutId(), equalTo(workoutId2)); assertThat(workoutList.get(1).toString(), equalTo("workout2")); } @Test public void deleteWorkoutWithNull_shouldDoNothing() throws Exception { workoutRepository.delete(null); } @Test(expected = WorkoutException.class) public void deleteWorkoutByWorkoutId_shouldRemoveItFromPersistence() throws Exception { WorkoutId workoutId = createWorkout("workout1"); workoutRepository.delete(workoutId); workoutRepository.load(workoutId); } }