Beispiel #1
0
 def it_doesnt_create_a_magazine_email_if_no_match(self, db_session,
                                                   sample_uuid):
     with pytest.raises(expected_exception=InvalidRequest):
         create_email(magazine_id=sample_uuid,
                      email_type=MAGAZINE,
                      old_id=None)
     assert Email.query.count() == 0
Beispiel #2
0
    def it_returns_approved_emails(self, client, db, db_session):
        event = create_event(title='Event 1')
        event_2 = create_event(title='Event 2')

        event_date = create_event_date(event_id=str(event.id),
                                       event_datetime='2019-07-20 19:00')
        event_date_2 = create_event_date(event_id=str(event_2.id),
                                         event_datetime='2019-07-13 19:00')

        approved_email = create_email(event_id=str(event.id),
                                      created_at='2019-07-01 11:00',
                                      send_starts_at='2019-07-10',
                                      send_after='2019-07-01 11:00',
                                      expires='2019-07-20',
                                      email_state='approved')
        create_email(event_id=str(event_2.id),
                     created_at='2019-07-02 11:00',
                     send_starts_at='2019-07-01',
                     expires='2019-07-12')

        response = client.get(url_for('emails.get_approved_emails'),
                              headers=[('Content-Type', 'application/json'),
                                       create_authorization_header()])
        json_latest_emails = json.loads(response.get_data(as_text=True))

        assert len(json_latest_emails) == 1
        assert json_latest_emails[0] == approved_email.serialize()
Beispiel #3
0
    def it_doesnt_create_email_for_imported_emails_already_imported(
            self, client, db_session, sample_old_emails, sample_event):
        create_email()  # email with old_id=1
        response = client.post(url_for('emails.import_emails'),
                               data=json.dumps(sample_old_emails),
                               headers=[('Content-Type', 'application/json'),
                                        create_authorization_header()])
        assert response.status_code == 201

        json_resp = json.loads(response.get_data(as_text=True))
        json_emails = json_resp['emails']
        email_types = [EVENT, ANNOUNCEMENT, ANON_REMINDER]
        assert len(json_emails) == len(sample_old_emails) - 1
        for i in range(0, len(sample_old_emails) - 1):
            assert json_emails[i]['email_type'] == email_types[i]
            assert json_emails[i]['created_at'] == sample_old_emails[
                i + 1]['timestamp'][:-3]
            assert json_emails[i]['extra_txt'] == sample_old_emails[
                i + 1]['extratxt']
            assert json_emails[i]['details'] == sample_old_emails[
                i + 1]['eventdetails']
            assert str(json_emails[i]['old_id']) == sample_old_emails[i +
                                                                      1]['id']
            assert str(json_emails[i]['old_event_id']) == sample_old_emails[
                i + 1]['eventid']
            assert json_emails[i]['replace_all'] == (
                True if sample_old_emails[i +
                                          1]['replaceAll'] == 'y' else False)
        json_errors = json_resp['errors']
        assert json_errors == ['email already exists: 1']
    def it_gets_emails_from_starting_date_from_specified_date(
            self, db, db_session):
        emails = [
            create_email(details='more details', created_at='2019-02-01'),
            create_email(details='more details', created_at='2018-02-01')
        ]

        emails_from_db = dao_get_emails_for_year_starting_on('2018-01-01')
        assert len(emails_from_db) == 1
        assert emails[1] == emails_from_db[0]
Beispiel #5
0
    def it_gets_latest_magazine_email_only(self, db_session, sample_magazine):
        later_magazine = create_magazine(title='ignored magazine')
        event_email = create_email()
        create_email(email_type=MAGAZINE, magazine_id=sample_magazine.id)
        later_magazine_email = create_email(email_type=MAGAZINE,
                                            magazine_id=later_magazine.id)

        emails = dao_get_latest_emails()

        assert len(emails) == 2
        assert set([event_email, later_magazine_email]) == set(emails)
Beispiel #6
0
 def it_gets_approved_emails_for_sending(self, db, db_session):
     create_email(send_starts_at="2020-10-30",
                  send_after="2020-10-30T20:30:00 BST+0100",
                  expires="2020-11-07",
                  email_state=APPROVED)
     create_email(send_starts_at="2020-10-30",
                  send_after="2020-10-30T20:30:00 BST+0100",
                  expires="2020-11-07",
                  email_state=READY)
     res = dao_get_approved_emails_for_sending()
     assert len(res) == 1
Beispiel #7
0
    def it_doesnt_send_email_out_of_hours(self, mocker, db_session,
                                          sample_email, sample_member, now):
        mock_get_emails = mocker.patch(
            'app.na_celery.email_tasks.dao_get_approved_emails_for_sending')

        create_email(send_starts_at='2020-06-02',
                     created_at='2020-06-01',
                     send_after='2020-06-03 9:00',
                     email_state=APPROVED)
        with freeze_time(now):
            send_periodic_emails()

        assert not mock_get_emails.called
Beispiel #8
0
    def it_gets_latest_announcement_event_magazine_emails(
            self, db_session, sample_magazine):
        event_email = create_email()
        magazine_email = create_email(email_type=MAGAZINE,
                                      magazine_id=sample_magazine.id)
        announcement_email = create_email(email_type=ANNOUNCEMENT)
        anon_reminder_email = create_email(email_type=ANON_REMINDER)

        emails = dao_get_latest_emails()

        assert len(emails) == 3
        assert set([event_email, magazine_email,
                    announcement_email]) == set(emails)
        assert anon_reminder_email not in emails
Beispiel #9
0
def sample_email(db):
    return create_email(
        details='<strong>Fees:</strong> 10, <strong>Concessions:</strong> 5',
        created_at='2019-06-01',
        expires='2019-07-01',
        email_state=APPROVED
    )
    def it_creates_an_email(self, db_session):
        email = create_email()
        assert Email.query.count() == 1

        email_from_db = Email.query.filter(Email.id == email.id).first()

        assert email == email_from_db
Beispiel #11
0
    def it_gets_past_hour_emails_for_provider(self, db, db_session,
                                              sample_member, sample_email,
                                              sample_email_provider):
        email = create_email(send_starts_at="2020-10-30",
                             send_after="2020-10-30T20:30:00",
                             expires="2020-11-07",
                             email_state=APPROVED)
        member = create_member(email="*****@*****.**")
        email_to_member = create_email_to_member(
            email_id=email.id, created_at="2020-10-31T12:00:00")
        create_email_to_member(
            member_id=sample_member.id,
            email_id=email.id,
            created_at="2020-10-31T10:00:00",
            email_provider_id=email_to_member.email_provider_id)
        create_email_to_member(
            member_id=member.id,
            email_id=email.id,
            created_at="2020-10-31T11:31:00",
            email_provider_id=email_to_member.email_provider_id)

        # use another provider to show that it doesn't get that count
        email_provider = create_email_provider(name="Another email provider")
        create_email_to_member(
            member_id=sample_member.id,
            email_id=sample_email.id,
            email_provider_id=email_provider.id,
            created_at="2020-10-31T11:31:00",
        )

        count = dao_get_past_hour_email_count_for_provider(
            email_to_member.email_provider_id)
        assert count == 2
Beispiel #12
0
    def it_sends_email_in_hours(self, mocker, db_session, sample_email,
                                sample_member, now):
        mock_send_emails = mocker.patch(
            'app.na_celery.email_tasks.send_emails')
        event_date = create_event_date(event_datetime='2020-09-20 19:00')
        event = create_event(event_dates=[event_date])
        create_email(send_starts_at='2020-09-02',
                     created_at='2020-09-01',
                     send_after='2020-09-03 8:00',
                     expires=None,
                     email_state=APPROVED,
                     old_event_id=None,
                     event_id=event.id)
        with freeze_time(now):
            send_periodic_emails()

        assert mock_send_emails.called
Beispiel #13
0
    def it_gets_all_emails_count_for_chosen_provider(self, db, db_session):
        email = create_email()
        member = create_member(email='*****@*****.**', name='Test1')
        create_email_to_member(email_id=email.id, member_id=member.id)

        email_to_member = create_email_to_member()

        assert dao_get_todays_email_count_for_provider(
            email_to_member.email_provider_id) == 2
Beispiel #14
0
    def it_creates_an_event_email(self, db_session, sample_event_with_dates):
        email = create_email(event_id=sample_event_with_dates.id,
                             old_event_id=None)
        assert Email.query.count() == 1

        email_from_db = Email.query.filter(Email.id == email.id).first()

        assert email == email_from_db
        assert email_from_db.send_starts_at == \
            datetime.strptime(sample_event_with_dates.get_first_event_date(), "%Y-%m-%d") - timedelta(weeks=2)
Beispiel #15
0
def sample_magazine_email(db):
    magazine = create_magazine(title="New mag", filename="new_mag.pdf")
    return create_email(
        magazine_id=magazine.id,
        details='<strong>Fees:</strong> 10, <strong>Concessions:</strong> 5',
        created_at='2019-06-01',
        expires='2019-07-01',
        email_type=MAGAZINE,
        email_state=APPROVED
    )
    def it_gets_emails_from_starting_date_from_last_year(
            self, db, db_session, sample_email):
        emails = [
            create_email(details='more details', created_at='2019-01-01'),
            sample_email
        ]

        emails_from_db = dao_get_emails_for_year_starting_on()
        assert Email.query.count() == 2
        assert set(emails) == set(emails_from_db)
Beispiel #17
0
    def it_returns_future_emails(self, client, db, db_session):
        event = create_event(title='Event 1')
        event_2 = create_event(title='Event 2')
        event_3 = create_event(title='Event 3')
        past_event = create_event(title='Past event')

        event_date = create_event_date(event_id=str(event.id),
                                       event_datetime='2019-07-20 19:00')
        event_date_2 = create_event_date(event_id=str(event_2.id),
                                         event_datetime='2019-07-13 19:00')
        event_date_3 = create_event_date(event_id=str(event_3.id),
                                         event_datetime='2019-08-13 19:00')
        past_event_date = create_event_date(event_id=str(past_event.id),
                                            event_datetime='2019-06-13 19:00')

        future_email = create_email(event_id=str(event.id),
                                    created_at='2019-07-01 11:00',
                                    send_starts_at='2019-07-10',
                                    expires='2019-07-20')
        future_email_2 = create_email(event_id=str(event_2.id),
                                      created_at='2019-07-01 11:00',
                                      send_starts_at='2019-07-01',
                                      expires='2019-07-12')
        future_email_3 = create_email(event_id=str(event_3.id),
                                      created_at='2019-07-01 11:00',
                                      send_starts_at='2019-08-01',
                                      expires='2019-08-12')
        # email below will be ignored as its in the past
        create_email(event_id=str(past_event.id),
                     created_at='2019-06-01 11:00',
                     send_starts_at='2019-06-01',
                     expires='2019-06-12')

        response = client.get(url_for('emails.get_future_emails'),
                              headers=[('Content-Type', 'application/json'),
                                       create_authorization_header()])
        json_future_emails = json.loads(response.get_data(as_text=True))

        assert len(json_future_emails) == 3
        assert json_future_emails[0] == future_email.serialize()
        assert json_future_emails[1] == future_email_2.serialize()
        assert json_future_emails[2] == future_email_3.serialize()
    def it_gets_future_emails(self, db, db_session):
        active_email = create_email(created_at='2019-07-01 11:00',
                                    send_starts_at='2019-07-10',
                                    expires='2019-07-20')
        active_email_2 = create_email(created_at='2019-07-01 11:00',
                                      send_starts_at='2019-07-01',
                                      expires='2019-07-12')
        active_email_3 = create_email(created_at='2019-07-01 11:00',
                                      send_starts_at='2019-07-11',
                                      expires='2019-07-18')
        # these emails below are not active
        create_email(created_at='2019-07-01 11:00',
                     send_starts_at='2019-07-01',
                     expires='2019-07-09')

        emails_from_db = dao_get_future_emails()
        assert len(emails_from_db) == 3
        assert emails_from_db[0] == active_email
        assert emails_from_db[1] == active_email_2
        assert emails_from_db[2] == active_email_3
Beispiel #19
0
    def it_only_sends_approved_emails_periodically(self, mocker, db,
                                                   db_session, sample_email,
                                                   sample_member):
        mock_send_emails = mocker.patch(
            'app.na_celery.email_tasks.send_emails')
        create_email(send_starts_at='2019-06-07',
                     created_at='2019-06-01',
                     send_after='2019-06-07 9:00')
        create_email(send_starts_at='2019-08-08',
                     created_at='2019-06-01',
                     send_after='2019-07-14 9:00')

        approved_email = create_email(send_starts_at='2019-06-02',
                                      created_at='2019-06-01',
                                      send_after='2019-06-03 9:00',
                                      email_state=APPROVED)
        send_periodic_emails()

        assert mock_send_emails.call_count == 1
        assert mock_send_emails.call_args_list[0][0][0] == approved_email.id
Beispiel #20
0
    def it_creates_a_magazine_email(self, db_session):
        magazine = create_magazine()
        email = create_email(magazine_id=magazine.id,
                             email_type=MAGAZINE,
                             old_id=None)
        assert Email.query.count() == 1

        email_from_db = Email.query.filter(Email.id == email.id).first()

        assert email == email_from_db
        assert email_from_db.magazine_id == magazine.id
Beispiel #21
0
    def it_gets_emails_count_only_for_today_only(self, db, db_session):
        email = create_email()
        member = create_member(email='*****@*****.**', name='Test1')
        created_at = datetime.now() - timedelta(days=1)
        create_email_to_member(created_at=created_at,
                               email_id=email.id,
                               member_id=member.id)

        email_to_member = create_email_to_member()

        assert dao_get_todays_email_count_for_provider(
            email_to_member.email_provider_id) == 1
Beispiel #22
0
    def it_sends_emails_anytime(self, mocker, db_session, sample_email,
                                sample_member, now):
        mocker.patch.dict('app.application.config', {
            'ENVIRONMENT': 'test',
            'EMAIL_RESTRICT': None,
            'EMAIL_ANYTIME': True
        })
        mock_send_emails = mocker.patch(
            'app.na_celery.email_tasks.send_emails')

        event_date = create_event_date(event_datetime='2020-09-20 19:00')
        event = create_event(event_dates=[event_date])
        create_email(send_starts_at='2020-09-02',
                     created_at='2020-09-01',
                     send_after='2020-09-03 8:00',
                     expires=None,
                     email_state=APPROVED,
                     old_event_id=None,
                     event_id=event.id)

        with freeze_time(now):
            send_periodic_emails()

        assert mock_send_emails.called
Beispiel #23
0
    def it_uploads_a_magazine_pdf_and_reuses_email(self, app, db_session,
                                                   mocker, sample_magazine,
                                                   sample_user):
        mocker.patch('app.na_celery.upload_tasks.Storage')
        mocker.patch('app.na_celery.upload_tasks.base64')
        mocker.patch('app.na_celery.upload_tasks.extract_topics',
                     return_value='Philosophy: Meaning of Life And Death')
        mock_send_email = mocker.patch(
            'app.na_celery.upload_tasks.send_smtp_email', return_value=200)
        email = create_email(magazine_id=sample_magazine.id,
                             email_type=MAGAZINE)

        upload_magazine(sample_magazine.id, 'pdf data')

        assert mock_send_email.called
        assert '<div>Please review this email: {}/emails/{}</div>'.format(
            app.config['FRONTEND_ADMIN_URL'],
            str(email.id)) in mock_send_email.call_args[0][2]
    def it_shows_email_json_on_serialize(self, db, db_session):
        email = create_email(created_at='2019-06-01T10:00:00',
                             send_starts_at='2019-06-02T11:00:00')

        assert email.serialize() == {
            'id': str(email.id),
            'subject': 'workshop: test title',
            'event_id': str(email.event_id),
            'old_id': email.old_id,
            'old_event_id': email.old_event_id,
            'created_at': '2019-06-01 10:00',
            'extra_txt': u'test extra text',
            'details': u'test event details',
            'replace_all': False,
            'email_type': u'event',
            'email_state': u'draft',
            'send_starts_at': '2019-06-02',
            'expires': '2019-06-21',
            'task_id': None
        }
Beispiel #25
0
    def it_get_emails_sent_count_for_specified_month(self, db, db_session,
                                                     sample_member,
                                                     sample_email):
        email = create_email(send_starts_at="2020-11-30",
                             send_after="2020-11-30T20:30:00",
                             expires="2020-12-20",
                             email_state=APPROVED)
        member = create_member(email="*****@*****.**")
        # counted
        create_email_to_member(email_id=email.id,
                               created_at="2020-11-30T12:00:00")
        # not counted
        create_email_to_member(member_id=sample_member.id,
                               email_id=email.id,
                               created_at="2020-12-11T12:30:00")
        create_email_to_member(member_id=member.id,
                               email_id=email.id,
                               created_at="2020-12-12T12:00:00")

        count = dao_get_emails_sent_count(month=11, year=2020)
        assert count == 1
Beispiel #26
0
    def it_handles_error_from_extract_topics(self, app, db_session, mocker,
                                             sample_magazine, sample_user):
        mocker.patch('app.na_celery.upload_tasks.extract_topics',
                     side_effect=Exception('Unknown'))
        mocker.patch('app.na_celery.upload_tasks.Storage')
        mocker.patch('app.na_celery.upload_tasks.base64')
        mock_logger = mocker.patch(
            'app.na_celery.upload_tasks.current_app.logger.error')
        mock_send_email = mocker.patch(
            'app.na_celery.upload_tasks.send_smtp_email', return_value=200)
        email = create_email(magazine_id=sample_magazine.id,
                             email_type=MAGAZINE)

        upload_magazine(sample_magazine.id, 'pdf data')

        assert mock_logger.called
        assert 'Error extracting topics:' in mock_logger.call_args[0][0]

        assert mock_send_email.called
        assert '<div>Please review this email: {}/emails/{}</div>'.format(
            app.config['FRONTEND_ADMIN_URL'],
            str(email.id)) in mock_send_email.call_args[0][2]
Beispiel #27
0
 def it_doesnt_create_a_magazine_email_if_no_magazine_id(self, db_session):
     create_email(email_type=MAGAZINE, old_id=None)
     assert Email.query.count() == 0
    def it_gets_an_email_by_id(self, db, db_session, sample_email):
        email = create_email(details='new event details')

        fetched_email = dao_get_email_by_id(email.id)
        assert fetched_email == email