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