public async Task CorrectlyCascadeDeleteExerciseHistoryHistories_WhenNoPreviousAndNextEntityExist()
        {
            var(connection, options) = await CreateUniqueMockDbConnectionForThisTest();

            try
            {
                using (var context = new FittifyContext(options))
                {
                    var repo = new ExerciseHistoryRepository(context);
                    var entityToBeDeleted = context.ExerciseHistories.FirstOrDefault(f => f.Id == 1);
                    var weightLiftingSetsToBeCascadeDeleted =
                        context.WeightLiftingSets.Where(w => w.ExerciseHistoryId == entityToBeDeleted.Id).ToList();
                    var cardioSetsToBeCascadeDeleted =
                        context.WeightLiftingSets.Where(w => w.ExerciseHistoryId == entityToBeDeleted.Id).ToList();
                    var exerciseHistoryToBeChanged = context
                                                     .ExerciseHistories
                                                     .Include(i => i.PreviousExerciseHistory)
                                                     .FirstOrDefault(w => w.PreviousExerciseHistory == entityToBeDeleted);

                    Assert.AreNotEqual(entityToBeDeleted, null);
                    Assert.AreNotEqual(exerciseHistoryToBeChanged, null);
                    Assert.AreEqual(weightLiftingSetsToBeCascadeDeleted.Count(), 2);
                    Assert.AreEqual(cardioSetsToBeCascadeDeleted.Count(), 2);

                    var deletionResult = await repo.Delete(entityToBeDeleted.Id);

                    if (deletionResult != null)
                    {
                        weightLiftingSetsToBeCascadeDeleted =
                            context.WeightLiftingSets.Where(w => w.ExerciseHistoryId == entityToBeDeleted.Id).ToList();
                        cardioSetsToBeCascadeDeleted =
                            context.WeightLiftingSets.Where(w => w.ExerciseHistoryId == entityToBeDeleted.Id).ToList();
                        exerciseHistoryToBeChanged = context
                                                     .ExerciseHistories
                                                     .FirstOrDefault(f => f.PreviousExerciseHistory == null);
                        entityToBeDeleted = context.ExerciseHistories.FirstOrDefault(f => f.Id == 1);

                        Assert.AreEqual(entityToBeDeleted, null);
                        Assert.AreEqual(weightLiftingSetsToBeCascadeDeleted.Count, 0);
                        Assert.AreEqual(cardioSetsToBeCascadeDeleted.Count, 0);
                        Assert.AreNotEqual(exerciseHistoryToBeChanged, null);
                        Assert.AreEqual(exerciseHistoryToBeChanged.PreviousExerciseHistory, null);
                    }
                    else
                    {
                        Assert.Fail();
                    }
                }
            }
            finally
            {
                connection.Close();
            }
        }
        public async Task ReturnCorrectlyQueriedCollection()
        {
            var(connection, options) = await CreateUniqueMockDbConnectionForThisTest();

            try
            {
                using (var context = new FittifyContext(options))
                {
                    var entitiesFromContext = await context
                                              .ExerciseHistories
                                              .Include(i => i.Exercise)
                                              .Where(w => w.OwnerGuid == _ownerGuid)
                                              .Where(w => w.ExerciseId == context.Exercises.FirstOrDefault(f => f.OwnerGuid != null).Id)
                                              .Where(w => w.WorkoutHistoryId ==
                                                     context.WorkoutHistories.FirstOrDefault(f => f.OwnerGuid != null).Id)
                                              .ToListAsync();

                    var serializedEntitesFromContext = JsonConvert.SerializeObject(entitiesFromContext,
                                                                                   new JsonSerializerSettings()
                    {
                        ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                    });

                    var resourceParameters =
                        new ExerciseHistoryResourceParameters()
                    {
                        OwnerGuid        = _ownerGuid,
                        ExerciseId       = context.Exercises.FirstOrDefault(f => f.OwnerGuid != null).Id,
                        WorkoutHistoryId = context.WorkoutHistories.FirstOrDefault(f => f.OwnerGuid != null).Id
                    };
                    var repo       = new ExerciseHistoryRepository(context);
                    var collection = await repo.GetPagedCollection(resourceParameters);

                    var serializedEntitiesFromRepo = JsonConvert.SerializeObject(collection,
                                                                                 new JsonSerializerSettings()
                    {
                        ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                    });
                    Assert.AreEqual(serializedEntitesFromContext, serializedEntitiesFromRepo);
                }
            }
            finally
            {
                connection.Close();
            }
        }
        public async Task CodeCoverage100()
        {
            var(connection, options) = await CreateUniqueMockDbConnectionForThisTest();

            try
            {
                using (var context = new FittifyContext(options))
                {
                    var sut = new ExerciseHistoryRepository(context);
                    sut.FixRelationOfNextExerciseHistory(id: 0);
                    sut.FixRelationOfNextExerciseHistory(entity: null);
                }
            }
            finally
            {
                connection.Close();
            }
        }
        public async Task FailDeleteForNonExistingEntity()
        {
            var(connection, options) = await CreateUniqueMockDbConnectionForThisTest();

            try
            {
                using (var context = new FittifyContext(options))
                {
                    var sut            = new ExerciseHistoryRepository(context);
                    var deletionResult = await sut.Delete(0);

                    Assert.AreEqual(deletionResult.DidEntityExist, false);
                    Assert.AreEqual(deletionResult.IsDeleted, false);
                }
            }
            finally
            {
                connection.Close();
            }
        }
        public async Task ReturnCorrectQueryByIdResult()
        {
            var(connection, options) = await CreateUniqueMockDbConnectionForThisTest();

            try
            {
                using (var context = new FittifyContext(options))
                {
                    var entityFromContext = await context
                                            .ExerciseHistories
                                            .Include(i => i.Exercise)
                                            .Include(i => i.WorkoutHistory)
                                            .Include(i => i.WeightLiftingSets)
                                            .Include(i => i.CardioSets)
                                            .FirstOrDefaultAsync(f => f.Id == 1);

                    var serializedEntityFromContext = JsonConvert.SerializeObject(entityFromContext,
                                                                                  new JsonSerializerSettings()
                    {
                        ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                    });

                    var repo           = new ExerciseHistoryRepository(context);
                    var entityFromRepo = await repo.GetById(1);

                    var serializedEntityFromRepo = JsonConvert.SerializeObject(entityFromRepo,
                                                                               new JsonSerializerSettings()
                    {
                        ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                    });
                    Assert.AreEqual(serializedEntityFromContext, serializedEntityFromRepo);
                }
            }
            finally
            {
                connection.Close();
            }
        }
        public async Task CorrectlyCascadeDeleteExerciseHistoryHistories_WhenPreviousAndNextEntityExist()
        {
            var(connection, options) = await CreateUniqueMockDbConnectionForThisTest();

            try
            {
                using (var context = new FittifyContext(options))
                {
                    var repo = new ExerciseHistoryRepository(context);
                    var entityToBeDeleted = context.ExerciseHistories.FirstOrDefault(f => f.Id == 2);
                    var weightLiftingSetsToBeCascadeDeleted =
                        context.WeightLiftingSets.Where(w => w.ExerciseHistoryId == entityToBeDeleted.Id).ToList();
                    var cardioSetsToBeCascadeDeleted =
                        context.WeightLiftingSets.Where(w => w.ExerciseHistoryId == entityToBeDeleted.Id).ToList();
                    var exerciseHistoryToBeChanged = context
                                                     .ExerciseHistories
                                                     .Include(i => i.PreviousExerciseHistory)
                                                     .FirstOrDefault(w => w.PreviousExerciseHistory == entityToBeDeleted);
                    var newPreviousExerciseHistory =
                        context.ExerciseHistories.FirstOrDefault(f => f.Id == 1);

                    var formerPreviousExerciseHistory =
                        JsonConvert.SerializeObject(exerciseHistoryToBeChanged.PreviousExerciseHistory,
                                                    new JsonSerializerSettings()
                    {
                        ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                    });

                    Assert.AreNotEqual(entityToBeDeleted, null);
                    Assert.AreNotEqual(exerciseHistoryToBeChanged, null);
                    Assert.AreEqual(weightLiftingSetsToBeCascadeDeleted.Count(), 2);
                    Assert.AreEqual(cardioSetsToBeCascadeDeleted.Count(), 2);

                    var deletionResult = await repo.Delete(entityToBeDeleted.Id);

                    if (deletionResult != null && deletionResult.DidEntityExist == true && deletionResult.IsDeleted)
                    {
                        weightLiftingSetsToBeCascadeDeleted =
                            context.WeightLiftingSets.Where(w => w.ExerciseHistoryId == entityToBeDeleted.Id).ToList();
                        cardioSetsToBeCascadeDeleted =
                            context.WeightLiftingSets.Where(w => w.ExerciseHistoryId == entityToBeDeleted.Id).ToList();
                        exerciseHistoryToBeChanged = context
                                                     .ExerciseHistories
                                                     .FirstOrDefault(f => f.PreviousExerciseHistory == newPreviousExerciseHistory);
                        entityToBeDeleted = context.ExerciseHistories.FirstOrDefault(f => f.Id == 2);

                        var latterPreviousExerciseHistory =
                            JsonConvert.SerializeObject(exerciseHistoryToBeChanged.PreviousExerciseHistory,
                                                        new JsonSerializerSettings()
                        {
                            ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                        });

                        Assert.AreEqual(entityToBeDeleted, null);
                        Assert.AreEqual(weightLiftingSetsToBeCascadeDeleted.Count, 0);
                        Assert.AreEqual(cardioSetsToBeCascadeDeleted.Count, 0);
                        Assert.AreNotEqual(exerciseHistoryToBeChanged, null);
                        Assert.AreNotEqual(formerPreviousExerciseHistory, latterPreviousExerciseHistory);
                    }
                    else
                    {
                        Assert.Fail();
                    }
                }
            }
            finally
            {
                connection.Close();
            }
        }