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"])
Exemple #5
0
    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_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_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_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])
Exemple #17
0
    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]
            )
Exemple #20
0
    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_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')
Exemple #28
0
    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')
Exemple #30
0
    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')