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