Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/a168811274116850_submit_bid_with…
Browse files Browse the repository at this point in the history
…_documents'
  • Loading branch information
vmaksymiv committed Dec 13, 2016
2 parents 4b4e6ec + dccbb1b commit 5390573
Show file tree
Hide file tree
Showing 2 changed files with 304 additions and 1 deletion.
2 changes: 1 addition & 1 deletion openprocurement/tender/openua/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ class Options:
'Administrator': Administrator_bid_role,
'embedded': view_bid_role,
'view': view_bid_role,
'create': whitelist('value', 'tenderers', 'parameters', 'lotValues', 'status', 'selfQualified', 'selfEligible', 'subcontractingDetails'),
'create': whitelist('value', 'tenderers', 'parameters', 'lotValues', 'status', 'selfQualified', 'selfEligible', 'subcontractingDetails', 'documents'),
'edit': whitelist('value', 'tenderers', 'parameters', 'lotValues', 'status', 'subcontractingDetails'),
'auction_view': whitelist('value', 'lotValues', 'id', 'date', 'parameters', 'participationUrl', 'status'),
'auction_post': whitelist('value', 'lotValues', 'id', 'date'),
Expand Down
303 changes: 303 additions & 0 deletions openprocurement/tender/openua/tests/bid.py
Original file line number Diff line number Diff line change
Expand Up @@ -1278,6 +1278,309 @@ def test_put_tender_bidder_document_json(self):
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['errors'][0]["description"], "Can't update document because award of bid is not in pending or active state")


class TenderBidderBatchDocumentWithDSResourceTest(BaseTenderUAContentWebTest):
docservice = True
initial_status = 'active.tendering'

def test_create_tender_bidder_with_document_invalid(self):
response = self.app.post_json('/tenders/{}/bids'.format( self.tender_id),
{'data': {
'tenderers': [test_organization],
'value': {'amount': 500},
'selfEligible': True,
'selfQualified': True,
'documents': [{
'title': 'name.doc',
'url': 'http://invalid.docservice.url/get/uuid',
'hash': 'md5:' + '0' * 32,
'format': 'application/msword'
}]
}}, status=403)
self.assertEqual(response.status, '403 Forbidden')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['errors'][0]["description"], "Can add document only from document service.")

response = self.app.post_json('/tenders/{}/bids'.format( self.tender_id),
{'data': {
'tenderers': [test_organization],
'value': {'amount': 500},
'selfEligible': True,
'selfQualified': True,
'documents': [{
'title': 'name.doc',
'url': '/'.join(self.generate_docservice_url().split('/')[:4]),
'hash': 'md5:' + '0' * 32,
'format': 'application/msword'
}]
}}, status=403)
self.assertEqual(response.status, '403 Forbidden')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['errors'][0]["description"], "Can add document only from document service.")

response = self.app.post_json('/tenders/{}/bids'.format( self.tender_id),
{'data': {
'tenderers': [test_organization],
'value': {'amount': 500},
'selfEligible': True,
'selfQualified': True,
'documents': [{
'title': 'name.doc',
'url': self.generate_docservice_url().split('?')[0],
'hash': 'md5:' + '0' * 32,
'format': 'application/msword'
}]
}}, status=403)
self.assertEqual(response.status, '403 Forbidden')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['errors'][0]["description"], "Can add document only from document service.")

response = self.app.post_json('/tenders/{}/bids'.format( self.tender_id),
{'data': {
'tenderers': [test_organization],
'value': {'amount': 500},
'selfEligible': True,
'selfQualified': True,
'documents': [{
'title': 'name.doc',
'url': self.generate_docservice_url(),
'format': 'application/msword'
}]
}}, status=422)
self.assertEqual(response.status, '422 Unprocessable Entity')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['errors'][0]["location"], "documents")
self.assertEqual(response.json['errors'][0]["name"], "hash")
self.assertEqual(response.json['errors'][0]["description"], "This field is required.")

response = self.app.post_json('/tenders/{}/bids'.format( self.tender_id),
{'data': {
'tenderers': [test_organization],
'value': {'amount': 500},
'selfEligible': True,
'selfQualified': True,
'documents': [{
'title': 'name.doc',
'url': self.generate_docservice_url().replace(self.app.app.registry.keyring.keys()[-1], '0' * 8),
'hash': 'md5:' + '0' * 32,
'format': 'application/msword'
}]
}}, status=422)
self.assertEqual(response.status, '422 Unprocessable Entity')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['errors'][0]["description"], "Document url expired.")

response = self.app.post_json('/tenders/{}/bids'.format( self.tender_id),
{'data': {
'tenderers': [test_organization],
'value': {'amount': 500},
'selfEligible': True,
'selfQualified': True,
'documents': [{
'title': 'name.doc',
'url': self.generate_docservice_url().replace("Signature=", "Signature=ABC"),
'hash': 'md5:' + '0' * 32,
'format': 'application/msword'
}]
}}, status=422)
self.assertEqual(response.status, '422 Unprocessable Entity')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['errors'][0]["description"], "Document url signature invalid.")

response = self.app.post_json('/tenders/{}/bids'.format( self.tender_id),
{'data': {
'tenderers': [test_organization],
'value': {'amount': 500},
'selfEligible': True,
'selfQualified': True,
'documents': [{
'title': 'name.doc',
'url': self.generate_docservice_url().replace("Signature=", "Signature=bw%3D%3D"),
'hash': 'md5:' + '0' * 32,
'format': 'application/msword'
}]
}}, status=422)
self.assertEqual(response.status, '422 Unprocessable Entity')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['errors'][0]["description"], "Document url invalid.")


def test_create_tender_bidder_with_document(self):
response = self.app.post_json('/tenders/{}/bids'.format( self.tender_id),
{'data': {
'tenderers': [test_organization],
'value': {'amount': 500},
'selfEligible': True,
'selfQualified': True,
'documents': [{
'title': 'name.doc',
'url': self.generate_docservice_url(),
'hash': 'md5:' + '0' * 32,
'format': 'application/msword'
}]
}})
self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')
bidder = response.json['data']
self.assertEqual(bidder['tenderers'][0]['name'], test_organization['name'])
self.assertIn('id', bidder)
self.bid_id = bidder['id']
self.bid_token = response.json['access']['token']
self.assertIn(bidder['id'], response.headers['Location'])
document = bidder['documents'][0]
self.assertEqual('name.doc', document["title"])
key = document["url"].split('?')[-1].split('=')[-1]

response = self.app.get('/tenders/{}/bids/{}/documents'.format(self.tender_id, self.bid_id), status=403)
self.assertEqual(response.status, '403 Forbidden')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['errors'][0]["description"], "Can't view bid documents in current (active.tendering) tender status")

response = self.app.get('/tenders/{}/bids/{}/documents?acc_token={}'.format(self.tender_id, self.bid_id, self.bid_token))
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(document['id'], response.json["data"][0]["id"])
self.assertEqual('name.doc', response.json["data"][0]["title"])

response = self.app.get('/tenders/{}/bids/{}/documents?all=true&acc_token={}'.format(self.tender_id, self.bid_id, self.bid_token))
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(document['id'], response.json["data"][0]["id"])
self.assertEqual('name.doc', response.json["data"][0]["title"])

response = self.app.get('/tenders/{}/bids/{}/documents/{}?download=some_id&acc_token={}'.format(
self.tender_id, self.bid_id, document['id'], self.bid_token), status=404)
self.assertEqual(response.status, '404 Not Found')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['status'], 'error')
self.assertEqual(response.json['errors'], [
{u'description': u'Not Found', u'location': u'url', u'name': u'download'}
])

response = self.app.get('/tenders/{}/bids/{}/documents/{}?download={}'.format(
self.tender_id, self.bid_id, document['id'], key), status=403)
self.assertEqual(response.status, '403 Forbidden')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['errors'][0]["description"], "Can't view bid document in current (active.tendering) tender status")

response = self.app.get('/tenders/{}/bids/{}/documents/{}?download={}&acc_token={}'.format(
self.tender_id, self.bid_id, document['id'], key, self.bid_token))
self.assertEqual(response.status, '302 Moved Temporarily')
self.assertIn('http://localhost/get/', response.location)
self.assertIn('Signature=', response.location)
self.assertIn('KeyID=', response.location)
self.assertIn('Expires=', response.location)

response = self.app.get('/tenders/{}/bids/{}/documents/{}'.format(
self.tender_id, self.bid_id, document['id']), status=403)
self.assertEqual(response.status, '403 Forbidden')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['errors'][0]["description"], "Can't view bid document in current (active.tendering) tender status")

response = self.app.get('/tenders/{}/bids/{}/documents/{}?acc_token={}'.format(
self.tender_id, self.bid_id, document['id'], self.bid_token))
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(document['id'], response.json["data"]["id"])
self.assertEqual('name.doc', response.json["data"]["title"])


def test_create_tender_bidder_with_documents(self):
dateModified = self.db.get(self.tender_id).get('dateModified')

response = self.app.post_json('/tenders/{}/bids'.format( self.tender_id),
{'data': {
'tenderers': [test_organization],
'value': {'amount': 500},
'selfEligible': True,
'selfQualified': True,
'documents': [{
'title': 'first.doc',
'url': self.generate_docservice_url(),
'hash': 'md5:' + '0' * 32,
'format': 'application/msword'
},
{
'title': 'second.doc',
'url': self.generate_docservice_url(),
'hash': 'md5:' + '0' * 32,
'format': 'application/msword'
},
{
'title': 'third.doc',
'url': self.generate_docservice_url(),
'hash': 'md5:' + '0' * 32,
'format': 'application/msword'
}]
}})
self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')
bidder = response.json['data']
self.assertEqual(bidder['tenderers'][0]['name'], test_organization['name'])
self.assertIn('id', bidder)
self.bid_id = bidder['id']
self.bid_token = response.json['access']['token']
self.assertIn(bidder['id'], response.headers['Location'])
documents = bidder['documents']
ids = [doc['id'] for doc in documents]
self.assertEqual(['first.doc', 'second.doc', 'third.doc'], [document["title"] for document in documents])

response = self.app.get('/tenders/{}/bids/{}/documents'.format(self.tender_id, self.bid_id), status=403)
self.assertEqual(response.status, '403 Forbidden')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['errors'][0]["description"], "Can't view bid documents in current (active.tendering) tender status")

response = self.app.get('/tenders/{}/bids/{}/documents?acc_token={}'.format(self.tender_id, self.bid_id, self.bid_token))
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(len(response.json["data"]), 3)
self.assertEqual(ids, [doc['id'] for doc in response.json["data"]])

response = self.app.get('/tenders/{}/bids/{}/documents?all=true&acc_token={}'.format(self.tender_id, self.bid_id, self.bid_token))
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(len(response.json["data"]), 3)
self.assertEqual(ids, [doc['id'] for doc in response.json["data"]])

for index, document in enumerate(documents):
key = document["url"].split('?')[-1].split('=')[-1]

response = self.app.get('/tenders/{}/bids/{}/documents/{}?download=some_id&acc_token={}'.format(
self.tender_id, self.bid_id, document['id'], self.bid_token), status=404)
self.assertEqual(response.status, '404 Not Found')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['status'], 'error')
self.assertEqual(response.json['errors'], [
{u'description': u'Not Found', u'location': u'url', u'name': u'download'}
])

response = self.app.get('/tenders/{}/bids/{}/documents/{}?download={}'.format(
self.tender_id, self.bid_id, document['id'], key), status=403)
self.assertEqual(response.status, '403 Forbidden')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['errors'][0]["description"], "Can't view bid document in current (active.tendering) tender status")

response = self.app.get('/tenders/{}/bids/{}/documents/{}?download={}&acc_token={}'.format(
self.tender_id, self.bid_id, document['id'], key, self.bid_token))
self.assertEqual(response.status, '302 Moved Temporarily')
self.assertIn('http://localhost/get/', response.location)
self.assertIn('Signature=', response.location)
self.assertIn('KeyID=', response.location)
self.assertIn('Expires=', response.location)

response = self.app.get('/tenders/{}/bids/{}/documents/{}'.format(
self.tender_id, self.bid_id, document['id']), status=403)
self.assertEqual(response.status, '403 Forbidden')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['errors'][0]["description"], "Can't view bid document in current (active.tendering) tender status")

response = self.app.get('/tenders/{}/bids/{}/documents/{}?acc_token={}'.format(
self.tender_id, self.bid_id, document['id'], self.bid_token))
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(document['id'], response.json["data"]["id"])


def suite():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TenderBidDocumentResourceTest))
Expand Down

0 comments on commit 5390573

Please sign in to comment.