func TestDataDeleteSubscription(t *testing.T) { pool := newConnPool(t) userID, err := data.CreateUser(pool, newUser()) if err != nil { t.Fatal(err) } err = data.InsertSubscription(pool, userID, "http://foo") if err != nil { t.Fatal(err) } subscriptions, err := data.SelectSubscriptions(pool, userID) if err != nil { t.Fatal(err) } if len(subscriptions) != 1 { t.Fatalf("Found %d subscriptions, expected 1", len(subscriptions)) } feedID := subscriptions[0].FeedID.Value update := &data.ParsedFeed{Name: "baz", Items: []data.ParsedItem{ {URL: "http://baz/bar", Title: "Baz", PublicationTime: data.NewTime(time.Now())}, }} nullString := data.String{Status: data.Null} err = data.UpdateFeedWithFetchSuccess(pool, feedID, update, nullString, time.Now().Add(-20*time.Minute)) if err != nil { t.Fatal(err) } err = data.DeleteSubscription(pool, userID, feedID) if err != nil { t.Fatal(err) } subscriptions, err = data.SelectSubscriptions(pool, userID) if err != nil { t.Fatal(err) } if len(subscriptions) != 0 { t.Errorf("Found %d subscriptions, expected 0", len(subscriptions)) } // feed should have been deleted as it was the last user staleFeeds, err := data.GetFeedsUncheckedSince(pool, time.Now()) if err != nil { t.Fatal(err) } if len(staleFeeds) != 0 { t.Errorf("Found %d staleFeeds, expected 0", len(staleFeeds)) } }
func (u *FeedUpdater) KeepFeedsFresh() { for { startTime := time.Now() if staleFeeds, err := data.GetFeedsUncheckedSince(u.pool, startTime.Add(-10*time.Minute)); err == nil { u.logger.Info("GetFeedsUncheckedSince succeeded", "n", len(staleFeeds)) staleFeedChan := make(chan data.Feed) finishChan := make(chan bool) worker := func() { for feed := range staleFeedChan { u.RefreshFeed(feed) } finishChan <- true } for i := 0; i < u.maxConcurrentFeedFetches; i++ { go worker() } for _, sf := range staleFeeds { staleFeedChan <- sf } close(staleFeedChan) for i := 0; i < u.maxConcurrentFeedFetches; i++ { <-finishChan } } else { u.logger.Error("GetFeedsUncheckedSince failed", "error", err) } sleepUntil(startTime.Add(time.Minute)) } }
func TestDataFeeds(t *testing.T) { pool := newConnPool(t) userID, err := data.CreateUser(pool, newUser()) if err != nil { t.Fatal(err) } now := time.Now() fiveMinutesAgo := now.Add(-5 * time.Minute) tenMinutesAgo := now.Add(-10 * time.Minute) fifteenMinutesAgo := now.Add(-15 * time.Minute) update := &data.ParsedFeed{Name: "baz", Items: make([]data.ParsedItem, 0)} // Create a feed url := "http://bar" err = data.InsertSubscription(pool, userID, url) if err != nil { t.Fatal(err) } // A new feed has never been fetched -- it should need fetching staleFeeds, err := data.GetFeedsUncheckedSince(pool, tenMinutesAgo) if err != nil { t.Fatal(err) } if len(staleFeeds) != 1 { t.Fatalf("Found %d stale feed, expected 1", len(staleFeeds)) } if staleFeeds[0].URL.Value != url { t.Errorf("Expected %v, got %v", url, staleFeeds[0].URL) } feedID := staleFeeds[0].ID.Value nullString := data.String{Status: data.Null} // Update feed as of now err = data.UpdateFeedWithFetchSuccess(pool, feedID, update, nullString, now) if err != nil { t.Fatal(err) } // feed should no longer be stale staleFeeds, err = data.GetFeedsUncheckedSince(pool, tenMinutesAgo) if err != nil { t.Fatal(err) } if len(staleFeeds) != 0 { t.Fatalf("Found %d stale feed, expected 0", len(staleFeeds)) } // Update feed to be old enough to need refresh err = data.UpdateFeedWithFetchSuccess(pool, feedID, update, nullString, fifteenMinutesAgo) if err != nil { t.Fatal(err) } // It should now need fetching staleFeeds, err = data.GetFeedsUncheckedSince(pool, tenMinutesAgo) if err != nil { t.Fatal(err) } if len(staleFeeds) != 1 { t.Fatalf("Found %d stale feed, expected 1", len(staleFeeds)) } if staleFeeds[0].ID.Value != feedID { t.Errorf("Expected %v, got %v", feedID, staleFeeds[0].ID) } // But update feed with a recent failed fetch err = data.UpdateFeedWithFetchFailure(pool, feedID, "something went wrong", fiveMinutesAgo) if err != nil { t.Fatal(err) } // feed should no longer be stale staleFeeds, err = data.GetFeedsUncheckedSince(pool, tenMinutesAgo) if err != nil { t.Fatal(err) } if len(staleFeeds) != 0 { t.Fatalf("Found %d stale feed, expected 0", len(staleFeeds)) } }