Skip to content

Commit dffb0b9

Browse files
Anna MankoAnna Manko
authored andcommitted
Added document types and a documentOf option, tests for them.
1 parent a2b3109 commit dffb0b9

13 files changed

Lines changed: 282 additions & 7 deletions

File tree

src/openprocurement/api/models.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,11 @@ class Options:
520520
"registerExtract",
521521
"registerFiscal",
522522
"winningBid",
523+
"contractTemplate",
524+
"contractSchema",
525+
"contractForm",
526+
"contractData",
527+
"contractProforma",
523528
]
524529
)
525530
title = StringType(required=True) # A title of the document.

src/openprocurement/tender/belowthreshold/tests/award.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@
6464
# TenderAwardDocumentResourceTest
6565
not_found_award_document,
6666
create_tender_award_document,
67+
create_tender_award_with_the_invalid_document_type,
68+
put_tender_json_award_document_of_document,
6769
put_tender_award_document,
6870
patch_tender_award_document,
6971
create_award_document_bot,
@@ -95,7 +97,9 @@ class TenderAwardComplaintResourceTestMixin(object):
9597
class TenderAwardDocumentResourceTestMixin(object):
9698
test_not_found_award_document = snitch(not_found_award_document)
9799
test_create_tender_award_document = snitch(create_tender_award_document)
100+
test_create_tender_award_with_the_invalid_document_type = snitch(create_tender_award_with_the_invalid_document_type)
98101
test_put_tender_award_document = snitch(put_tender_award_document)
102+
test_put_tender_json_award_document_of_document = snitch(put_tender_json_award_document_of_document)
99103
test_patch_tender_award_document = snitch(patch_tender_award_document)
100104
test_create_award_document_bot = snitch(create_award_document_bot)
101105
test_patch_not_author = snitch(patch_not_author)

src/openprocurement/tender/belowthreshold/tests/award_blanks.py

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44
from webtest import AppError
55
import mock
66
import dateutil.parser
7-
7+
import re
8+
import ast
89
from openprocurement.api.utils import get_now
910
from openprocurement.tender.belowthreshold.tests.base import (
10-
test_organization, test_draft_claim, test_claim, test_cancellation
11+
test_organization, test_draft_claim, test_claim, test_cancellation, test_tender_document_data
1112
)
1213

1314

@@ -591,6 +592,79 @@ def create_tender_award_no_scale(self):
591592
self.assertNotIn("scale", response.json["data"]["suppliers"][0])
592593

593594

595+
def create_tender_award_with_the_invalid_document_type(self):
596+
document_data = test_tender_document_data
597+
document_data["url"] = self.generate_docservice_url()
598+
document_data["hash"] = "md5:" + "0" * 32
599+
document_data["documentType"] = "smth"
600+
601+
response = self.app.post(
602+
"/tenders/{}/awards/{}/documents?acc_token={}".format(self.tender_id, self.award_id, self.tender_token),
603+
upload_files=[("file", "name.doc", "content")],
604+
)
605+
self.assertEqual(response.status, "201 Created")
606+
self.assertEqual(response.content_type, "application/json")
607+
608+
doc_id = response.json["data"]["id"]
609+
self.assertIn(doc_id, response.headers["Location"])
610+
self.assertEqual(u"name.doc", response.json["data"]["title"])
611+
response = self.app.patch_json(
612+
"/tenders/{}/awards/{}/documents/{}?acc_token={}".format(self.tender_id, self.award_id,doc_id, self.tender_token),
613+
{"data": {"documentType": "smth"}},
614+
status=422,
615+
)
616+
self.assertEqual(response.status, "422 Unprocessable Entity")
617+
self.assertEqual(response.content_type, "application/json")
618+
response_doctype_dict = re.findall(r"\[.*\]",response.json["errors"][0]["description"][0])[0]
619+
response_doctype_dict = ast.literal_eval(response_doctype_dict)
620+
response_doctype_dict = [n.strip() for n in response_doctype_dict]
621+
self.assertListEqual(
622+
response_doctype_dict,
623+
["tenderNotice","awardNotice","contractNotice","notice","biddingDocuments","technicalSpecifications",
624+
"evaluationCriteria","clarifications","shortlistedFirms","riskProvisions","billOfQuantity","bidders",
625+
"conflictOfInterest","debarments","evaluationReports","winningBid","complaints","contractSigned",
626+
"contractArrangements","contractSchedule","contractAnnexe","contractGuarantees","subContract",
627+
"eligibilityCriteria","contractProforma","commercialProposal","qualificationDocuments",
628+
"eligibilityDocuments","registerExtract","registerFiscal","winningBid","contractTemplate",
629+
"contractSchema","contractForm","contractData","contractProforma"])
630+
631+
632+
def put_tender_json_award_document_of_document(self):
633+
response = self.app.post(
634+
"/tenders/{}/awards/{}/documents?acc_token={}".format(self.tender_id, self.award_id, self.tender_token),
635+
upload_files=[("file", "name.doc", "content")],
636+
)
637+
self.assertEqual(response.status, "201 Created")
638+
self.assertEqual(response.content_type, "application/json")
639+
document_id = response.json["data"]["id"]
640+
response = self.app.patch_json(
641+
"/tenders/{}/awards/{}/documents/{}?acc_token={}".format(self.tender_id, self.award_id,document_id, self.tender_token),
642+
{"data": {
643+
"title": u"укр.doc",
644+
"url": self.generate_docservice_url(),
645+
"hash": "md5:" + "0" * 32,
646+
"format": "application/msword",
647+
"documentOf": "document",
648+
"relatedItem": "0"*32,
649+
}}, status=422
650+
)
651+
self.assertEqual(response.status, "422 Unprocessable Entity")
652+
self.assertEqual(response.content_type, "application/json")
653+
self.assertEqual(
654+
response.json["errors"],
655+
[
656+
{
657+
u"location": u"body",
658+
u"name": u"relatedItem",
659+
u"description": [
660+
661+
u'relatedItem should be one of documents'
662+
]
663+
}
664+
]
665+
)
666+
667+
594668
# TenderLotAwardResourceTest
595669

596670

src/openprocurement/tender/belowthreshold/tests/base.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,15 @@
8484
"procurementMethodType": "belowThreshold",
8585
"milestones": test_milestones,
8686
}
87+
88+
test_tender_document_data = {
89+
"url": "http://ds.prozorro.local/get/b97562e3f33c493297fd14dd6d8c50f0?KeyID=a8968c46&Signature=3OV7QC7f%2ByfcGTvpy0tf%2FaM%2BFRI6kkg1ImfEJlfAx5qi%2FLY7IIj7TFqtxgaPrzdd%2BWIOCe3O5Q7WhXkOdCB9CQ%3D%3D",
90+
"documentType":"tenderNotice",
91+
"title": "Notice.pdf",
92+
"hash": "md5:00000000000000000000000000000000",
93+
"format": "application/pdf"
94+
}
95+
8796
if SANDBOX_MODE:
8897
test_tender_data["procurementMethodDetails"] = "quick, accelerator=1440"
8998
test_features_tender_data = test_tender_data.copy()

src/openprocurement/tender/belowthreshold/tests/document.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
create_tender_document,
1212
put_tender_document,
1313
patch_tender_document,
14+
create_document_with_the_invalid_document_type,
15+
put_tender_json_document_of_document,
1416
# TenderDocumentWithDSResourceTest
1517
create_tender_document_error,
1618
create_tender_document_json_invalid,
@@ -33,6 +35,8 @@ class TenderDocumentWithDSResourceTestMixin(object):
3335
test_create_tender_document_json_invalid = snitch(create_tender_document_json_invalid)
3436
test_create_tender_document_json = snitch(create_tender_document_json)
3537
test_put_tender_document_json = snitch(put_tender_document_json)
38+
test_put_tender_json_document_of_document = snitch(put_tender_json_document_of_document)
39+
test_create_document_with_the_invalid_document_type = snitch(create_document_with_the_invalid_document_type)
3640

3741

3842
class TenderDocumentResourceTest(TenderContentWebTest, TenderDocumentResourceTestMixin):

src/openprocurement/tender/belowthreshold/tests/document_blanks.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,13 @@
22
from email.header import Header
33

44
# TenderDocumentResourceTest
5+
import re
6+
import ast
57
from mock import patch
8+
from copy import deepcopy
69
from openprocurement.tender.core.tests.base import bad_rs_request, srequest
10+
from openprocurement.tender.belowthreshold.tests.base import test_tender_document_data
11+
from openprocurement.api.models import Document as BaseDocument
712

813

914
def not_found(self):
@@ -888,3 +893,77 @@ def lot_patch_tender_document_json_items_none(self):
888893

889894
errors = {error["name"]: error["description"] for error in response.json["errors"]}
890895
self.assertEqual(errors["documents"][0], {"relatedItem": ["relatedItem should be one of items"]})
896+
897+
898+
def put_tender_json_document_of_document(self):
899+
document_data = deepcopy(test_tender_document_data)
900+
document_data["url"] = self.generate_docservice_url()
901+
document_data["hash"] = "md5:" + "0" * 32
902+
document_data["documentType"] = "tenderNotice"
903+
904+
response = self.app.post_json("/tenders/{}/documents?acc_token={}".format(
905+
self.tender_id, self.tender_token),{"data":document_data}, status=201)
906+
907+
self.assertEqual(response.status, "201 Created")
908+
self.assertEqual(response.content_type, "application/json")
909+
document_id = response.json["data"]["id"]
910+
911+
response = self.app.post_json(
912+
"/tenders/{}/documents?acc_token={}".format(self.tender_id, self.tender_token),
913+
{
914+
"data": {
915+
"title": u"укр.doc",
916+
"url": self.generate_docservice_url(),
917+
"hash": "md5:" + "0" * 32,
918+
"format": "application/msword",
919+
"documentOf": "document",
920+
"relatedItem": document_id,
921+
}
922+
},
923+
)
924+
self.assertEqual(response.status, "201 Created")
925+
self.assertEqual(response.content_type, "application/json")
926+
927+
response = self.app.post_json(
928+
"/tenders/{}/documents?acc_token={}".format(self.tender_id, self.tender_token),
929+
{"data": {
930+
"title": u"укр.doc",
931+
"url": self.generate_docservice_url(),
932+
"hash": "md5:" + "0" * 32,
933+
"format": "application/msword",
934+
"documentOf": "document",
935+
"relatedItem": "0"*32,
936+
}}, status=422
937+
)
938+
self.assertEqual(response.status, "422 Unprocessable Entity")
939+
self.assertEqual(response.content_type, "application/json")
940+
self.assertEqual(
941+
response.json["errors"],
942+
[
943+
{
944+
u"location": u"body",
945+
u"name": u"relatedItem",
946+
u"description": [
947+
948+
u'relatedItem should be one of documents'
949+
]
950+
}
951+
]
952+
)
953+
954+
def create_document_with_the_invalid_document_type(self):
955+
"""
956+
A test checks if errors raise in case of processing document with the invalid document type (documentType field).
957+
"""
958+
document_data = deepcopy(test_tender_document_data)
959+
document_data["url"] = self.generate_docservice_url()
960+
document_data["hash"] = "md5:" + "0" * 32
961+
document_data["documentType"] = "smth"
962+
963+
response = self.app.post_json("/tenders/{}/documents?acc_token={}".format(
964+
self.tender_id, self.tender_token),{"data":document_data}, status=422)
965+
self.assertEqual(response.status, "422 Unprocessable Entity")
966+
self.assertEqual(response.content_type, "application/json")
967+
response_doctype_dict = re.findall(r"\[.*\]",response.json["errors"][0]["description"][0])[0]
968+
response_doctype_dict = ast.literal_eval(response_doctype_dict)
969+
response_doctype_dict = [n.strip() for n in response_doctype_dict]

src/openprocurement/tender/cfaselectionua/tests/award.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33
from copy import deepcopy
44

55
from openprocurement.api.tests.base import snitch
6-
from openprocurement.tender.belowthreshold.tests.award_blanks import patch_tender_lot_award_lots_none
6+
from openprocurement.tender.belowthreshold.tests.award_blanks import (
7+
patch_tender_lot_award_lots_none,
8+
put_tender_json_award_document_of_document,
9+
create_tender_award_with_the_invalid_document_type,
10+
)
711
from openprocurement.tender.cfaselectionua.adapters.configurator import TenderCfaSelectionUAConfigurator
812
from openprocurement.tender.cfaselectionua.tests.base import (
913
TenderContentWebTest,
@@ -53,6 +57,8 @@ class TenderAwardResourceTestMixin(object):
5357
class TenderAwardDocumentResourceTestMixin(object):
5458
test_not_found_award_document = snitch(not_found_award_document)
5559
test_create_tender_award_document = snitch(create_tender_award_document)
60+
test_create_tender_award_with_the_invalid_document_type = snitch(create_tender_award_with_the_invalid_document_type)
61+
test_put_tender_json_award_document_of_document = snitch(put_tender_json_award_document_of_document)
5662
test_put_tender_award_document = snitch(put_tender_award_document)
5763
test_patch_tender_award_document = snitch(patch_tender_award_document)
5864
test_create_award_document_bot = snitch(create_award_document_bot)

src/openprocurement/tender/cfaselectionua/tests/document.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
create_tender_document_json_invalid,
1111
create_tender_document_json,
1212
put_tender_document_json,
13+
put_tender_json_document_of_document,
14+
create_document_with_the_invalid_document_type,
1315
)
1416

1517
from openprocurement.tender.cfaselectionua.tests.document_blanks import (
@@ -34,6 +36,8 @@ class TenderDocumentWithDSResourceTestMixin(object):
3436
test_create_tender_document_json_invalid = snitch(create_tender_document_json_invalid)
3537
test_create_tender_document_json = snitch(create_tender_document_json)
3638
test_put_tender_document_json = snitch(put_tender_document_json)
39+
test_put_tender_json_document_of_document = snitch(put_tender_json_document_of_document)
40+
test_create_document_with_the_invalid_document_type = snitch(create_document_with_the_invalid_document_type)
3741

3842

3943
class TenderDocumentResourceTest(TenderContentWebTest, TenderDocumentResourceTestMixin):

src/openprocurement/tender/competitivedialogue/tests/stage1/document.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
from openprocurement.tender.competitivedialogue.tests.stage1.document_blanks import (
1313
put_tender_document,
1414
patch_tender_document,
15+
put_tender_json_document_of_document,
16+
create_document_with_the_invalid_document_type,
1517
)
1618

1719
# _____________________________________________________________________
@@ -61,7 +63,8 @@ class DialogUADocumentResourceTest(BaseCompetitiveDialogUAContentWebTest, Tender
6163

6264
test_put_tender_document = snitch(put_tender_document)
6365
test_patch_tender_document = snitch(patch_tender_document)
64-
66+
test_put_tender_json_document_of_document =snitch(put_tender_json_document_of_document)
67+
test_create_document_with_the_invalid_document_type = snitch(create_document_with_the_invalid_document_type)
6568

6669
class DialogUADocumentWithDSResourceTest(DialogUADocumentResourceTest):
6770
docservice = True

src/openprocurement/tender/competitivedialogue/tests/stage1/document_blanks.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# -*- coding: utf-8 -*-
22
from email.header import Header
3+
import re
4+
import ast
5+
from openprocurement.tender.belowthreshold.tests.base import test_tender_document_data
6+
from openprocurement.api.models import Document as BaseDocument
37

48

59
# DialogEUDocumentResourceTest
@@ -244,3 +248,78 @@ def patch_tender_document(self):
244248
self.assertEqual(response.content_type, "application/json")
245249
self.assertEqual(doc_id, response.json["data"]["id"])
246250
self.assertEqual("document description", response.json["data"]["description"])
251+
252+
253+
def put_tender_json_document_of_document(self):
254+
response = self.app.post(
255+
"/tenders/{}/documents?acc_token={}".format(self.tender_id, self.tender_token),
256+
upload_files=[("file", str(Header(u"укр.doc", "utf-8")), "content")],
257+
)
258+
self.assertEqual(response.status, "201 Created")
259+
self.assertEqual(response.content_type, "application/json")
260+
old_doc_id = response.json["data"]["id"]
261+
262+
response = self.app.post(
263+
"/tenders/{}/documents?acc_token={}".format(self.tender_id, self.tender_token),
264+
upload_files=[("file", str(Header(u"укр.doc", "utf-8")), "content")],
265+
)
266+
self.assertEqual(response.status, "201 Created")
267+
self.assertEqual(response.content_type, "application/json")
268+
doc_id = response.json["data"]["id"]
269+
self.assertIn(doc_id, response.headers["Location"])
270+
self.assertEqual(u"укр.doc", response.json["data"]["title"])
271+
272+
response = self.app.patch_json(
273+
"/tenders/{}/documents/{}?acc_token={}".format(self.tender_id, doc_id, self.tender_token),
274+
{"data": {"documentOf": "document", "relatedItem": doc_id}},
275+
status=200,
276+
)
277+
self.assertEqual(response.status, "200 OK")
278+
self.assertEqual(response.content_type, "application/json")
279+
response = self.app.patch_json(
280+
"/tenders/{}/documents/{}?acc_token={}".format(self.tender_id, doc_id, self.tender_token),
281+
{"data": {"documentOf": "document", "relatedItem": "0"*32,}},
282+
status=422,
283+
)
284+
self.assertEqual(response.status, "422 Unprocessable Entity")
285+
self.assertEqual(response.content_type, "application/json")
286+
self.assertEqual(
287+
response.json["errors"],
288+
[
289+
{
290+
u"location": u"body",
291+
u"name": u"relatedItem",
292+
u"description": [
293+
294+
u'relatedItem should be one of documents'
295+
]
296+
}
297+
]
298+
)
299+
300+
301+
def create_document_with_the_invalid_document_type(self):
302+
"""
303+
A test checks if errors raise in case of processing document with the invalid document type (documentType field).
304+
"""
305+
response = self.app.post(
306+
"/tenders/{}/documents?acc_token={}".format(self.tender_id, self.tender_token),
307+
upload_files=[("file", str(Header(u"укр.doc", "utf-8")), "content")],
308+
)
309+
self.assertEqual(response.status, "201 Created")
310+
self.assertEqual(response.content_type, "application/json")
311+
doc_id = response.json["data"]["id"]
312+
self.assertIn(doc_id, response.headers["Location"])
313+
self.assertEqual(u"укр.doc", response.json["data"]["title"])
314+
315+
# Try connect document with lot, without description in params
316+
response = self.app.patch_json(
317+
"/tenders/{}/documents/{}?acc_token={}".format(self.tender_id, doc_id, self.tender_token),
318+
{"data": {"documentType": "smth"}},
319+
status=422,
320+
)
321+
self.assertEqual(response.status, "422 Unprocessable Entity")
322+
self.assertEqual(response.content_type, "application/json")
323+
response_doctype_dict = re.findall(r"\[.*\]",response.json["errors"][0]["description"][0])[0]
324+
response_doctype_dict = ast.literal_eval(response_doctype_dict)
325+
response_doctype_dict = [n.strip() for n in response_doctype_dict]

0 commit comments

Comments
 (0)