public void Create_WhenSavingValidWorkout_ThenWorkoutIsSaved()
        {
            // Arrange
            var dbContext = new FakeShoeTrackerDbContext()
                .WithShoe("Some show", _currentUserId);
            var controller = new WorkoutController(dbContext)
                .WithAuthenticatedUser("some user", _currentUserId)
                .WithValidModelState();

            var workoutOnView = controller.Create().CastModel<EditWorkoutViewModel>();
            workoutOnView.Distance = 1.2m;
            workoutOnView.Name = "my name";
            workoutOnView.WorkoutDate = DateTime.Today.AddDays(-4);
            workoutOnView.ShoeUsedId = long.Parse(workoutOnView.AvailableShoes.First().Value);

            // Act
            controller.Create(workoutOnView);

            // Assert
            Assert.That(dbContext.Workouts.Count(), Is.EqualTo(1));
            Assert.That(dbContext.Workouts.First().UserId, Is.EqualTo(_currentUserId));
            Assert.That(dbContext.Workouts.First().Distance, Is.EqualTo(workoutOnView.Distance));
            Assert.That(dbContext.Workouts.First().Name, Is.EqualTo(workoutOnView.Name));
            Assert.That(dbContext.Workouts.First().ShoeUsed.ShoeId, Is.EqualTo(workoutOnView.ShoeUsedId));
            Assert.That(dbContext.Workouts.First().WorkoutDate, Is.EqualTo(workoutOnView.WorkoutDate));
        }
        public void All_WhenShowingView_ThenAllWorkoutsAreDisplayed()
        {
            // Arrange
            var dbContext = new FakeShoeTrackerDbContext();
            var controller = new WorkoutController(dbContext);

            IndexSetup(dbContext, controller);

            // Act
            var result = controller.All();

            // Assert
            var viewModels = result.CastModel<ICollection<Workout>>();

            Assert.That(viewModels.Count, Is.EqualTo(dbContext.Workouts.Count()));

            foreach (var viewModel in viewModels)
            {
                var matchingWorkout = dbContext.Workouts.First(s => s.WorkoutId == viewModel.WorkoutId);

                Assert.That(matchingWorkout.Distance, Is.EqualTo(matchingWorkout.Distance));
                Assert.That(matchingWorkout.Name, Is.EqualTo(matchingWorkout.Name));
                Assert.That(matchingWorkout.WorkoutDate, Is.EqualTo(matchingWorkout.WorkoutDate));
                Assert.That(matchingWorkout.ShoeUsed, Is.SameAs(matchingWorkout.ShoeUsed));
            }
        }
        public void Create_WhenSavingInValidWorkout_ThenWorkoutIsNotSaved()
        {
            // Arrange
            var dbContext = new FakeShoeTrackerDbContext();
            var controller = new WorkoutController(dbContext)
                .WithAuthenticatedUser("some user", _currentUserId)
                .WithInvalidModelState();

            var workoutOnView = controller.Create().CastModel<EditWorkoutViewModel>();

            // Act
            controller.Create(workoutOnView);

            // Assert
            Assert.That(dbContext.Workouts.Count(), Is.EqualTo(0));
        }
        private void IndexSetup(ShoeTrackerDbContext dbContext, WorkoutController controller)
        {
            const string username = "******";

            dbContext
                .WithShoe("Bar", _currentUserId);

            dbContext
                .WithWorkout("Workout 1", _currentUserId, shoeName: "Bar")
                .WithWorkout("Workout 2", _currentUserId, shoeName: "Bar")
                .WithWorkout("Workout 3", _currentUserId, shoeName: "Bar")
                .WithWorkout("Workout 4", _currentUserId)
                .WithWorkout("Workout 5", _currentUserId)
                .WithWorkout("Workout 6", _currentUserId)
                .WithWorkout("Workout 7", _currentUserId)
                .WithWorkout("Workout 8", _currentUserId)
                .WithWorkout("Workout 9", _currentUserId)
                .WithWorkout("Workout 10", _currentUserId, shoeName: "Bar")
                .WithWorkout("Workout 11", _currentUserId, shoeName: "Bar")
                ;

            controller
                .WithAuthenticatedUser(username, _currentUserId)
                .WithValidModelState();
        }
        public void Edit_WhenShowingView_ThenTheMatchingWorkoutIsShown()
        {
            // Arrange
            var dbContext = new FakeShoeTrackerDbContext()
                .WithShoe("Foo", _currentUserId)
                .WithShoe("Bar", _currentUserId)
                .WithShoe("Other", "some other user")
                .WithWorkout("some workout", _currentUserId,shoeName:"Foo");

            var controller = new WorkoutController(dbContext)
                .WithAuthenticatedUser("some user", _currentUserId);

            var workout = dbContext.Workouts.First();
            var workoutId = workout.WorkoutId;

            // Act
            var result = controller.Edit(workoutId);

            // Assert
            var viewResult = (ViewResult)result;
            var workoutViewModel = viewResult.CastModel<EditWorkoutViewModel>();

            Assert.That(workoutViewModel.WorkoutId, Is.EqualTo(workoutId));
            Assert.That(workoutViewModel.Name, Is.EqualTo(workout.Name));
            Assert.That(workoutViewModel.WorkoutDate, Is.EqualTo(workout.WorkoutDate));
            Assert.That(workoutViewModel.Distance, Is.EqualTo(workout.Distance));
            Assert.That(workoutViewModel.ShoeUsedId, Is.EqualTo(workout.ShoeUsed.ShoeId));
        }
        public void Edit_WhenSavingValidWorkflow_ThenWorkflowIsSaved()
        {
            // Arrange
            var dbContext = new FakeShoeTrackerDbContext();
            dbContext
                .WithShoe("foo", _currentUserId)
                .WithWorkout("some workout", _currentUserId, shoeName: "foo");
            var controller = new WorkoutController(dbContext)
                .WithAuthenticatedUser("some user", _currentUserId)
                .WithValidModelState();

            var workoutId = dbContext.Workouts.Select(s => s.WorkoutId).First();
            var workoutOnView = ((ViewResult)controller.Edit(workoutId)).CastModel<EditWorkoutViewModel>();

            workoutOnView.Name = "some other name";
            workoutOnView.Distance = 55m;
            workoutOnView.WorkoutDate = DateTime.Today.AddDays(5);

            // Act
            controller.Edit(workoutOnView);

            // Assert
            Assert.That(dbContext.NumerOfTimesSaveChangesCalled, Is.EqualTo(1));

            var savedWorkout = dbContext.Workouts.First(w => w.WorkoutId == workoutId);
            Assert.That(savedWorkout.Name,Is.EqualTo(workoutOnView.Name));
            Assert.That(savedWorkout.Distance,Is.EqualTo(workoutOnView.Distance));
            Assert.That(savedWorkout.WorkoutDate,Is.EqualTo(workoutOnView.WorkoutDate));
        }
        public void Edit_WhenShowingViewWithInvalidWorkoutId_ThenNotFoundResult()
        {
            // Arrange
            var dbContext = new FakeShoeTrackerDbContext();
            var controller = new WorkoutController(dbContext)
                .WithAuthenticatedUser("some user", _currentUserId);

            const int workoutId = -1;

            // Act
            var result = controller.Edit(workoutId);

            // Assert
            Assert.That(result, Is.InstanceOf<HttpNotFoundResult>());
        }
        public void Edit_WhenSavingInValidWorkout_ThenWorkoutIsNotSaved()
        {
            // Arrange
            var dbContext = new FakeShoeTrackerDbContext();
            dbContext
                .WithShoe("foo", _currentUserId)
                .WithWorkout("some workout", _currentUserId, shoeName: "foo");
            var controller = new WorkoutController(dbContext)
                .WithAuthenticatedUser("some user", _currentUserId)
                .WithInvalidModelState();

            var workoutId = dbContext.Workouts.Select(s => s.WorkoutId).First();
            var workoutOnView = ((ViewResult)controller.Edit(workoutId)).CastModel<EditWorkoutViewModel>();

            // Act
            controller.Edit(workoutOnView);

            // Assert
            Assert.That(dbContext.NumerOfTimesSaveChangesCalled, Is.EqualTo(0));
        }
        public void Delete_WhenShowingView_ThenTheMatchingWorkoutIsShown()
        {
            // Arrange
            var dbContext = new FakeShoeTrackerDbContext()
                .WithWorkout("some run", _currentUserId);
            var controller = new WorkoutController(dbContext)
                .WithAuthenticatedUser("some user", _currentUserId);

            var workoutId = dbContext.Workouts.Select(s => s.WorkoutId).First();

            // Act
            var result = controller.Delete(workoutId);

            // Assert
            var viewResult = (ViewResult)result;
            var workout = viewResult.CastModel<Workout>();

            Assert.That(workout.WorkoutId, Is.EqualTo(workoutId));
        }
        public void DeleteConfirmed_WhenDeleting_ThenTheWorkoutIsRemovedFromTheDatabase()
        {
            // Arrange
            var dbContext = new FakeShoeTrackerDbContext();
            dbContext
                .WithWorkout("foo", _currentUserId)
                .WithWorkout("other", _currentUserId);
            var controller = new WorkoutController(dbContext)
                .WithAuthenticatedUser("some user", _currentUserId)
                .WithValidModelState();

            var workoutId = dbContext.Workouts.Select(s => s.WorkoutId).First();

            // Act
            controller.DeleteConfirmed(workoutId);

            // Assert
            Assert.That(dbContext.Workouts.Count(), Is.EqualTo(1));
            Assert.That(dbContext.Workouts.First().Name, Is.EqualTo("other"));
            Assert.That(dbContext.NumerOfTimesSaveChangesCalled, Is.EqualTo(1));
        }
        public void DeleteConfirmed_WhenDeletingInValidWorkout_ThenNothingHappes()
        {
            // Arrange
            var dbContext = new FakeShoeTrackerDbContext();
            var controller = new WorkoutController(dbContext)
                .WithAuthenticatedUser("some user", _currentUserId)
                .WithValidModelState();

            const int workoutId = -1;

            // Act
            controller.DeleteConfirmed(workoutId);

            // Assert
            Assert.That(dbContext.Workouts.Count(), Is.EqualTo(0));
            Assert.That(dbContext.NumerOfTimesSaveChangesCalled, Is.EqualTo(1));
        }
        public void Create_WhenShowingView_ThenNewWorkoutHasDefaults()
        {
            // Arrange
            var dbContext = new FakeShoeTrackerDbContext()
                .WithShoe("Foo", _currentUserId)
                .WithShoe("Bar", _currentUserId)
                .WithShoe("Other", "some other user");
            var controller = new WorkoutController(dbContext)
                .WithAuthenticatedUser("some user", _currentUserId);

            // Act
            var result = controller.Create();

            // Assert
            var modelData = result.CastModel<EditWorkoutViewModel>();

            Assert.That(modelData.WorkoutDate, Is.EqualTo(DateTime.Today));
            Assert.That(modelData.AvailableShoes.Count(), Is.EqualTo(2));
        }