public async Task Get_Returns_ViewResult_With_Workouts()
            {
                // Arrange
                var expectedWorkouts = new[]
                {
                    new WorkoutViewModel {
                        Name = "Test workout 01"
                    },
                    new WorkoutViewModel {
                        Name = "Test workout 02"
                    },
                    new WorkoutViewModel {
                        Name = "Test workout 03"
                    }
                };

                WorkoutServiceMock
                .Setup(x => x.ReadAllAsync())
                .ReturnsAsync(expectedWorkouts);

                // Act
                var result = await ControllerUnderTest.Index();

                // Assert
                var viewResult = Assert.IsType <ViewResult>(result);

                Assert.Same(expectedWorkouts, viewResult.Model);
            }
            public async Task ReadOneAsync_Returns_NotFoundResult_When_EntityNotFoundException_Is_Thrown()
            {
                // Arrange
                const int id = 1;
                WorkoutServiceMock
                    .Setup(x => x.ReadOneAsync(id))
                    .ThrowsAsync(new EntityNotFoundException(id));

                // Act
                var result = await ControllerUnderTest.ReadOneAsync(id);

                // Assert
                Assert.IsType<NotFoundResult>(result);
            }
            public async Task DeleteAsync_Returns_NoContentResult()
            {
                // Arrange
                const int id = 1;
                var expectedWorkout = new Workout {Name = "Test workout 01", Id = id};
                WorkoutServiceMock
                    .Setup(x => x.DeleteAsync(id))
                    .ReturnsAsync(expectedWorkout);

                // Act
                var result = await ControllerUnderTest.DeleteAsync(id);

                // Assert
                Assert.IsType<NoContentResult>(result);
            }
            public async Task UpdateAsync_Returns_NotFoundResult_When_EntityNotFoundException_Is_Thrown()
            {
                // Arrange
                const int id = 1;
                var expectedWorkout = new Workout {Name = "Test workout 01", Id = id};
                WorkoutServiceMock
                    .Setup(x => x.UpdateAsync(id, expectedWorkout))
                    .ThrowsAsync(new EntityNotFoundException(expectedWorkout));

                // Act
                var result = await ControllerUnderTest.UpdateAsync(id, expectedWorkout);

                // Assert
                Assert.IsType<NotFoundResult>(result);
            }
            public async Task Get_Returns_NotFoundResult_When_WorkoutIsNotFound()
            {
                // Arrange
                const int id = 1;

                WorkoutServiceMock
                .Setup(x => x.ReadOneAsync(id))
                .ReturnsAsync(default(WorkoutViewModel));

                // Act
                var result = await ControllerUnderTest.Edit(id);

                // Assert
                Assert.IsType <NotFoundResult>(result);
            }
            public async Task ReadOneAsync_Returns_OkObjectResult_With_Workout()
            {
                // Arrange
                const int id = 1;
                var expectedWorkout = new Workout {Name = "Test workout 01", Id = id};
                WorkoutServiceMock
                    .Setup(x => x.ReadOneAsync(id))
                    .ReturnsAsync(expectedWorkout);

                // Act
                var result = await ControllerUnderTest.ReadOneAsync(id);

                // Assert
                var okObjectResult = Assert.IsType<OkObjectResult>(result);
                Assert.Same(expectedWorkout, okObjectResult.Value);
            }
            public async Task Post_Returns_RedirectToActionResult_When_Succeeds()
            {
                // Arrange
                const int    id = 1;
                const string expectedActionName = nameof(WorkoutsController.Index);

                WorkoutServiceMock
                .Setup(x => x.DeleteAsync(id))
                .Returns(Task.CompletedTask);

                // Act
                var result = await ControllerUnderTest.Delete(id);

                // Assert
                var redirectToActionResult = Assert.IsType <RedirectToActionResult>(result);

                Assert.Equal(expectedActionName, redirectToActionResult.ActionName);
            }
            public async Task ReadAllAsync_Returns_OkObjectResult_With_Workouts()
            {
                // Arrange
                var expectedWorkouts = new[]
                {
                    new Workout {Name = "Test workout 01"},
                    new Workout {Name = "Test workout 02"},
                    new Workout {Name = "Test workout 03"}
                };
                WorkoutServiceMock
                    .Setup(x => x.ReadAllAsync())
                    .ReturnsAsync(expectedWorkouts);

                // Act
                var result = await ControllerUnderTest.ReadAllAsync();

                // Assert
                var okObjectResult = Assert.IsType<OkObjectResult>(result);
                Assert.Same(expectedWorkouts, okObjectResult.Value);
            }
            public async Task Get_Returns_ViewResult_With_Workout_When_WorkoutIsFound()
            {
                // Arrange
                const int id = 1;
                var       expectedWorkout = new WorkoutViewModel {
                    Name = "Test workout 01", Id = id
                };

                WorkoutServiceMock
                .Setup(x => x.ReadOneAsync(id))
                .ReturnsAsync(expectedWorkout);

                // Act
                var result = await ControllerUnderTest.Edit(id);

                // Assert
                var viewResult = Assert.IsType <ViewResult>(result);

                Assert.Same(expectedWorkout, viewResult.Model);
            }
            public async Task Post_Returns_RedirectToActionResult_When_ModelStateIsValid()
            {
                // Arrange
                const int id = 1;
                var       expectedWorkout = new WorkoutViewModel {
                    Name = "Test workout 01", Id = id
                };
                const string expectedActionName = nameof(WorkoutsController.Index);

                WorkoutServiceMock
                .Setup(x => x.CreateAsync(expectedWorkout))
                .Returns(Task.CompletedTask);

                // Act
                var result = await ControllerUnderTest.Create(expectedWorkout);

                // Assert
                var redirectToActionResult = Assert.IsType <RedirectToActionResult>(result);

                Assert.Equal(expectedActionName, redirectToActionResult.ActionName);
            }
            public async Task CreateAsync_Returns_CreatedAtActionResult_With_Workout()
            {
                // Arrange
                const int id = 1;
                var expectedWorkout = new Workout {Name = "Test workout 01", Id = id};
                const string expectedCreatedAtActionName = nameof(WorkoutsController.ReadOneAsync);
                WorkoutServiceMock
                    .Setup(x => x.CreateAsync(expectedWorkout))
                    .ReturnsAsync(() =>
                    {
                        expectedWorkout.Id = id;
                        return expectedWorkout;
                    });

                // Act
                var result = await ControllerUnderTest.CreateAsync(expectedWorkout);

                // Assert
                var createdAtActionResult = Assert.IsType<CreatedAtActionResult>(result);
                Assert.Same(expectedWorkout, createdAtActionResult.Value);
                Assert.Equal(expectedCreatedAtActionName, createdAtActionResult.ActionName);
                Assert.Equal(id, createdAtActionResult.RouteValues.GetValueOrDefault("id"));
            }