public async Task Test_No_Previous_Comic_When_Current_Is_First()
        {
            //Arrange
            int mockId          = 1;
            int?previousValidId = null;
            var mockComicApi    = new Mock <IXKCDApi>();

            mockComicApi.Setup(api => api.GetFirstComicId())
            .ReturnsAsync(GetValidMockedFirstComicId());
            mockComicApi.Setup(api => api.GetComicOfTheDay())
            .ReturnsAsync(GetValidMockedComicOfTheDay());
            mockComicApi.Setup(api => api.GetComicById(previousValidId ?? default))
            .ReturnsAsync(GetInvalidComic());

            var comicRepository = new ComicRepository(mockComicApi.Object);

            //Act
            var result = await comicRepository.GetPreviousComicId(mockId);

            var previousComic = await comicRepository.GetComicById(previousValidId ?? default);

            var firstComicId = await comicRepository.GetFirstComicId();

            //Assert
            Assert.Null(result);
            Assert.Equal(previousValidId, result);
            Assert.Null(previousComic);
            Assert.Equal(firstComicId, mockId);
        }
        public async Task Test_Previous_Valid_Comic_When_Current_Is_Not_First()
        {
            //Arrange
            int mockId          = 406;
            int previousValidId = 403;
            var mockComicApi    = new Mock <IXKCDApi>();

            mockComicApi.Setup(api => api.GetFirstComicId())
            .ReturnsAsync(GetValidMockedFirstComicId());
            mockComicApi.Setup(api => api.GetComicOfTheDay())
            .ReturnsAsync(GetValidMockedComicOfTheDay());
            mockComicApi.Setup(api => api.GetComicById(404))
            .ReturnsAsync(GetInvalidComic());
            mockComicApi.Setup(api => api.GetComicById(405))
            .ReturnsAsync(GetInvalidComic());
            mockComicApi.Setup(api => api.GetComicById(previousValidId))
            .ReturnsAsync(GetMockedComicById(previousValidId));

            var comicRepository = new ComicRepository(mockComicApi.Object);

            //Act
            var result = await comicRepository.GetPreviousComicId(mockId);

            var previousComic = await comicRepository.GetComicById(previousValidId);

            //Assert
            Assert.NotNull(result);
            Assert.Equal(previousValidId, result);
            Assert.NotNull(previousComic);
            Assert.Equal(previousComic.Num, result);
            Assert.Equal($"Testing {result.Value}", previousComic.Alt);
            Assert.Equal($"Test comic {result.Value}", previousComic.SafeTitle);
            Assert.Equal($"Test comic {result.Value}", previousComic.Title);

            mockComicApi.Verify(mock => mock.GetComicById(mockId - 1), Times.Once());
            mockComicApi.Verify(mock => mock.GetComicById(mockId - 2), Times.Once());
            //Because of the fetch during the act
            mockComicApi.Verify(mock => mock.GetComicById(previousValidId), Times.Exactly(2));
            mockComicApi.Verify(mock => mock.GetComicById(mockId - 4), Times.Never());
        }
        public async Task Test_No_Next_Comic_When_Current_Is_Invalid()
        {
            //Arrange
            int mockId       = 10000;
            int?nextValidId  = null;
            var mockComicApi = new Mock <IXKCDApi>();

            mockComicApi.Setup(api => api.GetFirstComicId())
            .ReturnsAsync(GetValidMockedFirstComicId());
            mockComicApi.Setup(api => api.GetComicOfTheDay())
            .ReturnsAsync(GetValidMockedComicOfTheDay());
            mockComicApi.Setup(api => api.GetComicById(mockId))
            .ReturnsAsync(GetInvalidComic());

            var comicRepository = new ComicRepository(mockComicApi.Object);

            //Act
            var result = await comicRepository.GetPreviousComicId(mockId);

            //Assert
            Assert.Null(result);
            Assert.Equal(nextValidId, result);
            mockComicApi.Verify(mock => mock.GetComicById(mockId + 1), Times.Never());
        }