def test_404_if_framework_is_not_live_or_expired(self): for framework_status in ['coming', 'open', 'pending', 'standstill']: self.data_api_client.get_framework.return_value = FrameworkStub( slug='digital-outcomes-and-specialists-4', status=framework_status, lots=[ LotStub(slug='digital-specialists', allows_brief=True).response() ]).single_result_response() res = self.client.post( "/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/digital-specialists/1234/delete", ) assert res.status_code == 404 assert not self.data_api_client.delete_brief.called
def test_404_if_framework_does_not_allow_brief(self): self.data_api_client.get_framework.return_value = FrameworkStub( slug="digital-outcomes-and-specialists-4", status="live", lots=[ LotStub(slug="digital-specialists", allows_brief=False).response() ], ).single_result_response() res = self.client.get( "/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/digital-specialists/1234" ) assert res.status_code == 404
def test_404_if_lot_does_not_allow_brief(self): self.data_api_client.get_framework.return_value = FrameworkStub( slug=self.framework_slug, status='live', lots=[ LotStub(slug='digital-outcomes', allows_brief=False).response(), ]).single_result_response() self.login_as_buyer() res = self.client.get( f"/buyers/frameworks/{self.framework_slug}/requirements/digital-outcomes/1234/responses" ) assert res.status_code == 404
def test_404_if_brief_is_not_closed_or_awarded(self, data_api_client): data_api_client.get_framework.return_value = FrameworkStub( framework_slug='digital-outcomes-and-specialists-4', status='live', lots=[ LotStub(slug='digital-specialists', allows_brief=True).response(), ]).single_result_response() data_api_client.get_brief.return_value = BriefStub( framework_slug="digital-outcomes-and-specialists-4", status="live", ).single_result_response() self.login_as_buyer() res = self.client.get(self.url) assert res.status_code == 404
def test_show_start_brief_info_page(self): self.data_api_client.get_framework.return_value = FrameworkStub( slug='digital-outcomes-and-specialists-4', status='live', lots=[ LotStub(slug='digital-specialists', allows_brief=True).response(), ]).single_result_response() res = self.client.get( "/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/digital-specialists" ) assert res.status_code == 200 document = html.fromstring(res.get_data(as_text=True)) assert document.xpath('//h1')[0].text_content().strip( ) == "Find an individual specialist"
def test_dos_only_expired_framework_action_lists_shown_for(self, family, should_be_shown): self.data_api_client.find_frameworks.return_value = {'frameworks': [FrameworkStub( status='expired', slug=f'flim-flam-3', family=family, name=f'Flim Flam Framework 3', ).response()]} self.user_role = "admin-framework-manager" response = self.client.get('/admin') assert response.status_code == 200 document = html.fromstring(response.get_data(as_text=True)) assert bool( document.xpath(f'.//h3[contains(text(),"Flim Flam Framework 3")]') ) == should_be_shown
def test_award_brief_post_valid_form_calls_api_and_redirects_to_next_question(self): self.data_api_client.update_brief_award_brief_response.return_value = FrameworkStub( slug='digital-outcomes-and-specialists-4', status='closed', lots=[ LotStub(slug='digital-outcomes', allows_brief=True).response() ] ) self.login_as_buyer() res = self.client.post(self.url.format(brief_id=1234), data={'brief_response': 2}) assert self.data_api_client.update_brief_award_brief_response.call_args == mock.call( u'1234', 2, "*****@*****.**" ) assert res.status_code == 302 assert "/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/digital-outcomes/1234/award/2/contract-details" in res.location # noqa
def setup_method(self, method): super().setup_method(method) self.data_api_client_patch = mock.patch( "app.main.views.requirement_task_list.data_api_client", autospec=True) self.data_api_client = self.data_api_client_patch.start() self.data_api_client.get_framework.return_value = FrameworkStub( slug="digital-outcomes-and-specialists-4", status="live", lots=[ LotStub(slug="digital-specialists", allows_brief=True).response() ], ).single_result_response() self.login_as_buyer()
def brief(self): """A draft brief on a live framework""" self.data_api_client.get_framework.return_value = FrameworkStub( slug="digital-outcomes-and-specialists-4", status="live", lots=[ LotStub(slug="digital-specialists", allows_brief=True).response() ], ).single_result_response() self.data_api_client.get_brief.return_value = BriefStub( framework_slug="digital-outcomes-and-specialists-4", status="draft", ).single_result_response() return self.data_api_client.get_brief.return_value["briefs"]
def test_get_framework_and_lot_404s_if_allows_brief_required(self): data_api_client = mock.Mock() data_api_client.get_framework.return_value = FrameworkStub( slug='digital-outcomes-and-specialists-4', status='live', lots=[ LotStub(slug='digital-specialists', allows_brief=False).response() ]).single_result_response() with pytest.raises(NotFound): helpers.buyers_helpers.get_framework_and_lot( 'digital-outcomes-and-specialists-4', 'digital-specialists', data_api_client, must_allow_brief=True, )
def test_404_if_framework_is_not_live_or_expired(self, data_api_client): for framework_status in ['coming', 'open', 'pending', 'standstill']: data_api_client.get_framework.return_value = FrameworkStub( framework_slug='digital-outcomes-and-specialists-4', status=framework_status, lots=[ LotStub(slug='digital-specialists', allows_brief=True).response(), ]).single_result_response() data_api_client.get_brief.return_value = BriefStub( framework_slug="digital-outcomes-and-specialists-4", status="closed", ).single_result_response() self.login_as_buyer() res = self.client.get(self.url) assert res.status_code == 404
def test_get_framework_and_lot_404s_for_wrong_framework_status(self): data_api_client = mock.Mock() data_api_client.get_framework.return_value = FrameworkStub( slug='digital-outcomes-and-specialists-4', status='open', lots=[ LotStub(slug='digital-specialists', allows_brief=True).response() ]).single_result_response() with pytest.raises(NotFound): helpers.buyers_helpers.get_framework_and_lot( 'digital-outcomes-and-specialists-4', 'digital-specialists', data_api_client, allowed_statuses=['live'], )
def setup_method(self, method): super().setup_method(method) self.data_api_client_patch = mock.patch( "app.main.views.create_a_brief.publish.data_api_client", autospec=True) self.data_api_client = self.data_api_client_patch.start() self.data_api_client.get_brief.return_value = BriefStub( ).single_result_response() self.data_api_client.get_framework.return_value = FrameworkStub( slug='digital-outcomes-and-specialists-4', status='live', lots=[ LotStub(slug='digital-specialists', allows_brief=True).response() ]).single_result_response() self.login_as_buyer()
def test_404_if_framework_status_is_not_live(self, framework_status): self.data_api_client.get_framework.return_value = FrameworkStub( slug='digital-outcomes-and-specialists-4', status=framework_status, lots=[ LotStub(slug='digital-specialists', allows_brief=True).response() ] ).single_result_response() res = self.client.post( "/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/" "digital-specialists/1234/edit/description-of-work/organisation", data={ "title": "A new title" }) assert res.status_code == 404 assert not self.data_api_client.update_brief.called
def test_show_question_and_answer_dates_for_published_brief(self): for framework_status in ['live', 'expired']: self.data_api_client.get_framework.return_value = FrameworkStub( slug='digital-outcomes-and-specialists-4', status=framework_status, lots=[ LotStub(slug='digital-specialists', allows_brief=True).response(), ]).single_result_response() brief_json = BriefStub( framework_slug="digital-outcomes-and-specialists-4", status="live", ).single_result_response() brief_json['briefs']['requirementsLength'] = '2 weeks' brief_json['briefs']['publishedAt'] = u"2016-04-02T20:10:00.00000Z" brief_json['briefs'][ 'clarificationQuestionsClosedAt'] = u"2016-04-12T23:59:00.00000Z" brief_json['briefs'][ 'clarificationQuestionsPublishedBy'] = u"2016-04-14T23:59:00.00000Z" brief_json['briefs'][ 'applicationsClosedAt'] = u"2016-04-16T23:59:00.00000Z" brief_json['briefs']['specialistRole'] = 'communicationsManager' brief_json['briefs'][ 'questionAndAnswerSessionDetails'] = 'question and answer session details' brief_json['briefs']["clarificationQuestionsAreClosed"] = True self.data_api_client.get_brief.return_value = brief_json res = self.client.get( "/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/digital-specialists/1234/timeline" ) assert res.status_code == 200 page_html = res.get_data(as_text=True) document = html.fromstring(page_html) assert (document.xpath('//h1')[0] ).text_content().strip() == "Question and answer dates" assert all(date in [ e.text_content().strip() for e in document.xpath('//main//dt') ] for date in [ '2 April', 'Before 8 April', '8 April', '15 April', '16 April' ]) assert 'question and answer session details' in document.xpath( '//main//dd')[1].text_content().strip()
def test_has_correct_link_to_supplier_csv(self, slug_suffix, lot_slug): self.data_api_client.get_framework.return_value = FrameworkStub( slug=f'digital-outcomes-and-specialists-4{slug_suffix}', status='live', lots=[ LotStub(slug=lot_slug, allows_brief=True).response(), ]).single_result_response() res = self.client.get( f"/buyers/frameworks/digital-outcomes-and-specialists-4{slug_suffix}/requirements/{lot_slug}" ) assert res.status_code == 200 document = html.fromstring(res.get_data(as_text=True)) assert document.xpath( "//a[normalize-space()='Download list of suppliers.']" )[0].attrib['href'] == ( f"https://assets.digitalmarketplace.service.gov.uk/" f"digital-outcomes-and-specialists-4{slug_suffix}/communications/catalogues/{lot_slug}-suppliers.csv" )
def test_404_if_framework_status_is_not_live(self): for framework_status in [ 'coming', 'open', 'pending', 'standstill', 'expired' ]: self.data_api_client.get_framework.return_value = FrameworkStub( slug='digital-outcomes-and-specialists-4', status=framework_status, lots=[ LotStub(slug='digital-specialists', allows_brief=True).response() ]).single_result_response() brief_json = BriefStub(status="draft").single_result_response() brief_questions = brief_json['briefs'] brief_questions.update({ 'backgroundInformation': 'test background info', 'contractLength': 'A very long time', 'culturalFitCriteria': ['CULTURAL', 'FIT'], 'culturalWeighting': 10, 'essentialRequirements': 'Everything', 'evaluationType': ['test evaluation type'], 'existingTeam': 'team team team', 'importantDates': 'Near future', 'numberOfSuppliers': 5, 'location': 'somewhere', 'organisation': 'test organisation', 'priceWeighting': 80, 'specialistRole': 'communicationsManager', 'specialistWork': 'work work work', 'startDate': 'startDate', 'summary': 'blah', 'technicalWeighting': 10, 'workingArrangements': 'arrangements', 'workplaceAddress': 'address', 'requirementsLength': '1 week' }) self.data_api_client.get_brief.return_value = brief_json res = self.client.post( "/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/" "digital-specialists/1234/publish") assert res.status_code == 404 assert not self.data_api_client.publish_brief.called
def test_withdraw_brief_warning_page_displays_correctly(self, framework_status): self.data_api_client.get_framework.return_value = FrameworkStub( slug='digital-outcomes-and-specialists-4', status=framework_status, lots=[LotStub(slug='digital-specialists', allows_brief=True).response()] ).single_result_response() self.data_api_client.get_brief.return_value = BriefStub( framework_slug='digital-outcomes-and-specialists-4', status='live', ).single_result_response() res = self.client.get( "/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/digital-specialists/1234/withdraw" ) assert res.status_code == 200 document = html.fromstring(res.get_data(as_text=True)) self.assert_breadcrumbs(res, extra_breadcrumbs=[ ( 'I need a thing to do a thing', '/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/digital-specialists/1234' ), ( "Are you sure you want to withdraw these requirements?", ) ]) page_title = document.xpath('//h1')[0].text_content() title_caption = document.cssselect('span.govuk-caption-xl')[0].text_content() assert title_caption == self.brief.get('title') assert page_title == "Are you sure you want to withdraw these requirements?" assert document.xpath( '//form[@action="/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/digital-specialists/1234/withdraw"]' # noqa )[0] is not None submit_button = document.cssselect('button[name="withdraw_confirmed"]') cancel_link = document.xpath("//a[normalize-space()='Cancel']") assert len(submit_button) == 1 assert len(cancel_link) == 1 assert cancel_link[0].attrib['href'] == "/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/digital-specialists/1234" # noqa
def test_get_framework_and_lot(self): provided_lot = LotStub(slug='digital-specialists', allows_brief=True).response() data_api_client = mock.Mock() data_api_client.get_framework.return_value = FrameworkStub( slug='digital-outcomes-and-specialists-4', status='live', lots=[provided_lot], ).single_result_response() framework, lot = helpers.buyers_helpers.get_framework_and_lot( 'digital-outcomes-and-specialists-4', 'digital-specialists', data_api_client) assert framework['status'] == "live" assert framework['name'] == 'Digital Outcomes and Specialists 4' assert framework['slug'] == 'digital-outcomes-and-specialists-4' assert framework['clarificationQuestionsOpen'] is True assert lot == provided_lot
def data_api_client(self): data_api_client = mock.Mock(spec=DataAPIClient) data_api_client.find_frameworks.return_value = { "frameworks": [ FrameworkStub( status="live", slug="digital-outcomes-and-specialists-3", family="digital-outcomes-and-specialists" ).response(), ] } data_api_client.find_briefs_iter.return_value = [example_brief] data_api_client.find_brief_responses_iter.return_value = [ example_winning_brief_response, BriefResponseStub().response() ] return data_api_client
def setup_method(self, method): super(TestAwardBrief, self).setup_method(method) self.data_api_client_patch = mock.patch('app.main.views.outcome.data_api_client', autospec=True) self.data_api_client = self.data_api_client_patch.start() self.data_api_client.get_framework.return_value = FrameworkStub( slug='digital-outcomes-and-specialists-4', status='live', lots=[ LotStub(slug='digital-outcomes', allows_brief=True).response(), ] ).single_result_response() brief_stub = BriefStub( framework_slug="digital-outcomes-and-specialists-4", lot_slug="digital-outcomes", status='closed' ).single_result_response() self.data_api_client.get_brief.return_value = brief_stub self.data_api_client.find_brief_responses.return_value = self.brief_responses
def test_404_if_framework_is_not_live_or_expired(self): for framework_status in ['coming', 'open', 'pending', 'standstill']: self.data_api_client.get_framework.return_value = FrameworkStub( slug='digital-outcomes-and-specialists-4', status=framework_status, lots=[ LotStub(slug='digital-specialists', allows_brief=True).response(), ]).single_result_response() brief_json = BriefStub( framework_slug="digital-outcomes-and-specialists-4", status="live", ).single_result_response() self.data_api_client.get_brief.return_value = brief_json res = self.client.get( "/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/digital-specialists/1234/timeline" ) assert res.status_code == 404
def setup_method(self, method): super().setup_method(method) self.data_api_client_patch = mock.patch( "app.main.views.create_a_brief.edit.data_api_client", autospec=True ) self.data_api_client = self.data_api_client_patch.start() self.data_api_client.get_brief.return_value = BriefStub( framework_slug="digital-outcomes-and-specialists-4", ).single_result_response() self.data_api_client.get_framework.return_value = FrameworkStub( slug='digital-outcomes-and-specialists-4', status='live', lots=[ LotStub(slug='digital-specialists', allows_brief=True).response() ] ).single_result_response() self.login_as_buyer() self.content_fixture = ContentLoader('tests/fixtures/content') self.content_fixture.load_manifest('dos', 'data', 'edit_brief')
def setup_method(self, method): super(TestAwardOrCancelBrief, self).setup_method(method) self.data_api_client_patch = mock.patch('app.main.views.outcome.data_api_client', autospec=True) self.data_api_client = self.data_api_client_patch.start() self.data_api_client.get_framework.return_value = FrameworkStub( slug='digital-outcomes-and-specialists-4', status='live', lots=[ LotStub(slug='digital-outcomes', allows_brief=True).response(), ] ).single_result_response() self.brief = BriefStub( user_id=123, framework_slug='digital-outcomes-and-specialists-4', lot_slug="digital-outcomes", status='closed' ).response() self.data_api_client.get_brief.return_value = {"briefs": self.brief} self.login_as_buyer()
def test_do_not_show_question_and_answer_dates_for_draft_brief(self): self.data_api_client.get_framework.return_value = FrameworkStub( slug='digital-outcomes-and-specialists-4', status='live', lots=[ LotStub(slug='digital-specialists', allows_brief=True).response(), ]).single_result_response() brief_json = BriefStub( framework_slug="digital-outcomes-and-specialists-4", status="draft", ).single_result_response() brief_json['briefs']['specialistRole'] = 'communicationsManager' brief_json['briefs']["clarificationQuestionsAreClosed"] = True self.data_api_client.get_brief.return_value = brief_json res = self.client.get( "/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/digital-specialists/1234/timeline" ) assert res.status_code == 404
def brief(self, request): """An awarded brief on a live or expired framework""" framework_status = request.param self.data_api_client.get_framework.return_value = FrameworkStub( slug="digital-outcomes-and-specialists-4", status=framework_status, lots=[ LotStub(slug="digital-specialists", allows_brief=True).response() ], ).single_result_response() brief_json = BriefStub( framework_slug="digital-outcomes-and-specialists-4", status="awarded", ).single_result_response() brief_json["briefs"]["publishedAt"] = "2016-04-02T20:10:00.00000Z" brief_json["briefs"]["specialistRole"] = "communicationsManager" brief_json["briefs"]["clarificationQuestionsAreClosed"] = True brief_json["briefs"]["awardedBriefResponseId"] = 999 self.data_api_client.get_brief.return_value = brief_json self.data_api_client.get_brief_response.return_value = { "briefResponses": { "awardDetails": { "awardedContractStartDate": "2016-4-4", "awardedContractValue": "100" }, "id": 213, "status": "awarded", "supplierName": "100 Percent IT Ltd", } } return brief_json["briefs"]
class _BaseTestCommunicationsView(LoggedInApplicationTest): user_role = 'admin-framework-manager' def setup_method(self, method): super().setup_method(method) self.framework_slug = "g-things-23" self.framework_stub = FrameworkStub(slug=self.framework_slug) self.data_api_client_patch = mock.patch( 'app.main.views.communications.data_api_client', autospec=True) self.data_api_client = self.data_api_client_patch.start() # note how this evaluates .single_result_response() at call-time, allowing self.framework_stub to be # overridden by test methods self.data_api_client.get_framework.side_effect = lambda framework_slug: { self.framework_slug: self.framework_stub.single_result_response() }[framework_slug] self.app.config["DM_COMMUNICATIONS_BUCKET"] = "flop-slop-slap" self.app.config["DM_ASSETS_URL"] = "https://basket.market.net/" def teardown_method(self, method): self.data_api_client_patch.stop() super().teardown_method(method)
def test_dos_frameworks_only_expired_frameworks_available( self, s3, family, should_be_shown): self.data_api_client.get_framework.return_value = FrameworkStub( family=family, status='expired', slug=f'sunt-me-gratis-12', name=f'Sunt Me Gratis 12', ).single_result_response() response = self.client.get( f"/admin/frameworks/sunt-me-gratis-12/users") assert self.data_api_client.mock_calls == [ mock.call.get_framework("sunt-me-gratis-12") ] if should_be_shown: assert response.status_code == 200 document = html.fromstring(response.get_data(as_text=True)) page_heading = document.xpath('normalize-space(string(//h1))') assert page_heading == f"Download supplier lists for Sunt Me Gratis 12" else: assert response.status_code == 404
def test_withdraw_brief_submission(self, framework_status): self.data_api_client.get_framework.return_value = FrameworkStub( slug='digital-outcomes-and-specialists-4', status=framework_status, lots=[LotStub(slug='digital-specialists', allows_brief=True).response()] ).single_result_response() self.data_api_client.get_brief.return_value = BriefStub( framework_slug='digital-outcomes-and-specialists-4', status='live', ).single_result_response() res = self.client.post( "/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/digital-specialists/1234/withdraw", data={"withdraw_confirmed": True} ) assert res.status_code == 302 assert self.data_api_client.delete_brief.call_args_list == [] assert res.location == "http://localhost{}".format(self.briefs_dashboard_url) expected_flash_message = ("You’ve withdrawn your requirements for ‘I need a thing to do a thing’", "success") self.assert_flashes(*expected_flash_message) self.assert_flashes_with_dm_alert(*expected_flash_message)
def test_warning_about_setting_requirement_length_is_not_displayed_if_not_specialist_brief( self): self.data_api_client.get_framework.return_value = FrameworkStub( slug='digital-outcomes-and-specialists-4', status='live', lots=[ LotStub(slug='digital-outcomes', allows_brief=True).response() ]).single_result_response() self.data_api_client.get_brief.return_value = BriefStub( framework_slug="digital-outcomes-and-specialists-4", lot_slug="digital-outcomes", status="draft", ).single_result_response() res = self.client.get( "/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/" "digital-outcomes/1234/publish") page_html = res.get_data(as_text=True) assert res.status_code == 200 assert 'This will show you what the supplier application deadline will be' not in page_html assert 'Your requirements will be open for 2 weeks' in page_html