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.BasicExercise; import de.avalax.fitbuddy.domain.model.exercise.Exercise; import de.avalax.fitbuddy.domain.model.exercise.ExerciseId; import de.avalax.fitbuddy.domain.model.exercise.ExerciseRepository; import de.avalax.fitbuddy.domain.model.set.Set; 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.WorkoutId; 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 SQLiteExerciseRepositoryTest { private ExerciseRepository exerciseRepository; private SetRepository setRepository; private WorkoutId workoutId; private ExerciseId createExercise(int position, String name) { Exercise exercise = new BasicExercise(); exercise.setName(name); exerciseRepository.save(workoutId, position, exercise); return exercise.getExerciseId(); } private void createWorkout(FitbuddySQLiteOpenHelper sqLiteOpenHelper) { WorkoutRepository workoutRepository = new SQLiteWorkoutRepository(sqLiteOpenHelper, exerciseRepository); Workout workout = new BasicWorkout(); workoutRepository.save(workout); workoutId = workout.getWorkoutId(); } @Before public void setUp() throws Exception { Context context = RuntimeEnvironment.application.getApplicationContext(); FitbuddySQLiteOpenHelper sqLiteOpenHelper = new FitbuddySQLiteOpenHelper("SQLiteExerciseRepositoryTest", 1, context, R.raw.fitbuddy_db); setRepository = new SQLiteSetRepository(sqLiteOpenHelper); exerciseRepository = new SQLiteExerciseRepository(sqLiteOpenHelper, setRepository); createWorkout(sqLiteOpenHelper); } @Test public void saveUnpersistedExercise_shouldAssignNewExerciseId() throws Exception { Exercise exercise = new BasicExercise(); assertThat(exercise.getExerciseId(), nullValue()); exerciseRepository.save(workoutId, 1, exercise); assertThat(exercise.getExerciseId(), any(ExerciseId.class)); } @Test public void savePersistedExercise_shouldKeepExerciseId() { Exercise exercise = new BasicExercise(); exerciseRepository.save(workoutId, 1, exercise); ExerciseId exerciseId = exercise.getExerciseId(); exerciseRepository.save(workoutId, 2, exercise); assertThat(exercise.getExerciseId(), equalTo(exerciseId)); } @Test public void updateExercises_shouldSaveTheCorrectEntity() { ExerciseId exerciseId1 = createExercise(0, "name1"); ExerciseId exerciseId2 = createExercise(1, "name2"); List<Exercise> exercises = exerciseRepository.allExercisesBelongsTo(workoutId); exercises.get(1).setName("newname2"); exerciseRepository.save(workoutId, 1, exercises.get(1)); List<Exercise> reloadedExercises = exerciseRepository.allExercisesBelongsTo(workoutId); assertThat(reloadedExercises.get(0).getExerciseId(), equalTo(exerciseId1)); assertThat(reloadedExercises.get(0).getName(), equalTo("name1")); assertThat(reloadedExercises.get(1).getExerciseId(), equalTo(exerciseId2)); assertThat(reloadedExercises.get(1).getName(), equalTo("newname2")); } @Test public void saveExercise_shouldAlsoSaveSets() { Exercise exercise = new BasicExercise(); Set set = exercise.getSets().createSet(); exerciseRepository.save(workoutId, 1, exercise); List<Set> loadedSets = setRepository.allSetsBelongsTo(exercise.getExerciseId()); assertThat(loadedSets.size(), equalTo(1)); assertThat(loadedSets.get(0), equalTo(set)); } @Test public void loadByUnknownWorkoutId_shouldReturnNullValue() { List<Exercise> exercises = exerciseRepository.allExercisesBelongsTo(new WorkoutId("21")); assertThat(exercises.size(), equalTo(0)); } @Test public void loadAllExercisesBelongsTo_shouldReturnExercisesOfWorkout() throws Exception { ExerciseId exerciseId1 = createExercise(1, "name"); ExerciseId exerciseId2 = createExercise(2, "name"); List<Exercise> exercises = exerciseRepository.allExercisesBelongsTo(workoutId); assertThat(exercises.size(), equalTo(2)); assertThat(exercises.get(0).getExerciseId(), equalTo(exerciseId1)); assertThat(exercises.get(1).getExerciseId(), equalTo(exerciseId2)); } @Test public void loadAllExercisesBelongsTo_shouldAddSetsToExercise() throws Exception { Exercise exercise = new BasicExercise(); Set set1 = exercise.getSets().createSet(); Set set2 = exercise.getSets().createSet(); exerciseRepository.save(workoutId, 1, exercise); List<Exercise> exercises = exerciseRepository.allExercisesBelongsTo(workoutId); assertThat(exercises.get(0).getSets().size(), equalTo(2)); assertThat(exercises.get(0).getSets().get(0), equalTo(set1)); assertThat(exercises.get(0).getSets().get(1), equalTo(set2)); } @Test public void loadAllExercisesBelongsTo_shouldLoadThemInCorrectOrder() throws Exception { ExerciseId exerciseId2 = createExercise(2, "name"); ExerciseId exerciseId1 = createExercise(1, "name"); ExerciseId exerciseId3 = createExercise(3, "name"); ExerciseId exerciseId0 = createExercise(0, "name"); List<Exercise> exercises = exerciseRepository.allExercisesBelongsTo(workoutId); assertThat(exercises.size(), equalTo(4)); assertThat(exercises.get(0).getExerciseId(), equalTo(exerciseId0)); assertThat(exercises.get(1).getExerciseId(), equalTo(exerciseId1)); assertThat(exercises.get(2).getExerciseId(), equalTo(exerciseId2)); assertThat(exercises.get(3).getExerciseId(), equalTo(exerciseId3)); } @Test public void deleteExerciseWithNull_shouldDoNothing() throws Exception { exerciseRepository.delete(null); } @Test public void deleteExerciseByExerciseId_shouldRemoveItFromPersistence() throws Exception { ExerciseId exerciseId = createExercise(1, "name"); exerciseRepository.delete(exerciseId); assertThat(exerciseRepository.allExercisesBelongsTo(workoutId).size(), equalTo(0)); } }