コード例 #1
0
            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);
            }
コード例 #2
0
            public void MustThrowArgumentNullExceptionWhenArgumentIsNull()
            {
                var rowParser = Substitute.For <IAltbauWohnungenRowParser>();
                var parser    = new AltbauWohnungenParser(rowParser);

                Assert.That(() => parser.ParseAltbauWohnungenDocumentWithLogging(null), Throws.ArgumentNullException);
            }
コード例 #3
0
            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");
                });
            }
コード例 #4
0
        // 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);
        }
コード例 #5
0
            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);
            }