Skip to content

Commit

Permalink
Merge pull request #49 from gorserg/fix_questions
Browse files Browse the repository at this point in the history
Fix validation for questions stage2
  • Loading branch information
kroman0 committed Aug 4, 2016
2 parents 8d4bfe9 + 4c9680f commit 2ed1a08
Show file tree
Hide file tree
Showing 2 changed files with 160 additions and 2 deletions.
145 changes: 145 additions & 0 deletions openprocurement/tender/competitivedialogue/tests/stage2/question.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
import unittest
from copy import deepcopy
from uuid import uuid4

from openprocurement.tender.competitivedialogue.tests.base import (test_lots, test_bids, test_shortlistedFirms,
BaseCompetitiveDialogEUStage2ContentWebTest,
Expand Down Expand Up @@ -385,6 +386,28 @@ def test_get_tender_questions(self):
u'url', u'name': u'tender_id'}
])

def create_question_on_item(self):
tender = self.db.get(self.tender_id)
item = tender['items'][0]
response = self.app.post_json('/tenders/{}/questions'.format(self.tender_id),
{'data': {'title': 'question title',
'description': 'question description',
'questionOf': 'item',
'relatedItem': item['id'],
'author': author}})

self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')

response = self.app.post_json('/tenders/{}/questions'.format(self.tender_id),
{'data': {'title': 'question title',
'description': 'question description',
'questionOf': 'tender',
'author': author}})

self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')


class TenderStage2EULotQuestionResourceTest(BaseCompetitiveDialogEUStage2ContentWebTest):

Expand Down Expand Up @@ -448,6 +471,56 @@ def test_create_question_on_lot_without_perm(self):
u'name': u'author'}
])

def create_question_on_item(self):
tender = self.db.get(self.tender_id)
item = tender['items'][0]
new_item = deepcopy(item)
new_item['id'] = uuid4().hex
new_item['relatedLot'] = self.lots[1]['id']
tender['items'] = [item, new_item]
for firm in tender['shortlistedFirms']:
firm['lots'] = [{'id': self.lots[1]['id']}]
self.db.save(tender)

# Create question on item
response = self.app.post_json('/tenders/{}/questions'.format(self.tender_id),
{'data': {'title': 'question title',
'description': 'question description',
'questionOf': 'item',
'relatedItem': new_item['id'],
'author': author}})

self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')

# Can't create question on item, on which we haven't access
response = self.app.post_json('/tenders/{}/questions'.format(self.tender_id),
{'data': {'title': 'question title',
'description': 'question description',
'questionOf': 'item',
'relatedItem': item['id'],
'author': author}},
status=403)

self.assertEqual(response.status, '403 Forbidden')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['status'], 'error')
self.assertEqual(response.json['errors'], [
{u'description': u'Author can\'t create question',
u'location': u'body',
u'name': u'author'}
])

# Create question on tender
response = self.app.post_json('/tenders/{}/questions'.format(self.tender_id),
{'data': {'title': 'question title',
'description': 'question description',
'questionOf': 'tender',
'author': author}})

self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')

def test_patch_tender_question(self):
response = self.app.post_json('/tenders/{}/questions'.format(self.tender_id),
{'data': {'title': 'question title',
Expand Down Expand Up @@ -875,6 +948,28 @@ def test_get_tender_questions(self):
u'url', u'name': u'tender_id'}
])

def create_question_on_item(self):
tender = self.db.get(self.tender_id)
item = tender['items'][0]
response = self.app.post_json('/tenders/{}/questions'.format(self.tender_id),
{'data': {'title': 'question title',
'description': 'question description',
'questionOf': 'item',
'relatedItem': item['id'],
'author': author}})

self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')

response = self.app.post_json('/tenders/{}/questions'.format(self.tender_id),
{'data': {'title': 'question title',
'description': 'question description',
'questionOf': 'tender',
'author': author}})

self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')


class TenderStage2UALotQuestionResourceTest(BaseCompetitiveDialogUAStage2ContentWebTest):

Expand Down Expand Up @@ -990,6 +1085,56 @@ def test_patch_tender_question(self):
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['data']["answer"], "answer")

def create_question_on_item(self):
tender = self.db.get(self.tender_id)
item = tender['items'][0]
new_item = deepcopy(item)
new_item['id'] = uuid4().hex
new_item['relatedLot'] = self.lots[1]['id']
tender['items'] = [item, new_item]
for firm in tender['shortlistedFirms']:
firm['lots'] = [{'id': self.lots[1]['id']}]
self.db.save(tender)

# Create question on item
response = self.app.post_json('/tenders/{}/questions'.format(self.tender_id),
{'data': {'title': 'question title',
'description': 'question description',
'questionOf': 'item',
'relatedItem': new_item['id'],
'author': author}})

self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')

# Can't create question on item, on which we haven't access
response = self.app.post_json('/tenders/{}/questions'.format(self.tender_id),
{'data': {'title': 'question title',
'description': 'question description',
'questionOf': 'item',
'relatedItem': item['id'],
'author': author}},
status=403)

self.assertEqual(response.status, '403 Forbidden')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['status'], 'error')
self.assertEqual(response.json['errors'], [
{u'description': u'Author can\'t create question',
u'location': u'body',
u'name': u'author'}
])

# Create question on tender
response = self.app.post_json('/tenders/{}/questions'.format(self.tender_id),
{'data': {'title': 'question title',
'description': 'question description',
'questionOf': 'tender',
'author': author}})

self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')


def suite():
suite = unittest.TestSuite()
Expand Down
17 changes: 15 additions & 2 deletions openprocurement/tender/competitivedialogue/validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,25 @@ def validate_patch_tender_stage2_data(request):
return data


def get_item_by_id(tender, id):
for item in tender['items']:
if item['id'] == id:
return item


def validate_author(request, shortlistedFirms, obj):
error_message = 'Author can\'t {} {}'.format('create' if request.method == 'POST' else 'patch',
obj.__class__.__name__.lower())
firms_key = prepare_shortlistedFirms(shortlistedFirms)
firms_keys = prepare_shortlistedFirms(shortlistedFirms)
author_key = prepare_author(obj)
for firm in firms_key:
if obj.get('questionOf') == 'item':
if shortlistedFirms[0].get('lots'): # question can create on item
item_id = author_key.split('_')[-1]
item = get_item_by_id(request.validated['tender'], item_id)
author_key = author_key.replace(author_key.split('_')[-1], item['relatedLot'])
else:
author_key = '_'.join(author_key.split('_')[:-1])
for firm in firms_keys:
if author_key in firm: # if we found legal firm then check another complaint
break
else: # we didn't find legal firm, then return error
Expand Down

0 comments on commit 2ed1a08

Please sign in to comment.