Commit f7d8b3755522e62c53e8e5339dd5133faf339a56

Authored by Taras Kozlovskyi
1 parent 324c3fbc

Improved OpenProcurementProcess

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  
1 -*** Variables ***  
2 -${api_key} e9c3ccb8e8124f26941d5f9639a4ebc3  
@@ -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