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.ExerciseId;
import de.avalax.fitbuddy.domain.model.exercise.ExerciseRepository;
import de.avalax.fitbuddy.domain.model.set.BasicSet;
import de.avalax.fitbuddy.domain.model.set.Set;
import de.avalax.fitbuddy.domain.model.set.SetId;
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.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 SQLiteSetRepositoryTest {
private SetRepository setRepository;
private ExerciseId exerciseId;
private Set createSet(double weight, int maxReps) {
Set set = new BasicSet();
set.setWeight(weight);
set.setMaxReps(maxReps);
setRepository.save(exerciseId, set);
return set;
}
@Before
public void setUp() throws Exception {
Context context = RuntimeEnvironment.application.getApplicationContext();
FitbuddySQLiteOpenHelper sqLiteOpenHelper = new FitbuddySQLiteOpenHelper("SQLiteSetRepositoryTest", 1, context, R.raw.fitbuddy_db);
setRepository = new SQLiteSetRepository(sqLiteOpenHelper);
ExerciseRepository exerciseRepository = new SQLiteExerciseRepository(sqLiteOpenHelper, setRepository);
WorkoutRepository workoutRepository = new SQLiteWorkoutRepository(sqLiteOpenHelper, exerciseRepository);
Workout workout = new BasicWorkout();
Exercise exercise = workout.getExercises().createExercise();
workoutRepository.save(workout);
exerciseId = exercise.getExerciseId();
}
@Test
public void saveUnpersistedSet_shouldAssignNewSetId() throws Exception {
Set set = new BasicSet();
assertThat(set.getSetId(), nullValue());
setRepository.save(exerciseId, set);
assertThat(set.getSetId(), any(SetId.class));
}
@Test
public void savePersistedSet_shouldKeepSetId() {
Set set = createSet(42, 12);
SetId setId = set.getSetId();
setRepository.save(exerciseId, set);
assertThat(set.getSetId(), equalTo(setId));
}
@Test
public void loadAllSetsBelongsTo_shouldReturnSetsOfExercise() throws Exception {
Set set1 = createSet(42, 12);
Set set2 = createSet(40, 10);
List<Set> sets = setRepository.allSetsBelongsTo(exerciseId);
assertThat(sets.size(), equalTo(2));
assertThat(sets.get(0), equalTo(set1));
assertThat(sets.get(1), equalTo(set2));
}
@Test
public void updateSets_shouldSaveTheCorrectEntity() {
Set set1 = createSet(42, 12);
createSet(40, 10);
List<Set> sets = setRepository.allSetsBelongsTo(exerciseId);
Set loadedSet2 = sets.get(1);
loadedSet2.setWeight(100);
setRepository.save(exerciseId, loadedSet2);
List<Set> reloadedSets = setRepository.allSetsBelongsTo(exerciseId);
assertThat(reloadedSets.get(0).getWeight(), equalTo(set1.getWeight()));
assertThat(reloadedSets.get(1).getWeight(), equalTo(loadedSet2.getWeight()));
}
@Test
public void deleteSetWithNull_shouldDoNothing() throws Exception {
setRepository.delete(null);
}
@Test
public void deleteSetBySetId_shouldRemoveItFromPersistence() throws Exception {
double weight = 42;
int maxReps = 12;
Set set = createSet(weight, maxReps);
SetId setId = set.getSetId();
setRepository.delete(setId);
assertThat(setRepository.allSetsBelongsTo(exerciseId).size(), equalTo(0));
}
}