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 }
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'), ]
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
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")
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'), ]
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 }
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
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
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
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
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
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
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
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
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
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]
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
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
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']
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
def sample_member(db): return create_member(name='Sue Green', email='*****@*****.**')