Example #1
0
    def test_poll_feed_parse_defective_feed_items(self):
        feed = fixtures.create_feed('http://feed.url', self.access_key)
        feed.access_key = self.access_key
        db.session.add(feed)
        db.session.commit()

        with open('./tests/fixtures/defective-rss') as fh:
            httpretty.register_uri(httpretty.GET, feed.url, body=fh.read())

        poll_feeds.poll_feed(feed)
        db.session.commit()
        assert feed.items.count() == 1
        assert feed.items.first().guid == 'http://link.url'
Example #2
0
    def test_poll_feed_basics(self):
        # Дата публикации новости "оссийское правительство принимает меры
        # для поддержки моногородов" в 66.ru-society-rss
        self.access_key.enabled_at = dt.datetime(2013, 11, 13, 3, 34, 50)

        for feed_url in ('http://66.ru/news/society/rss/',
                         'http://news.yandex.ru/hardware.rss'):
            feed = fixtures.create_feed(feed_url, self.access_key)
            feed.access_key = self.access_key
            db.session.add(feed)
        db.session.commit()

        with open('./tests/fixtures/66.ru-society-rss') as fh:
            httpretty.register_uri(
                httpretty.GET, 'http://66.ru/news/society/rss/', body=fh.read())
        with open('./tests/fixtures/news.yandex.ru-hardware-rss') as fh:
            httpretty.register_uri(
                httpretty.GET, 'http://news.yandex.ru/hardware.rss', body=fh.read())

        for feed in self.access_key.feeds:
            poll_feeds.poll_feed(feed)
            db.session.commit()

        feed_66_ru = self.access_key.feeds.filter(Feed.url.contains('66.ru')).first()
        # В фиде 66.ру десять элементов, но только семь из них имеют дату
        # публикации позже `access_key.enabled_at`
        assert feed_66_ru.items.count() == 7
        item = feed_66_ru.items.filter_by(guid='66.ru:news:147137').first()
        assert item.description == u'Президент РЖД хочет заменить их двухэтажными.'
        assert feed_66_ru.channel_link == 'http://66.ru'
        assert feed_66_ru.channel_description == u'Удобные новости'
        assert feed_66_ru.channel_title == u'66.ru — Городской портал Екатеринбурга'
        assert feed_66_ru.channel_image_url == u'http://s.66.ru/localStorage/3c/87/06/84/3c870684.gif'

        feed_yandex_ru = self.access_key.feeds.filter(Feed.url.contains('yandex.ru')).first()
        assert feed_yandex_ru.items.count() == 15
Example #3
0
    def test_poll_feed_ignores_already_seen_items(self):
        feed = fixtures.create_feed('http://news.yandex.ru/hardware.rss', self.access_key)
        feed.access_key = self.access_key
        db.session.add(feed)
        db.session.commit()

        # news.yandex.ru-world-rss-1 содержит элементы A B C D E
        with open('./tests/fixtures/news.yandex.ru-world-rss-1') as fh:
            rss_data = fh.read()
            guids_before_update = \
                set(entry['guid'] for entry in feedparser.parse(rss_data).entries)
            httpretty.register_uri(httpretty.GET, feed.url, body=rss_data)

        poll_feeds.poll_feed(feed)
        db.session.commit()
        assert feed.items.count() == 5

        httpretty.reset()
        # news.yandex.ru-world-rss-2 содержит элементы D E F G H
        with open('./tests/fixtures/news.yandex.ru-world-rss-2') as fh:
            rss_data = fh.read()
            guids_after_update = \
                set(entry['guid'] for entry in feedparser.parse(rss_data).entries)
            httpretty.register_uri(httpretty.GET, feed.url, body=rss_data)

        poll_feeds.poll_feed(feed)
        db.session.commit()
        assert feed.items.count() == 8  # 5 штук (A B C D E) + 3 штуки (F G H)

        guids_in_db = [item.guid for item in feed.items]
        # Убедимся, что все guid-ы в БД -- уникальные
        assert len(guids_in_db) == len(set(guids_in_db))
        # И отражают записи как до "обновления фида", так и после
        assert set(guids_in_db) == (guids_before_update | guids_after_update)

        # Проверим, что после чистки старые элементы не будут подгружены
        for item in feed.items.all():
            db.session.delete(item)
        db.session.commit()

        poll_feeds.poll_feed(feed)
        db.session.commit()
        assert feed.items.count() == 0