Showing
8 changed files
with
110 additions
and
155 deletions
... | ... | @@ -4,15 +4,15 @@ Library String |
4 | 4 | LIbrary Collections |
5 | 5 | LIbrary Selenium2Library |
6 | 6 | Library DebugLibrary |
7 | - | |
7 | +Resource keywords.robot | |
8 | 8 | Suite Setup TestCaseSetup |
9 | 9 | Suite Teardown Close all browsers |
10 | 10 | |
11 | - | |
12 | 11 | *** Variables *** |
13 | -${viewer} E-tender User | |
14 | -${provider} Andrew | |
15 | -@{item_fields} description quantity classification.id classification.description deliveryAddress deliveryDate | |
12 | +${viewer} Tender User | |
13 | +# Tender Viewer | |
14 | +${provider} Tender User | |
15 | + | |
16 | 16 | |
17 | 17 | *** Test Cases *** |
18 | 18 | Можливість оголосити тендер |
... | ... | @@ -66,9 +66,6 @@ ${provider} Andrew |
66 | 66 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення основних даних оголошеного тендера |
67 | 67 | Звірити поле тендера ${viewer} procuringEntity.name |
68 | 68 | |
69 | - | |
70 | - | |
71 | - | |
72 | 69 | Відображення предмету закупівлі однопредметного тендера |
73 | 70 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення однопредметного тендера |
74 | 71 | Звірити поле тендера ${viewer} items[0].description |
... | ... | @@ -84,7 +81,11 @@ ${provider} Andrew |
84 | 81 | |
85 | 82 | Відображення місце поставки закупівлі однопредметного тендера |
86 | 83 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення однопредметного тендера |
87 | - Звірити поле тендера ${viewer} items[0].deliveryAddress | |
84 | + Звірити поле тендера ${viewer} items[0].deliveryAddress.countryName | |
85 | + Звірити поле тендера ${viewer} items[0].deliveryAddress.locality | |
86 | + Звірити поле тендера ${viewer} items[0].deliveryAddress.postalCode | |
87 | + Звірити поле тендера ${viewer} items[0].deliveryAddress.region | |
88 | + Звірити поле тендера ${viewer} items[0].deliveryAddress.streetAddress | |
88 | 89 | |
89 | 90 | Відображення строки поставки закупівлі однопредметного тендера |
90 | 91 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення однопредметного тендера |
... | ... | @@ -97,7 +98,6 @@ ${provider} Andrew |
97 | 98 | Set Global Variable ${LAST_MODIFICATION_DATE} |
98 | 99 | отримати останні зміни в тендері |
99 | 100 | |
100 | - | |
101 | 101 | Відображення заголовоку анонімного питання без відповіді |
102 | 102 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення анонімного питання без відповідей |
103 | 103 | Дочекатись синхронізації з майданчиком ${viewer} |
... | ... | @@ -108,96 +108,27 @@ ${provider} Andrew |
108 | 108 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення анонімного питання без відповідей |
109 | 109 | Звірити поле тендера ${viewer} questions[0].description |
110 | 110 | |
111 | - | |
112 | -Відображення дата анонімного питання без відповіді | |
111 | +Відображення дати анонімного питання без відповіді | |
113 | 112 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення анонімного питання без відповідей |
114 | 113 | Звірити поле тендера ${viewer} questions[0].date |
115 | 114 | |
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 | -# | |
137 | - | |
138 | - | |
139 | -*** Keywords *** | |
140 | -TestCaseSetup | |
141 | - Завантажуємо дані про корисувачів і площадки | |
142 | - Підготовка початкових даних | |
143 | - | |
144 | - | |
145 | -Завантажуємо дані про корисувачів і площадки | |
146 | - # Init Brokers | |
147 | - ${file_path}= Get Variable Value ${BROKERS_FILE} brokers.yaml | |
148 | - ${BROKERS}= load_initial_data_from ${file_path} | |
149 | - Set Global Variable ${BROKERS} | |
150 | - ${brokers_list}= Get Dictionary Items ${BROKERS} | |
151 | - :FOR ${Broker_Name} ${Broker_Data} IN @{brokers_list} | |
152 | - \ Завантажуємо бібліотеку з реалізацією ${Broker_Data.keywords_file} площадки | |
153 | - # Init Users | |
154 | - ${file_path}= Get Variable Value ${USERS_FILE} users.yaml | |
155 | - ${USERS}= load_initial_data_from ${file_path} | |
156 | - Set Global Variable ${USERS} | |
157 | - ${users_list}= Get Dictionary Items ${USERS.users} | |
158 | - :FOR ${username} ${user_data} IN @{users_list} | |
159 | - \ Викликати для учасника ${username} Підготувати клієнт для користувача | |
160 | - | |
161 | -Підготовка початкових даних | |
162 | - @{QUESTIONS} = Create list | |
163 | - ${question}= test question data | |
164 | - Append to list ${QUESTIONS} ${question} | |
165 | - Set Global Variable ${QUESTIONS} | |
166 | - ${INITIAL_TENDER_DATA}= prepare_test_tender_data | |
167 | - Set Global Variable ${INITIAL_TENDER_DATA} | |
168 | - | |
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} | |
115 | +Відповісти на запитання | |
116 | + [Tags] ${USERS.users['${USERS.tender_owner}'].broker}: Можливість відповісти на запитання | |
117 | + Викликати для учасника ${USERS.tender_owner} Відповісти на питання ${TENDER_DATA.data.id} 0 ${ANSWERS[0]} | |
118 | + ${LAST_MODIFICATION_DATE}= Get Current Date | |
119 | + Set Global Variable ${LAST_MODIFICATION_DATE} | |
120 | + отримати останні зміни в тендері | |
121 | + | |
122 | +Відображення відповіді на запитання | |
123 | + [Tags] ${USERS.users['${viewer}'].broker}: Відображення відповіді на запитання | |
124 | + Дочекатись синхронізації з майданчиком ${viewer} | |
125 | + Викликати для учасника ${viewer} обновити сторінку з тендером ${TENDER_DATA.data.tenderID} ${TENDER_DATA.data.id} | |
126 | + Звірити поле тендера ${viewer} questions[0].answer | |
127 | + | |
128 | + | |
129 | +Подати цінову пропозицію | |
130 | + [Tags] ${USERS.users['${provider}'].broker}: Можливість подати цінову пропозицію | |
131 | + Дочекатись дати початоку прийому пропозицій | |
132 | + ${bid}= test bid data | |
133 | + Log object data ${bid} | |
134 | + Викликати для учасника ${provider} Подати цінову пропозицію ${TENDER_DATA.data.id} ${bid} | |
\ No newline at end of file | ... | ... |
... | ... | @@ -157,12 +157,16 @@ ${locator.enquiryPeriod.endDate} jquery=tender-procedure-info>div.row:contai |
157 | 157 | [return] ${return_value} |
158 | 158 | |
159 | 159 | отримати інформацію про questions[${question_id}].description |
160 | - відмітити на сторінці поле з тендера questions title jquery=tender-questions>div:eq(1)>div.row:contains("Питання:")>:eq(1)> | |
160 | + відмітити на сторінці поле з тендера questions description jquery=tender-questions>div:eq(1)>div.row:contains("Питання:")>:eq(1)> | |
161 | 161 | ${return_value}= Get Text jquery=tender-questions>div:eq(1)>div.row:contains("Питання:")>:eq(1)> |
162 | 162 | [return] ${return_value} |
163 | 163 | |
164 | 164 | отримати інформацію про questions[${question_id}].date |
165 | - відмітити на сторінці поле з тендера questions title jquery=tender-questions>div:eq(1)>div.row:contains("Дата:")>:eq(1)> | |
165 | + відмітити на сторінці поле з тендера question date jquery=tender-questions>div:eq(1)>div.row:contains("Дата:")>:eq(1)> | |
166 | 166 | ${return_value}= Get Text jquery=tender-questions>div:eq(1)>div.row:contains("Дата:")>:eq(1)> |
167 | 167 | [return] ${return_value} |
168 | 168 | |
169 | +отримати інформацію про questions[${question_id}].answer | |
170 | + відмітити на сторінці поле з тендера question answer jquery=tender-questions>div:eq(1)>div:last> | |
171 | + ${return_value}= Get Text jquery=tender-questions>div:eq(1)>div:last> | |
172 | + [return] ${return_value} | |
\ No newline at end of file | ... | ... |
... | ... | @@ -34,53 +34,23 @@ Library op_robot_tests.tests_files.brokers.openprocurement_client_helper |
34 | 34 | [return] ${tender_data} |
35 | 35 | |
36 | 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 для предмету закупівлі в однопредметному тендері | |
37 | +обновити сторінку з тендером | |
67 | 38 | [Arguments] @{ARGUMENTS} |
68 | 39 | [Documentation] |
69 | 40 | ... ${ARGUMENTS[0]} == username |
70 | - [return] ${USERS.users['${ARGUMENTS[0]}'].tender_data.data['items'][0].classification.description} | |
41 | + ... ${ARGUMENTS[1]} == tenderId | |
42 | + ... ${ARGUMENTS[2]} == id | |
43 | + openprocurement_client.Пошук тендера по ідентифікатору @{ARGUMENTS} | |
71 | 44 | |
72 | 45 | |
73 | -отримати інформацію про deliveryAddress для предмету закупівлі в однопредметному тендері | |
46 | +отримати інформацію із тендера | |
74 | 47 | [Arguments] @{ARGUMENTS} |
75 | 48 | [Documentation] |
76 | 49 | ... ${ARGUMENTS[0]} == username |
77 | - [return] ${USERS.users['${ARGUMENTS[0]}'].tender_data.data['items'][0].deliveryAddress} | |
50 | + ... ${ARGUMENTS[1]} == fieldname | |
51 | + ${field_value}= Get_From_Object ${USERS.users['${ARGUMENTS[0]}'].tender_data.data} ${ARGUMENTS[1]} | |
52 | + [return] ${field_value} | |
78 | 53 | |
79 | -отримати інформацію про deliveryDate для предмету закупівлі в однопредметному тендері | |
80 | - [Arguments] @{ARGUMENTS} | |
81 | - [Documentation] | |
82 | - ... ${ARGUMENTS[0]} == username | |
83 | - [return] ${USERS.users['${ARGUMENTS[0]}'].tender_data.data['items'][0].deliveryDate} | |
84 | 54 | |
85 | 55 | Внести зміни в тендер |
86 | 56 | [Arguments] @{ARGUMENTS} |
... | ... | @@ -91,7 +61,6 @@ Library op_robot_tests.tests_files.brokers.openprocurement_client_helper |
91 | 61 | ... ${ARGUMENTS[3]} == fieldvalue |
92 | 62 | отримати тендер ${ARGUMENTS[0]} ${ARGUMENTS[1]} |
93 | 63 | Set_To_Object ${TENDER_DATA.data} ${ARGUMENTS[2]} ${ARGUMENTS[3]} |
94 | - | |
95 | 64 | ${TENDER_DATA}= Call Method ${USERS.users['${ARGUMENTS[0]}'].client} patch_tender ${TENDER_DATA} |
96 | 65 | ${TENDER_DATA}= set_access_key ${TENDER_DATA} ${USERS.users['${ARGUMENTS[0]}'].access_token} |
97 | 66 | Set Global Variable ${TENDER_DATA} |
... | ... | @@ -107,13 +76,39 @@ Library op_robot_tests.tests_files.brokers.openprocurement_client_helper |
107 | 76 | Set Global Variable ${TENDER_DATA} |
108 | 77 | |
109 | 78 | |
110 | - | |
111 | 79 | Задати питання |
112 | 80 | [Documentation] |
113 | 81 | ... ${ARGUMENTS[0]} == username |
114 | 82 | ... ${ARGUMENTS[1]} == tender_uid |
115 | 83 | ... ${ARGUMENTS[2]} == question |
116 | 84 | [Arguments] @{ARGUMENTS} |
85 | + log many @{ARGUMENTS} | |
117 | 86 | ${tender}= Call Method ${USERS.users['${ARGUMENTS[0]}'].client} get_tender ${ARGUMENTS[1]} |
118 | 87 | ${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 | ||
88 | + Log object data ${question} question | |
89 | + | |
90 | +Відповісти на питання | |
91 | + [Documentation] | |
92 | + ... ${ARGUMENTS[0]} == username | |
93 | + ... ${ARGUMENTS[1]} == tender_uid | |
94 | + ... ${ARGUMENTS[2]} == question_id | |
95 | + ... ${ARGUMENTS[3]} == answer_data | |
96 | + [Arguments] @{ARGUMENTS} | |
97 | + log many @{ARGUMENTS} | |
98 | + ${tender}= Call Method ${USERS.users['${ARGUMENTS[0]}'].client} get_tender ${ARGUMENTS[1]} | |
99 | + ${tender}= set_access_key ${tender} ${USERS.users['${ARGUMENTS[0]}'].access_token} | |
100 | + ${ARGUMENTS[3].data.id}= Set Variable ${tender.data.questions[${ARGUMENTS[2]}].id} | |
101 | + ${quvestion_with_answer}= Call Method ${USERS.users['${ARGUMENTS[0]}'].client} patch_question ${tender} ${ARGUMENTS[3]} | |
102 | + Log object data ${quvestion_with_answer} quvestion_with_answer | |
103 | + | |
104 | + | |
105 | +Подати цінову пропозицію | |
106 | + [Documentation] | |
107 | + ... ${ARGUMENTS[0]} == username | |
108 | + ... ${ARGUMENTS[1]} == tender_uid | |
109 | + ... ${ARGUMENTS[2]} == bid | |
110 | + [Arguments] @{ARGUMENTS} | |
111 | + log many @{ARGUMENTS} | |
112 | + ${tender}= Call Method ${USERS.users['${ARGUMENTS[0]}'].client} get_tender ${ARGUMENTS[1]} | |
113 | + ${bid}= Call Method ${USERS.users['${ARGUMENTS[0]}'].client} create_bid ${tender} ${ARGUMENTS[2]} | |
114 | + Log object data ${question} bid | ... | ... |
... | ... | @@ -2,11 +2,11 @@ tender_owner: Tender Owner |
2 | 2 | users: |
3 | 3 | Tender Owner: |
4 | 4 | broker: Quinta |
5 | - E-tender User: | |
5 | + Tender Viewer: | |
6 | 6 | broker: E-tender |
7 | 7 | username: test |
8 | 8 | browser: chrome |
9 | 9 | position: [960, 0] |
10 | 10 | size: [960, 1000] |
11 | - Andrew: | |
11 | + Tender User: | |
12 | 12 | broker: Quinta |
\ No newline at end of file | ... | ... |
... | ... | @@ -80,16 +80,16 @@ test_tender_data = { |
80 | 80 | } |
81 | 81 | ], |
82 | 82 | "enquiryPeriod": { |
83 | - "endDate": (now + timedelta(days=1)).isoformat() | |
83 | + "endDate": (now + timedelta(minutes=2)).isoformat() | |
84 | 84 | }, |
85 | 85 | "tenderPeriod": { |
86 | - "endDate": (now + timedelta(days=2)).isoformat() | |
86 | + "endDate": (now + timedelta(minutes=5)).isoformat() | |
87 | 87 | } |
88 | 88 | } |
89 | 89 | |
90 | 90 | |
91 | 91 | def test_question_data(): |
92 | - return { | |
92 | + return munchify({ | |
93 | 93 | "data": { |
94 | 94 | "author": { |
95 | 95 | "address": { |
... | ... | @@ -113,15 +113,15 @@ def test_question_data(): |
113 | 113 | "description": fake.sentence(nb_words=10, variable_nb_words=True), |
114 | 114 | "title": fake.sentence(nb_words=6, variable_nb_words=True) |
115 | 115 | } |
116 | - } | |
116 | + }) | |
117 | 117 | |
118 | 118 | |
119 | 119 | def test_question_answer_data(): |
120 | - return { | |
120 | + return munchify({ | |
121 | 121 | "data": { |
122 | 122 | "answer": fake.sentence(nb_words=40, variable_nb_words=True) |
123 | 123 | } |
124 | - } | |
124 | + }) | |
125 | 125 | |
126 | 126 | |
127 | 127 | def test_bid_data(): | ... | ... |
... | ... | @@ -71,4 +71,14 @@ TestCaseSetup |
71 | 71 | [Arguments] ${username} ${command} @{arguments} |
72 | 72 | ${status} ${value}= run_keyword_and_ignore_keyword_definations ${BROKERS['${USERS.users['${username}'].broker}'].keywords_file}.${command} ${username} @{arguments} |
73 | 73 | Run keyword if '${status}' == 'FAIL' Log Учасник ${username} не зміг виконати "${command}" WARN |
74 | - [return] ${value} | |
\ No newline at end of file | ||
74 | + [return] ${value} | |
75 | + | |
76 | + | |
77 | +Дочекатись дати | |
78 | + [Arguments] ${date} | |
79 | + ${wait_timout}= wait_to_date ${date} | |
80 | + Run Keyword If ${wait_timout}>0 Sleep ${wait_timout} | |
81 | + | |
82 | + | |
83 | +Дочекатись дати початоку прийому пропозицій | |
84 | + Дочекатись дати ${TENDER_DATA.data.tenderPeriod.startDate} | |
\ No newline at end of file | ... | ... |
... | ... | @@ -7,8 +7,10 @@ from robot.output.loggerhelper import Message |
7 | 7 | from robot.libraries.BuiltIn import BuiltIn |
8 | 8 | from robot.errors import HandlerExecutionFailed |
9 | 9 | from datetime import datetime, timedelta |
10 | +from dateutil.parser import parse | |
11 | +from dateutil.tz import tzlocal | |
10 | 12 | from dpath.util import set as xpathset |
11 | -from jsonpath_rw import parse | |
13 | +from jsonpath_rw import parse as parse_path | |
12 | 14 | from .initial_data import ( |
13 | 15 | test_tender_data, test_question_data, test_question_answer_data, |
14 | 16 | test_bid_data |
... | ... | @@ -88,8 +90,20 @@ def set_to_object(obj, attribute, value): |
88 | 90 | |
89 | 91 | def get_from_object(obj, attribute): |
90 | 92 | """Gets data from a dictionary using a dotted accessor-string""" |
91 | - jsonpath_expr = parse(attribute) | |
93 | + jsonpath_expr = parse_path(attribute) | |
92 | 94 | return_list = [i.value for i in jsonpath_expr.find(obj)] |
93 | 95 | if return_list: |
94 | 96 | return return_list[0] |
95 | 97 | return None |
98 | + | |
99 | + | |
100 | +def wait_to_date(date_stamp): | |
101 | + date = parse(date_stamp) | |
102 | + LOGGER.log_message(Message("date: {}".format(date.isoformat()), "INFO")) | |
103 | + now = datetime.now(tzlocal()) | |
104 | + LOGGER.log_message(Message("now: {}".format(now.isoformat()), "INFO")) | |
105 | + wait_seconds = (date - now).total_seconds() | |
106 | + wait_seconds += 2 | |
107 | + if wait_seconds < 0: | |
108 | + return 0 | |
109 | + return wait_seconds | ... | ... |
Please
register
or
login
to post a comment