def test_signup_for_opportunity(self): self.opportunity1.is_public = True self.opportunity1.planned_publish = datetime.date.today() - datetime.timedelta(2) db.session.commit() with mail.record_messages() as outbox: self.assertEquals(Vendor.query.count(), 1) post = self.client.post('/beacon/opportunities/{}'.format(self.opportunity1.id), data={ 'email': '*****@*****.**', 'business_name': 'foo' }) # should create a new vendor self.assertEquals(Vendor.query.count(), 2) # should subscribe that vendor to the opportunity self.assertEquals(len(Vendor.query.filter(Vendor.email == '*****@*****.**').first().opportunities), 1) self.assertTrue( self.opportunity1.id in [ i.id for i in Vendor.query.filter(Vendor.email == '*****@*****.**').first().opportunities ] ) # should redirect and flash properly self.assertEquals(post.status_code, 302) self.assert_flashes('Successfully subscribed for updates!', 'alert-success') self.assertEquals(len(outbox), 1)
def test_update_and_publish_oppportunity_as_admin(self): data = { 'department': str(self.department1.id), 'contact_email': self.staff.email, 'title': 'test_create_edit_publish', 'description': 'bar', 'planned_publish': datetime.date.today(), 'planned_submission_start': datetime.date.today(), 'planned_submission_end': datetime.date.today() + datetime.timedelta(1), 'save_type': 'save', 'subcategories-{}'.format(Category.query.all()[-1].id): 'on', 'opportunity_type': self.opportunity_type.id } self.login_user(self.admin) self.assertEquals(Opportunity.query.count(), 4) with mail.record_messages() as outbox: self.client.post('/beacon/admin/opportunities/new', data=data) self.assertEquals(Opportunity.query.count(), 5) # doesn't send the opportunity yet self.assertEquals(len(outbox), 0) data.update({'save_type': 'publish'}) self.client.post('/beacon/admin/opportunities/{}'.format( Opportunity.query.filter(Opportunity.title == 'test_create_edit_publish').first().id), data=data ) # sends the opportunity when updated with the proper save type self.assertEquals(len(outbox), 1) self.assertEquals(outbox[0].subject, '[Pittsburgh Purchasing] A new City of Pittsburgh opportunity from Beacon!')
def test_update_and_publish_oppportunity_as_admin(self): '''Test that 'publishing' an opportunity sends the proper emails ''' data = { 'department': str(self.department1.id), 'contact_email': self.staff.email, 'title': 'test_create_edit_publish', 'description': 'bar', 'planned_publish': datetime.date.today(), 'planned_submission_start': datetime.date.today(), 'planned_submission_end': datetime.date.today() + datetime.timedelta(1), 'save_type': 'save', 'subcategories-{}'.format(Category.query.all()[-1].id): 'on' } self.login_user(self.admin) self.assertEquals(Opportunity.query.count(), 4) with mail.record_messages() as outbox: self.client.post('/beacon/admin/opportunities/new', data=data) self.assertEquals(Opportunity.query.count(), 5) # doesn't send the opportunity yet self.assertEquals(len(outbox), 0) data.update({'save_type': 'publish'}) self.client.post('/beacon/admin/opportunities/{}'.format( Opportunity.query.filter(Opportunity.title == 'test_create_edit_publish').first().id), data=data ) # sends the opportunity when updated with the proper save type self.assertEquals(len(outbox), 1) self.assertEquals(outbox[0].subject, '[Pittsburgh Purchasing] A new City of Pittsburgh opportunity from Beacon!')
def test_scout_expiration_soon(self): nightly = ScoutContractsExpireSoonJob(time_override=True) scheduled, existing_job = nightly.schedule_job() with mail.record_messages() as outbox: nightly.run_job(scheduled) self.assertEquals(len(outbox), 1) self.assertEquals(outbox[0].subject, "[Pittsburgh Purchasing] " + nightly.notification_props["subject"])
def test_conductor_send_update(self): '''Test sending an email/into the activity stream ''' self.assign_contract() self.assertEquals(ContractStageActionItem.query.count(), 0) detail_view_url = self.detail_view.format(self.contract1.id, self.stage1.id) # make sure the form validators work bad_post = self.client.post(detail_view_url + '?form=update', data=dict(send_to='bademail', subject='test', body='test'), follow_redirects=True) self.assertEquals(ContractStageActionItem.query.count(), 0) self.assertEquals(bad_post.status_code, 200) self.assertTrue('Invalid email address.' in bad_post.data) with mail.record_messages() as outbox: good_post = self.client.post(detail_view_url + '?form=update', data=dict(send_to='*****@*****.**', subject='test', body='test'), follow_redirects=True) self.assertEquals(len(outbox), 1) self.assertEquals(ContractStageActionItem.query.count(), 1) self.assertTrue('*****@*****.**' in outbox[0].send_to) self.assertTrue('test' in outbox[0].subject) self.assertTrue('with the subject' in good_post.data)
def test_conductor_send_update(self): '''Test sending an email/into the activity stream ''' self.assign_contract() self.assertEquals(ContractStageActionItem.query.count(), 0) detail_view_url = self.detail_view.format(self.contract1.id, self.stage1.id) # make sure the form validators work bad_post = self.client.post(detail_view_url + '?form=update', data=dict( send_to='bademail', subject='test', body='test' ), follow_redirects=True) self.assertEquals(ContractStageActionItem.query.count(), 0) self.assertEquals(bad_post.status_code, 200) self.assertTrue('Invalid email address.' in bad_post.data) with mail.record_messages() as outbox: good_post = self.client.post(detail_view_url + '?form=update', data=dict( send_to='*****@*****.**', subject='test', body='test' ), follow_redirects=True) self.assertEquals(len(outbox), 1) self.assertEquals(ContractStageActionItem.query.count(), 1) self.assertTrue('*****@*****.**' in outbox[0].send_to) self.assertTrue('test' in outbox[0].subject) self.assertTrue('with the subject' in good_post.data)
def test_scout_expiration_soon(self): nightly = ScoutContractsExpireSoonJob(time_override=True) scheduled, existing_job = nightly.schedule_job() with mail.record_messages() as outbox: nightly.run_job(scheduled) self.assertEquals(len(outbox), 1) self.assertEquals( outbox[0].subject, '[Pittsburgh Purchasing] ' + nightly.notification_props['subject'])
def test_vendor_signup_unpublished(self): with mail.record_messages() as outbox: # vendor should not be able to sign up for unpublished opp bad_contract = self.client.post('/beacon/opportunities', data={ 'email': '*****@*****.**', 'business_name': 'foo', 'opportunity': str(self.opportunity3.id), }) self.assertEquals(len(Vendor.query.get(1).opportunities), 0) self.assertTrue('not a valid choice.' in bad_contract.data) self.assertEquals(len(outbox), 0)
def test_beacon_new_opportunity_nightly(self): nightly = BeaconNewOppotunityOpenJob(time_override=True) scheduled, existing_job = nightly.schedule_job() with mail.record_messages() as outbox: nightly.run_job(scheduled) self.assertEquals(len(outbox), 2) self.assertEquals( outbox[0].subject, "[Pittsburgh Purchasing] A new City of Pittsburgh opportunity from Beacon!" ) self.assertTrue(self.opportunity.publish_notification_sent)
def test_pending_notification_email(self): self.login_user(self.admin) self.assertFalse(self.opportunity3.publish_notification_sent) with mail.record_messages() as outbox: self.client.get('/beacon/admin/opportunities/{}/publish'.format( self.opportunity3.id)) self.assertTrue(self.opportunity3.is_published) self.assertTrue(self.opportunity3.is_public) self.assertTrue(self.opportunity3.publish_notification_sent) self.assertEquals(len(outbox), 2)
def test_pending_notification_email(self): self.login_user(self.admin) self.assertFalse(self.opportunity3.publish_notification_sent) with mail.record_messages() as outbox: self.client.get('/beacon/admin/opportunities/{}/publish'.format( self.opportunity3.id )) self.assertTrue(self.opportunity3.is_published) self.assertTrue(self.opportunity3.is_public) self.assertTrue(self.opportunity3.publish_notification_sent) self.assertEquals(len(outbox), 2)
def test_beacon_new_opportunity_nightly(self): nightly = BeaconNewOppotunityOpenJob(time_override=True) scheduled, existing_job = nightly.schedule_job() with mail.record_messages() as outbox: nightly.run_job(scheduled) self.assertEquals(len(outbox), 2) self.assertEquals( outbox[0].subject, '[Pittsburgh Purchasing] A new City of Pittsburgh opportunity from Beacon!' ) self.assertTrue(self.opportunity.publish_notification_sent)
def test_feedback(self): ''' Test wexplorer contract feedback mechanism ''' self.assert200(self.client.get('/wexplorer/contracts/1/feedback')) self.assert_template_used('wexplorer/feedback.html') self.assert404(self.client.get('/wexplorer/contracts/1000/feedback')) contract = get_one_contract(1) # assert data validation bad_post = self.client.post('/wexplorer/contracts/1/feedback', data=dict(sender='JUNK')) self.assert200(bad_post) # correct template self.assert_template_used('wexplorer/feedback.html') # two alerts self.assertTrue(bad_post.data.count('alert-danger'), 2) # feedback is required self.assertTrue(bad_post.data.count('field is required'), 1) # email must be email self.assertTrue(bad_post.data.count('Invalid'), 1) # assert email works properly self.login_user(self.admin_user) with mail.record_messages() as outbox: success_post = self.client.post('/wexplorer/contracts/1/feedback', data=dict(body='test')) # the mail sent self.assertEquals(len(outbox), 1) # it went to the right place self.assertTrue( current_app.config['ADMIN_EMAIL'] in outbox[0].send_to) # assert the subject is right self.assertTrue(str(contract.id) in outbox[0].subject) self.assertTrue(contract.description in outbox[0].subject) # the message body contains the right email address self.assertTrue(self.admin_user.email in outbox[0].html) # it redirects and flashes correctly self.assertEquals(success_post.status_code, 302) self.assertEquals(success_post.location, 'http://localhost/wexplorer/contracts/1') self.assert_flashes('Thank you for your feedback!', 'alert-success')
def test_pending_notification_email_gated(self): self.login_user(self.admin) self.opportunity3.planned_publish = datetime.date.today( ) + datetime.timedelta(1) self.assertFalse(self.opportunity3.publish_notification_sent) db.session.commit() with mail.record_messages() as outbox: self.client.get('/beacon/admin/opportunities/{}/publish'.format( self.opportunity3.id)) self.assertFalse(self.opportunity3.is_published) self.assertTrue(self.opportunity3.is_public) self.assertFalse(self.opportunity3.publish_notification_sent) self.assertEquals(len(outbox), 1) self.assertTrue('A new City of Pittsburgh opportunity from Beacon' not in [i.subject for i in outbox])
def test_conductor_send_update(self): assign = self.assign_contract() self.assertEquals(ContractStageActionItem.query.count(), 1) detail_view_url = self.build_detail_view(assign) # make sure the form validators work bad_post = self.client.post(detail_view_url + '?form=update', data=dict(send_to='bademail', subject='test', body='test'), follow_redirects=True) self.assertEquals(ContractStageActionItem.query.count(), 1) self.assertEquals(bad_post.status_code, 200) self.assertTrue( 'One of the supplied emails is invalid' in bad_post.data) with mail.record_messages() as outbox: good_post = self.client.post( detail_view_url + '?form=update', data=dict(send_to='[email protected]; [email protected]', subject='test', body='test', send_to_cc='*****@*****.**'), follow_redirects=True) self.assertEquals(len(outbox), 1) self.assertEquals(ContractStageActionItem.query.count(), 2) self.assertTrue('test' in outbox[0].subject) self.assertTrue('with the subject' in good_post.data) self.assertTrue(len(outbox[0].cc), 1) self.assertTrue(len(outbox[0].recipients), 2) good_post_ccs = self.client.post( detail_view_url + '?form=update', data=dict(send_to='*****@*****.**', subject='test', body='test', send_to_cc='[email protected]; [email protected]'), follow_redirects=True) self.assertEquals(len(outbox), 2) self.assertEquals(ContractStageActionItem.query.count(), 3) self.assertTrue('test' in outbox[1].subject) self.assertTrue('with the subject' in good_post_ccs.data) self.assertTrue(len(outbox[1].cc), 2) self.assertTrue(len(outbox[1].recipients), 1)
def test_feedback(self): ''' Test wexplorer contract feedback mechanism ''' self.assert200(self.client.get('/wexplorer/contracts/1/feedback')) self.assert_template_used('wexplorer/feedback.html') self.assert404(self.client.get('/wexplorer/contracts/1000/feedback')) contract = get_one_contract(1) # assert data validation bad_post = self.client.post('/wexplorer/contracts/1/feedback', data=dict( sender='JUNK' )) self.assert200(bad_post) # correct template self.assert_template_used('wexplorer/feedback.html') # two alerts self.assertTrue(bad_post.data.count('alert-danger'), 2) # feedback is required self.assertTrue(bad_post.data.count('field is required'), 1) # email must be email self.assertTrue(bad_post.data.count('Invalid'), 1) # assert email works properly self.login_user(self.admin_user) with mail.record_messages() as outbox: success_post = self.client.post('/wexplorer/contracts/1/feedback', data=dict( body='test' )) # the mail sent self.assertEquals(len(outbox), 1) # it went to the right place self.assertTrue(current_app.config['ADMIN_EMAIL'] in outbox[0].send_to) # assert the subject is right self.assertTrue(str(contract.id) in outbox[0].subject) self.assertTrue(contract.description in outbox[0].subject) # the message body contains the right email address self.assertTrue(self.admin_user.email in outbox[0].html) # it redirects and flashes correctly self.assertEquals(success_post.status_code, 302) self.assertEquals(success_post.location, 'http://localhost/wexplorer/contracts/1') self.assert_flashes('Thank you for your feedback!', 'alert-success')
def test_pending_notification_email_gated(self): self.login_user(self.admin) self.opportunity3.planned_publish = datetime.date.today() + datetime.timedelta(1) self.assertFalse(self.opportunity3.publish_notification_sent) db.session.commit() with mail.record_messages() as outbox: self.client.get('/beacon/admin/opportunities/{}/publish'.format( self.opportunity3.id )) self.assertFalse(self.opportunity3.is_published) self.assertTrue(self.opportunity3.is_public) self.assertFalse(self.opportunity3.publish_notification_sent) self.assertEquals(len(outbox), 1) self.assertTrue( 'A new City of Pittsburgh opportunity from Beacon' not in [i.subject for i in outbox] )
def test_feedback(self): self.assert200( self.client.get('/scout/contracts/{}/feedback'.format( self.contract1.id))) self.assert_template_used('scout/feedback.html') self.assert404(self.client.get('/scout/contracts/1000/feedback')) # assert data validation bad_post = self.client.post('/scout/contracts/{}/feedback'.format( self.contract1.id), data=dict(sender='JUNK')) self.assert200(bad_post) # correct template self.assert_template_used('scout/feedback.html') # two alerts self.assertTrue(bad_post.data.count('alert-danger'), 2) # feedback is required self.assertTrue(bad_post.data.count('field is required'), 1) # email must be email self.assertTrue(bad_post.data.count('Invalid'), 1) # assert email works properly self.login_user(self.admin_user) self.admin_user.email = '*****@*****.**' with mail.record_messages() as outbox: success_post = self.client.post( '/scout/contracts/{}/feedback'.format(self.contract1.id), data=dict(body='test')) # the mail sent self.assertEquals(len(outbox), 1) # it went to the right place self.assertTrue(self.admin_user.email in outbox[0].send_to) # it redirects and flashes correctly self.assertEquals(success_post.status_code, 302) self.assertEquals( success_post.location, 'http://localhost/scout/contracts/{}'.format( self.contract1.id)) self.assert_flashes('Thank you for your feedback!', 'alert-success')
def test_edit_contract(self): '''Test edit metadata for contracts ''' # subscribe to this contract self.login_user(self.conductor) self.client.get('/wexplorer/contracts/1/subscribe') edit_contract_url = '/conductor/contract/{}/edit'.format(self.contract1.id) self.assert200(self.client.get(edit_contract_url)) self.assert404(self.client.get('/conductor/contract/999/edit')) # test a form with malformed url bad_url = self.client.post(edit_contract_url, data={ 'contract_href': 'does not work!', 'description': 'this is a test', 'expiration_date': datetime.date(2015, 9, 30), 'financial_id': 1234, 'spec_number': 'test' }, follow_redirects=True) self.assertEquals(ContractBase.query.get(1).financial_id, self.contract1.financial_id) self.assert200(bad_url) self.assertTrue("That URL doesn't work!" in bad_url.data) # test a form with missing data missing_data = self.client.post(edit_contract_url, data={ 'contract_href': 'http://www.example.com', 'description': 'a different description!', 'financial_id': 1234 }, follow_redirects=True) self.assertEquals(ContractBase.query.get(1).financial_id, self.contract1.financial_id) self.assertEquals(ContractBase.query.get(1), self.contract1) self.assertTrue("This field is required." in missing_data.data) # test a good form with mail.record_messages() as outbox: good_post = self.client.post(edit_contract_url, data={ 'contract_href': 'http://www.example.com', 'description': 'a different description!', 'expiration_date': datetime.date(2015, 9, 30), 'financial_id': 1234, 'spec_number': '1234' }, follow_redirects=True) self.assertEquals(ContractBase.query.get(1).contract_href, 'http://www.example.com') self.assertEquals(ContractBase.query.get(1).description, 'a different description!') self.assertEquals(len(outbox), 1) self.assertTrue('*****@*****.**' in outbox[0].send_to) self.assertTrue('[Pittsburgh Procurement] A contract you follow has been updated!' in outbox[0].subject) self.assertTrue('Successfully Updated' in good_post.data)
def test_signup_for_opportunity(self): '''Test signup for individual opportunities ''' with mail.record_messages() as outbox: self.assertEquals(Vendor.query.count(), 0) post = self.client.post('/beacon/opportunities/{}'.format(self.opportunity3.id), data={ 'email': '*****@*****.**', 'business_name': 'foo' }) # should create a new vendor self.assertEquals(Vendor.query.count(), 1) # should subscribe that vendor to the opportunity self.assertEquals(len(Vendor.query.first().opportunities), 1) self.assertTrue(self.opportunity3.id in [i.id for i in Vendor.query.first().opportunities]) # should redirect and flash properly self.assertEquals(post.status_code, 302) self.assert_flashes('Successfully subscribed for updates!', 'alert-success') self.assertEquals(len(outbox), 1)
def test_create_and_publish_opportunity_as_admin(self): self.login_user(self.admin) self.assertEquals(Opportunity.query.count(), 4) with mail.record_messages() as outbox: self.client.post('/beacon/admin/opportunities/new', data={ 'department': str(self.department1.id), 'contact_email': self.staff.email, 'title': 'foo', 'description': 'bar', 'planned_publish': datetime.date.today(), 'planned_submission_start': datetime.date.today(), 'planned_submission_end': datetime.date.today() + datetime.timedelta(1), 'save_type': 'publish', 'subcategories-{}'.format(Category.query.all()[-1].id): 'on', 'opportunity_type': self.opportunity_type.id }) self.assertEquals(Opportunity.query.count(), 5) # should send to the single vendor signed up to receive info # about that category self.assertEquals(len(outbox), 1) self.assertEquals(outbox[0].subject, '[Pittsburgh Purchasing] A new City of Pittsburgh opportunity from Beacon!')
def test_conductor_send_update(self): '''Test sending an email/into the activity stream ''' assign = self.assign_contract() self.assertEquals(ContractStageActionItem.query.count(), 1) detail_view_url = self.build_detail_view(assign) # make sure the form validators work bad_post = self.client.post(detail_view_url + '?form=update', data=dict( send_to='bademail', subject='test', body='test' ), follow_redirects=True) self.assertEquals(ContractStageActionItem.query.count(), 1) self.assertEquals(bad_post.status_code, 200) self.assertTrue('One of the supplied emails is invalid' in bad_post.data) with mail.record_messages() as outbox: good_post = self.client.post(detail_view_url + '?form=update', data=dict( send_to='[email protected]; [email protected]', subject='test', body='test', send_to_cc='*****@*****.**' ), follow_redirects=True) self.assertEquals(len(outbox), 1) self.assertEquals(ContractStageActionItem.query.count(), 2) self.assertTrue('test' in outbox[0].subject) self.assertTrue('with the subject' in good_post.data) self.assertTrue(len(outbox[0].cc), 1) self.assertTrue(len(outbox[0].recipients), 2) good_post_ccs = self.client.post(detail_view_url + '?form=update', data=dict( send_to='*****@*****.**', subject='test', body='test', send_to_cc='[email protected]; [email protected]' ), follow_redirects=True) self.assertEquals(len(outbox), 2) self.assertEquals(ContractStageActionItem.query.count(), 3) self.assertTrue('test' in outbox[1].subject) self.assertTrue('with the subject' in good_post_ccs.data) self.assertTrue(len(outbox[1].cc), 2) self.assertTrue(len(outbox[1].recipients), 1)
def test_feedback(self): '''Test scout contract feedback mechanism ''' self.assert200(self.client.get('/scout/contracts/{}/feedback'.format(self.contract1.id))) self.assert_template_used('wexplorer/feedback.html') self.assert404(self.client.get('/scout/contracts/1000/feedback')) # assert data validation bad_post = self.client.post('/scout/contracts/{}/feedback'.format(self.contract1.id), data=dict( sender='JUNK' )) self.assert200(bad_post) # correct template self.assert_template_used('wexplorer/feedback.html') # two alerts self.assertTrue(bad_post.data.count('alert-danger'), 2) # feedback is required self.assertTrue(bad_post.data.count('field is required'), 1) # email must be email self.assertTrue(bad_post.data.count('Invalid'), 1) # assert email works properly self.login_user(self.admin_user) self.admin_user.email = '*****@*****.**' with mail.record_messages() as outbox: success_post = self.client.post('/scout/contracts/{}/feedback'.format(self.contract1.id), data=dict( body='test' )) # the mail sent self.assertEquals(len(outbox), 1) # it went to the right place self.assertTrue(self.admin_user.email in outbox[0].send_to) # it redirects and flashes correctly self.assertEquals(success_post.status_code, 302) self.assertEquals(success_post.location, 'http://localhost/scout/contracts/{}'.format(self.contract1.id)) self.assert_flashes('Thank you for your feedback!', 'alert-success')
def test_signup(self): admin_role = insert_a_role('admin') superadmin_role = insert_a_role('superadmin') insert_a_user(role=admin_role) insert_a_user(email='*****@*****.**', role=superadmin_role) response = self.client.get('/beacon/signup') self.assert200(response) subcats = json.loads(self.get_context_variable('subcategories')) # assert three categories (plus the total category) self.assertEquals(len(subcats.keys()), 4) # assert five total subcatgories (plus 5 in the total field) self.assertEquals( len([item for sublist in subcats.values() for item in sublist]), 10) # assert email, business, categories needed no_email_post = self.client.post('/beacon/signup', data=dict(first_name='foo')) self.assert200(no_email_post) self.assertTrue(no_email_post.data.count('alert-danger'), 3) # ensure that there are two required field notes self.assertTrue(no_email_post.data.count('This field is required'), 2) # assert valid email address invalid_email_post = self.client.post('/beacon/signup', data=dict(email='INVALID', business_name='test')) self.assert200(invalid_email_post) self.assertTrue(invalid_email_post.data.count('alert-danger'), 1) self.assertTrue( invalid_email_post.data.count('Invalid email address.'), 1) # assert you need at least one category invalid_no_categories = self.client.post('/beacon/signup', data=dict( email='*****@*****.**', business_name='foo')) self.assert200(invalid_no_categories) self.assertTrue(invalid_no_categories.data.count('alert-danger'), 1) self.assertTrue( invalid_no_categories.data.count('You must select at least one!'), 1) # assert valid categories with mail.record_messages() as outbox: # successful post with only one set of subcategories success_post = self.client.post('/beacon/signup', data={ 'email': '*****@*****.**', 'business_name': 'foo', 'subcategories-1': 'on', 'categories': 'Apparel', 'subscribed_to_newsletter': True }) with self.client.session_transaction() as session: assert 'email' in session assert 'business_name' in session self.assertEquals(session['email'], '*****@*****.**') self.assertEquals(session['business_name'], 'foo') self.assertEquals(success_post.status_code, 302) self.assertEquals(success_post.location, 'http://localhost/beacon/') # should send three emails # one to the vendor, one to the admins self.assertEquals(len(outbox), 2) self.assertEquals(Vendor.query.count(), 1) self.assertTrue(Vendor.query.first().subscribed_to_newsletter) self.assertEquals(len(Vendor.query.first().categories), 1) self.assert_flashes( 'Thank you for signing up! Check your email for more information', 'alert-success') # successful post with two sets of subcategories success_post_everything = self.client.post( '/beacon/signup', data={ 'email': '*****@*****.**', 'business_name': 'foo', 'subcategories-1': 'on', 'subcategories-2': 'on', 'subcategories-3': 'on', 'subcategories-4': 'on', 'subcategories-5': 'on', 'categories': 'Apparel', 'subscribed_to_newsletter': True }) self.assertEquals(success_post_everything.status_code, 302) self.assertEquals(success_post_everything.location, 'http://localhost/beacon/') self.assertEquals(len(outbox), 4) self.assertEquals(Vendor.query.count(), 2) self.assertEquals( len( Vendor.query.filter( Vendor.email == '*****@*****.**').first().categories), 5) self.assert_flashes( 'Thank you for signing up! Check your email for more information', 'alert-success') # successful post with existing email should update the profile, not send message success_post_old_email = self.client.post( '/beacon/signup', data={ 'email': '*****@*****.**', 'business_name': 'foo', 'subcategories-1': 'on', 'subcategories-2': 'on', 'subcategories-3': 'on', 'categories': 'Apparel', 'subscribed_to_newsletter': True }) self.assertEquals(success_post_old_email.status_code, 302) self.assertEquals(success_post_old_email.location, 'http://localhost/beacon/') self.assertEquals(len(outbox), 4) self.assertEquals(Vendor.query.count(), 2) self.assertEquals( len( Vendor.query.filter( Vendor.email == '*****@*****.**').first().categories), 5) self.assert_flashes( "You are already signed up! Your profile was updated with this new information", 'alert-info') admin_mail, vendor_mail = 0, 0 for _mail in outbox: if 'new vendor has signed up on beacon' in _mail.subject: admin_mail += 1 if 'Thank you for signing up' in _mail.subject: vendor_mail += 1 self.assertEquals(admin_mail, 2) self.assertEquals(vendor_mail, 2) with self.client.session_transaction() as session: assert 'email' in session assert 'business_name' in session self.assertEquals(session['email'], '*****@*****.**') self.assertEquals(session['business_name'], 'foo')
def test_edit_contract(self): '''Test edit metadata for contracts ''' # subscribe to this contract self.login_user(self.conductor) self.client.get('/wexplorer/contracts/1/subscribe') edit_contract_url = '/conductor/contract/{}/edit'.format( self.contract1.id) self.assert200(self.client.get(edit_contract_url)) self.assert404(self.client.get('/conductor/contract/999/edit')) # test a form with malformed url bad_url = self.client.post(edit_contract_url, data={ 'contract_href': 'does not work!', 'description': 'this is a test', 'expiration_date': datetime.date(2015, 9, 30), 'financial_id': 1234, 'spec_number': 'test' }, follow_redirects=True) self.assertEquals( ContractBase.query.get(1).financial_id, self.contract1.financial_id) self.assert200(bad_url) self.assertTrue("That URL doesn't work!" in bad_url.data) # test a form with missing data missing_data = self.client.post(edit_contract_url, data={ 'contract_href': 'http://www.example.com', 'description': 'a different description!', 'financial_id': 1234 }, follow_redirects=True) self.assertEquals( ContractBase.query.get(1).financial_id, self.contract1.financial_id) self.assertEquals(ContractBase.query.get(1), self.contract1) self.assertTrue("This field is required." in missing_data.data) # test a good form with mail.record_messages() as outbox: good_post = self.client.post(edit_contract_url, data={ 'contract_href': 'http://www.example.com', 'description': 'a different description!', 'expiration_date': datetime.date(2015, 9, 30), 'financial_id': 1234, 'spec_number': '1234' }, follow_redirects=True) self.assertEquals( ContractBase.query.get(1).contract_href, 'http://www.example.com') self.assertEquals( ContractBase.query.get(1).description, 'a different description!') self.assertEquals(len(outbox), 1) self.assertTrue('*****@*****.**' in outbox[0].send_to) self.assertTrue( '[Pittsburgh Procurement] A contract you follow has been updated!' in outbox[0].subject) self.assertTrue('Successfully Updated' in good_post.data)
def test_signup(self): '''Test signups work as expected including validation errors, signups, etc. ''' admin_role = insert_a_role('admin') superadmin_role = insert_a_role('superadmin') insert_a_user(role=admin_role) insert_a_user(email='*****@*****.**', role=superadmin_role) response = self.client.get('/beacon/signup') self.assert200(response) subcats = json.loads(self.get_context_variable('subcategories')) # assert three categories (plus the total category) self.assertEquals(len(subcats.keys()), 4) # assert five total subcatgories (plus 5 in the total field) self.assertEquals(len([item for sublist in subcats.values() for item in sublist]), 10) # assert email, business, categories needed no_email_post = self.client.post('/beacon/signup', data=dict( first_name='foo' )) self.assert200(no_email_post) self.assertTrue(no_email_post.data.count('alert-danger'), 3) # ensure that there are two required field notes self.assertTrue(no_email_post.data.count('This field is required'), 2) # assert valid email address invalid_email_post = self.client.post('/beacon/signup', data=dict( email='INVALID', business_name='test' )) self.assert200(invalid_email_post) self.assertTrue(invalid_email_post.data.count('alert-danger'), 1) self.assertTrue(invalid_email_post.data.count('Invalid email address.'), 1) # assert valid categories with mail.record_messages() as outbox: # successful post with only one set of subcategories success_post = self.client.post('/beacon/signup', data={ 'email': '*****@*****.**', 'business_name': 'foo', 'subcategories-1': 'on', 'categories': 'Apparel', 'subscribed_to_newsletter': True }) with self.client.session_transaction() as session: assert 'email' in session assert 'business_name' in session self.assertEquals(session['email'], '*****@*****.**') self.assertEquals(session['business_name'], 'foo') self.assertEquals(success_post.status_code, 302) self.assertEquals(success_post.location, 'http://localhost/beacon/') # should send three emails # one to the vendor, one to the admins self.assertEquals(len(outbox), 2) self.assertEquals(Vendor.query.count(), 1) self.assertTrue(Vendor.query.first().subscribed_to_newsletter) self.assertEquals(len(Vendor.query.first().categories), 1) self.assert_flashes( 'Thank you for signing up! Check your email for more information', 'alert-success' ) # successful post with two sets of subcategories success_post_everything = self.client.post('/beacon/signup', data={ 'email': '*****@*****.**', 'business_name': 'foo', 'subcategories-1': 'on', 'subcategories-2': 'on', 'subcategories-3': 'on', 'subcategories-4': 'on', 'subcategories-5': 'on', 'categories': 'Apparel', 'subscribed_to_newsletter': True }) self.assertEquals(success_post_everything.status_code, 302) self.assertEquals(success_post_everything.location, 'http://localhost/beacon/') self.assertEquals(len(outbox), 4) self.assertEquals(Vendor.query.count(), 2) self.assertEquals(len(Vendor.query.filter(Vendor.email == '*****@*****.**').first().categories), 5) self.assert_flashes('Thank you for signing up! Check your email for more information', 'alert-success') # successful post with existing email should update the profile, not send message success_post_old_email = self.client.post('/beacon/signup', data={ 'email': '*****@*****.**', 'business_name': 'foo', 'subcategories-1': 'on', 'subcategories-2': 'on', 'subcategories-3': 'on', 'categories': 'Apparel', 'subscribed_to_newsletter': True }) self.assertEquals(success_post_old_email.status_code, 302) self.assertEquals(success_post_old_email.location, 'http://localhost/beacon/') self.assertEquals(len(outbox), 4) self.assertEquals(Vendor.query.count(), 2) self.assertEquals(len(Vendor.query.filter(Vendor.email == '*****@*****.**').first().categories), 5) self.assert_flashes( "You are already signed up! Your profile was updated with this new information", 'alert-info' ) admin_mail, vendor_mail = 0, 0 for _mail in outbox: if 'new vendor has signed up on beacon' in _mail.subject: admin_mail += 1 if 'Thank you for signing up' in _mail.subject: vendor_mail += 1 self.assertEquals(admin_mail, 2) self.assertEquals(vendor_mail, 2) with self.client.session_transaction() as session: assert 'email' in session assert 'business_name' in session self.assertEquals(session['email'], '*****@*****.**') self.assertEquals(session['business_name'], 'foo')
def test_signup(self): ''' Signups work as expected including validation errors, signups, etc. ''' response = self.client.get('/opportunities/signup') self.assert200(response) subcats = json.loads(self.get_context_variable('subcategories')) # assert two categories (plus the total category) self.assertEquals(len(subcats.keys()), 3) # assert five total subcatgories (plus 5 in the total field) self.assertEquals(len([item for sublist in subcats.values() for item in sublist]), 10) # assert email, business, categories needed no_email_post = self.client.post('/opportunities/signup', data=dict( first_name='foo' )) self.assert200(no_email_post) self.assertTrue(no_email_post.data.count('alert-danger'), 3) # ensure that there are two required field notes self.assertTrue(no_email_post.data.count('This field is required'), 2) # assert valid email address invalid_email_post = self.client.post('/opportunities/signup', data=dict( email='INVALID', business_name='test', subcategories=[1] )) self.assert200(invalid_email_post) self.assertTrue(invalid_email_post.data.count('alert-danger'), 1) self.assertTrue(invalid_email_post.data.count('Invalid email address.'), 1) # assert valid categories invalid_category_post = self.client.post('/opportunities/signup', data=dict( email='*****@*****.**', business_name='test', subcategories=[999] )) self.assert200(invalid_category_post) self.assertTrue(invalid_category_post.data.count('alert-danger'), 1) self.assertTrue('999 is not a valid choice!' in invalid_category_post.data) with mail.record_messages() as outbox: # successful post with only one set of subcategories success_post = self.client.post('/opportunities/signup', data={ 'email': '*****@*****.**', 'business_name': 'foo', 'subcategories-1': 'on', 'categories': 'Apparel' }) self.assertEquals(success_post.status_code, 302) self.assertEquals(success_post.location, 'http://localhost/opportunities/') self.assertEquals(len(outbox), 1) self.assertEquals(Vendor.query.count(), 1) self.assertEquals(len(Vendor.query.first().categories), 1) self.assert_flashes('Thank you for signing up! Check your email for more information', 'alert-success') # successful post with two sets of subcategories success_post_everything = self.client.post('/opportunities/signup', data={ 'email': '*****@*****.**', 'business_name': 'foo', 'subcategories-1': 'on', 'subcategories-2': 'on', 'subcategories-3': 'on', 'subcategories-4': 'on', 'subcategories-5': 'on', 'categories': 'Apparel' }) self.assertEquals(success_post.status_code, 302) self.assertEquals(success_post.location, 'http://localhost/opportunities/') self.assertEquals(len(outbox), 2) self.assertEquals(Vendor.query.count(), 2) self.assertEquals(len(Vendor.query.all()[1].categories), 5) self.assert_flashes('Thank you for signing up! Check your email for more information', 'alert-success') # successful post with existing email should update the profile, not send message success_post_old_email = self.client.post('/opportunities/signup', data={ 'email': '*****@*****.**', 'business_name': 'foo', 'subcategories-1': 'on', 'subcategories-2': 'on', 'subcategories-3': 'on', 'categories': 'Apparel' }) self.assertEquals(success_post.status_code, 302) self.assertEquals(success_post.location, 'http://localhost/opportunities/') self.assertEquals(len(outbox), 2) self.assertEquals(Vendor.query.count(), 2) self.assertEquals(len(Vendor.query.all()[1].categories), 3) self.assert_flashes("You are already signed up! Your profile was updated with this new information", 'alert-info')