public void TestALinkThatIsNotExcelForCorrectException()
        {
            var       mockLogger         = new Mock <ILogFunctions>();
            var       errorMessageString = string.Empty;
            Exception errorException     = null;
            var       errorAction        = new Action <string, Exception>((message, exception) =>
            {
                errorMessageString = message;
                errorException     = exception;
            });

            mockLogger.SetupGet(x => x.Error).Returns(errorAction);
            var action = new Action <string>(message => { });

            mockLogger.SetupGet(x => x.Debug).Returns(action);

            var mockWebClientFactory = new Mock <IWebClientFactory>();
            var mockWebClient        = new Mock <IWebClient>();

            mockWebClient.Setup(x => x.DownloadData(It.IsAny <Uri>())).Returns(new byte[20]);
            mockWebClientFactory.Setup(x => x.Create()).Returns(mockWebClient.Object);

            var getInspectionService = new GetInspectionsService(mockLogger.Object, Mock.Of <IGetOfstedDetailsFromExcelPackageService>(), mockWebClientFactory.Object);

            var urlWithoutExcel = "http://blah.xyz";

            Assert.Throws <UrlReadingException>(() => getInspectionService.GetInspectionsDetail(urlWithoutExcel));
            mockLogger.Verify(x => x.Debug, Times.Exactly(3));
            Assert.IsTrue(errorMessageString.StartsWith("Error whilst trying to read excel details from url: ["), "Logged Error message does not contain expected words");
            Assert.IsNotNull(errorException);
            Assert.IsTrue(errorException.Message.StartsWith("Error whilst trying to read excel details from url: ["), "Exception message does not contain expected words");
        }
        public void TestAnInvalidUrlForCorrectException(string invalidUrl, string exceptionMessage)
        {
            var       mockLogger         = new Mock <ILogFunctions>();
            var       errorMessageString = string.Empty;
            Exception errorException     = null;
            var       errorAction        = new Action <string, Exception>((message, exception) =>
            {
                errorMessageString = message;
                errorException     = exception;
            });

            mockLogger.SetupGet(x => x.Error).Returns(errorAction);

            var action = new Action <string>(message => { });

            mockLogger.SetupGet(x => x.Debug).Returns(action);

            var mockWebClientFactory = new Mock <IWebClientFactory>();
            var mockWebClient        = new Mock <IWebClient>();

            mockWebClient.Setup(x => x.DownloadData(It.IsAny <Uri>())).Throws <UriFormatException>();

            mockWebClientFactory.Setup(x => x.Create()).Returns(mockWebClient.Object);

            var getInspectionService = new GetInspectionsService(mockLogger.Object, Mock.Of <IGetOfstedDetailsFromExcelPackageService>(), mockWebClientFactory.Object);

            Assert.Throws <UrlReadingException>(() => getInspectionService.GetInspectionsDetail(invalidUrl));

            mockLogger.Verify(x => x.Debug, Times.Exactly(2));
            Assert.IsTrue(errorMessageString.StartsWith(exceptionMessage), "Logged Error message does not contain expected words");
            Assert.IsNotNull(errorException);
            Assert.IsTrue(errorException.Message.StartsWith(exceptionMessage), "Exception message does not contain expected words");
        }
        public void TestALinkThatReturnsExcelAndCountLoggerDebugCalls()
        {
            var mockLogger = new Mock <ILogFunctions>();

            var action = new Action <string>(message => { });

            mockLogger.SetupGet(x => x.Debug).Returns(action);

            var mockWebClientFactory = new Mock <IWebClientFactory>();
            var mockWebClient        = new Mock <IWebClient>();

            var excelPackage = CreateBasicExcelSpreadsheetForStubbing();

            mockWebClient.Setup(x => x.DownloadData(It.IsAny <Uri>())).Returns(excelPackage.GetAsByteArray);
            mockWebClientFactory.Setup(x => x.Create()).Returns(mockWebClient.Object);

            var getInspectionService = new GetInspectionsService(mockLogger.Object, Mock.Of <IGetOfstedDetailsFromExcelPackageService>(), mockWebClientFactory.Object);

            const string urlWithExcel = "http://blah.xyz";

            getInspectionService.GetInspectionsDetail(urlWithExcel);
            mockLogger.Verify(x => x.Debug, Times.Exactly(7));
        }