Esempio n. 1
0
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
Esempio n. 2
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))
Esempio n. 3
0
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
Esempio n. 4
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
Esempio n. 5
0
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
Esempio n. 6
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)
Esempio n. 7
0
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
Esempio n. 8
0
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
Esempio n. 9
0
    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)