Showing
14 changed files
with
503 additions
and
566 deletions
| 1 | -# -*- coding: utf-8 - | |
| 2 | -from munch import munchify | |
| 3 | -from .initial_data import ( | |
| 4 | - test_tender_data, test_question_data, test_question_answer_data, | |
| 5 | - test_bid_data | |
| 6 | -) | |
| 7 | - | |
| 8 | -from dateutil.parser import parse | |
| 9 | -from dateutil.tz import tzlocal | |
| 10 | -from datetime import datetime, timedelta | |
| 11 | - | |
| 12 | -from json import loads as convert_from_string_to_dict | |
| 13 | -from openprocurement_client.client import Client | |
| 14 | -from StringIO import StringIO | |
| 15 | -from robot.output import LOGGER | |
| 16 | -from robot.output.loggerhelper import Message | |
| 17 | - | |
| 18 | - | |
| 19 | -def prepare_api(key=''): | |
| 20 | - return Client(key) | |
| 21 | - | |
| 22 | - | |
| 23 | -def prepare_test_tender_data(): | |
| 24 | - tender = munchify({'data': test_tender_data}) | |
| 25 | - return tender | |
| 26 | - | |
| 27 | - | |
| 28 | -def set_tender_periods(tender): | |
| 29 | - now = datetime.now() | |
| 30 | - tender.data.enquiryPeriod.endDate = (now + timedelta(minutes=2)).isoformat() | |
| 31 | - tender.data.tenderPeriod.startDate = (now + timedelta(minutes=2)).isoformat() | |
| 32 | - tender.data.tenderPeriod.endDate = (now + timedelta(minutes=4)).isoformat() | |
| 33 | - return tender | |
| 34 | - | |
| 35 | - | |
| 36 | -def set_access_key(tender, access_token): | |
| 37 | - tender.access = munchify({"token": access_token}) | |
| 38 | - return tender | |
| 39 | - | |
| 40 | - | |
| 41 | -def upload_tender_document(api, tender): | |
| 42 | - file = StringIO() | |
| 43 | - file.name = 'тест.txt' | |
| 44 | - file.write("test text dataaaфвфв") | |
| 45 | - file.seek(0) | |
| 46 | - return api.upload_document(tender, file) | |
| 47 | - | |
| 48 | - | |
| 49 | -def patch_tender_document(api, tender, doc_id): | |
| 50 | - file = StringIO() | |
| 51 | - file.name = 'test1.txt' | |
| 52 | - file.write("контент") | |
| 53 | - file.seek(0) | |
| 54 | - return api.update_document(tender, doc_id, file) | |
| 55 | - | |
| 56 | - | |
| 57 | -def create_approve_award_request_data(award_id): | |
| 58 | - return munchify({"data": {"status": "active", "id": award_id}}) | |
| 59 | - | |
| 60 | - | |
| 61 | -def calculate_wait_to_date(date_stamp): | |
| 62 | - date = parse(date_stamp) | |
| 63 | - LOGGER.log_message(Message("date: {}".format(date.isoformat()), "INFO")) | |
| 64 | - now = datetime.now(tzlocal()) | |
| 65 | - LOGGER.log_message(Message("now: {}".format(now.isoformat()), "INFO")) | |
| 66 | - wait_seconds = (date - now).total_seconds() | |
| 67 | - wait_seconds += 2 | |
| 68 | - if wait_seconds < 0: | |
| 69 | - return 0 | |
| 70 | - return wait_seconds |
| ... | ... | @@ -5,19 +5,135 @@ LIbrary Collections |
| 5 | 5 | LIbrary Selenium2Library |
| 6 | 6 | Library DebugLibrary |
| 7 | 7 | |
| 8 | -Test Setup TestCaseSetup | |
| 8 | +Suite Setup TestCaseSetup | |
| 9 | +Suite Teardown Close all browsers | |
| 9 | 10 | |
| 10 | 11 | |
| 11 | 12 | *** Variables *** |
| 12 | -@{important_fields} description minimalStep.amount procuringEntity.name tenderID title value.amount | |
| 13 | - | |
| 13 | +${viewer} E-tender User | |
| 14 | +${provider} Andrew | |
| 15 | +@{item_fields} description quantity classification.id classification.description deliveryAddress deliveryDate | |
| 14 | 16 | |
| 15 | 17 | *** Test Cases *** |
| 16 | -Створення тендера | |
| 17 | - [tags] all_stages | |
| 18 | - Власник тендера створив тендер | |
| 19 | - Інші учасники побачили створений тендер | |
| 20 | - [Teardown] Close all browsers | |
| 18 | +Можливість оголосити тендер | |
| 19 | + [Tags] ${USERS.users['${USERS.tender_owner}'].broker}: Можливість оголосити тендер | |
| 20 | + Викликати для учасника ${USERS.tender_owner} Створити тендер | |
| 21 | + ${LAST_MODIFICATION_DATE}= Get Current Date | |
| 22 | + Set Global Variable ${LAST_MODIFICATION_DATE} | |
| 23 | + | |
| 24 | +Пошук тендера по ідентифікатору | |
| 25 | + [Tags] ${USERS.users['${viewer}'].broker}: Пошук тендера по ідентифікатору | |
| 26 | + Дочекатись синхронізації з майданчиком ${viewer} | |
| 27 | + Викликати для учасника ${viewer} Пошук тендера по ідентифікатору ${TENDER_DATA.data.tenderID} ${TENDER_DATA.data.id} | |
| 28 | + | |
| 29 | +Відображення заголовоку оголошеного тендера | |
| 30 | + [Tags] ${USERS.users['${viewer}'].broker}: Відображення основних даних оголошеного тендера | |
| 31 | + Звірити поле тендера ${viewer} title | |
| 32 | + | |
| 33 | +Відображення tenderID оголошеного тендера | |
| 34 | + [Tags] ${USERS.users['${viewer}'].broker}: Відображення основних даних оголошеного тендера | |
| 35 | + Звірити поле тендера ${viewer} tenderID | |
| 36 | + | |
| 37 | +Відображення опису оголошеного тендера | |
| 38 | + [Tags] ${USERS.users['${viewer}'].broker}: Відображення основних даних оголошеного тендера | |
| 39 | + Звірити поле тендера ${viewer} description | |
| 40 | + | |
| 41 | +Відображення початоку періоду уточнення оголошеного тендера | |
| 42 | + [Tags] ${USERS.users['${viewer}'].broker}: Відображення основних даних оголошеного тендера | |
| 43 | + Звірити поле тендера ${viewer} enquiryPeriod.startDate | |
| 44 | + | |
| 45 | +Відображення закінчення періоду уточнення оголошеного тендера | |
| 46 | + [Tags] ${USERS.users['${viewer}'].broker}: Відображення основних даних оголошеного тендера | |
| 47 | + Звірити поле тендера ${viewer} enquiryPeriod.endDate | |
| 48 | + | |
| 49 | +Відображення початоку періоду прийому пропозицій оголошеного тендера | |
| 50 | + [Tags] ${USERS.users['${viewer}'].broker}: Відображення основних даних оголошеного тендера | |
| 51 | + Звірити поле тендера ${viewer} tenderPeriod.startDate | |
| 52 | + | |
| 53 | +Відображення закінчення періоду прийому пропозицій оголошеного тендера | |
| 54 | + [Tags] ${USERS.users['${viewer}'].broker}: Відображення основних даних оголошеного тендера | |
| 55 | + Звірити поле тендера ${viewer} tenderPeriod.endDate | |
| 56 | + | |
| 57 | +Відображення бюджету оголошеного тендера | |
| 58 | + [Tags] ${USERS.users['${viewer}'].broker}: Відображення основних даних оголошеного тендера | |
| 59 | + Звірити поле тендера ${viewer} value.amount | |
| 60 | + | |
| 61 | +Відображення мінімального кроку оголошеного тендера | |
| 62 | + [Tags] ${USERS.users['${viewer}'].broker}: Відображення основних даних оголошеного тендера | |
| 63 | + Звірити поле тендера ${viewer} minimalStep.amount | |
| 64 | + | |
| 65 | +Відображення procuringEntity.name оголошеного тендера | |
| 66 | + [Tags] ${USERS.users['${viewer}'].broker}: Відображення основних даних оголошеного тендера | |
| 67 | + Звірити поле тендера ${viewer} procuringEntity.name | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | +Відображення предмету закупівлі однопредметного тендера | |
| 73 | + [Tags] ${USERS.users['${viewer}'].broker}: Відображення однопредметного тендера | |
| 74 | + Звірити поле тендера ${viewer} items[0].description | |
| 75 | + | |
| 76 | +Відображення кількісті предметів закупівлі однопредметного тендера | |
| 77 | + [Tags] ${USERS.users['${viewer}'].broker}: Відображення однопредметного тендера | |
| 78 | + Звірити поле тендера ${viewer} items[0].quantity | |
| 79 | + | |
| 80 | +Відображення класифікаторів закупівлі однопредметного тендера | |
| 81 | + [Tags] ${USERS.users['${viewer}'].broker}: Відображення однопредметного тендера | |
| 82 | + Звірити поле тендера ${viewer} items[0].classification.id | |
| 83 | + Звірити поле тендера ${viewer} items[0].classification.description | |
| 84 | + | |
| 85 | +Відображення місце поставки закупівлі однопредметного тендера | |
| 86 | + [Tags] ${USERS.users['${viewer}'].broker}: Відображення однопредметного тендера | |
| 87 | + Звірити поле тендера ${viewer} items[0].deliveryAddress | |
| 88 | + | |
| 89 | +Відображення строки поставки закупівлі однопредметного тендера | |
| 90 | + [Tags] ${USERS.users['${viewer}'].broker}: Відображення однопредметного тендера | |
| 91 | + Звірити поле тендера ${viewer} items[0].deliveryDate.endDate | |
| 92 | + | |
| 93 | +Задати питання | |
| 94 | + [Tags] ${USERS.users['${provider}'].broker}: Можливість задати запитання | |
| 95 | + Викликати для учасника ${provider} Задати питання ${TENDER_DATA.data.id} ${QUESTIONS[0]} | |
| 96 | + ${LAST_MODIFICATION_DATE}= Get Current Date | |
| 97 | + Set Global Variable ${LAST_MODIFICATION_DATE} | |
| 98 | + отримати останні зміни в тендері | |
| 99 | + | |
| 100 | + | |
| 101 | +Відображення заголовоку анонімного питання без відповіді | |
| 102 | + [Tags] ${USERS.users['${viewer}'].broker}: Відображення анонімного питання без відповідей | |
| 103 | + Дочекатись синхронізації з майданчиком ${viewer} | |
| 104 | + Викликати для учасника ${viewer} обновити сторінку з тендером ${TENDER_DATA.data.tenderID} ${TENDER_DATA.data.id} | |
| 105 | + Звірити поле тендера ${viewer} questions[0].title | |
| 106 | + | |
| 107 | +Відображення опис анонімного питання без відповіді | |
| 108 | + [Tags] ${USERS.users['${viewer}'].broker}: Відображення анонімного питання без відповідей | |
| 109 | + Звірити поле тендера ${viewer} questions[0].description | |
| 110 | + | |
| 111 | + | |
| 112 | +Відображення дата анонімного питання без відповіді | |
| 113 | + [Tags] ${USERS.users['${viewer}'].broker}: Відображення анонімного питання без відповідей | |
| 114 | + Звірити поле тендера ${viewer} questions[0].date | |
| 115 | + | |
| 116 | + # ${users_list}= Get Dictionary Items ${USERS.users} | |
| 117 | + # :FOR ${username} ${User_Data} IN @{users_list} | |
| 118 | + # \ Run Keyword If '${User_Name}' != '${USERS.tender_owner}' Відображення основних даних оголошеного тендера ${username} | |
| 119 | +# | |
| 120 | +# Відображення однопредметного тендера | |
| 121 | + # ${users_list}= Get Dictionary Items ${USERS.users} | |
| 122 | + # :FOR ${username} ${User_Data} IN @{users_list} | |
| 123 | + # \ Run Keyword If '${User_Name}' != '${USERS.tender_owner}' Відображення однопредметного тендера ${username} | |
| 124 | +# | |
| 125 | +# | |
| 126 | +# Можливість змінити основні властивості тендера | |
| 127 | + # [tags] all_stages | |
| 128 | + # Власник змінив основні властивості тендера | |
| 129 | + # Інші учасники побачили створений тендер | |
| 130 | +# | |
| 131 | +# Питання і відповідь | |
| 132 | + # Учасник Andrew задав 1-ше питання | |
| 133 | + # Інші учасники побачили 1-ше питання | |
| 134 | + # Власник відповів на 1-ше питання | |
| 135 | + # Інші учасники побачили відповідь на 1-ше питання | |
| 136 | +# | |
| 21 | 137 | |
| 22 | 138 | |
| 23 | 139 | *** Keywords *** |
| ... | ... | @@ -27,47 +143,61 @@ TestCaseSetup |
| 27 | 143 | |
| 28 | 144 | |
| 29 | 145 | Завантажуємо дані про корисувачів і площадки |
| 30 | - | |
| 31 | 146 | # Init Brokers |
| 32 | 147 | ${file_path}= Get Variable Value ${BROKERS_FILE} brokers.yaml |
| 33 | 148 | ${BROKERS}= load_initial_data_from ${file_path} |
| 34 | 149 | Set Global Variable ${BROKERS} |
| 35 | 150 | ${brokers_list}= Get Dictionary Items ${BROKERS} |
| 36 | 151 | :FOR ${Broker_Name} ${Broker_Data} IN @{brokers_list} |
| 37 | - \ Завантажуємо бібліотеку з реалізацією ${Broker_Data.broker_api} площадки | |
| 38 | - | |
| 152 | + \ Завантажуємо бібліотеку з реалізацією ${Broker_Data.keywords_file} площадки | |
| 39 | 153 | # Init Users |
| 40 | 154 | ${file_path}= Get Variable Value ${USERS_FILE} users.yaml |
| 41 | 155 | ${USERS}= load_initial_data_from ${file_path} |
| 42 | 156 | Set Global Variable ${USERS} |
| 43 | 157 | ${users_list}= Get Dictionary Items ${USERS.users} |
| 44 | 158 | :FOR ${username} ${user_data} IN @{users_list} |
| 45 | - \ Викликати "Підготувати клієнт для користувача" для учасника "${username}" | |
| 159 | + \ Викликати для учасника ${username} Підготувати клієнт для користувача | |
| 46 | 160 | |
| 47 | 161 | Підготовка початкових даних |
| 162 | + @{QUESTIONS} = Create list | |
| 163 | + ${question}= test question data | |
| 164 | + Append to list ${QUESTIONS} ${question} | |
| 165 | + Set Global Variable ${QUESTIONS} | |
| 48 | 166 | ${INITIAL_TENDER_DATA}= prepare_test_tender_data |
| 49 | 167 | Set Global Variable ${INITIAL_TENDER_DATA} |
| 50 | 168 | |
| 51 | -Завантажуємо бібліотеку з реалізацією ${broker_api} площадки | |
| 52 | - Import Resource ${CURDIR}/brokers/${broker_api}.robot | |
| 53 | - | |
| 54 | -Власник тендера створив тендер | |
| 55 | - Викликати "Створити тендер" для учасника "${USERS.tender_owner}" | |
| 56 | - Log Учасник ${USERS.tender_owner} використовуючи майданчик ${USERS.users['${USERS.tender_owner}'].broker} з імплементацією api: ${BROKERS['${USERS.users['${USERS.tender_owner}'].broker}'].broker_api} створює тендер WARN | |
| 57 | - | |
| 58 | - | |
| 59 | -Інші учасники побачили створений тендер | |
| 60 | - Log Очікуємо синхронізації з майданчиками WARN | |
| 61 | - Sleep 15 | |
| 62 | - ${users_list}= Get Dictionary Items ${USERS.users} | |
| 63 | - :FOR ${User_Name} ${User_Data} IN @{users_list} | |
| 64 | - \ Run Keyword If '${User_Name}' != '${USERS.tender_owner}' Учасник ${User_Name} побачив створений тендер | |
| 65 | - | |
| 66 | - | |
| 67 | -Учасник ${User_Name} побачив створений тендер | |
| 68 | - Викликати "Звірити інформацію про тендер" для учасника "${username}" | |
| 69 | - Log Учасник ${User_Name} використовуючи майданчик ${USERS.users['${User_Name}'].broker} з імплементацією api: ${BROKERS['${USERS.users['${User_Name}'].broker}'].broker_api} перевірив створений тендер WARN | |
| 70 | - | |
| 71 | - | |
| 72 | -Викликати "${command}" для учасника "${username}" | |
| 73 | - Run keyword ${BROKERS['${USERS.users['${username}'].broker}'].broker_api}.${command} ${username} | |
| \ No newline at end of file | ||
| 169 | +Завантажуємо бібліотеку з реалізацією ${keywords_file} площадки | |
| 170 | + Import Resource ${CURDIR}/brokers/${keywords_file}.robot | |
| 171 | + | |
| 172 | + | |
| 173 | +################################################################################## | |
| 174 | +Дочекатись синхронізації з майданчиком | |
| 175 | + [Arguments] ${username} | |
| 176 | + [Documentation] | |
| 177 | + ... ${ARGUMENTS[0]} == username | |
| 178 | + ... ${ARGUMENTS[1]} == tenderId | |
| 179 | + ... ${ARGUMENTS[2]} == id | |
| 180 | + | |
| 181 | + ${now}= Get Current Date | |
| 182 | + ${delta}= Subtract Date From Date ${now} ${LAST_MODIFICATION_DATE} | |
| 183 | + ${wait_timout}= Subtract Time From Time ${BROKERS['${USERS.users['${username}'].broker}'].timout_on_wait} ${delta} | |
| 184 | + Run Keyword If ${wait_timout}>0 Sleep ${wait_timout} | |
| 185 | + | |
| 186 | +отримати останні зміни в тендері | |
| 187 | + ${TENDER_DATA}= Викликати для учасника ${USERS.tender_owner} Пошук тендера по ідентифікатору ${TENDER_DATA.data.tenderID} ${TENDER_DATA.data.id} | |
| 188 | + Set To Dictionary ${TENDER_DATA} access_token ${access_token} | |
| 189 | + Set Global Variable ${TENDER_DATA} | |
| 190 | + Log object data ${TENDER_DATA} tender_with_question | |
| 191 | + | |
| 192 | +Звірити поле тендера | |
| 193 | + [Arguments] ${username} ${field} | |
| 194 | + ${field_response}= Викликати для учасника ${username} отримати інформацію із тендера ${field} | |
| 195 | + ${field_value}= Get_From_Object ${TENDER_DATA.data} ${field} | |
| 196 | + Should Be Equal ${field_value} ${field_response} Майданчик ${USERS.users['${username}'].broker} | |
| 197 | + | |
| 198 | + | |
| 199 | +Викликати для учасника | |
| 200 | + [Arguments] ${username} ${command} @{arguments} | |
| 201 | + ${status} ${value}= run_keyword_and_ignore_keyword_definations ${BROKERS['${USERS.users['${username}'].broker}'].keywords_file}.${command} ${username} @{arguments} | |
| 202 | + Run keyword if '${status}' == 'FAIL' Log Учасник ${username} не зміг виконати "${command}" WARN | |
| 203 | + [return] ${value} | ... | ... |
| 1 | -*** Setting *** | |
| 2 | -Resource keywords.robot | |
| 3 | -Resource resource.robot | |
| 4 | - | |
| 5 | -*** Test Cases *** | |
| 6 | -Tender process | |
| 7 | - [tags] all_stages | |
| 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 tender period with name tenderPeriod | |
| 16 | - Submit bids | |
| 17 | - Review tender | |
| 18 | - Wait to start of auction's worker | |
| 19 | - Get particular urls for bids | |
| 20 | - Get auction url for observer | |
| 21 | - Game process begin | |
| 22 | - Wait to end of auction | |
| 23 | - Review tender | |
| 24 | - Activate award | |
| 25 | - [Teardown] Close all browsers |
| 1 | -*** Setting *** | |
| 2 | -Resource keywords.robot | |
| 3 | -Resource resource.robot | |
| 4 | -Resource auction_keywords.robot | |
| 5 | - | |
| 6 | - | |
| 7 | -*** Test Cases *** | |
| 8 | -Valid Login | |
| 9 | - Open Browser as observer | |
| 10 | - Open Browser To Login Page bidder1 | |
| 11 | - Open Browser To Login Page bidder2 | |
| 12 | - Switch Browser observer | |
| 13 | - Auction is in standby | |
| 14 | - Auction is between rounds → 1 | |
| 15 | - Auction is on round 1 | |
| 16 | - | |
| 17 | -auction runs 1 round | |
| 18 | - bidder1 leaves bid 475000 | |
| 19 | - bidder2 leaves bid 470000 | |
| 20 | - Switch Browser observer | |
| 21 | - Auction is between rounds 1 → 2 | |
| 22 | - | |
| 23 | -auction runs 2 round | |
| 24 | - Auction is on round 2 | |
| 25 | - bidder1 leaves bid 465000 | |
| 26 | - bidder2 leaves bid 460000 | |
| 27 | - Switch Browser observer | |
| 28 | - Auction is between rounds 2 → 3 | |
| 29 | - | |
| 30 | -auction is on last round | |
| 31 | - Auction is on last round 3 | |
| 32 | - bidder1 leaves bid 455000 | |
| 33 | - bidder2 leaves bid 450000 | |
| 34 | - Switch Browser observer | |
| 35 | - Auction is finished | |
| 36 | - [Teardown] Close Browser | |
| 37 | - |
| 1 | -*** Setting *** | |
| 2 | -Library op_robot_tests.tests_files.ApiCommands | |
| 3 | -Library String | |
| 4 | -LIbrary Collections | |
| 5 | -LIbrary Selenium2Library | |
| 6 | - | |
| 7 | - | |
| 8 | -*** Variables *** | |
| 9 | -${BROWSER} googlechrome | |
| 10 | -${DELAY} 1 | |
| 11 | -${URL} http://cygnet.office.quintagroup.com:9001/tenders/ua3 | |
| 12 | -#http://auction-sandbox.openprocurement.org/ | |
| 13 | - | |
| 14 | - | |
| 15 | -${AUCTION_URL} http://cygnet.office.quintagroup.com:9001/tenders/ua3 | |
| 16 | -${LOGIN URL1} ${AUCTION_URL}/login?bidder_id=d3ba84c66c9e4f34bfb33cc3c686f137&hash=4e79e605bfecbaa9ac4d0d974c541ee2988f7377 | |
| 17 | -${LOGIN URL2} ${AUCTION_URL}/login?bidder_id=5675acc9232942e8940a034994ad883e&hash=bd4a790aac32b73e853c26424b032e5a29143d1f | |
| 18 | - | |
| 19 | -#$x('/html/body/div/div[1]/div/div[1]//*[contains(text(),"Аукціон завершився")]') | |
| 20 | -#[<span ng-if="$parent.info_timer.msg" class="ng-binding ng-scope">…</span>] | |
| 21 | -# http://cygnet.office.quintagroup.com:9001/tenders/ua3/login?bidder_id=d3ba84c66c9e4f34bfb33cc3c686f137&hash=4e79e605bfecbaa9ac4d0d974c541ee2988f7377 | |
| 22 | - | |
| 23 | -*** Keywords *** | |
| 24 | -Open Browser as observer | |
| 25 | - Open Browser ${AUCTION_URL} ${BROWSER} observer | |
| 26 | - Maximize Browser Window | |
| 27 | - Capture Page Screenshot | |
| 28 | - | |
| 29 | -Open Browser To Login Page bidder1 | |
| 30 | - Open Browser ${LOGIN URL1} ${BROWSER} bidder1 | |
| 31 | - Maximize Browser Window | |
| 32 | - Oauth Confirm Page Should Be Open | |
| 33 | - Capture Page Screenshot | |
| 34 | - Agree with rules | |
| 35 | - | |
| 36 | -Open Browser To Login Page bidder2 | |
| 37 | - Open Browser ${LOGIN URL2} ${BROWSER} bidder2 | |
| 38 | - Maximize Browser Window | |
| 39 | - Oauth Confirm Page Should Be Open | |
| 40 | - Capture Page Screenshot | |
| 41 | - Agree with rules | |
| 42 | - | |
| 43 | -Agree with rules | |
| 44 | - Click Button xpath=//form/div/button[1] | |
| 45 | - #Auction Page Should Be Open | |
| 46 | - | |
| 47 | -Oauth Confirm Page Should Be Open | |
| 48 | - Title Should Be Authorization | |
| 49 | - | |
| 50 | -Auction Page Should Be Open | |
| 51 | - Location Should Be ${AUCTION_URL} | |
| 52 | - Page Should Contain UA-11111 | |
| 53 | - Wait Until Page Contains до закінчення вашої черги 600 | |
| 54 | - Capture Page Screenshot | |
| 55 | - | |
| 56 | -Start Browser | |
| 57 | - Open Browser ${URL} ${BROWSER} | |
| 58 | - Capture Page Screenshot | |
| 59 | - | |
| 60 | -Auction is in standby | |
| 61 | - Page Should Contain до початку аукціону 600 | |
| 62 | - ${value} = Get Text xpath = //p[@class="round-number ng-scope"] | |
| 63 | - Should Be Equal ${value} Очікування | |
| 64 | - Capture Page Screenshot | |
| 65 | - | |
| 66 | -Auction is between rounds ${value1} | |
| 67 | - Wait Until Page Contains до початку раунду 600 | |
| 68 | - ${value} = Get Text xpath = //span[@class="round-number ng-binding"] | |
| 69 | - Should Be Equal ${value1} ${value} | |
| 70 | - Capture Page Screenshot | |
| 71 | - | |
| 72 | -Auction is on round ${value3} | |
| 73 | - Wait Until Page Contains до закінчення раунду 600 | |
| 74 | - ${round} = Get Text xpath = //p[@class="round-label ng-scope"] | |
| 75 | - ${number} = Get Text xpath = //p[@class="round-number ng-binding"] | |
| 76 | - Should Be Equal ${round} Раунд | |
| 77 | - Should Be Equal ${number} ${value3} | |
| 78 | - Capture Page Screenshot | |
| 79 | - | |
| 80 | -Auction is on last round ${value3} | |
| 81 | - Wait Until Page Contains до оголошення результатів 600 | |
| 82 | - ${round} = Get Text xpath = //p[@class="round-label ng-scope"] | |
| 83 | - ${number} = Get Text xpath = //p[@class="round-number ng-binding"] | |
| 84 | - Should Be Equal ${round} Раунд | |
| 85 | - Should Be Equal ${number} ${value3} | |
| 86 | - Capture Page Screenshot | |
| 87 | - | |
| 88 | -Auction is finished | |
| 89 | - Wait Until Page Contains Аукціон завершився 600 | |
| 90 | - ${value} = Get Text xpath = //p[@class="round-number ng-scope"] | |
| 91 | - Should Be Equal ${value} Завершено | |
| 92 | - Capture Page Screenshot | |
| 93 | - | |
| 94 | -*** Keywords *** | |
| 95 | -#bidding keywords | |
| 96 | - | |
| 97 | -#get minimum bid value | |
| 98 | - | |
| 99 | -submit bid ${amount} | |
| 100 | - Wait Until Page Contains до закінчення вашої черги 300 | |
| 101 | - Input Text xpath = //input[@id="bid"] ${amount} | |
| 102 | - Click Button xpath = //button[@class="btn btn-success ng-scope"] | |
| 103 | - Wait Until Page Contains Заявку прийнято 10 | |
| 104 | - Page Should Not Contain Надто висока заявка | |
| 105 | - | |
| 106 | -bidder1 leaves bid ${amount} | |
| 107 | - Switch Browser bidder1 | |
| 108 | - submit bid ${amount} | |
| 109 | - | |
| 110 | -bidder2 leaves bid ${amount} | |
| 111 | - Switch Browser bidder2 | |
| 112 | - submit bid ${amount} | |
| 113 | - | |
| 114 | - | |
| \ No newline at end of file |
| 1 | 1 | *** Setting *** |
| 2 | 2 | Library Selenium2Screenshots |
| 3 | +Library String | |
| 4 | +Library DateTime | |
| 5 | + | |
| 6 | +*** Variables *** | |
| 7 | +${locator.tenderId} jquery=h3 | |
| 8 | +${locator.title} jquery=tender-subject-info>div.row:contains("Назва закупівлі:")>:eq(1)> | |
| 9 | +${locator.description} jquery=tender-subject-info>div.row:contains("Детальний опис закупівлі:")>:eq(1)> | |
| 10 | +${locator.minimalStep.amount} jquery=tender-subject-info>div.row:contains("Мінімальний крок аукціону, грн.:")>:eq(1)> | |
| 11 | +${locator.procuringEntity.name} jquery=customer-info>div.row:contains("Найменування:")>:eq(1)> | |
| 12 | +${locator.value.amount} jquery=tender-subject-info>div.row:contains("Повний доступний бюджет закупівлі, грн.:")>:eq(1)> | |
| 13 | +${locator.tenderPeriod.startDate} jquery=tender-procedure-info>div.row:contains("Початок прийому пропозицій:")>:eq(1)> | |
| 14 | +${locator.tenderPeriod.endDate} jquery=tender-procedure-info>div.row:contains("Завершення прийому пропозицій:")>:eq(1)> | |
| 15 | +${locator.enquiryPeriod.startDate} jquery=tender-procedure-info>div.row:contains("Початок періоду уточнень:")>:eq(1)> | |
| 16 | +${locator.enquiryPeriod.endDate} jquery=tender-procedure-info>div.row:contains("Завершення періоду уточнень:")>:eq(1)> | |
| 3 | 17 | |
| 4 | 18 | *** Keywords *** |
| 5 | 19 | Підготувати клієнт для користувача |
| 6 | 20 | [Arguments] ${username} |
| 7 | 21 | [Documentation] Відкрити брaвзер, створити обєкт api wrapper, тощо |
| 8 | - Open Browser ${BROKERS['${USERS.users['${username}'].broker}'].url} ${USERS.users['${username}'].browser} ${username} | |
| 22 | + Open Browser ${BROKERS['${USERS.users['${username}'].broker}'].url} ${USERS.users['${username}'].browser} alias=${username} | |
| 9 | 23 | Set Window Position @{USERS.users['${username}'].position} |
| 10 | 24 | Set Window Size @{USERS.users['${username}'].size} |
| 11 | 25 | Log Variables |
| 12 | 26 | |
| 13 | -Створити тендер | |
| 27 | +Пошук тендера по ідентифікатору | |
| 14 | 28 | [Arguments] @{ARGUMENTS} |
| 15 | - Log Variables | |
| 29 | + [Documentation] | |
| 30 | + ... ${ARGUMENTS[0]} == username | |
| 31 | + ... ${ARGUMENTS[1]} == tenderId | |
| 32 | + ... ${ARGUMENTS[2]} == id | |
| 33 | + ${current_location}= Get Location | |
| 34 | + Run keyword if '${BROKERS['${USERS.users['${username}'].broker}'].url}/#/tenderDetailes/${ARGUMENTS[2]}'=='${current_location}' Reload Page | |
| 35 | + Go to ${BROKERS['${USERS.users['${username}'].broker}'].url} | |
| 36 | + Wait Until Page Contains E-TENDER - центр електронної торгівлі 10 | |
| 37 | + sleep 1 | |
| 38 | + Input Text jquery=input[ng-change='search()'] ${ARGUMENTS[1]} | |
| 39 | + Click Link jquery=a[ng-click='search()'] | |
| 40 | + sleep 2 | |
| 41 | + ${last_note_id}= Add pointy note jquery=a[href^="#/tenderDetailes"] Found tender with tenderID "${ARGUMENTS[1]}" width=200 position=bottom | |
| 42 | + sleep 1 | |
| 43 | + Remove element ${last_note_id} | |
| 44 | + Click Link jquery=a[href^="#/tenderDetailes"] | |
| 45 | + Wait Until Page Contains ${ARGUMENTS[1]} 10 | |
| 46 | + sleep 1 | |
| 47 | + Capture Page Screenshot | |
| 16 | 48 | |
| 49 | +обновити сторінку з тендером | |
| 50 | + [Arguments] @{ARGUMENTS} | |
| 51 | + [Documentation] | |
| 52 | + ... ${ARGUMENTS[0]} == username | |
| 53 | + ... ${ARGUMENTS[1]} == tenderId | |
| 54 | + ... ${ARGUMENTS[2]} == id | |
| 55 | + ${current_location}= Get Location | |
| 56 | + Run keyword if '${BROKERS['${USERS.users['${username}'].broker}'].url}/#/tenderDetailes/${ARGUMENTS[2]}'=='${current_location}' Reload Page | |
| 57 | + Run keyword unless '${BROKERS['${USERS.users['${username}'].broker}'].url}/#/tenderDetailes/${ARGUMENTS[2]}'=='${current_location}' Пошук тендера по ідентифікатору @{ARGUMENTS} | |
| 58 | + Wait Until Page Contains ${ARGUMENTS[1]} 10 | |
| 59 | + sleep 1 | |
| 60 | + | |
| 61 | +отримати інформацію із тендера | |
| 62 | + [Arguments] @{ARGUMENTS} | |
| 63 | + [Documentation] | |
| 64 | + ... ${ARGUMENTS[0]} == username | |
| 65 | + ... ${ARGUMENTS[1]} == fieldname | |
| 66 | + Switch browser ${ARGUMENTS[0]} | |
| 67 | + ${return_value}= run keyword отримати інформацію про ${ARGUMENTS[1]} | |
| 68 | + [return] ${return_value} | |
| 69 | + | |
| 70 | +Відмітити на сторінці поле з тендера | |
| 71 | + [Arguments] ${fieldname} ${locator} | |
| 72 | + ${last_note_id}= Add pointy note ${locator} Found ${fieldname} width=200 position=bottom | |
| 73 | + Align elements horizontally ${locator} ${last_note_id} | |
| 74 | + sleep 1 | |
| 75 | + Remove element ${last_note_id} | |
| 76 | + | |
| 77 | +Отримати тест із поля і показати на сторінці | |
| 78 | + [Arguments] ${fieldname} | |
| 79 | + відмітити на сторінці поле з тендера ${fieldname} ${locator.${fieldname}} | |
| 80 | + ${return_value}= Get Text ${locator.${fieldname}} | |
| 81 | + [return] ${return_value} | |
| 82 | + | |
| 83 | +отримати інформацію про tenderId | |
| 84 | + ${return_value}= Отримати тест із поля і показати на сторінці tenderId | |
| 85 | + [return] ${return_value.split(' ')[1]} | |
| 86 | + | |
| 87 | +отримати інформацію про title | |
| 88 | + ${return_value}= Отримати тест із поля і показати на сторінці title | |
| 89 | + [return] ${return_value} | |
| 90 | + | |
| 91 | +отримати інформацію про description | |
| 92 | + ${return_value}= Отримати тест із поля і показати на сторінці description | |
| 93 | + [return] ${return_value} | |
| 94 | + | |
| 95 | +отримати інформацію про minimalStep.amount | |
| 96 | + ${return_value}= Отримати тест із поля і показати на сторінці minimalStep.amount | |
| 97 | + ${return_value}= Convert To Number ${return_value.split(' ')[0]} | |
| 98 | + [return] ${return_value} | |
| 99 | + | |
| 100 | +отримати інформацію про procuringEntity.name | |
| 101 | + ${return_value}= Отримати тест із поля і показати на сторінці procuringEntity.name | |
| 102 | + [return] ${return_value} | |
| 103 | + | |
| 104 | + | |
| 105 | +отримати інформацію про value.amount | |
| 106 | + ${return_value}= Отримати тест із поля і показати на сторінці value.amount | |
| 107 | + ${return_value}= Convert To Number ${return_value.split(' ')[0].replace(',', '')} | |
| 108 | + [return] ${return_value} | |
| 109 | + | |
| 110 | +отримати інформацію про tenderPeriod.startDate | |
| 111 | + ${return_value}= Отримати тест із поля і показати на сторінці tenderPeriod.startDate | |
| 112 | + [return] ${return_value} | |
| 113 | + | |
| 114 | +отримати інформацію про tenderPeriod.endDate | |
| 115 | + ${return_value}= Отримати тест із поля і показати на сторінці tenderPeriod.endDate | |
| 116 | + [return] ${return_value} | |
| 117 | + | |
| 118 | +отримати інформацію про enquiryPeriod.startDate | |
| 119 | + ${return_value}= Отримати тест із поля і показати на сторінці enquiryPeriod.startDate | |
| 120 | + [return] ${return_value} | |
| 121 | + | |
| 122 | +отримати інформацію про enquiryPeriod.endDate | |
| 123 | + ${return_value}= Отримати тест із поля і показати на сторінці enquiryPeriod.endDate | |
| 124 | + [return] ${return_value} | |
| 125 | + | |
| 126 | + | |
| 127 | +отримати інформацію про items[${item_id}].description | |
| 128 | + No Operation | |
| 129 | + | |
| 130 | +отримати інформацію про items[${item_id}].quantity | |
| 131 | + відмітити на сторінці поле з тендера items[${item_id}].quantity jquery=tender-subject-info>div.row:contains("Кількість:")>:eq(1)> | |
| 132 | + ${return_value}= Get Text jquery=tender-subject-info>div.row:contains("Кількість:")>:eq(1)> | |
| 133 | + ${return_value}= Convert To Number ${return_value} | |
| 134 | + [return] ${return_value} | |
| 135 | + | |
| 136 | +отримати інформацію про items[${item_id}].classification.id | |
| 137 | + відмітити на сторінці поле з тендера items[0].classification.id jquery=tender-subject-info>div.row:contains("Класифікатор CPV:")>:eq(1)> | |
| 138 | + ${return_value}= Get Text jquery=tender-subject-info>div.row:contains("Класифікатор CPV:")>:eq(1)> | |
| 139 | + [return] ${return_value.split(' ')[0]} | |
| 140 | + | |
| 141 | + | |
| 142 | +отримати інформацію про items[${item_id}].classification.description | |
| 143 | + відмітити на сторінці поле з тендера classification.description jquery=tender-subject-info>div.row:contains("Класифікатор CPV:")>:eq(1)> | |
| 144 | + ${return_value}= Get Text jquery=tender-subject-info>div.row:contains("Класифікатор CPV:")>:eq(1)> | |
| 145 | + ${return_value}= catenate @{return_value.split(' ')[1:]} | |
| 146 | + [return] ${return_value} | |
| 147 | + | |
| 148 | +отримати інформацію про items[${item_id}].deliveryAddress | |
| 149 | + No Operation | |
| 150 | + | |
| 151 | +отримати інформацію про items[${item_id}].deliveryDate | |
| 152 | + No Operation | |
| 153 | + | |
| 154 | +отримати інформацію про questions[${question_id}].title | |
| 155 | + відмітити на сторінці поле з тендера questions title jquery=tender-questions>div:eq(1)>div.row:contains("Тема:")>:eq(1)> | |
| 156 | + ${return_value}= Get Text jquery=tender-questions>div:eq(1)>div.row:contains("Тема:")>:eq(1)> | |
| 157 | + [return] ${return_value} | |
| 158 | + | |
| 159 | +отримати інформацію про questions[${question_id}].description | |
| 160 | + відмітити на сторінці поле з тендера questions title jquery=tender-questions>div:eq(1)>div.row:contains("Питання:")>:eq(1)> | |
| 161 | + ${return_value}= Get Text jquery=tender-questions>div:eq(1)>div.row:contains("Питання:")>:eq(1)> | |
| 162 | + [return] ${return_value} | |
| 163 | + | |
| 164 | +отримати інформацію про questions[${question_id}].date | |
| 165 | + відмітити на сторінці поле з тендера questions title jquery=tender-questions>div:eq(1)>div.row:contains("Дата:")>:eq(1)> | |
| 166 | + ${return_value}= Get Text jquery=tender-questions>div:eq(1)>div.row:contains("Дата:")>:eq(1)> | |
| 167 | + [return] ${return_value} | |
| 17 | 168 | |
| 18 | -Звірити інформацію про тендер | |
| 19 | - [Arguments] ${username} | |
| 20 | - Go to ${BROKERS['${USERS.users['${username}'].broker}'].url}/#/tenderDetailes/${TENDER_DATA.data.id} | |
| 21 | - Wait Until Page Contains ${TENDER_DATA.data.tenderID} 10 | |
| 22 | - ${last_note_id}= Add pointy note css=h3.panel-title Verify information about the tender position=bottom | |
| 23 | - :FOR ${field} IN @{important_fields} | |
| 24 | - \ Page Should Contain ${TENDER_DATA.data.${field}} | |
| 25 | - \ Remove element ${last_note_id} | |
| 26 | - \ ${last_note_id}= Add pointy note css=h3.panel-title checked information about field "${field}" width=200 color=green position=bottom | |
| 27 | - \ sleep 1 | |
| \ No newline at end of file | ... | ... |
| ... | ... | @@ -3,29 +3,117 @@ Library op_robot_tests.tests_files.brokers.openprocurement_client_helper |
| 3 | 3 | |
| 4 | 4 | *** Keywords *** |
| 5 | 5 | Підготувати клієнт для користувача |
| 6 | - [Arguments] ${username} | |
| 6 | + [Arguments] @{ARGUMENTS} | |
| 7 | 7 | [Documentation] Відкрити брaвзер, створити обєкт api wrapper, тощо |
| 8 | - ${api_wrapper}= prepare_api_wrapper ${BROKERS['${USERS.users['${username}'].broker}'].api_key} | |
| 9 | - Set To Dictionary ${USERS.users['${username}']} client ${api_wrapper} | |
| 8 | + ${api_wrapper}= prepare_api_wrapper ${BROKERS['${USERS.users['${ARGUMENTS[0]}'].broker}'].api_key} | |
| 9 | + Set To Dictionary ${USERS.users['${ARGUMENTS[0]}']} client ${api_wrapper} | |
| 10 | 10 | Log Variables |
| 11 | 11 | |
| 12 | 12 | Створити тендер |
| 13 | - [Arguments] ${username} | |
| 13 | + [Arguments] @{ARGUMENTS} | |
| 14 | 14 | ${INITIAL_TENDER_DATA}= prepare_test_tender_data |
| 15 | 15 | Log object data ${INITIAL_TENDER_DATA} |
| 16 | - ${TENDER_DATA}= Call Method ${USERS.users['${username}'].client} create_tender ${INITIAL_TENDER_DATA} | |
| 16 | + ${TENDER_DATA}= Call Method ${USERS.users['${ARGUMENTS[0]}'].client} create_tender ${INITIAL_TENDER_DATA} | |
| 17 | 17 | Log object data ${TENDER_DATA} cteated_tender |
| 18 | 18 | ${access_token}= Get Variable Value ${TENDER_DATA.access.token} |
| 19 | - Set To Dictionary ${USERS.users['${username}']} access_token ${access_token} | |
| 19 | + Set Global Variable ${access_token} | |
| 20 | + Set To Dictionary ${USERS.users['${ARGUMENTS[0]}']} access_token ${access_token} | |
| 20 | 21 | Log access_token: ${access_token} |
| 21 | 22 | Log tender_id: ${TENDER_DATA.data.id} |
| 22 | - Log Variables | |
| 23 | 23 | Set Global Variable ${TENDER_DATA} |
| 24 | + [return] ${TENDER_DATA} | |
| 25 | + | |
| 26 | +Пошук тендера по ідентифікатору | |
| 27 | + [Arguments] @{ARGUMENTS} | |
| 28 | + [Documentation] | |
| 29 | + ... ${ARGUMENTS[0]} == username | |
| 30 | + ... ${ARGUMENTS[1]} == tenderId | |
| 31 | + ... ${ARGUMENTS[2]} == id | |
| 32 | + ${tender_data}= Call Method ${USERS.users['${ARGUMENTS[0]}'].client} get_tender ${ARGUMENTS[2]} | |
| 33 | + Set To Dictionary ${USERS.users['${ARGUMENTS[0]}']} tender_data ${tender_data} | |
| 34 | + [return] ${tender_data} | |
| 35 | + | |
| 36 | + | |
| 37 | +отримати інформацію із тендера | |
| 38 | + [Arguments] @{ARGUMENTS} | |
| 39 | + [Documentation] | |
| 40 | + ... ${ARGUMENTS[0]} == username | |
| 41 | + ... ${ARGUMENTS[1]} == fieldname | |
| 42 | + [return] ${USERS.users['${ARGUMENTS[0]}'].tender_data.data.${ARGUMENTS[1]}} | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | +отримати інформацію про description для предмету закупівлі в однопредметному тендері | |
| 47 | + [Arguments] @{ARGUMENTS} | |
| 48 | + [Documentation] | |
| 49 | + ... ${ARGUMENTS[0]} == username | |
| 50 | + [return] ${USERS.users['${ARGUMENTS[0]}'].tender_data.data['items'][0].description} | |
| 51 | + | |
| 52 | +отримати інформацію про quantity для предмету закупівлі в однопредметному тендері | |
| 53 | + [Arguments] @{ARGUMENTS} | |
| 54 | + [Documentation] | |
| 55 | + ... ${ARGUMENTS[0]} == username | |
| 56 | + [return] ${USERS.users['${ARGUMENTS[0]}'].tender_data.data['items'][0].quantity} | |
| 57 | + | |
| 58 | + | |
| 59 | +отримати інформацію про classification.id для предмету закупівлі в однопредметному тендері | |
| 60 | + [Arguments] @{ARGUMENTS} | |
| 61 | + [Documentation] | |
| 62 | + ... ${ARGUMENTS[0]} == username | |
| 63 | + [return] ${USERS.users['${ARGUMENTS[0]}'].tender_data.data['items'][0].classification.id} | |
| 64 | + | |
| 65 | + | |
| 66 | +отримати інформацію про classification.description для предмету закупівлі в однопредметному тендері | |
| 67 | + [Arguments] @{ARGUMENTS} | |
| 68 | + [Documentation] | |
| 69 | + ... ${ARGUMENTS[0]} == username | |
| 70 | + [return] ${USERS.users['${ARGUMENTS[0]}'].tender_data.data['items'][0].classification.description} | |
| 71 | + | |
| 72 | + | |
| 73 | +отримати інформацію про deliveryAddress для предмету закупівлі в однопредметному тендері | |
| 74 | + [Arguments] @{ARGUMENTS} | |
| 75 | + [Documentation] | |
| 76 | + ... ${ARGUMENTS[0]} == username | |
| 77 | + [return] ${USERS.users['${ARGUMENTS[0]}'].tender_data.data['items'][0].deliveryAddress} | |
| 78 | + | |
| 79 | +отримати інформацію про deliveryDate для предмету закупівлі в однопредметному тендері | |
| 80 | + [Arguments] @{ARGUMENTS} | |
| 81 | + [Documentation] | |
| 82 | + ... ${ARGUMENTS[0]} == username | |
| 83 | + [return] ${USERS.users['${ARGUMENTS[0]}'].tender_data.data['items'][0].deliveryDate} | |
| 84 | + | |
| 85 | +Внести зміни в тендер | |
| 86 | + [Arguments] @{ARGUMENTS} | |
| 87 | + [Documentation] | |
| 88 | + ... ${ARGUMENTS[0]} == username | |
| 89 | + ... ${ARGUMENTS[1]} == id | |
| 90 | + ... ${ARGUMENTS[2]} == fieldname | |
| 91 | + ... ${ARGUMENTS[3]} == fieldvalue | |
| 92 | + отримати тендер ${ARGUMENTS[0]} ${ARGUMENTS[1]} | |
| 93 | + Set_To_Object ${TENDER_DATA.data} ${ARGUMENTS[2]} ${ARGUMENTS[3]} | |
| 94 | + | |
| 95 | + ${TENDER_DATA}= Call Method ${USERS.users['${ARGUMENTS[0]}'].client} patch_tender ${TENDER_DATA} | |
| 96 | + ${TENDER_DATA}= set_access_key ${TENDER_DATA} ${USERS.users['${ARGUMENTS[0]}'].access_token} | |
| 97 | + Set Global Variable ${TENDER_DATA} | |
| 98 | + | |
| 99 | +отримати тендер | |
| 100 | + [Arguments] @{ARGUMENTS} | |
| 101 | + [Documentation] | |
| 102 | + ... ${ARGUMENTS[0]} == username | |
| 103 | + ... ${ARGUMENTS[1]} == id | |
| 104 | + ${TENDER_DATA}= Call Method ${USERS.users['${ARGUMENTS[0]}'].client} get_tender ${ARGUMENTS[1]} | |
| 105 | + Log object data ${TENDER_DATA} | |
| 106 | + ${TENDER_DATA}= set_access_key ${TENDER_DATA} ${USERS.users['${ARGUMENTS[0]}'].access_token} | |
| 107 | + Set Global Variable ${TENDER_DATA} | |
| 108 | + | |
| 109 | + | |
| 24 | 110 | |
| 25 | -Звірити інформацію про тендер | |
| 26 | - [Arguments] ${username} | |
| 27 | - ${tender}= Call Method ${USERS.users['${username}'].client} get_tender ${TENDER_DATA.data.id} | |
| 28 | - Log object data ${tender} | |
| 29 | - :FOR ${field} IN @{important_fields} | |
| 30 | - \ Page Should Contain ${TENDER_DATA.data.${field}} | |
| 31 | - \ Log Учасник ${username} звірив поле "${field}" warn | |
| \ No newline at end of file | ||
| 111 | +Задати питання | |
| 112 | + [Documentation] | |
| 113 | + ... ${ARGUMENTS[0]} == username | |
| 114 | + ... ${ARGUMENTS[1]} == tender_uid | |
| 115 | + ... ${ARGUMENTS[2]} == question | |
| 116 | + [Arguments] @{ARGUMENTS} | |
| 117 | + ${tender}= Call Method ${USERS.users['${ARGUMENTS[0]}'].client} get_tender ${ARGUMENTS[1]} | |
| 118 | + ${question}= Call Method ${USERS.users['${ARGUMENTS[0]}'].client} create_question ${tender} ${ARGUMENTS[2]} | |
| 119 | + Log object data ${question} question | |
| \ No newline at end of file | ... | ... |
| 1 | -tender_owner: Taras | |
| 1 | +tender_owner: Tender Owner | |
| 2 | 2 | users: |
| 3 | - Taras: | |
| 3 | + Tender Owner: | |
| 4 | 4 | broker: Quinta |
| 5 | - Andew: | |
| 5 | + E-tender User: | |
| 6 | 6 | broker: E-tender |
| 7 | 7 | username: test |
| 8 | 8 | browser: chrome |
| 9 | - position: [1060, 0] | |
| 10 | - size: [860, 1000] | |
| 11 | - Andew1: | |
| 9 | + position: [960, 0] | |
| 10 | + size: [960, 1000] | |
| 11 | + Andrew: | |
| 12 | 12 | broker: Quinta |
| \ No newline at end of file | ... | ... |
| ... | ... | @@ -46,6 +46,20 @@ test_tender_data = { |
| 46 | 46 | "items": [ |
| 47 | 47 | { |
| 48 | 48 | "description": fake.catch_phrase(), |
| 49 | + "deliveryDate": { | |
| 50 | + "endDate": (now + timedelta(days=5)).isoformat() | |
| 51 | + }, | |
| 52 | + "deliveryLocation": { | |
| 53 | + "latitude": "49.8500° N", | |
| 54 | + "longitude": "24.0167° E" | |
| 55 | + }, | |
| 56 | + "deliveryAddress": { | |
| 57 | + "countryName": u"Україна", | |
| 58 | + "postalCode": fake.postalcode(), | |
| 59 | + "region": u"м. Київ", | |
| 60 | + "locality": u"м. Київ", | |
| 61 | + "streetAddress": fake.street_address() | |
| 62 | + }, | |
| 49 | 63 | "classification": { |
| 50 | 64 | "scheme": u"CPV", |
| 51 | 65 | "id": u"44617100-9", | ... | ... |
| 1 | -*** Setting *** | |
| 2 | -Library op_robot_tests.tests_files.ApiCommands | |
| 3 | -Library String | |
| 4 | -LIbrary Collections | |
| 5 | -LIbrary Selenium2Library | |
| 6 | -Library DebugLibrary | |
| 7 | - | |
| 8 | - | |
| 9 | -*** Keywords *** | |
| 10 | -Init auction data | |
| 11 | - ${auction_data}= load_initial_data_from auction_data.yaml | |
| 12 | - Set Global Variable ${auction_data} | |
| 13 | - | |
| 14 | -Create api wrapper | |
| 15 | - Init auction data | |
| 16 | - ${API}= prepare_api ${api_key} | |
| 17 | - Set Global Variable ${API} | |
| 18 | - LOG ${API} | |
| 19 | - Log Variables | |
| 20 | - | |
| 21 | -Set access key on tender | |
| 22 | - ${tender}= set_access_key ${tender} ${access_token} | |
| 23 | - Set Global Variable ${tender} | |
| 24 | - | |
| 25 | -Create tender | |
| 26 | - ${init_tender_data}= prepare_test_tender_data | |
| 27 | - Log object data ${init_tender_data} | |
| 28 | - ${tender}= Call Method ${API} create_tender ${init_tender_data} | |
| 29 | - Log object data ${tender} tender_creater | |
| 30 | - ${access_token}= Get Variable Value ${tender.access.token} | |
| 31 | - Set Global Variable ${access_token} | |
| 32 | - ${tender_id}= Get Variable Value ${tender.data.id} | |
| 33 | - Set Global Variable ${tender_id} | |
| 34 | - Log access_key: ${access_token} | |
| 35 | - Log tender_id: ${tender_id} | |
| 36 | - Log Variables | |
| 37 | - Set Global Variable ${tender} | |
| 38 | - [return] ${tender} | |
| 39 | - | |
| 40 | -Change tender title | |
| 41 | - ${new_tender_sufix}= Generate Random String 3 [NUMBERS] | |
| 42 | - ${new_tender_title}= Set Variable 1-QUINTA-KT-${new_tender_sufix} | |
| 43 | - Log new title: ${new_tender_title} | |
| 44 | - Log object data ${tender} | |
| 45 | - ${tender.data.title}= Set Variable ${new_tender_title} | |
| 46 | - ${tender.data.title_en}= Set Variable ${new_tender_title} | |
| 47 | - ${tender.data.title_ru}= Set Variable ${new_tender_title} | |
| 48 | - Log object data ${tender} | |
| 49 | - ${tender}= Call Method ${API} patch_tender ${tender} | |
| 50 | - Set Global Variable ${tender} | |
| 51 | - Log object data ${tender} tender_changed_titles | |
| 52 | - Set access key on tender | |
| 53 | - | |
| 54 | -Change tender periods | |
| 55 | - Log object data ${tender} | |
| 56 | - ${tender}= set_tender_periods ${tender} | |
| 57 | - Log object data ${tender} | |
| 58 | - ${tender}= Call Method ${API} patch_tender ${tender} | |
| 59 | - Set Global Variable ${tender} | |
| 60 | - Log object data ${tender} tender_changed_periods | |
| 61 | - Set access key on tender | |
| 62 | - | |
| 63 | -Upload tender documentation | |
| 64 | - ${file}= upload tender document ${API} ${tender} | |
| 65 | - patch tender document ${API} ${tender} ${file.data.id} | |
| 66 | - | |
| 67 | -Create question | |
| 68 | - ${question}= test question data | |
| 69 | - Log object data ${question} | |
| 70 | - ${question}= Call Method ${API} create_question ${tender} ${question} | |
| 71 | - Log object data ${question} question_created | |
| 72 | - [return] ${question} | |
| 73 | - | |
| 74 | - | |
| 75 | -Write answer on first question | |
| 76 | - ${questions}= Call Method ${API} get_questions ${tender} | |
| 77 | - Log object data ${questions} | |
| 78 | - ${question}= Set Variable ${questions.data[0]} | |
| 79 | - Log object data ${question} | |
| 80 | - | |
| 81 | - ${question}= Call Method ${API} get_question ${tender} ${questions.data[0].id} | |
| 82 | - Log object data ${question} | |
| 83 | - ${question}= set_access_key ${question} ${access_token} | |
| 84 | - Log object data ${question} | |
| 85 | - | |
| 86 | - ${answer}= test_question_answer_data | |
| 87 | - Log object data ${answer} | |
| 88 | - ${question.data.answer}= Set Variable ${answer['data']['answer']} | |
| 89 | - Log object data ${question} | |
| 90 | - ${question}= Call Method ${API} patch_question ${tender} ${question} | |
| 91 | - Log object data ${question} | |
| 92 | - [return] ${question} | |
| 93 | - | |
| 94 | -Review tender | |
| 95 | - ${tender}= Call Method ${API} get_tender ${tender_id} | |
| 96 | - Set Global Variable ${tender} | |
| 97 | - Log object data ${tender} | |
| 98 | - Set access key on tender | |
| 99 | - | |
| 100 | -Wait to tender period with name ${period_name} | |
| 101 | - log ${tender.data.${period_name}.startDate} | |
| 102 | - ${wait_seconds}= calculate wait to date ${tender.data.${period_name}.startDate} | |
| 103 | - Sleep ${wait_seconds} Wait on ${period_name} | |
| 104 | - Review tender | |
| 105 | - | |
| 106 | -Wait to start of auction's worker | |
| 107 | - Sleep 4 minutes | |
| 108 | - | |
| 109 | -Submit bids | |
| 110 | - Review tender | |
| 111 | - Log object data ${tender} tender_before_submit_bids | |
| 112 | - ${bids_items}= Get Dictionary Items ${auction_data.bidders} | |
| 113 | - :FOR ${bidder_key} ${bidder_data} IN @{bids_items} | |
| 114 | - \ ${bid}= test bid data | |
| 115 | - \ Log object data ${bid} | |
| 116 | - \ ${temp_amount}= Get Variable Value ${auction_data.bidders.${bidder_key}.start_bid} | |
| 117 | - \ Log ${temp_amount} | |
| 118 | - \ ${bid.data.value.amount}= Get Variable Value ${temp_amount} | |
| 119 | - \ ${bids_data}= Submit in tender bid with data ${bid} | |
| 120 | - \ Set To Dictionary ${auction_data.bidders.${bidder_key}} tender_bid_data ${bids_data} | |
| 121 | - Log object data ${auction_data} auction_data_after_submit_bids | |
| 122 | - Set Global Variable ${auction_data} | |
| 123 | - | |
| 124 | - | |
| 125 | - | |
| 126 | -Submit in tender bid with data | |
| 127 | - [Arguments] ${bid} | |
| 128 | - ${bid_data}= Call Method ${API} create_bid ${tender} ${bid} | |
| 129 | - Log object data ${bid_data} | |
| 130 | - [return] ${bid_data} | |
| 131 | - | |
| 132 | - | |
| 133 | -Get particular urls for bids | |
| 134 | - ${bids_items}= Get Dictionary Items ${auction_data.bidders} | |
| 135 | - :FOR ${bidder_key} ${bidder_data} IN @{bids_items} | |
| 136 | - \ ${approved_bid}= Call Method ${API} get_bid ${tender} ${bidder_data.tender_bid_data.data.id} ${bidder_data.tender_bid_data.access.token} | |
| 137 | - \ Log object data ${approved_bid} | |
| 138 | - \ Log ${approved_bid.data.participationUrl} | |
| 139 | - \ Set To Dictionary ${auction_data.bidders.${bidder_key}} start_url ${approved_bid.data.participationUrl} | |
| 140 | - Log object data ${auction_data} auction_data_after_get_particular_urls | |
| 141 | - Set Global Variable ${auction_data} | |
| 142 | - | |
| 143 | - | |
| 144 | -Get auction url for observer | |
| 145 | - Review tender | |
| 146 | - Set To Dictionary ${auction_data.observer} start_url ${tender.data.auctionUrl} | |
| 147 | - Log object data ${auction_data} auction_data_after_add_auction_url | |
| 148 | - Set Global Variable ${auction_data} | |
| 149 | - | |
| 150 | - | |
| 151 | -Wait to end of auction | |
| 152 | - Sleep 1 minutes Wait to end of auction | |
| 153 | - | |
| 154 | - | |
| 155 | -Activate award | |
| 156 | - Review tender | |
| 157 | - Log object data ${tender} tender_after_add_auction | |
| 158 | - ${awards}= Call Method ${API} get_awards ${tender} | |
| 159 | - Log object data ${awards} initial_get_awards_response json | |
| 160 | - ${award_approve}= create_approve_award_request_data ${awards.data[0].id} | |
| 161 | - Log object data ${award_approve} active_award_request json | |
| 162 | - ${approved_award}= Call Method ${API} patch_award ${tender} ${award_approve} | |
| 163 | - Log object data ${approved_award} activeted_award_response json | |
| 164 | - ${award_canceled}= create_approve_award_request_data ${awards.data[0].id} | |
| 165 | - Set To Dictionary ${award_canceled.data} status cancelled | |
| 166 | - Log object data ${award_canceled} cancel_award_request json | |
| 167 | - ${canceled_award}= Call Method ${API} patch_award ${tender} ${award_canceled} | |
| 168 | - Log object data ${canceled_award} cancel_award_response json | |
| 169 | - ${awards}= Call Method ${API} get_awards ${tender} | |
| 170 | - Log object data ${awards} awards_after_cancel_one json | |
| 171 | - ${unsuccessful_award_request}= create_approve_award_request_data ${awards.data[1].id} | |
| 172 | - Set To Dictionary ${unsuccessful_award_request.data} status unsuccessful | |
| 173 | - Log object data ${unsuccessful_award_request} unsuccessful_award_request json | |
| 174 | - ${unsuccessful_award_response}= Call Method ${API} patch_award ${tender} ${unsuccessful_award_request} | |
| 175 | - Log object data ${unsuccessful_award_response} unsuccessful_award_response json | |
| 176 | - ${award_canceled}= create_approve_award_request_data ${awards.data[0].id} | |
| 177 | - ${awards}= Call Method ${API} get_awards ${tender} | |
| 178 | - Log object data ${awards} awards_after_unsuccessful_one json | |
| 179 | - ${next_award_activate_request}= create_approve_award_request_data ${awards.data[2].id} | |
| 180 | - Set To Dictionary ${next_award_activate_request.data} status active | |
| 181 | - Log object data ${next_award_activate_request} next_award_activate_request json | |
| 182 | - ${next_award_activate_response}= Call Method ${API} patch_award ${tender} ${next_award_activate_request} | |
| 183 | - Log object data ${next_award_activate_response} next_award_activate_response json | |
| 184 | - | |
| 185 | -Game process begin | |
| 186 | - Open Browser To bidder0 Login Page | |
| 187 | - Open Browser To bidder1 Login Page | |
| 188 | - Open Browser as observer | |
| 189 | - Auction is on round 1 | |
| 190 | - bidder1 leaves bid 40000 | |
| 191 | - Capture Page Screenshot | |
| 192 | - bidder0 leaves bid 39000 | |
| 193 | - Capture Page Screenshot | |
| 194 | - Auction is finished | |
| 195 | - Capture Page Screenshot | |
| 196 | - | |
| 197 | -Open Browser To ${bidder} Login Page | |
| 198 | - Open Browser ${auction_data.bidders.${bidder}.start_url} ${auction_data.bidders.${bidder}.browser} ${bidder} | |
| 199 | - Maximize Browser Window | |
| 200 | - Oauth Confirm Page Should Be Open | |
| 201 | - ${bidder} agree with rules | |
| 202 | - Sleep 2 | |
| 203 | - Capture Page Screenshot | |
| 204 | - | |
| 205 | - | |
| 206 | -Open Browser as observer | |
| 207 | - Open Browser ${auction_data.observer.start_url} ${auction_data.observer.browser} observer | |
| 208 | - Maximize Browser Window | |
| 209 | - Capture Page Screenshot | |
| 210 | - | |
| 211 | -Oauth Confirm Page Should Be Open | |
| 212 | - Title Should Be Authorization | |
| 213 | - Capture Page Screenshot | |
| 214 | - | |
| 215 | -${bidder} agree with rules | |
| 216 | - Click Element css=.btn.btn-success | |
| 217 | - Wait Until Page Contains ${tender.data.tenderID} 20 | |
| 218 | - Capture Page Screenshot | |
| 219 | - | |
| 220 | - | |
| 221 | -submit bid ${amount} on auction | |
| 222 | - Wait Until Page Contains до закінчення вашої черги 600 | |
| 223 | - Input Text xpath = //input[@id="bid-amount-input"] ${amount} | |
| 224 | - Click Button xpath = //button[@id="place-bid-button"] | |
| 225 | - Wait Until Page Contains Заявку прийнято 10 | |
| 226 | - Page Should Not Contain Надто висока заявка | |
| 227 | - | |
| 228 | -${bidder} leaves bid ${amount} | |
| 229 | - Switch Browser ${bidder} | |
| 230 | - submit bid ${amount} on auction | |
| 231 | - | |
| 232 | - | |
| 233 | -Auction is finished | |
| 234 | - Wait Until Page Contains Аукціон завершився 700 | |
| 235 | - ${value} = Get Text xpath= //p[@class="round-number ng-scope"] | |
| 236 | - Should Be Equal ${value} Завершено | |
| 237 | - Capture Page Screenshot | |
| 238 | - | |
| 239 | -Auction is on round ${value3} | |
| 240 | - Wait Until Page Contains до закінчення раунду 1200 | |
| 241 | - ${round} = Get Text xpath = //p[@class="round-label ng-scope"] | |
| 242 | - ${number} = Get Text xpath = //p[@class="round-number ng-binding"] | |
| 243 | - Should Be Equal ${round} Раунд | |
| 244 | - Should Be Equal ${number} ${value3} | |
| 245 | - Capture Page Screenshot | |
| \ No newline at end of file |
| ... | ... | @@ -5,8 +5,10 @@ from json import load |
| 5 | 5 | from robot.output import LOGGER |
| 6 | 6 | from robot.output.loggerhelper import Message |
| 7 | 7 | from robot.libraries.BuiltIn import BuiltIn |
| 8 | - | |
| 9 | - | |
| 8 | +from robot.errors import HandlerExecutionFailed | |
| 9 | +from datetime import datetime, timedelta | |
| 10 | +from dpath.util import set as xpathset | |
| 11 | +from jsonpath_rw import parse | |
| 10 | 12 | from .initial_data import ( |
| 11 | 13 | test_tender_data, test_question_data, test_question_answer_data, |
| 12 | 14 | test_bid_data |
| ... | ... | @@ -40,3 +42,54 @@ def load_initial_data_from(file_name): |
| 40 | 42 | |
| 41 | 43 | def prepare_test_tender_data(): |
| 42 | 44 | return munchify({'data': test_tender_data}) |
| 45 | + | |
| 46 | + | |
| 47 | +def run_keyword_and_ignore_keyword_definations(name, *args): | |
| 48 | + """Runs the given keyword with given arguments and returns the status as a Boolean value. | |
| 49 | + | |
| 50 | + This keyword returns `True` if the keyword that is executed succeeds and | |
| 51 | + `False` if it fails. This is useful, for example, in combination with | |
| 52 | + `Run Keyword If`. If you are interested in the error message or return | |
| 53 | + value, use `Run Keyword And Ignore Error` instead. | |
| 54 | + | |
| 55 | + The keyword name and arguments work as in `Run Keyword`. | |
| 56 | + | |
| 57 | + Example: | |
| 58 | + | ${passed} = | `Run Keyword And Return Status` | Keyword | args | | |
| 59 | + | `Run Keyword If` | ${passed} | Another keyword | | |
| 60 | + | |
| 61 | + New in Robot Framework 2.7.6. | |
| 62 | + """ | |
| 63 | + try: | |
| 64 | + status, _ = BuiltIn().run_keyword_and_ignore_error(name, *args) | |
| 65 | + except HandlerExecutionFailed, e: | |
| 66 | + LOGGER.log_message(Message("Keyword {} not implemented", "ERROR")) | |
| 67 | + return "FAIL", "" | |
| 68 | + return status, _ | |
| 69 | + | |
| 70 | + | |
| 71 | +def set_tender_periods(tender): | |
| 72 | + now = datetime.now() | |
| 73 | + tender.data.enquiryPeriod.endDate = (now + timedelta(minutes=2)).isoformat() | |
| 74 | + tender.data.tenderPeriod.startDate = (now + timedelta(minutes=2)).isoformat() | |
| 75 | + tender.data.tenderPeriod.endDate = (now + timedelta(minutes=4)).isoformat() | |
| 76 | + return tender | |
| 77 | + | |
| 78 | + | |
| 79 | +def set_access_key(tender, access_token): | |
| 80 | + tender.access = munchify({"token": access_token}) | |
| 81 | + return tender | |
| 82 | + | |
| 83 | + | |
| 84 | +def set_to_object(obj, attribute, value): | |
| 85 | + xpathset(obj, attribute.replace('.', '/'), value) | |
| 86 | + return obj | |
| 87 | + | |
| 88 | + | |
| 89 | +def get_from_object(obj, attribute): | |
| 90 | + """Gets data from a dictionary using a dotted accessor-string""" | |
| 91 | + jsonpath_expr = parse(attribute) | |
| 92 | + return_list = [i.value for i in jsonpath_expr.find(obj)] | |
| 93 | + if return_list: | |
| 94 | + return return_list[0] | |
| 95 | + return None | ... | ... |
Please
register
or
login
to post a comment