public void ShouldParseDocument() { // setup logging var logger = Substitute.For <ILogger>(); var parserLogger = Substitute.For <ILogger>(); logger.ForContext <AltbauWohnungenParser>().Returns(parserLogger); // setup parser var rowParser = Substitute.For <IAltbauWohnungenRowParser>(); rowParser.ParseWithLogging(Arg.Any <HtmlNodeCollection>()).Returns(An.AltbauWohnungInfo()); var parser = new AltbauWohnungenParser(rowParser); // load document var document = An.HtmlDocument(); // act var result = parser.ParseAltbauWohnungenDocumentWithLogging(document); Assert.That(result, Is.Not.Null, "result was null"); Assert.That(result.Count(), Is.EqualTo(4), "result count"); Assert.That(() => rowParser.Received(4).ParseWithLogging(Arg.Any <HtmlNodeCollection>()), Throws.Nothing); Assert.That(() => parserLogger.DidNotReceive().Error(Arg.Any <Exception>(), Arg.Any <string>()), Throws.Nothing); }
public void MustThrowArgumentNullExceptionWhenArgumentIsNull() { var rowParser = Substitute.For <IAltbauWohnungenRowParser>(); var parser = new AltbauWohnungenParser(rowParser); Assert.That(() => parser.ParseAltbauWohnungenDocumentWithLogging(null), Throws.ArgumentNullException); }
public void ShouldLogErrors() { // setup logging var logger = Substitute.For <ILogger>(); var parserLogger = Substitute.For <ILogger>(); logger.ForContext <AltbauWohnungenParser>().Returns(parserLogger); Log.Logger = logger; // setup parser var rowParser = Substitute.For <IAltbauWohnungenRowParser>(); rowParser.ParseWithLogging(Arg.Any <HtmlNodeCollection>()).Returns(x => throw new Exception()); var parser = new AltbauWohnungenParser(rowParser); // load document var document = An.HtmlDocument(); // act var result = parser.ParseAltbauWohnungenDocumentWithLogging(document).ToArray(); // assert Assert.Multiple(() => { Assert.That(result, Is.Not.Null, "result was null"); Assert.That(result.Count, Is.EqualTo(0), "result count"); Assert.That(() => rowParser.Received(1).ParseWithLogging(Arg.Any <HtmlNodeCollection>()), Throws.Nothing, "row parser was not called"); Assert.That(() => parserLogger.Received().Error(Arg.Any <Exception>(), Arg.Any <string>()), Throws.Nothing, "error was not logged"); }); }
// TODO: split into smaller commands public async Task ExecuteAsync(CancellationToken cancellationToken) { var settings = LoadSettings(); var url = settings.Url; var targetPath = Path.Combine(FileHelper.GetApplicationDataPath(), "altbau.xhtml"); var webpage = await WebsiteDownloader.GetWebsiteOrNullWithPolicyAndLoggingAsync(url, targetPath, cancellationToken); if (webpage == null) { return; } if (File.Exists(targetPath)) { var cachedWebpage = await HtmlDocumentFactory.FromFileAsync(targetPath, cancellationToken); var areEqual = HtmlDocumentComparer.Equals(webpage, cachedWebpage); if (areEqual) { Log.Information("Website has not changed"); return; } NotifyHelper.ShowNotificationThatWebsiteHasChanged("Website has changed", url); Log.Information("Parsing altbau wohnungen document."); var offers = AltbauWohnungenParser.ParseAltbauWohnungenDocumentWithLogging(webpage).ToArray(); Log.Information($"Found {offers.Length} offers."); var interestingOffers = AltbauWohnungenFilter.Filter(offers).ToArray(); Log.Information($"Found {interestingOffers.Length} interesting offers."); var postedHrefsFilePath = Path.Combine(FileHelper.GetApplicationDataPath(), "hrefs.txt"); var newOffers = interestingOffers.FilterNewOffers(postedHrefsFilePath).ToArray(); Log.Information($"Found {newOffers.Length} new and interesting offers."); //if (!SettingsManager.IsFirstRun) //{ await RegisterForOffersAndInformUserAsync(settings, newOffers, cancellationToken); //} //SettingsManager.IsFirstRun = false; Log.Information("Saving lines in file."); var lines = newOffers.Select(o => o.Href); await FileHelper.CreateFileIfNotExistsAndAppendLinesToFileAsync(postedHrefsFilePath, lines); File.Delete(targetPath); } await webpage.SaveHtmlDocumentToFileWithLoggingAsync(targetPath, cancellationToken); }
public void ShouldParseDocument() { // setup parser var rowParser = Substitute.For <IAltbauWohnungenRowParser>(); rowParser.Parse(Arg.Any <HtmlNodeCollection>()).Returns(An.AltbauWohnungInfo()); var parser = new AltbauWohnungenParser(rowParser); // load document var document = An.HtmlDocument(); // act var result = parser.ParseAltbauWohnungenDocument(document); Assert.That(result, Is.Not.Null, "result was null"); Assert.That(result.Count(), Is.EqualTo(4), "result count"); Assert.That(() => rowParser.Received(4).Parse(Arg.Any <HtmlNodeCollection>()), Throws.Nothing); }