Showing
8 changed files
with
383 additions
and
3 deletions
op_robot_tests/runner.py
0 → 100644
op_robot_tests/tests_files/ApiCommands.py
0 → 100644
1 | +# -*- coding: utf-8 - | |
2 | + | |
3 | +from munch import munchify, Munch | |
4 | +from .initial_data import ( | |
5 | + test_tender_data, test_question_data, test_question_answer_data, | |
6 | + test_bid_data | |
7 | +) | |
8 | +from openprocurement_client.client import Client | |
9 | +from datetime import datetime, timedelta | |
10 | +from StringIO import StringIO | |
11 | +from robot.output import LOGGER | |
12 | +from robot.output.loggerhelper import Message | |
13 | + | |
14 | + | |
15 | +def prepare_api(key=''): | |
16 | + return Client(key) | |
17 | + | |
18 | + | |
19 | +def prepare_test_tender_data(): | |
20 | + tender = munchify({'data': test_tender_data}) | |
21 | + return tender | |
22 | + | |
23 | + | |
24 | +def log_object_data(data): | |
25 | + if not isinstance(data, Munch): | |
26 | + data = munchify(data) | |
27 | + LOGGER.log_message( | |
28 | + Message(data.toYAML(allow_unicode=True, default_flow_style=False), "INFO") | |
29 | + ) | |
30 | + | |
31 | + | |
32 | +def set_tender_periods(tender): | |
33 | + now = datetime.now() | |
34 | + tender.data.enquiryPeriod.endDate = (now + timedelta(minutes=2)).isoformat() | |
35 | + tender.data.tenderPeriod.startDate = (now + timedelta(minutes=2)).isoformat() | |
36 | + tender.data.tenderPeriod.endDate = (now + timedelta(minutes=4)).isoformat() | |
37 | + return tender | |
38 | + | |
39 | + | |
40 | +def set_access_key(tender, access_token): | |
41 | + tender.access = munchify({"token": access_token}) | |
42 | + return tender | |
43 | + | |
44 | + | |
45 | +def upload_tender_document(api, tender): | |
46 | + file = StringIO() | |
47 | + file.name = 'test_file.txt' | |
48 | + file.write("test text data") | |
49 | + file.seek(0) | |
50 | + return api.upload_document(tender, file) | |
51 | + | |
52 | + | |
53 | +def patch_tender_document(api, tender, doc_id): | |
54 | + file = StringIO() | |
55 | + file.name = 'test_file1.txt' | |
56 | + file.write("test text data 11111") | |
57 | + file.seek(0) | |
58 | + return api.update_document(tender, doc_id, file) | |
59 | + | |
60 | + | |
61 | +def let_active_award(api, tender): | |
62 | + awards = api.get_awards(tender) | |
63 | + print "----_____ WE GOT AN AWARDS _____----" | |
64 | + award_id = [i['id'] for i in awards.data if i['status'] == 'pending'][0] | |
65 | + active_award = munchify({"data": {"status": "active", "id": award_id}}) | |
66 | + award = api.patch_award(tender, active_award) | ... | ... |
1 | +*** Setting *** | |
2 | +Resource keywords.robot | |
3 | +Resource resource.robot | |
4 | + | |
5 | + | |
6 | +*** Test Cases *** | |
7 | +Tender process | |
8 | + Create api wrapper | |
9 | + Create tender | |
10 | + Change tender title | |
11 | + Upload tender documentation | |
12 | + Change tender periods | |
13 | + Create question | |
14 | + Write answer on first question | |
15 | + Wait to TenderPeriod | |
16 | + Submit bids | |
17 | + Review tender | |
18 | + Wait to start of auction's worker | |
19 | + Get particular urls for bids | |
20 | + Review tender | |
21 | + Wait to end of auction | |
22 | + Review tender | |
23 | + Activate award | |
24 | + | ... | ... |
op_robot_tests/tests_files/__init__.py
0 → 100644
1 | +# | ... | ... |
op_robot_tests/tests_files/initial_data.py
0 → 100644
1 | +# -*- coding: utf-8 - | |
2 | +from datetime import datetime, timedelta | |
3 | +now = datetime.now() | |
4 | +from munch import munchify | |
5 | +from faker import Factory | |
6 | +fake = Factory.create('uk_UA') | |
7 | + | |
8 | +test_tender_data = { | |
9 | + "title": fake.catch_phrase(), | |
10 | + "mode": "test", | |
11 | + "submissionMethodDetails": "quick", | |
12 | + "procuringEntity": { | |
13 | + "name": fake.company(), | |
14 | + "identifier": { | |
15 | + "scheme": u"UA-EDR", | |
16 | + "id": u"0000{}".format(fake.pyint()), | |
17 | + "uri": fake.image_url(width=None, height=None) | |
18 | + }, | |
19 | + "address": { | |
20 | + "countryName": u"Україна", | |
21 | + "postalCode": fake.postalcode(), | |
22 | + "region": u"м. Київ", | |
23 | + "locality": u"м. Київ", | |
24 | + "streetAddress": fake.street_address() | |
25 | + }, | |
26 | + "contactPoint": { | |
27 | + "name": fake.name(), | |
28 | + "telephone": fake.phone_number() | |
29 | + } | |
30 | + }, | |
31 | + "value": { | |
32 | + "amount": 500, | |
33 | + "currency": u"UAH" | |
34 | + }, | |
35 | + "minimalStep": { | |
36 | + "amount": 1, | |
37 | + "currency": u"UAH" | |
38 | + }, | |
39 | + "items": [ | |
40 | + { | |
41 | + "description": fake.catch_phrase(), | |
42 | + "classification": { | |
43 | + "scheme": u"CPV", | |
44 | + "id": u"44617100-9", | |
45 | + "description": u"Cartons" | |
46 | + }, | |
47 | + "additionalClassifications": [ | |
48 | + { | |
49 | + "scheme": u"ДКПП", | |
50 | + "id": u"17.21.1", | |
51 | + "description": u"папір і картон гофровані, паперова й картонна тара" | |
52 | + } | |
53 | + ], | |
54 | + "unit": { | |
55 | + "name": u"item", | |
56 | + "code": u"44617100-9" | |
57 | + }, | |
58 | + "quantity": fake.pyint() | |
59 | + } | |
60 | + ], | |
61 | + "enquiryPeriod": { | |
62 | + "endDate": (now + timedelta(days=1)).isoformat() | |
63 | + }, | |
64 | + "tenderPeriod": { | |
65 | + "endDate": (now + timedelta(days=2)).isoformat() | |
66 | + } | |
67 | +} | |
68 | + | |
69 | + | |
70 | +def test_question_data(): | |
71 | + return { | |
72 | + "data": { | |
73 | + "author": { | |
74 | + "address": { | |
75 | + "countryName": "Україна", | |
76 | + "locality": "м. Вінниця", | |
77 | + "postalCode": "21100", | |
78 | + "region": "м. Вінниця", | |
79 | + "streetAddress": fake.street_address() | |
80 | + }, | |
81 | + "contactPoint": { | |
82 | + "name": fake.name(), | |
83 | + "telephone": fake.phone_number() | |
84 | + }, | |
85 | + "identifier": { | |
86 | + "scheme": u"UA-EDR", | |
87 | + "id": u"0000{}".format(fake.pyint()), | |
88 | + "uri": fake.image_url(width=None, height=None) | |
89 | + }, | |
90 | + "name": fake.company() | |
91 | + }, | |
92 | + "description": fake.sentence(nb_words=10, variable_nb_words=True), | |
93 | + "title": fake.sentence(nb_words=6, variable_nb_words=True) | |
94 | + } | |
95 | + } | |
96 | + | |
97 | + | |
98 | +def test_question_answer_data(): | |
99 | + return { | |
100 | + "data": { | |
101 | + "answer": fake.sentence(nb_words=40, variable_nb_words=True) | |
102 | + } | |
103 | + } | |
104 | + | |
105 | + | |
106 | +def test_bid_data(): | |
107 | + return munchify({ | |
108 | + "data": { | |
109 | + "tenderers": [ | |
110 | + { | |
111 | + "address": { | |
112 | + "countryName": "Україна", | |
113 | + "locality": "м. Вінниця", | |
114 | + "postalCode": "21100", | |
115 | + "region": "м. Вінниця", | |
116 | + "streetAddress": fake.street_address() | |
117 | + }, | |
118 | + "contactPoint": { | |
119 | + "name": fake.name(), | |
120 | + "telephone": fake.phone_number() | |
121 | + }, | |
122 | + "identifier": { | |
123 | + "scheme": u"UA-EDR", | |
124 | + "id": u"0000{}".format(fake.pyint()), | |
125 | + }, | |
126 | + "name": fake.company() | |
127 | + } | |
128 | + ], | |
129 | + "value": { | |
130 | + "amount": 500 | |
131 | + } | |
132 | + } | |
133 | + }) | ... | ... |
op_robot_tests/tests_files/keywords.robot
0 → 100644
1 | +*** Setting *** | |
2 | +Library op_robot_tests.tests_files.ApiCommands | |
3 | +Library String | |
4 | +LIbrary Collections | |
5 | + | |
6 | + | |
7 | +*** Keywords *** | |
8 | +Create api wrapper | |
9 | + ${API}= prepare_api ${api_key} | |
10 | + Set Global Variable ${API} | |
11 | + LOG ${API} | |
12 | + Log Variables | |
13 | + | |
14 | +Set access key on tender | |
15 | + ${tender}= set_access_key ${tender} ${access_token} | |
16 | + Set Global Variable ${tender} | |
17 | + | |
18 | +Create tender | |
19 | + ${init_tender_data}= prepare_test_tender_data | |
20 | + Log object data ${init_tender_data} | |
21 | + ${tender}= Call Method ${API} create_tender ${init_tender_data} | |
22 | + Log object data ${tender} | |
23 | + ${access_token}= Get Variable Value ${tender.access.token} | |
24 | + Set Global Variable ${access_token} | |
25 | + ${tender_id}= Get Variable Value ${tender.data.id} | |
26 | + Set Global Variable ${tender_id} | |
27 | + Log access_key: ${access_token} | |
28 | + Log tender_id: ${tender_id} | |
29 | + Log Variables | |
30 | + Set Global Variable ${tender} | |
31 | + [return] ${tender} | |
32 | + | |
33 | +Change tender title | |
34 | + ${new_tender_sufix}= Generate Random String 3 [NUMBERS] | |
35 | + ${new_tender_title}= Set Variable 1-QUINTA-KT-${new_tender_sufix} | |
36 | + Log new title: ${new_tender_title} | |
37 | + Log object data ${tender} | |
38 | + ${tender.data.title}= Set Variable ${new_tender_title} | |
39 | + ${tender.data.title_en}= Set Variable ${new_tender_title} | |
40 | + ${tender.data.title_ru}= Set Variable ${new_tender_title} | |
41 | + Log object data ${tender} | |
42 | + ${tender}= Call Method ${API} patch_tender ${tender} | |
43 | + Set Global Variable ${tender} | |
44 | + Log object data ${tender} | |
45 | + Set access key on tender | |
46 | + | |
47 | +Change tender periods | |
48 | + Log object data ${tender} | |
49 | + ${tender}= set_tender_periods ${tender} | |
50 | + Log object data ${tender} | |
51 | + ${tender}= Call Method ${API} patch_tender ${tender} | |
52 | + Set Global Variable ${tender} | |
53 | + Log object data ${tender} | |
54 | + Set access key on tender | |
55 | + | |
56 | +Upload tender documentation | |
57 | + ${file}= upload tender document ${API} ${tender} | |
58 | + patch tender document ${API} ${tender} ${file.data.id} | |
59 | + | |
60 | +Create question | |
61 | + ${question}= test question data | |
62 | + Log object data ${question} | |
63 | + ${question}= Call Method ${API} create_question ${tender} ${question} | |
64 | + Log object data ${question} | |
65 | + [return] ${question} | |
66 | + | |
67 | + | |
68 | +Write answer on first question | |
69 | + ${questions}= Call Method ${API} get_questions ${tender} | |
70 | + Log object data ${questions} | |
71 | + ${question}= Set Variable ${questions.data[0]} | |
72 | + Log object data ${question} | |
73 | + | |
74 | + ${question}= Call Method ${API} get_question ${tender} ${questions.data[0].id} | |
75 | + Log object data ${question} | |
76 | + ${question}= set_access_key ${question} ${access_token} | |
77 | + Log object data ${question} | |
78 | + | |
79 | + ${answer}= test_question_answer_data | |
80 | + Log object data ${answer} | |
81 | + ${question.data.answer}= Set Variable ${answer['data']['answer']} | |
82 | + Log object data ${question} | |
83 | + ${question}= Call Method ${API} patch_question ${tender} ${question} | |
84 | + Log object data ${question} | |
85 | + [return] ${question} | |
86 | + | |
87 | +Review tender | |
88 | + ${tender}= Call Method ${API} get_tender ${tender_id} | |
89 | + Set Global Variable ${tender} | |
90 | + Log object data ${tender} | |
91 | + Set access key on tender | |
92 | + | |
93 | +Wait to TenderPeriod | |
94 | + Sleep 2 minutes 10 seconds Wait on TenderPeriod status | |
95 | + | |
96 | +Wait to start of auction's worker | |
97 | + Sleep 4 minutes | |
98 | + | |
99 | +Submit bids | |
100 | + ${bids} = Create Dictionary | |
101 | + Log object data ${bids} | |
102 | + :FOR ${index} IN RANGE 2 | |
103 | + \ ${bid}= test bid data | |
104 | + \ Log object data ${bid} | |
105 | + \ ${temp_amount}= Evaluate ${bid['data']['value']['amount']} - ${index} | |
106 | + \ Log ${temp_amount} | |
107 | + \ ${bid.data.value.amount}= Get Variable Value ${temp_amount} | |
108 | + \ ${bids_data}= Submit bid with data ${bid} | |
109 | + \ Set To Dictionary ${bids} ${index} ${bids_data} | |
110 | + Set Global Variable ${bids} | |
111 | + Log object data ${bids} | |
112 | + | |
113 | + | |
114 | + | |
115 | +Submit bid with data | |
116 | + [Arguments] ${bid} | |
117 | + ${bid_data}= Call Method ${API} create_bid ${tender} ${bid} | |
118 | + Log object data ${bid_data} | |
119 | + [return] ${bid_data} | |
120 | + | |
121 | + | |
122 | +Get particular urls for bids | |
123 | + ${bids_items}= Get Dictionary Items ${bids} | |
124 | + :FOR ${index} ${bid} IN @{bids_items} | |
125 | + \ ${approved_bid}= Call Method ${API} get_bid ${tender} ${bid.data.id} ${bid.access.token} | |
126 | + \ Log object data ${approved_bid} | |
127 | + \ Log ${approved_bid.data.participationUrl} | |
128 | + | |
129 | + | |
130 | +Wait to end of auction | |
131 | + Sleep 45 minutes Wait to end of auction | |
132 | + | |
133 | + | |
134 | +Activate award | |
135 | + ${awards}= Call Method ${API} get_awards ${tender} | |
136 | + Log object data ${awards} | |
137 | + # :FOR ${award} IN @{awards.data} | |
138 | + # \ | |
139 | + # award_id = [i['id'] for i in awards.data if i['status'] == 'pending'][0] | |
140 | + # active_award = munchify({"data": {"status": "active", "id": award_id}}) | |
141 | + # award = api.patch_award(tender, active_award) | |
142 | + # write_yaml('award_active.yaml', award) | |
\ No newline at end of file | ... | ... |
op_robot_tests/tests_files/resource.robot
0 → 100644
... | ... | @@ -19,8 +19,11 @@ setup(name='op_robot_tests', |
19 | 19 | zip_safe=False, |
20 | 20 | install_requires=[ |
21 | 21 | # -*- Extra requirements: -*- |
22 | + 'robotframework' | |
22 | 23 | ], |
23 | - entry_points=""" | |
24 | - # -*- Entry points: -*- | |
25 | - """, | |
24 | + entry_points={ | |
25 | + 'console_scripts': [ | |
26 | + 'openprocurement_tests = op_robot_tests.runner:runner', | |
27 | + ], | |
28 | + } | |
26 | 29 | ) | ... | ... |
Please
register
or
login
to post a comment