Ejemplo n.º 1
0
    def test_test_publishing_a_brief_sets_published_at(self):
        brief = Brief(data={}, framework=self.framework, lot=self.lot)
        assert brief.published_at is None

        brief.status = 'live'
        assert not brief.clarification_questions_are_closed
        assert isinstance(brief.published_at, datetime)
    def brief(self, app, users):
        with app.app_context():
            now = pendulum.now('utc')
            framework = frameworks_service.find(
                slug='digital-marketplace').one_or_none()
            specialist_lot = lots_service.find(slug='specialist').one_or_none()

            brief = Brief(id=1,
                          data={
                              'openTo': 'selected',
                              'sellers': {
                                  '123': {
                                      'name': 'FriendFace'
                                  },
                                  '456': {
                                      'name': 'FriendFlutter'
                                  }
                              }
                          },
                          framework=framework,
                          lot=specialist_lot,
                          users=users,
                          published_at=now.subtract(days=2),
                          withdrawn_at=None)

            brief.questions_closed_at = now.add(days=3)
            brief.closed_at = now.add(days=5)
            db.session.add(brief)

            db.session.commit()
            yield db.session.query(Brief).first()
    def test_cannot_set_live_brief_to_draft(self):
        brief = Brief(data={},
                      framework=self.framework,
                      lot=self.lot,
                      published_at=datetime.utcnow())

        with pytest.raises(ValidationError):
            brief.status = 'draft'
Ejemplo n.º 4
0
    def test_can_set_live_brief_to_draft(self):
        brief = Brief(data={},
                      framework=self.framework,
                      lot=self.lot,
                      published_at=datetime.utcnow())
        brief.status = 'draft'

        assert brief.published_at is None
Ejemplo n.º 5
0
    def test_foreign_fields_stripped_from_brief_data(self):
        brief = Brief(data={}, framework=self.framework, lot=self.lot)
        brief.data = {
            'frameworkSlug': 'test',
            'frameworkName': 'test',
            'lot': 'test',
            'lotName': 'test',
            'title': 'test',
        }

        assert brief.data == {'title': 'test'}
Ejemplo n.º 6
0
    def test_new_clarification_questions_get_added_to_the_end(self):
        with self.app.app_context():
            brief = Brief(data={},
                          framework=self.framework,
                          lot=self.lot,
                          status="live")
            db.session.add(brief)
            brief.add_clarification_question("How?", "This")
            brief.add_clarification_question("When", "Then")
            db.session.commit()

            assert brief.clarification_questions[0].question == "How?"
            assert brief.clarification_questions[1].question == "When"
Ejemplo n.º 7
0
    def test_updating_a_brief_updates_dates(self):
        with self.app.app_context():
            brief = Brief(data={}, framework=self.framework, lot=self.lot)
            db.session.add(brief)
            db.session.commit()

            updated_at = brief.updated_at
            created_at = brief.created_at

            brief.data = {'foo': 'bar'}
            db.session.add(brief)
            db.session.commit()

            assert brief.created_at == created_at
            assert brief.updated_at > updated_at
def briefs(app, request, users):
    with app.app_context():
        now = pendulum.now('utc')
        framework = frameworks_service.find(
            slug='digital-marketplace').one_or_none()
        atm_lot = lots_service.find(slug='atm').one_or_none()
        rfx_lot = lots_service.find(slug='rfx').one_or_none()
        specialist_lot = lots_service.find(slug='specialist').one_or_none()
        training_lot = lots_service.find(slug='training2').one_or_none()

        db.session.add(
            Brief(id=1,
                  data={},
                  framework=framework,
                  lot=atm_lot,
                  users=users,
                  published_at=now.subtract(days=2),
                  withdrawn_at=None))

        db.session.add(
            Brief(id=2,
                  data={},
                  framework=framework,
                  lot=rfx_lot,
                  users=users,
                  published_at=now.subtract(days=2),
                  withdrawn_at=None))

        db.session.add(
            Brief(id=3,
                  data={},
                  framework=framework,
                  lot=specialist_lot,
                  users=users,
                  published_at=now.subtract(days=2),
                  withdrawn_at=None))

        db.session.add(
            Brief(id=4,
                  data={},
                  framework=framework,
                  lot=training_lot,
                  users=users,
                  published_at=now.subtract(days=2),
                  withdrawn_at=None))

        db.session.commit()
        yield db.session.query(Brief).all()
Ejemplo n.º 9
0
 def test_cannot_update_lot_by_id(self):
     with self.app.app_context():
         with pytest.raises(ValidationError):
             Brief(
                 data={},
                 framework=self.framework,
                 lot_id=self.framework.get_lot('user-research-studios').id)
Ejemplo n.º 10
0
def test_when_what_training_and_details_is_set():
    brief_data = {
        'whatTraining': ['other', 'content design', 'user research'],
        'ldsContentDesignProposalOrLds': 'ldsUnits',
        'ldsUserResearchProposalOrLds': 'specify',
        'trainingDetailType': 'foo',
        'trainingDetailCover': 'bar'
    }
    lot = Lot(name='Training', one_service_limit=True)
    brief = Brief(lot=lot, data=brief_data)

    required_fields = [
        'trainingDetailType',
        'trainingDetailCover',
        'ldsContentDesignProposalOrLds',
        'ldsContentDesignUnits',
        'ldsUserResearchProposalOrLds',
        'ldsUserResearchTrainingNeeds']

    errors = check_lds(brief, required_fields)

    assert errors is not []
    assert len(errors) == 2
    assert errors[0]['ldsContentDesignUnits'] == 'answer_required'
    assert errors[1]['ldsUserResearchTrainingNeeds'] == 'answer_required'
def test_when_own_preference_and_approach_not_set():
    brief_data = {'approachSelector': 'ownPreference'}
    lot = Lot(name='Training', one_service_limit=True)
    brief = Brief(lot=lot, data=brief_data)
    error = check_training_method(brief)
    assert error is not None
    assert error['trainingApproachOwn'] == 'answer_required'
Ejemplo n.º 12
0
    def test_list_brief_responses_for_brief_id(self):
        with self.app.app_context():
            brief = Brief(data=example_listings.brief_data().example(),
                          status='live',
                          framework_id=5,
                          lot=Lot.query.get(5))
            db.session.add(brief)
            db.session.commit()

            another_brief_id = brief.id

        for i in range(8):
            self.setup_dummy_brief_response(brief_id=self.brief_id,
                                            supplier_id=0)
            self.setup_dummy_brief_response(brief_id=another_brief_id,
                                            supplier_id=0)

        res = self.list_brief_responses(brief_id=another_brief_id)
        data = json.loads(res.get_data(as_text=True))

        assert res.status_code == 200
        assert len(data['briefResponses']) == 8
        assert all(br['briefId'] == another_brief_id
                   for br in data['briefResponses'])
        assert 'self' in data['links']
def briefs(app, request, users):
    params = request.param if hasattr(request, 'param') else {}
    published_at = pendulum.parse(
        params['published_at']) if 'published_at' in params else utcnow()
    published_at = None if 'unpublished' in params and params[
        'unpublished'] else published_at
    data = params[
        'data'] if 'data' in params else COMPLETE_SPECIALIST_BRIEF.copy()
    data['sellerCategory'] = params[
        'sellerCategory'] if 'sellerCategory' in params else 1
    lot_slug = params['lot_slug'] if 'lot_slug' in params else 'specialist'
    framework_slug = params[
        'framework_slug'] if 'framework_slug' in params else 'digital-marketplace'
    with app.app_context():
        for i in range(1, 6):
            db.session.add(
                Brief(id=i,
                      data=data,
                      framework=Framework.query.filter(
                          Framework.slug == framework_slug).first(),
                      lot=Lot.query.filter(Lot.slug == lot_slug).first(),
                      users=users,
                      published_at=published_at,
                      withdrawn_at=None))
            db.session.flush()

        db.session.commit()
        yield Brief.query.all()
    def test_list_brief_responses_by_one_framework_slug(
            self, live_dos2_framework):
        supplier_framework = SupplierFramework(
            supplier_id=0, framework_id=live_dos2_framework["id"])
        dos2_brief = Brief(data=example_listings.brief_data().example(),
                           status='live',
                           framework_id=live_dos2_framework["id"],
                           lot=Lot.query.get(6))

        db.session.add_all([dos2_brief, supplier_framework])
        db.session.commit()

        dos2_brief_id = dos2_brief.id

        for i in range(3):
            self.setup_dummy_brief_response(brief_id=self.brief_id,
                                            supplier_id=0)
            self.setup_dummy_brief_response(brief_id=dos2_brief_id,
                                            supplier_id=0)

        res = self.list_brief_responses(
            framework='digital-outcomes-and-specialists-2')
        data = json.loads(res.get_data(as_text=True))

        assert res.status_code == 200
        assert len(data['briefResponses']) == 3
        assert all(br['brief']['framework']['slug'] ==
                   "digital-outcomes-and-specialists-2"
                   for br in data['briefResponses'])
        assert 'self' in data['links']
Ejemplo n.º 15
0
    def test_update_from_json(self):
        with self.app.app_context():
            brief = Brief(data={}, framework=self.framework, lot=self.lot)
            db.session.add(brief)
            db.session.commit()

            updated_at = brief.updated_at
            created_at = brief.created_at

            brief.update_from_json({"foo": "bar"})
            db.session.add(brief)
            db.session.commit()

            assert brief.created_at == created_at
            assert brief.updated_at > updated_at
            assert brief.data == {'foo': 'bar'}
Ejemplo n.º 16
0
    def setup_dummy_brief(
            self, id=None, user_id=1, status=None, data=None, published_at=None, withdrawn_at=None,
            framework_slug='digital-outcomes-and-specialists', lot_slug='digital-specialists'
    ):
        if published_at is not None and status is not None:
            raise ValueError('Cannot provide both status and published_at')
        if withdrawn_at is not None and published_at is None:
            raise ValueError('If setting withdrawn_at then published_at must also be set')
        if not published_at:
            if status == 'closed':
                published_at = datetime.utcnow() - timedelta(days=1000)
            elif status == 'withdrawn':
                published_at = datetime.utcnow() - timedelta(days=1000)
                withdrawn_at = datetime.utcnow()
            else:
                published_at = None if status == 'draft' else datetime.utcnow()
        framework = Framework.query.filter(Framework.slug == framework_slug).first()
        lot = Lot.query.filter(Lot.slug == lot_slug).first()

        db.session.add(Brief(
            id=id,
            data=data,
            framework=framework,
            lot=lot,
            users=[User.query.get(user_id)],
            published_at=published_at,
            withdrawn_at=withdrawn_at,
        ))
        db.session.commit()
    def setup(self):
        super(BaseBriefResponseTest, self).setup()

        self.supplier_ids = self.setup_dummy_suppliers(2)
        supplier_frameworks = [
            SupplierFramework(supplier_id=supplier_id, framework_id=5)
            for supplier_id in self.supplier_ids
        ]
        brief = Brief(data=example_listings.brief_data().example(),
                      status='live',
                      framework_id=5,
                      lot=Lot.query.get(5))

        service = Service(
            service_id='1234560987654321',
            data={'locations': [brief.data['location']]},
            status='published',
            framework_id=5,
            lot_id=5,
            supplier_id=0,
        )

        specialist_brief = Brief(data=example_listings.brief_data().example(),
                                 status='live',
                                 framework_id=5,
                                 lot=Lot.query.get(6))

        specialist_service = Service(
            service_id='1234560987654322',
            data={
                'developerLocations': [specialist_brief.data['location']],
                'developerPriceMin': "0",
                'developerPriceMax': "1000"
            },
            status='published',
            framework_id=5,
            lot_id=6,
            supplier_id=0,
        )

        db.session.add_all(
            [service, specialist_service, brief, specialist_brief] +
            supplier_frameworks)
        db.session.commit()
        self.brief_id = brief.id
        self.specialist_brief_id = specialist_brief.id
Ejemplo n.º 18
0
    def test_brief_lot_must_be_associated_to_the_framework(self):
        with self.app.app_context():
            other_framework = Framework.query.filter(
                Framework.slug == 'g-cloud-7').first()

            brief = Brief(data={}, framework=other_framework, lot=self.lot)
            db.session.add(brief)
            with pytest.raises(IntegrityError):
                db.session.commit()
Ejemplo n.º 19
0
    def test_non_buyer_users_cannot_be_added_to_a_brief(self):
        with self.app.app_context():
            self.setup_dummy_user(role='admin')

            with pytest.raises(ValidationError):
                Brief(data={},
                      framework=self.framework,
                      lot=self.lot,
                      users=User.query.all())
Ejemplo n.º 20
0
    def test_expired_status_for_a_brief_with_passed_close_date(self):
        brief = Brief(data={},
                      framework=self.framework,
                      lot=self.lot,
                      published_at=datetime.utcnow() - timedelta(days=1000))

        assert brief.status == 'closed'
        assert brief.clarification_questions_are_closed
        assert brief.applications_closed_at < datetime.utcnow()
Ejemplo n.º 21
0
    def test_query_draft_brief(self):
        with self.app.app_context():
            db.session.add(
                Brief(data={}, framework=self.framework, lot=self.lot))
            db.session.commit()

            assert Brief.query.filter(Brief.status == 'draft').count() == 1
            assert Brief.query.filter(Brief.status == 'live').count() == 0
            assert Brief.query.filter(Brief.status == 'closed').count() == 0
def test_when_own_preference_and_approach_is_set():
    brief_data = {
        'approachSelector': 'ownPreference',
        'trainingApproachOwn': 'test'
    }
    lot = Lot(name='Training', one_service_limit=True)
    brief = Brief(lot=lot, data=brief_data)
    error = check_training_method(brief)
    assert error is None
Ejemplo n.º 23
0
    def setup_dummy_brief(self,
                          id=None,
                          user_id=1,
                          status=None,
                          data=None,
                          published_at=None,
                          withdrawn_at=None,
                          cancelled_at=None,
                          unsuccessful_at=None,
                          framework_slug='digital-outcomes-and-specialists',
                          lot_slug='digital-specialists',
                          add_clarification_question=False):
        if published_at is not None and status is not None:
            raise ValueError('Cannot provide both status and published_at')
        if withdrawn_at is not None and published_at is None:
            raise ValueError(
                'If setting withdrawn_at then published_at must also be set')
        if not published_at:
            if status == 'closed':
                published_at = datetime.utcnow() - timedelta(days=1000)
            elif status == 'withdrawn':
                published_at = datetime.utcnow() - timedelta(days=1000)
                withdrawn_at = datetime.utcnow()
            elif status == 'cancelled':
                published_at = datetime.utcnow() - timedelta(days=1000)
                cancelled_at = datetime.utcnow()
            elif status == 'unsuccessful':
                published_at = datetime.utcnow() - timedelta(days=1000)
                unsuccessful_at = datetime.utcnow()
            else:
                published_at = None if status == 'draft' else datetime.utcnow()
        framework = Framework.query.filter(
            Framework.slug == framework_slug).first()
        lot = Lot.query.filter(Lot.slug == lot_slug).first()

        brief = Brief(id=id,
                      data=data,
                      framework=framework,
                      lot=lot,
                      users=[User.query.get(user_id)],
                      published_at=published_at,
                      withdrawn_at=withdrawn_at,
                      cancelled_at=cancelled_at,
                      unsuccessful_at=unsuccessful_at)

        db.session.add(brief)
        if add_clarification_question:
            db.session.add(
                BriefClarificationQuestion(
                    brief=brief,
                    question=
                    "What is the answer to the meaning of life, the Universe and everything?",
                    answer="42"))

        db.session.commit()
        return brief
Ejemplo n.º 24
0
    def test_add_brief_clarification_question(self):
        with self.app.app_context():
            brief = Brief(data={},
                          framework=self.framework,
                          lot=self.lot,
                          status="live")
            db.session.add(brief)
            db.session.commit()

            brief.add_clarification_question(
                "How do you expect to deliver this?",
                "By the power of Grayskull")
            db.session.commit()

            assert len(brief.clarification_questions) == 1
            assert len(
                BriefClarificationQuestion.query.filter(
                    BriefClarificationQuestion._brief_id ==
                    brief.id).all()) == 1
Ejemplo n.º 25
0
    def test_buyer_users_can_be_added_to_a_brief(self):
        with self.app.app_context():
            self.setup_dummy_user(role='buyer')

            brief = Brief(data={},
                          framework=self.framework,
                          lot=self.lot,
                          users=User.query.all())

            assert len(brief.users) == 1
    def briefs(self, app):
        with app.app_context():
            framework = frameworks_service.find(
                slug='digital-marketplace').one_or_none()
            digital_professional_lot = lots_service.find(
                slug='digital-professionals').one_or_none()
            specialist_lot = lots_service.find(slug='specialist').one_or_none()

            db.session.add(
                Brief(id=1,
                      data={},
                      framework=framework,
                      lot=digital_professional_lot))

            db.session.add(
                Brief(id=2, data={}, framework=framework, lot=specialist_lot))

            db.session.commit()
            yield db.session.query(Brief).all()
Ejemplo n.º 27
0
    def test_create_a_new_brief(self):
        with self.app.app_context():
            brief = Brief(data={}, framework=self.framework, lot=self.lot)
            db.session.add(brief)
            db.session.commit()

            assert isinstance(brief.created_at, datetime)
            assert isinstance(brief.updated_at, datetime)
            assert brief.id is not None
            assert brief.data == dict()
Ejemplo n.º 28
0
    def test_query_brief_applications_closed_at_date(self):
        with self.app.app_context():
            db.session.add(
                Brief(data={},
                      framework=self.framework,
                      lot=self.lot,
                      published_at=datetime(2016, 3, 3, 12, 30, 1, 2)))
            db.session.commit()

            assert Brief.query.filter(Brief.applications_closed_at == datetime(
                2016, 3, 17, 23, 59, 59)).count() == 1
Ejemplo n.º 29
0
    def create_brief(self, user, team, framework, lot, data=None):
        if not data:
            data = {}

        brief = None
        if team:
            team_brief = TeamBrief(team_id=team.get('id'), user_id=user.id)
            brief = Brief(team_briefs=[team_brief],
                          framework=framework,
                          lot=lot,
                          data=data)
        else:
            brief = Brief(users=[user],
                          framework=framework,
                          lot=lot,
                          data=data)

        db.session.add(brief)
        db.session.commit()
        return brief
Ejemplo n.º 30
0
    def test_applications_closed_at_is_set_with_published_at(self):
        brief = Brief(data={},
                      framework=self.framework,
                      lot=self.lot,
                      published_at=datetime(2016, 3, 3, 12, 30, 1, 2))

        assert brief.applications_closed_at == datetime(
            2016, 3, 17, 23, 59, 59)
        assert brief.clarification_questions_closed_at == datetime(
            2016, 3, 10, 23, 59, 59)
        assert brief.clarification_questions_published_by == datetime(
            2016, 3, 16, 23, 59, 59)