Skip to content

Commit

Permalink
Merge pull request prozorro-sale#37 from oleksiyVeretiuk/validation_d…
Browse files Browse the repository at this point in the history
…gfID

Validation dgf
  • Loading branch information
leits authored Dec 21, 2017
2 parents 51b0201 + 0a97f7d commit addaf48
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 196 deletions.
4 changes: 2 additions & 2 deletions openprocurement/auctions/dgf/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ class Options:
'invalid': view_role,
'edit_pending.verification': whitelist(),
'edit_invalid': whitelist(),
'convoy': whitelist('status', 'items', 'documents')
'convoy': whitelist('status', 'items', 'documents', 'dgfID')
}

awards = ListType(ModelType(Award), default=list())
Expand Down Expand Up @@ -407,7 +407,7 @@ def validate_value(self, data, value):
raise ValidationError(u"currency should be only UAH")

def validate_dgfID(self, data, dgfID):
if not dgfID:
if not dgfID and data['status'] not in ['draft', 'pending.verification', 'invalid']:
if (data.get('revisions')[0].date if data.get('revisions') else get_now()) > DGF_ID_REQUIRED_FROM:
raise ValidationError(u'This field is required.')

Expand Down
204 changes: 10 additions & 194 deletions openprocurement/auctions/dgf/tests/tender.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

from openprocurement.api.utils import ROUTE_PREFIX
from openprocurement.api.models import get_now, SANDBOX_MODE, TZ
from openprocurement.auctions.core.tests.base import snitch
from openprocurement.auctions.dgf.models import DGFOtherAssets, DGFFinancialAssets, DGF_ID_REQUIRED_FROM
from openprocurement.auctions.dgf.tests.base import (
test_auction_data,
Expand Down Expand Up @@ -68,6 +69,15 @@ def test_edit_role(self):


class AuctionResourceTest(BaseWebTest):

from openprocurement.auctions.core.tests.blanks.tender_blanks import (
create_auction_draft_with_registry,
convoy_change_status
)

test_01_create_auction_draft_with_registry = snitch(create_auction_draft_with_registry)
test_02_convoy_change_status = snitch(convoy_change_status)

initial_data = test_auction_data
initial_organization = test_organization

Expand Down Expand Up @@ -672,49 +682,6 @@ def test_create_auction_draft(self):
auction = response.json['data']
self.assertEqual(auction['status'], 'active.tendering')

def test_create_auction_draft_with_registry(self):
data = self.initial_data.copy()
items = data.pop('items')
data.update({'status': 'draft', 'merchandisingObject': uuid4().hex})
response = self.app.post_json('/auctions', {'data': data})
self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')
auction = response.json['data']
self.assertEqual(auction['status'], 'draft')

response = self.app.patch_json('/auctions/{}'.format(auction['id']), {'data': {'value': {'amount': 100}}}, 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"Can't update auction in current (draft) status", u'location': u'body', u'name': u'data'}
])

response = self.app.patch_json('/auctions/{}'.format(auction['id']), {'data': {'status': 'pending.verification'}})
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
auction = response.json['data']
self.assertEqual(auction['status'], 'pending.verification')

self.app.authorization = ('Basic', ('convoy', ''))
response = self.app.patch_json('/auctions/{}'.format(auction['id']),
{'data': {'items': items}})
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(len(response.json['data']['items']), len(items))

response = self.app.patch_json('/auctions/{}'.format(auction['id']), {'data': {'status': 'active.tendering'}})
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
auction = response.json['data']
self.assertEqual(auction['status'], 'active.tendering')

response = self.app.get('/auctions/{}'.format(auction['id']))
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
auction = response.json['data']
self.assertEqual(auction['status'], 'active.tendering')

def test_create_auction(self):
response = self.app.get('/auctions')
self.assertEqual(response.status, '200 OK')
Expand Down Expand Up @@ -1235,157 +1202,6 @@ def test_auction_Administrator_change(self):
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['data']['mode'], u'test')

def test_convoy_change_status(self):
# Check auctions list count
self.app.authorization = ('Basic', ('broker', ''))
response = self.app.get('/auctions')
self.assertEqual(response.status, '200 OK')
self.assertEqual(len(response.json['data']), 0)

# Create auction without merchandisingObject
data = self.initial_data.copy()
data.update({'status': 'draft'})
response = self.app.post_json('/auctions', {'data': data})
self.assertEqual(response.status, '201 Created')
auction = response.json['data']
owner_token = response.json['access']['token']

response = self.app.get('/auctions/{}'.format(auction['id']))
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['data'], auction)

# Switch auction status 'draft' -> 'pending.verification' via owner
# without merchandisingObject
response = self.app.patch_json('/auctions/{}?acc_token={}'.format(auction['id'], owner_token), {'data': {'status': 'pending.verification'}}, status=422)
self.assertEqual(response.status, '422 Unprocessable Entity')
self.assertEqual(response.json['status'], 'error')
self.assertEqual(response.json['errors'], [{u'description': u"Can't switch auction to status (pending.verification) without merchandisingObject", u'location': u'body', u'name': u'data'}])

# Create auction with items
data.update({'merchandisingObject': uuid4().hex})
response = self.app.post_json('/auctions', {'data': data})
self.assertEqual(response.status, '201 Created')
auction = response.json['data']
owner_token = response.json['access']['token']

response = self.app.get('/auctions/{}'.format(auction['id']))
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['data'], auction)

# Switch auction status 'draft' -> 'pending.verification' via owner
# with items
response = self.app.patch_json('/auctions/{}?acc_token={}'.format(auction['id'], owner_token),
{'data': {'status': 'pending.verification'}}, status=422)
self.assertEqual(response.status, '422 Unprocessable Entity')
self.assertEqual(response.json['status'], 'error')
self.assertEqual(response.json['errors'], [
{u'description': u"This field is not required.",
u'location': u'body', u'name': u'items'}])


# Create auction with merchandisingObject and without items
data.update({'merchandisingObject': uuid4().hex})
items = data.pop('items')
response = self.app.post_json('/auctions', {'data': data})
self.assertEqual(response.status, '201 Created')
auction = response.json['data']
owner_token = response.json['access']['token']

response = self.app.get('/auctions/{}'.format(auction['id']))
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['data'], auction)

# Switch auction status 'draft' -> 'pending.verification' via owner
response = self.app.patch_json('/auctions/{}?acc_token={}'.format(auction['id'], owner_token), {'data': {'status': 'pending.verification'}})
self.assertEqual(response.status, '200 OK')
auction = response.json['data']
self.assertEqual(auction['status'], 'pending.verification')

self.app.authorization = ('Basic', ('convoy', ''))
response = self.app.get('/auctions/{}'.format(auction['id']))
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['data'], auction)

# Switch auction status 'pending.verification' -> 'active.tendering' via convoy without items
response = self.app.patch_json('/auctions/{}'.format(auction['id']), {'data': {'status': 'active.tendering'}}, status=422)
self.assertEqual(response.status, '422 Unprocessable Entity')
self.assertEqual(response.json['status'], 'error')
self.assertEqual(response.json['errors'], [
{u'description': [u"This field is required."],
u'location': u'body', u'name': u'items'}])

# Add items via convoy
response = self.app.patch_json('/auctions/{}'.format(auction['id']), {'data': {'items': items}})
self.assertEqual(response.status, '200 OK')
self.assertEqual(len(response.json['data']['items']), len(items))

# Switch auction status 'pending.verification' -> 'active.tendering' via convoy
response = self.app.patch_json('/auctions/{}'.format(auction['id']), {'data': {'status': 'active.tendering'}})
self.assertEqual(response.status, '200 OK')
auction = response.json['data']
self.assertEqual(auction['status'], 'active.tendering')

response = self.app.get('/auctions/{}'.format(auction['id']))
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['data'], auction)

# Switch auction status 'active.tendering' -> 'invalid' via convoy
response = self.app.patch_json('/auctions/{}'.format(auction['id']), {'data': {'status': 'invalid'}}, status=403)
self.assertEqual(response.status, '403 Forbidden')
self.assertEqual(response.json['status'], 'error')
self.assertEqual(response.json['errors'], [{u'description': u"Can't update auction in current (active.tendering) status", u'location': u'body', u'name': u'data'}])

# Create auction with merchandisingObject
self.app.authorization = ('Basic', ('broker', ''))
response = self.app.post_json('/auctions', {'data': data})
self.assertEqual(response.status, '201 Created')
auction = response.json['data']
owner_token = response.json['access']['token']

response = self.app.get('/auctions/{}'.format(auction['id']))
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['data'], auction)

# Switch auction status 'draft' -> 'pending.verification' via owner
response = self.app.patch_json('/auctions/{}?acc_token={}'.format(auction['id'], owner_token), {'data': {'status': 'pending.verification'}})
self.assertEqual(response.status, '200 OK')
auction = response.json['data']
self.assertEqual(auction['status'], 'pending.verification')

self.app.authorization = ('Basic', ('convoy', ''))
response = self.app.get('/auctions/{}'.format(auction['id']))
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['data'], auction)

# Switch auction status 'pending.verification' -> 'invalid' via convoy
response = self.app.patch_json('/auctions/{}'.format(auction['id']), {'data': {'status': 'invalid'}})
self.assertEqual(response.status, '200 OK')
auction = response.json['data']
self.assertEqual(auction['status'], 'invalid')

response = self.app.get('/auctions/{}'.format(auction['id']))
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['data'], auction)

# Switch auction status 'invalid' -> 'active.tendering' via convoy
response = self.app.patch_json('/auctions/{}'.format(auction['id']), {'data': {'status': 'active.tendering'}}, status=403)
self.assertEqual(response.status, '403 Forbidden')
self.assertEqual(response.json['status'], 'error')
self.assertEqual(response.json['errors'], [{u'description': u"Can't update auction in current (invalid) status", u'location': u'body', u'name': u'data'}])

response = self.app.get('/auctions/{}'.format(auction['id']))
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['data'], auction)


class AuctionProcessTest(BaseAuctionWebTest):
#setUp = BaseWebTest.setUp
Expand Down
4 changes: 4 additions & 0 deletions openprocurement/auctions/dgf/validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ def validate_patch_auction_data(request):
request.errors.add('body', 'items', 'This field is not required.')
request.errors.status = 422
return
elif request.context.dgfID:
request.errors.add('body', 'dgfID', 'This field is not required.')
request.errors.status = 422
return
request.validated['data'] = {'status': new_status}
request.context.status = new_status
return
Expand Down

0 comments on commit addaf48

Please sign in to comment.