def test_update_no_authors(subhandler, session): entry = EntryFactory() with mail.record_messages() as outbox: with pytest.raises(NoneFoundError): subhandler.update([entry]) assert len(outbox) == 0
def test_cron_update_single_user(subhandler, client, session): # users = User.query.all() # pprint(users) user = UserFactory(active=True) user2 = UserFactory(active=True) author = AuthorFactory() now = datetime.utcnow() entry1 = EntryFactory(published=now - timedelta(hours=5)) entry2 = EntryFactory(published=now - timedelta(hours=3)) entry3 = EntryFactory(published=now - timedelta(hours=26)) entry1.authors.append(author) entry2.authors.append(author) entry3.authors.append(author) db.session.commit() sub = SubscriptionFactory(user=user, author=author, active=True) sub2 = SubscriptionFactory(user=user2, author=author, active=True) sub.add_period(PERIOD.DAILY) sub2.add_period(PERIOD.DAILY) user_email = '*****@*****.**' user_password = '******' add_admin(user_email, user_password) db.session.commit() # with client as c: with mail.record_messages() as outbox: h = Headers() auth = requests.auth._basic_auth_str(user_email, user_password) h.add('Authorization', auth) url = url_for('subscriptions.send_update') + '?period=Daily' + '&user_id=' + str(user.id) response = client.post(url, headers=h) assert response.status_code == 200 assert len(outbox) == 1 assert outbox[0].recipients[0] == user.email email_count = Email.query.count() assert email_count == 1 email = Email.query.filter_by( user_id=user.id, period_id=Period.get_period_id(PERIOD.DAILY)).first() assert email.address == user.email assert len(email.authors) == 1 assert len(email.entries) == 2 TestCase().assertCountEqual(email.entries, [entry1, entry2]) assert email.period == PERIOD.DAILY TestCase().assertAlmostEqual(sub.last_email_sent, datetime.utcnow(), delta=timedelta(seconds=1))
def test_update_no_subscriptions(subhandler, session): author = AuthorFactory() entry = EntryFactory() entry.authors.append(author) with mail.record_messages() as outbox: with pytest.raises(NoneFoundError): subhandler.update([entry]) assert len(outbox) == 0
def test_update_multiple_entries(subhandler, session): user1 = UserFactory(active=True) user2 = UserFactory(active=True) user3 = UserFactory(active=True) user4 = UserFactory(active=True) author1 = AuthorFactory() sub1 = Subscription(user=user1, author=author1, active=True) sub2 = Subscription(user=user2, author=author1, active=True) sub3 = Subscription(user=user3, author=author1, active=False) sub4 = Subscription(user=user4, author=author1, active=True) p = Period.query.filter_by(name=PERIOD.IMMEDIATE).first() sub1.add_period(p) sub2.add_period(p) sub3.add_period(p) p2 = Period.query.filter_by(name=PERIOD.DAILY).first() sub4.add_period(p2) entry1 = EntryFactory() entry2 = EntryFactory() entry1.authors.append(author1) entry2.authors.append(author1) entries = [entry1, entry2] db.session.commit() with mail.record_messages() as outbox: subhandler.update(entries) assert len(outbox) == 2 email_count = Email.query.count() assert email_count == 2 user1email = Email.query.filter_by(address=user1.email).first() assert user1email.address == user1.email assert sorted(user1email.authors) == sorted(user1.authors) assert user1email.sent_at is not None user2email = Email.query.filter_by(address=user1.email).first() assert user2email.address == user1.email assert sorted(user2email.authors) == sorted(user1.authors) assert user2email.sent_at is not None user3email = Email.query.filter_by(address=user3.email).first() assert user3email is None user4email = Email.query.filter_by(address=user4.email).first() assert user4email is None
def test_update_no_active_users(subhandler, session): user = UserFactory(active=False) author = AuthorFactory() entry = EntryFactory() entry.authors.append(author) sub = SubscriptionFactory(user=user, author=author, active=True) sub.add_period(PERIOD.IMMEDIATE) with mail.record_messages() as outbox: with pytest.raises(NoneFoundError): subhandler.update([entry]) assert len(outbox) == 0
def test_notification_path(self): with open(TEST_FILES_DIR + 'boingboing.xml') as f: data = f.read() user = UserFactory(active=True) feed = FeedFactory(status=STATUS.SUBSCRIBED) author = AuthorFactory(name='Cory Doctorow', givenname='Cory', familyname='Doctorow', email='*****@*****.**') sub = SubscriptionFactory(user=user, author=author, active=True) sub.add_period(PERIOD.IMMEDIATE) db.session.commit() h = hmac.new(bytes(feed.secret, 'UTF-8'), digestmod=hashlib.sha1) h.update(data.encode('UTF-8')) digest = h.hexdigest() sig = "sha1=" + digest headers = {} headers['X-Hub-Signature'] = sig headers['content-type'] = 'application/rss+xml' headers['Link'] = str(LinkHeader([Link(feed.hub, rel="hub"), Link(feed.topic, rel="self")])) with self.app.test_client() as c: notification_received.connect(when_notification_received) entries_added.connect(when_entries_added) update_user_rss.connect(when_update_user_rss) with mail.record_messages() as outbox: response = c.post(get_public_url(feed), headers=headers, data=data) self.assertEqual(response.status_code, 200) authors = db.session.query(Author).all() self.assertEqual(len(authors), 6) entries = db.session.query(Entry).all() self.assertEqual(len(entries), 30) self.assertIs(type(entries[0].content), str) self.assertEqual(len(outbox), 1) emails = Email.query.all() self.assertEqual(len(emails), 1) self.assertEqual(emails[0].address, user.email)
def test_listen_for_entries_added(subhandler, session): user = UserFactory(active=True) author = AuthorFactory() entry = EntryFactory() entry.authors.append(author) sub = SubscriptionFactory(user=user, author=author, active=True) sub.add_period(PERIOD.IMMEDIATE) db.session.add(sub) db.session.commit() class TestSender: def __init__(self, entries): self.entries = entries with mail.record_messages() as outbox: entries_added.connect(when_entries_added) sender = TestSender([entry]) assert len(sender.entries) == 1 entries_added.send(sender, entries=[entry]) assert len(outbox) == 1
def test_update(subhandler, session): user = UserFactory(active=True) entry = EntryFactory() author = AuthorFactory() subscription = SubscriptionFactory(user_id=user.id, author_id=author.id, active=True, user=user, author=author) subscription.add_period(PERIOD.IMMEDIATE) entry.authors.append(author) with mail.record_messages() as outbox: subhandler.update([entry]) assert len(outbox) == 1 assert len(outbox[0].recipients) == 1 assert outbox[0].recipients[0] == user.email emails = Email.query.all() assert len(emails) == 1 assert emails[0].address == user.email assert emails[0].sent_at is not None
def test_json_notification_path(self): with open(TEST_FILES_DIR + 'notification.json') as f: data = f.read() user = UserFactory(active=True) feed = FeedFactory(status=STATUS.SUBSCRIBED, topic='http://testfeed.test') author = AuthorFactory(name='Testy McTesterson', givenname='Testy', familyname='McTesterson') sub = SubscriptionFactory(user=user, author=author, active=True) sub.add_period(PERIOD.IMMEDIATE) db.session.commit() h = hmac.new(bytes(feed.secret, 'UTF-8'), digestmod=hashlib.sha1) h.update(data.encode('UTF-8')) digest = h.hexdigest() sig = "sha1=" + digest headers = {} headers['X-Hub-Signature'] = sig headers['content-type'] = 'application/json' headers['Link'] = str(LinkHeader([Link(feed.hub, rel='hub'), Link(feed.topic, rel='self')])) with self.app.test_client() as c: notification_received.connect(when_notification_received) entries_added.connect(when_entries_added) update_user_rss.connect(when_update_user_rss) with mail.record_messages() as outbox: response = c.post(get_public_url(feed), headers=headers, data=data) self.assertEqual(response.status_code, 200) authors = db.session.query(Author).all() self.assertEqual(len(authors), 3) author2 = Author.query.filter_by(name='John Doe').first() self.assertEqual(author2.name, 'John Doe') self.assertEqual(author2.givenname, 'John') self.assertEqual(author2.familyname, 'Doe') author3 = Author.query.filter_by(name=u'Tĕstá ĀũʈĥőŘ').first() self.assertEqual(author3.name, u'Tĕstá ĀũʈĥőŘ') self.assertEqual(author3.givenname, u'Tĕstá') self.assertEqual(author3.familyname, u'ĀũʈĥőŘ') entries = Entry.query.all() self.assertEqual(len(entries), 2) self.assertIs(type(entries[0].content), str) self.assertIs(type(entries[1].content), str) entry2 = Entry.query.filter_by(guid='domain.tld/2015-12-02').first() self.assertEqual(entry2.content, u'This is the second entry, it contains unicode Tĕstá ĀũʈĥőŘ') self.assertEqual(len(outbox), 1) emails = Email.query.all() self.assertEqual(len(emails), 1) self.assertEqual(emails[0].address, user.email)