public async Task GetBird_ReturnsOkObjectResult_WithABirdObject()
        {
            // Arrange
            var mockRepo = new Mock <IBirdRepository>();

            mockRepo.Setup(repo => repo.GetBirdAsync(It.IsAny <int>()))
            .ReturnsAsync(GetTestBird());

            var controller = new BirdsController(_mapper, _cache, _logger.Object, mockRepo.Object);

            // Act
            var result = await controller.GetBirdAsync(It.IsAny <int>());

            // Assert
            var okResult = Assert.IsType <OkObjectResult>(result);
        }
        public async Task GetBird_ReturnsBadRequestResult_WhenExceptionIsRaised()
        {
            // Arrange
            var mockRepo = new Mock <IBirdRepository>();

            mockRepo.Setup(repo => repo.GetBirdAsync(It.IsAny <int>()))
            .ThrowsAsync(new InvalidOperationException());

            var controller = new BirdsController(_mapper, _cache, _logger.Object, mockRepo.Object);

            // Act
            var result = await controller.GetBirdAsync(It.IsAny <int>());

            // Assert
            Assert.IsType <ObjectResult>(result);
            var objectResult = result as ObjectResult;

            Assert.Equal(StatusCodes.Status500InternalServerError, objectResult.StatusCode);
            Assert.Equal("an unexpected error occurred", objectResult.Value);
        }
        public async Task GetBird_ReturnsNotFoundResult_WhenRepositoryReturnsNull()
        {
            // Arrange
            var mockRepo = new Mock <IBirdRepository>();

            mockRepo.Setup(repo => repo.GetBirdAsync(It.IsAny <int>()))
            .Returns(Task.FromResult <Bird>(null));

            var controller = new BirdsController(_mapper, _cache, _logger.Object, mockRepo.Object);

            // Act
            var result = await controller.GetBirdAsync(It.IsAny <int>());

            // Assert
            Assert.IsType <ObjectResult>(result);
            var objectResult = result as ObjectResult;

            Assert.Equal(StatusCodes.Status500InternalServerError, objectResult.StatusCode);
            Assert.Equal($"bird repository returned null", objectResult.Value);
        }
        public async Task GetBird_ReturnsOkObjectResult_WithBirdDetailViewModel()
        {
            // Arrange
            var birdId   = 1;
            var mockRepo = new Mock <IBirdRepository>();

            mockRepo.Setup(repo => repo.GetBirdAsync(birdId))
            .ReturnsAsync(GetTestBird());

            var controller = new BirdsController(_mapper, _cache, _logger.Object, mockRepo.Object);

            // Act
            var result = await controller.GetBirdAsync(birdId);

            // Assert
            var objectResult = result as ObjectResult;

            Assert.NotNull(objectResult);
            Assert.True(objectResult is OkObjectResult);
            Assert.Equal(StatusCodes.Status200OK, objectResult.StatusCode);
            var model = Assert.IsType <BirdDetailDto>(objectResult.Value);

            Assert.Equal(birdId, model.BirdId);
        }