Example #1
0
    def it_only_sends_to_unsent_members_and_shows_failed_stat(
            self, mocker, db, db_session, sample_email, sample_member,
            sample_email_provider):
        mocker.patch.dict('app.application.config', {
            'ENVIRONMENT': 'test',
            'EMAIL_RESTRICT': None
        })

        member_1 = create_member(name='Test 1', email='*****@*****.**')
        member_2 = create_member(name='Test 2', email='*****@*****.**')
        create_member(name='Test 2', email='*****@*****.**', active=False)

        create_email_to_member(sample_email.id,
                               sample_member.id,
                               status_code=500)

        # respond with 201 on 2nd call
        mock_send_email = mocker.patch('app.na_celery.email_tasks.send_email',
                                       side_effect=[
                                           (200, sample_email_provider.id),
                                           (201, sample_email_provider.id)
                                       ])
        send_emails(sample_email.id)

        assert mock_send_email.call_count == 2
        assert mock_send_email.call_args_list[0][0][0] == member_1.email
        assert mock_send_email.call_args_list[1][0][0] == member_2.email
        assert sample_email.serialize()['emails_sent_counts'] == {
            'success': 2,
            'failed': 1,
            'total_active_members': 3
        }
Example #2
0
    def it_doesnt_send_instagram_stats(self, mocker, db, db_session):
        mocker.patch.dict('app.application.config', {'INSTAGRAM_URL': ''})

        create_member(created_at='2020-10-10T10:00:00')
        create_member(email='*****@*****.**',
                      created_at='2020-12-10T10:00:00')
        mock_send_ga_event = mocker.patch(
            'app.na_celery.stats_tasks.send_ga_event')

        with requests_mock.mock() as r:
            r.get(
                current_app.config.get('FACEBOOK_URL'),
                text=
                '<html><body><div><div>1,000</div><div>Total follows</div></div></body></html>'
            )
            r.get(
                current_app.config.get('INSTAGRAM_URL'),
                text=
                '{"data":{"user":{"edge_followed_by":{"count":1100,"page_info":'
                '{"has_next_page":false,"end_cursor":null},"edges":[]}}},"status":"ok"}'
            )

            send_num_subscribers_and_social_stats()
            assert mock_send_ga_event.call_args_list == [
                call('Number of subscribers', 'members',
                     'num_subscribers_december', 2),
                call('Number of new subscribers', 'members',
                     'num_new_subscribers_december', 1),
                call('Facebook followers count', 'social',
                     'num_facebook_december', 1000),
                call('Instagram followers count', 'social',
                     'num_instagram_december', 'url not set'),
            ]
Example #3
0
    def it_doesnt_create_members_with_same_email(self, db_session,
                                                 sample_member):
        with pytest.raises(expected_exception=IntegrityError):
            create_member(name='Sid Grey', email=sample_member.email)

        members = Member.query.all()
        assert len(members) == 1
Example #4
0
    def it_only_sends_to_3_emails_if_not_live_environment(
            self, mocker, db_session, sample_email, sample_member,
            sample_email_provider):
        mocker.patch.dict('app.application.config', {
            'ENVIRONMENT': 'test',
            'EMAIL_RESTRICT': None
        })

        member_1 = create_member(name='Test 1', email='*****@*****.**')
        member_2 = create_member(name='Test 2', email='*****@*****.**')
        create_member(name='Test 3', email='*****@*****.**')

        mock_send_email = mocker.patch('app.na_celery.email_tasks.send_email',
                                       return_value=(200,
                                                     sample_email_provider.id))
        send_emails(sample_email.id)

        assert mock_send_email.call_count == 3
        assert mock_send_email.call_args_list[0][0][0] == sample_member.email
        assert mock_send_email.call_args_list[1][0][0] == member_1.email
        assert mock_send_email.call_args_list[2][0][0] == member_2.email
        assert sample_email.serialize()['emails_sent_counts'] == {
            'success': 3,
            'failed': 0,
            'total_active_members': 4
        }

        emails_to_members = EmailToMember.query.all()
        assert len(emails_to_members) == 3
        assert emails_to_members[
            0].email_provider_id == sample_email_provider.id
        assert emails_to_members[0].created_at == datetime.strptime(
            "2020-10-09 19:00", "%Y-%m-%d %H:%M")
Example #5
0
    def it_sends_num_subscribers_and_failed_social_stats(
            self, mocker, db, db_session):
        create_member(created_at='2020-10-10T10:00:00')
        mock_send_ga_event = mocker.patch(
            'app.na_celery.stats_tasks.send_ga_event')

        with requests_mock.mock() as r:
            r.get(
                current_app.config.get('FACEBOOK_URL'),
                text=
                '<html><body><div><div>1,000</div><div>Total followers</div></div></body></html>'
            )
            r.get(current_app.config.get('INSTAGRAM_URL'),
                  text='<html><head><meta property="og:description" content="'
                  '1,100 Following, 200 Posts"/></head></html>')

            send_num_subscribers_and_social_stats()
            assert mock_send_ga_event.call_args_list == [
                call('Number of subscribers', 'members',
                     'num_subscribers_november', 1),
                call('Number of new subscribers', 'members',
                     'num_new_subscribers_november', 0),
                call('Facebook followers count', 'social',
                     'num_facebook_november', 'failed'),
                call('Instagram followers count', 'social',
                     'num_instagram_november', 'failed'),
            ]
Example #6
0
    def it_sends_an_email_to_members_up_to_email_limit(self, mocker,
                                                       db_session,
                                                       sample_email,
                                                       sample_member, monthly,
                                                       daily, hourly, minute):
        mocker.patch.dict('app.application.config', {
            'ENVIRONMENT': 'live',
            'EMAIL_RESTRICT': None
        })
        mocker.patch('requests.post')
        email_provider = create_email_provider(monthly_limit=monthly,
                                               daily_limit=daily,
                                               hourly_limit=hourly,
                                               minute_limit=minute)

        member_1 = create_member(name='Test 1', email='*****@*****.**')
        create_member(name='Test 2', email='*****@*****.**')

        mock_send_email = mocker.patch('app.na_celery.email_tasks.send_email',
                                       return_value=(200, email_provider.id))
        send_emails(sample_email.id)

        assert mock_send_email.call_count == 2
        assert mock_send_email.call_args_list[0][0][0] == sample_member.email
        assert mock_send_email.call_args_list[1][0][0] == member_1.email
        assert sample_email.serialize()['emails_sent_counts'] == {
            'success': 2,
            'failed': 0,
            'total_active_members': 3
        }
Example #7
0
    def it_only_sends_to_3_emails_if_not_live_environment(
            self, mocker, db, db_session, sample_email, sample_member):
        member_1 = create_member(name='Test 1', email='*****@*****.**')
        member_2 = create_member(name='Test 2', email='*****@*****.**')
        member_3 = create_member(name='Test 3', email='*****@*****.**')

        mock_send_email = mocker.patch('app.na_celery.email_tasks.send_email',
                                       return_value=200)
        send_emails(sample_email.id)

        assert mock_send_email.call_count == 3
        assert mock_send_email.call_args_list[0][0][0] == sample_member.email
        assert mock_send_email.call_args_list[1][0][0] == member_1.email
        assert mock_send_email.call_args_list[2][0][0] == member_2.email
Example #8
0
    def it_gets_only_members_not_sent_to(self, db_session, sample_member,
                                         sample_email):
        member = create_member(email='*****@*****.**')
        create_member(email='*****@*****.**', active=False)
        email_to_member = EmailToMember(email_id=sample_email.id,
                                        member_id=sample_member.id,
                                        created_at='2019-08-01 12:00:00')
        dao_create_email_to_member(email_to_member)

        unsent_members = dao_get_members_not_sent_to(sample_email.id)

        member_id, email = unsent_members[0]

        assert len(unsent_members) == 1
        assert str(member_id) == str(member.id)
        assert email == member.email
Example #9
0
    def it_creates_an_member(self, db_session):
        member = create_member()
        assert Member.query.count() == 1

        member_from_db = Member.query.filter(Member.id == member.id).first()

        assert member == member_from_db
Example #10
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
Example #11
0
    def it_only_sends_to_1_emails_if_restrict_email(self, mocker, db,
                                                    db_session, sample_email,
                                                    sample_member,
                                                    sample_email_provider):
        mocker.patch.dict('app.application.config', {
            'ENVIRONMENT': 'test',
            'EMAIL_RESTRICT': 1
        })

        create_member(name='Test 1', email='*****@*****.**')

        mock_send_email = mocker.patch('app.na_celery.email_tasks.send_email',
                                       return_value=(200,
                                                     sample_email_provider.id))
        send_emails(sample_email.id)

        assert mock_send_email.call_count == 1
        assert mock_send_email.call_args_list[0][0][0] == sample_member.email
Example #12
0
    def it_doesnt_send_unapproved_emails(self, mocker, db, db_session,
                                         sample_email, sample_member):
        mocker.patch.dict('app.application.config', {
            'ENVIRONMENT': 'test',
            'EMAIL_RESTRICT': 1
        })
        sample_email.email_state = DRAFT

        create_member(name='Test 1', email='*****@*****.**')

        mock_send_email = mocker.patch('app.na_celery.email_tasks.send_email',
                                       return_value=200)
        mock_logger = mocker.patch(
            'app.na_celery.email_tasks.current_app.logger.info')
        send_emails(sample_email.id)

        assert not mock_send_email.called
        assert mock_logger.called
Example #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
Example #14
0
    def it_doesnt_update_members_with_same_email(self, db_session, sample_member):
        member = create_member(email='*****@*****.**')
        with pytest.raises(expected_exception=IntegrityError):
            dao_update_member(str(member.id), email=sample_member.email)

        members = Member.query.all()
        assert len(members) == 2
        assert members[0].email == sample_member.email
        assert members[1].email == member.email
Example #15
0
    def it_returns_all_members(self, client, db_session, sample_member):
        member = create_member(name='Sid Green',
                               email='*****@*****.**',
                               active=False)

        response = client.get(url_for('members.get_members'),
                              headers=[('Content-Type', 'application/json'),
                                       create_authorization_header()])

        assert len(response.json) == 2
        assert response.json[0] == jsonify(sample_member.serialize()).json
        assert response.json[1] == jsonify(member.serialize()).json
Example #16
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
    def it_adds_a_member_sent_to_email(self, db, db_session, sample_email,
                                       sample_member):
        members = [sample_member]
        dao_update_email(sample_email.id, members_sent_to=members)

        member = create_member(name='New member',
                               email='*****@*****.**')

        dao_add_member_sent_to_email(sample_email.id, member.id)
        email_from_db = Email.query.filter(Email.id == sample_email.id).first()

        assert email_from_db.members_sent_to == [sample_member, member]
Example #18
0
    def it_sends_a_magazine_email(self, mocker, db_session,
                                  sample_magazine_email, sample_member,
                                  sample_email_provider):
        mocker.patch.dict('app.application.config', {
            'ENVIRONMENT': 'test',
            'EMAIL_RESTRICT': 1
        })

        create_member(name='Test 1', email='*****@*****.**')

        mock_send_email = mocker.patch(
            'app.na_celery.email_tasks.send_email',
            return_value=(200, str(sample_email_provider.id)))
        send_emails(sample_magazine_email.id)

        magazine = Magazine.query.filter_by(
            id=sample_magazine_email.magazine_id).first()
        assert magazine

        assert magazine.title in mock_send_email.call_args_list[0][0][1]
        assert magazine.filename in mock_send_email.call_args_list[0][0][2]
        assert mock_send_email.call_count == 1
        assert mock_send_email.call_args_list[0][0][0] == sample_member.email
Example #19
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
Example #20
0
    def it_creates_email_to_members_for_imported_emailmailingss(
            self, client, db_session, sample_email, sample_member):
        member = create_member(old_id=2,
                               name='Jack Green',
                               email='*****@*****.**')
        data = [
            {
                "id": "1",
                "emailid": "1",
                "mailinglistid": "1",
                "timestamp": "2019-06-10 17:30:00"
            },
            {
                "id": "2",
                "emailid": "1",
                "mailinglistid": "2",
                "timestamp": "2019-06-11 17:30:00"
            },
        ]

        response = client.post(url_for('emails.import_emails_members_sent_to'),
                               data=json.dumps(data),
                               headers=[('Content-Type', 'application/json'),
                                        create_authorization_header()])

        assert response.status_code == 201
        assert response.json['emails_members_sent_to'][0]['email_id'] == str(
            sample_email.id)
        assert response.json['emails_members_sent_to'][0]['member_id'] == str(
            sample_member.id)
        assert response.json['emails_members_sent_to'][0][
            'created_at'] == data[0]['timestamp']
        assert response.json['emails_members_sent_to'][1]['email_id'] == str(
            sample_email.id)
        assert response.json['emails_members_sent_to'][1]['member_id'] == str(
            member.id)
        assert response.json['emails_members_sent_to'][1][
            'created_at'] == data[1]['timestamp']
Example #21
0
    def it_gets_an_member_by_id(self, db, db_session, sample_member):
        member = create_member(name='Sid Grey', email='*****@*****.**')

        fetched_member = dao_get_member_by_id(member.id)
        assert fetched_member == member
Example #22
0
def sample_member(db):
    return create_member(name='Sue Green', email='*****@*****.**')