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
Пример #7
0
    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"]
Пример #10
0
    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
Пример #12
0
    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()
Пример #14
0
    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
Пример #18
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
Пример #19
0
    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
Пример #20
0
    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
Пример #21
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_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
Пример #23
0
    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')
Пример #24
0
    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)
Пример #28
0
    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
Пример #29
0
    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