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
Exemple #5
0
 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
Exemple #9
0
    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()
Exemple #10
0
    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
Exemple #13
0
 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
Exemple #14
0
    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"]
Exemple #20
0
    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
Exemple #26
0
    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
Exemple #29
0
    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