Ejemplo n.º 1
0
        public void does_not_update_feed_that_was_not_modified()
        {
            var cached = new LocalFeedInfo()
            {
                Url       = "http://cached.feed/rss",
                Content   = "cached-content",
                Etag      = "cached-etag",
                LastFetch = new DateTime(2012, 2, 3)
            };

            _feedsProvider.Db().LocalFeedInfo.Insert(cached);

            A.CallTo(
                () => _remoteData.ReadRemoteSource(
                    A <LocalFeedInfo> .That.Matches(x => x.Url == cached.Url && x.Etag == cached.Etag && x.LastFetch == cached.LastFetch)
                    )
                )
            .Returns(RemoteContentResponse.NotModified(HttpStatusCode.OK));

            execute(cached.Url);

            List <LocalFeedInfo> fromDb = _feedsProvider.Db().LocalFeedInfo.All().ToList <LocalFeedInfo>();

            Assert.Equal(1, fromDb.Count);

            Assert.Equal(cached.Url, fromDb[0].Url);
            Assert.Equal(cached.Content, fromDb[0].Content);
            Assert.Equal(cached.Etag, fromDb[0].Etag);
            Assert.Equal(cached.LastFetch, fromDb[0].LastFetch);
        }
Ejemplo n.º 2
0
 protected virtual void OnFeedUpdated(dynamic db, LocalFeedInfo feed, RemoteContentResponse remoteResponse)
 {
 }
Ejemplo n.º 3
0
 protected virtual void OnNoNewContentInRemoteSource(dynamic db, LocalFeedInfo feed, RemoteContentResponse remoteResponse)
 {
 }
Ejemplo n.º 4
0
        public void UpdateFeed(string url)
        {
            var db = _localFeedsProvider.Db();

            dynamic read_view = GetLocalFeedInfoView(db);

            LocalFeedInfo feed = read_view.FindByUrl(url)
                                 ?? new LocalFeedInfo
            {
                Url = url,
            };

            _log.Debug("Updating {0} feed '{1}'", feed.Id == 0 ? "new" : "existing", url);

            RemoteContentResponse remoteResponse = null;

            try
            {
                OnBeforeReadingRemoteSource(db, feed);

                remoteResponse = _remoteData.ReadRemoteSource(feed);
            }
            catch (Exception exc)
            {
                OnReadingRemoteSourceError(db, feed, remoteResponse, exc);
                throw;
            }

            if (remoteResponse.HasNewContent == false)
            {
                _log.Debug("Feed '{0}' does not have new content", url);

                OnNoNewContentInRemoteSource(db, feed, remoteResponse);

                return;
            }

            bool   newFeed         = feed.LastFetch == null;
            string previousContent = feed.Content ?? string.Empty;

            feed.Content   = GetFeedStringContent(remoteResponse);
            feed.LastFetch = ApplicationTime.Current;
            feed.Etag      = remoteResponse.Etag;

            if (newFeed)
            {
                _log.Info("Inserting new feed '{0}' to local cache", url);

                InsertNewFeed(db, feed, url);
            }
            else
            {
                _log.Info("Updating feed '{0}' in local cache", url);

                UpdateExistingFeed(db, feed, url);
            }

            OnFeedUpdated(db, feed, remoteResponse);

            if (previousContent.GetHashCode() == feed.Content.GetHashCode())
            {
                _log.Warn("Wasting resources: updating feed '{0}' with the same content it already had!", url);
            }
        }
Ejemplo n.º 5
0
 /// <summary>
 /// Gets whole feed content as string made of all it's items.
 /// </summary>
 protected virtual string GetFeedStringContent(RemoteContentResponse remoteResponse)
 {
     return(remoteResponse.Content.GetRssString());
 }
Ejemplo n.º 6
0
 protected virtual void OnReadingRemoteSourceError(dynamic db, LocalFeedInfo feed, RemoteContentResponse remoteResponse, Exception exc)
 {
 }