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'
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
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