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,19 +5,135 @@ LIbrary Collections | ||
5 | LIbrary Selenium2Library | 5 | LIbrary Selenium2Library |
6 | Library DebugLibrary | 6 | Library DebugLibrary |
7 | 7 | ||
8 | -Test Setup TestCaseSetup | 8 | +Suite Setup TestCaseSetup |
9 | +Suite Teardown Close all browsers | ||
9 | 10 | ||
10 | 11 | ||
11 | *** Variables *** | 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 | *** Test Cases *** | 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 | *** Keywords *** | 139 | *** Keywords *** |
@@ -27,47 +143,61 @@ TestCaseSetup | @@ -27,47 +143,61 @@ TestCaseSetup | ||
27 | 143 | ||
28 | 144 | ||
29 | Завантажуємо дані про корисувачів і площадки | 145 | Завантажуємо дані про корисувачів і площадки |
30 | - | ||
31 | # Init Brokers | 146 | # Init Brokers |
32 | ${file_path}= Get Variable Value ${BROKERS_FILE} brokers.yaml | 147 | ${file_path}= Get Variable Value ${BROKERS_FILE} brokers.yaml |
33 | ${BROKERS}= load_initial_data_from ${file_path} | 148 | ${BROKERS}= load_initial_data_from ${file_path} |
34 | Set Global Variable ${BROKERS} | 149 | Set Global Variable ${BROKERS} |
35 | ${brokers_list}= Get Dictionary Items ${BROKERS} | 150 | ${brokers_list}= Get Dictionary Items ${BROKERS} |
36 | :FOR ${Broker_Name} ${Broker_Data} IN @{brokers_list} | 151 | :FOR ${Broker_Name} ${Broker_Data} IN @{brokers_list} |
37 | - \ Завантажуємо бібліотеку з реалізацією ${Broker_Data.broker_api} площадки | ||
38 | - | 152 | + \ Завантажуємо бібліотеку з реалізацією ${Broker_Data.keywords_file} площадки |
39 | # Init Users | 153 | # Init Users |
40 | ${file_path}= Get Variable Value ${USERS_FILE} users.yaml | 154 | ${file_path}= Get Variable Value ${USERS_FILE} users.yaml |
41 | ${USERS}= load_initial_data_from ${file_path} | 155 | ${USERS}= load_initial_data_from ${file_path} |
42 | Set Global Variable ${USERS} | 156 | Set Global Variable ${USERS} |
43 | ${users_list}= Get Dictionary Items ${USERS.users} | 157 | ${users_list}= Get Dictionary Items ${USERS.users} |
44 | :FOR ${username} ${user_data} IN @{users_list} | 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 | ${INITIAL_TENDER_DATA}= prepare_test_tender_data | 166 | ${INITIAL_TENDER_DATA}= prepare_test_tender_data |
49 | Set Global Variable ${INITIAL_TENDER_DATA} | 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} | ||
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 | - |
1 | *** Setting *** | 1 | *** Setting *** |
2 | Library Selenium2Screenshots | 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 | *** Keywords *** | 18 | *** Keywords *** |
5 | Підготувати клієнт для користувача | 19 | Підготувати клієнт для користувача |
6 | [Arguments] ${username} | 20 | [Arguments] ${username} |
7 | [Documentation] Відкрити брaвзер, створити обєкт api wrapper, тощо | 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 | Set Window Position @{USERS.users['${username}'].position} | 23 | Set Window Position @{USERS.users['${username}'].position} |
10 | Set Window Size @{USERS.users['${username}'].size} | 24 | Set Window Size @{USERS.users['${username}'].size} |
11 | Log Variables | 25 | Log Variables |
12 | 26 | ||
13 | -Створити тендер | 27 | +Пошук тендера по ідентифікатору |
14 | [Arguments] @{ARGUMENTS} | 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 |
@@ -3,29 +3,117 @@ Library op_robot_tests.tests_files.brokers.openprocurement_client_helper | @@ -3,29 +3,117 @@ Library op_robot_tests.tests_files.brokers.openprocurement_client_helper | ||
3 | 3 | ||
4 | *** Keywords *** | 4 | *** Keywords *** |
5 | Підготувати клієнт для користувача | 5 | Підготувати клієнт для користувача |
6 | - [Arguments] ${username} | 6 | + [Arguments] @{ARGUMENTS} |
7 | [Documentation] Відкрити брaвзер, створити обєкт api wrapper, тощо | 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 | Log Variables | 10 | Log Variables |
11 | 11 | ||
12 | Створити тендер | 12 | Створити тендер |
13 | - [Arguments] ${username} | 13 | + [Arguments] @{ARGUMENTS} |
14 | ${INITIAL_TENDER_DATA}= prepare_test_tender_data | 14 | ${INITIAL_TENDER_DATA}= prepare_test_tender_data |
15 | Log object data ${INITIAL_TENDER_DATA} | 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 | Log object data ${TENDER_DATA} cteated_tender | 17 | Log object data ${TENDER_DATA} cteated_tender |
18 | ${access_token}= Get Variable Value ${TENDER_DATA.access.token} | 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 | Log access_token: ${access_token} | 21 | Log access_token: ${access_token} |
21 | Log tender_id: ${TENDER_DATA.data.id} | 22 | Log tender_id: ${TENDER_DATA.data.id} |
22 | - Log Variables | ||
23 | Set Global Variable ${TENDER_DATA} | 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 | ||
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 |
1 | E-tender: | 1 | E-tender: |
2 | - broker_api: etender | 2 | + keywords_file: etender |
3 | url: http://services.e-tender.biz:100 | 3 | url: http://services.e-tender.biz:100 |
4 | + timout_on_wait: 15 | ||
4 | Quinta: | 5 | Quinta: |
5 | api_key: e9c3ccb8e8124f26941d5f9639a4ebc3 | 6 | api_key: e9c3ccb8e8124f26941d5f9639a4ebc3 |
6 | - broker_api: openprocurement_client | 7 | + keywords_file: openprocurement_client |
8 | + timout_on_wait: 0 |
1 | -tender_owner: Taras | 1 | +tender_owner: Tender Owner |
2 | users: | 2 | users: |
3 | - Taras: | 3 | + Tender Owner: |
4 | broker: Quinta | 4 | broker: Quinta |
5 | - Andew: | 5 | + E-tender User: |
6 | broker: E-tender | 6 | broker: E-tender |
7 | username: test | 7 | username: test |
8 | browser: chrome | 8 | browser: chrome |
9 | - position: [1060, 0] | ||
10 | - size: [860, 1000] | ||
11 | - Andew1: | 9 | + position: [960, 0] |
10 | + size: [960, 1000] | ||
11 | + Andrew: | ||
12 | broker: Quinta | 12 | broker: Quinta |
@@ -46,6 +46,20 @@ test_tender_data = { | @@ -46,6 +46,20 @@ test_tender_data = { | ||
46 | "items": [ | 46 | "items": [ |
47 | { | 47 | { |
48 | "description": fake.catch_phrase(), | 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 | "classification": { | 63 | "classification": { |
50 | "scheme": u"CPV", | 64 | "scheme": u"CPV", |
51 | "id": u"44617100-9", | 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 |
@@ -5,8 +5,10 @@ from json import load | @@ -5,8 +5,10 @@ from json import load | ||
5 | from robot.output import LOGGER | 5 | from robot.output import LOGGER |
6 | from robot.output.loggerhelper import Message | 6 | from robot.output.loggerhelper import Message |
7 | from robot.libraries.BuiltIn import BuiltIn | 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 | from .initial_data import ( | 12 | from .initial_data import ( |
11 | test_tender_data, test_question_data, test_question_answer_data, | 13 | test_tender_data, test_question_data, test_question_answer_data, |
12 | test_bid_data | 14 | test_bid_data |
@@ -40,3 +42,54 @@ def load_initial_data_from(file_name): | @@ -40,3 +42,54 @@ def load_initial_data_from(file_name): | ||
40 | 42 | ||
41 | def prepare_test_tender_data(): | 43 | def prepare_test_tender_data(): |
42 | return munchify({'data': test_tender_data}) | 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 |
@@ -27,7 +27,9 @@ setup(name='op_robot_tests', | @@ -27,7 +27,9 @@ setup(name='op_robot_tests', | ||
27 | 'iso8601', | 27 | 'iso8601', |
28 | 'PyYAML', | 28 | 'PyYAML', |
29 | 'munch', | 29 | 'munch', |
30 | - 'fake-factory' | 30 | + 'fake-factory', |
31 | + 'dpath', | ||
32 | + 'jsonpath-rw' | ||
31 | ], | 33 | ], |
32 | entry_points={ | 34 | entry_points={ |
33 | 'console_scripts': [ | 35 | 'console_scripts': [ |
Please
register
or
login
to post a comment