def test_cannot_delete_live_brief(self): self.data_api_client.get_brief.return_value = BriefStub( status='live').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_brief_does_not_belong_to_user(self): self.data_api_client.get_brief.return_value = BriefStub( user_id=234).single_result_response() res = self.client.post( "/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/" "digital-specialists/1234/delete", data={"delete_confirmed": True}) assert res.status_code == 404
def test_brief_stub_single_result_response_adds_users_and_clarification_questions( self): api_response = BriefStub().single_result_response() assert api_response['briefs']['clarificationQuestions'] == [] assert api_response['briefs']['users'] == [{ "active": True, "role": "buyer", "emailAddress": "*****@*****.**", "id": 123, "name": "Buyer User" }]
def test_publish_brief_with_unanswered_required_questions(self): self.data_api_client.get_brief.return_value = BriefStub( framework_slug="digital-outcomes-and-specialists-4", status="draft", ).single_result_response() res = self.client.post( "/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/" "digital-specialists/1234/publish") assert res.status_code == 400 assert not self.data_api_client.publish_brief.called
def test_if_brief_correct_allow_withdrawn(self, status, allow_withdrawn, result): brief = BriefStub(framework_slug='digital-outcomes-and-specialists-4', user_id=123, status=status).response() assert helpers.buyers_helpers.is_brief_correct( brief, 'digital-outcomes-and-specialists-4', 'digital-specialists', 123, allow_withdrawn=allow_withdrawn) is result
def test_404_if_brief_does_not_belong_to_user(self): self.data_api_client.get_brief.return_value = BriefStub( user_id=234).single_result_response() res = self.client.post( "/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/" "digital-specialists/1234/edit/your-organisation", data={"organisation": "GDS"}) assert res.status_code == 404 assert not self.data_api_client.update_brief.called
def test_404_if_brief_is_withdrawn(self): self.data_api_client.get_brief.return_value = BriefStub( framework_slug="digital-outcomes-and-specialists-4", status="withdrawn", ).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_brief_does_not_belong_to_user(self): self.data_api_client.get_brief.return_value = BriefStub( framework_slug="digital-outcomes-and-specialists-4", user_id=234, ).single_result_response() res = self.client.get( "/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/digital-specialists/1234" ) assert res.status_code == 404
def setup_method(self, method): super(TestCancelBrief, 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_404_if_brief_is_already_live(self): self.data_api_client.get_brief.return_value = BriefStub(status='live').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_404_if_brief_is_not_closed_or_awarded(self): self.data_api_client.get_brief.return_value = BriefStub( framework_slug=self.framework_slug, lot_slug="digital-outcomes", status="live", ).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_does_not_belong_to_buyer(self): self.data_api_client.get_brief.return_value = BriefStub( framework_slug=self.framework_slug, lot_slug="digital-outcomes", user_id=234, ).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 _setup_brief(self, brief_status="draft", **stub_kwargs): brief_json = BriefStub( framework_slug="digital-outcomes-and-specialists-4", status=brief_status, **stub_kwargs ).single_result_response() brief_questions = brief_json['briefs'] brief_questions.update({ 'required1': 'test background info', 'required2': 'work work work', 'required3_1': 'yep', 'required3_2': 'yep' }) return brief_json
def setup_method(self, method): super().setup_method(method) self.data_api_client_patch = mock.patch( "app.main.views.withdraw_brief.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.brief = BriefStub( user_id=123, framework_slug='digital-outcomes-and-specialists-4', lot_slug="digital-specialists", status='draft' ).response() self.login_as_buyer()
def test_correct_content_is_displayed_if_no_requirementLength_is_set(self): self.data_api_client.get_brief.return_value = BriefStub( framework_slug="digital-outcomes-and-specialists-4", status="draft", ).single_result_response() res = self.client.get( "/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/" "digital-specialists/1234/publish") page_html = res.get_data(as_text=True) assert res.status_code == 200 assert 'href="/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/digital-specialists/1234/edit/set-how-long-your-requirements-will-be-open-for/requirementsLength"' in page_html # noqa assert 'This will show you what the supplier application deadline will be' in page_html assert 'Your requirements will be open for' not in page_html
def brief(self, request): brief_status = request.param brief_json = BriefStub( framework_slug="digital-outcomes-and-specialists-4", status=brief_status, ).single_result_response() brief_json["briefs"]["publishedAt"] = "2016-04-02T20:10:00.00000Z" brief_json["briefs"]["specialistRole"] = "communicationsManager" brief_json["briefs"]["clarificationQuestionsAreClosed"] = True self.data_api_client.get_brief.return_value = brief_json return brief_json["briefs"]
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_publish_button_unavailable_if_questions_not_answered(self): brief_json = BriefStub( framework_slug="digital-outcomes-and-specialists-4", status="draft", ).single_result_response() brief_questions = brief_json['briefs'] brief_questions.update({'requirementsLength': '1 week'}) 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/publish") page_html = res.get_data(as_text=True) assert res.status_code == 200 assert 'Publish requirements' not in page_html
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_metrics_page_registers_page_views(self): expected_metric_name = ( b'http_server_requests_total{code="200",host="localhost.localdomain",' b'method="GET",path="/suppliers/opportunities/' b'<int:brief_id>/question-and-answer-session"}') self.login() self.data_api_client.get_brief.return_value = BriefStub( status='live').single_result_response() res = self.client.get( '/suppliers/opportunities/1/question-and-answer-session') assert res.status_code == 200 metrics_response = self.client.get('/suppliers/opportunities/_metrics') results = load_prometheus_metrics(metrics_response.data) assert expected_metric_name in results
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_404_if_brief_is_not_live(self): brief_json = BriefStub( framework_slug="digital-outcomes-and-specialists-4", status="draft", ).single_result_response() brief_json['briefs']["clarificationQuestionsAreClosed"] = False 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/supplier-questions/answer-question", data={ "question": "Why?", "answer": "Because", }) assert res.status_code == 404 assert not self.data_api_client.add_brief_clarification_question.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_api_error(self): brief_json = BriefStub( framework_slug="digital-outcomes-and-specialists-4", status="live", ).single_result_response() brief_json['briefs']["clarificationQuestionsAreClosed"] = False self.data_api_client.get_brief.return_value = brief_json self.data_api_client.add_brief_clarification_question.side_effect = HTTPError( mock.Mock(status_code=500)) res = self.client.post( "/buyers/frameworks/digital-outcomes-and-specialists-4/requirements" "/digital-specialists/1234/supplier-questions/answer-question", data={ "question": "Why?", "answer": "Because", }) assert res.status_code == 500
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_clarification_questions_page_returns_404_if_not_live_brief(self): self.data_api_client.get_brief.return_value = BriefStub( framework_slug="digital-outcomes-and-specialists-4", status="expired", clarification_questions=[{ "question": "Why is my question a question?", "answer": "Because", "publishedAt": "2016-01-01T00:00:00.000000Z" }], ).single_result_response() res = self.client.get( "/buyers/frameworks/digital-outcomes-and-specialists-4/requirements/digital-specialists/1234/supplier-questions" # noqa ) assert res.status_code == 404
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(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_page_visible_for_awarded_cancelled_unsuccessful_briefs( self, status): brief_stub = BriefStub( framework_slug=self.framework_slug, lot_slug="digital-outcomes", status="closed", ).single_result_response() brief_stub['briefs'].update({ 'publishedAt': self.brief_publishing_date, 'status': status }) if status == 'awarded': brief_stub['briefs']['awardedBriefResponseId'] = 999 self.data_api_client.get_brief.return_value = brief_stub self.login_as_buyer() res = self.client.get( f"/buyers/frameworks/{self.framework_slug}/requirements/digital-outcomes/1234/responses" ) assert res.status_code == 200