Ejemplo n.º 1
0
class PollFeedTest(TestCase):
    def setUp(self):
        self.feed = Feed(link="http://link.to/rss.xml", title="A Feed")
        self.feed.save()

        # Create an entry
        published = datetime.datetime(2013, 9, 25, 4, 0)
        published = published.timetuple()
        self.entry1 = FeedParserEntry(title="An Entry", link="http://entry", published_parsed=published)

        # Create another entry
        published = datetime.datetime(2013, 9, 28, 4, 0)
        published = published.timetuple()
        self.entry2 = FeedParserEntry(title="Another Entry", link="http://another/entry", published_parsed=published)

        # Create users
        user1 = User(username="******")
        user1.save()
        self.profile1 = UserProfile(user=user1)
        self.profile1.save()

        user2 = User(username="******")
        user2.save()
        self.profile2 = UserProfile(user=user2)
        self.profile2.save()

    def test_profile_display(self):
        self.assertEqual(str(self.profile1), "user1's profile")
        self.assertEqual(str(self.profile2), "user2's profile")

    @mock.patch("feedparser.parse")
    def test_poll_new_subscriber(self, mock_parse):
        """Test a successful polling of a feed."""

        # Set up mock data
        parser = mock.MagicMock()
        parser.entries = [self.entry1, self.entry2]
        mock_parse.return_value = parser
        Subscription(profile=self.profile1, feed=self.feed).save()

        # Verify initial state
        self.assertEqual(Feed.objects.count(), 1)
        self.assertEqual(Entry.objects.count(), 0)
        self.assertEqual(UserEntryDetail.objects.count(), 0)

        # Perform poll
        tasks.poll_feed(self.feed)

        # Verify final state
        self.assertEqual(Feed.objects.count(), 1)
        self.assertEqual(Entry.objects.count(), 2)
        self.assertEqual(UserEntryDetail.objects.count(), 2)

    @mock.patch("feedparser.parse")
    def test_poll_two_new_subscribers(self, mock_parse):
        """Test a successful polling of a feed."""

        # Set up mock data
        parser = mock.MagicMock()
        parser.entries = [self.entry1, self.entry2]
        mock_parse.return_value = parser
        Subscription(profile=self.profile1, feed=self.feed).save()
        Subscription(profile=self.profile2, feed=self.feed).save()

        # Verify initial state
        self.assertEqual(Feed.objects.count(), 1)
        self.assertEqual(Entry.objects.count(), 0)
        self.assertEqual(UserEntryDetail.objects.count(), 0)

        # Perform poll
        tasks.poll_feed(self.feed)

        # Verify final state
        self.assertEqual(Feed.objects.count(), 1)
        self.assertEqual(Entry.objects.count(), 2)
        self.assertEqual(UserEntryDetail.objects.count(), 4)

    @mock.patch("feedparser.parse")
    def test_poll_new_and_existing_subscribers(self, mock_parse):
        """Test a successful polling of a feed."""

        # Set up mock data
        parser = mock.MagicMock()
        parser.entries = [self.entry1, self.entry2]
        mock_parse.return_value = parser
        Subscription(profile=self.profile1, feed=self.feed).save()
        Subscription(profile=self.profile2, feed=self.feed).save()
        entry1 = Entry(
            link=self.entry1.link,
            feed=self.feed,
            title=self.entry1.title,
            published=datetime.datetime(2013, 9, 25, 4, 0),
        )
        entry1.save()
        UserEntryDetail(profile=self.profile1, entry=entry1).save()

        # Verify initial state
        self.assertEqual(Feed.objects.count(), 1)
        self.assertEqual(Entry.objects.count(), 1)
        self.assertEqual(UserEntryDetail.objects.count(), 1)

        # Perform poll
        tasks.poll_feed(self.feed)

        # Verify final state
        self.assertEqual(Feed.objects.count(), 1)
        self.assertEqual(Entry.objects.count(), 2)
        self.assertEqual(UserEntryDetail.objects.count(), 4)

    @mock.patch("feedparser.parse")
    def test_poll_after_unsubscribe(self, mock_parse):
        # Set up mock data
        parser = mock.MagicMock()
        parser.entries = [self.entry1]
        mock_parse.return_value = parser
        Subscription(profile=self.profile1, feed=self.feed).save()

        # Verify initial state
        self.assertEqual(Feed.objects.count(), 1)
        self.assertEqual(Entry.objects.count(), 0)
        self.assertEqual(UserEntryDetail.objects.count(), 0)

        # Perform poll
        tasks.poll_feed(self.feed)

        # Verify state
        self.assertEqual(Feed.objects.count(), 1)
        self.assertEqual(Entry.objects.count(), 1)
        self.assertEqual(UserEntryDetail.objects.count(), 1)

        # Unsubscribe
        self.profile1.unsubscribe(self.feed)

        # Verify state
        self.assertEqual(Feed.objects.count(), 1)
        self.assertEqual(Entry.objects.count(), 1)
        self.assertEqual(UserEntryDetail.objects.count(), 0)

        # Resubscribe
        self.profile1.subscribe(self.feed)

        # Perform poll (find another entry)
        parser.entries = [self.entry1, self.entry2]
        tasks.poll_feed(self.feed)

        # Verify final state
        self.assertEqual(Feed.objects.count(), 1)
        self.assertEqual(Entry.objects.count(), 2)
        self.assertEqual(UserEntryDetail.objects.count(), 2)

    @mock.patch("feedparser.parse")
    def test_mark_read_unread(self, mock_parse):
        parser = mock.MagicMock()
        parser.entries = [self.entry1, self.entry2]
        mock_parse.return_value = parser

        unread_entries = self.profile1.unread_entries(self.feed)
        self.assertEqual(unread_entries, 0)

        self.profile1.subscribe(self.feed)
        tasks.poll_feed(self.feed)
        unread_entries = self.profile1.unread_entries(self.feed)
        self.assertEqual(unread_entries, 2)

        self.profile1.mark_read(self.feed)
        unread_entries = self.profile1.unread_entries(self.feed)
        self.assertEqual(unread_entries, 0)

        self.profile1.mark_unread(self.feed)
        unread_entries = self.profile1.unread_entries(self.feed)
        self.assertEqual(unread_entries, 2)