Commit f9a5a0a60fbf505e42c1aee45ff9dbdec7977f6b

Authored by selurvedu
2 parents 11009ec0 6e451572

Merge branch 'devel' into master

... ... @@ -14,6 +14,7 @@ recipe = zc.recipe.egg
14 14 eggs =
15 15 op_robot_tests
16 16 openprocurement_client
  17 + robotframework
17 18 robotframework-lint
18 19 robotframework-debuglibrary
19 20 robot_tests.broker.dzo
... ... @@ -70,8 +71,14 @@ robot_tests.broker.uub = git ${remotes:gh}openprocurement/robot_tests.b
70 71 robot_tests.broker.aps = git ${remotes:gh}openprocurement/robot_tests.broker.aps.git
71 72
72 73 [versions]
73   -fake-factory = 0.5.3
  74 +Faker = 0.7.7
  75 +mr.developer = 1.34
74 76 restkit = 4.2.2.op1
75 77 rfc6266 = 0.0.6.op1
76 78 robotframework = 3.0.0
77   -robotframework-selenium2library = 1.7.4
  79 +robotframework-debuglibrary = 0.8
  80 +robotframework-lint = 0.7
  81 +robotframework-selenium2library = 1.8.0
  82 +setuptools = 18.3.2
  83 +zc.buildout = 2.5.3
  84 +zc.recipe.egg = 2.0.3
... ...
... ... @@ -3,6 +3,8 @@
3 3 """
4 4 Setuptools bootstrapping installer.
5 5
  6 +Maintained at https://github.com/pypa/setuptools/tree/bootstrap.
  7 +
6 8 Run this script to install or upgrade setuptools.
7 9 """
8 10
... ... @@ -16,24 +18,30 @@ import subprocess
16 18 import platform
17 19 import textwrap
18 20 import contextlib
19   -import warnings
  21 +import json
  22 +import codecs
20 23
21 24 from distutils import log
22 25
23 26 try:
24 27 from urllib.request import urlopen
  28 + from urllib.parse import urljoin
25 29 except ImportError:
26 30 from urllib2 import urlopen
  31 + from urlparse import urljoin
27 32
28 33 try:
29 34 from site import USER_SITE
30 35 except ImportError:
31 36 USER_SITE = None
32 37
  38 +LATEST = object()
33 39 DEFAULT_VERSION = "18.3.2"
34   -DEFAULT_URL = "https://pypi.python.org/packages/source/s/setuptools/"
  40 +DEFAULT_URL = "https://pypi.io/packages/source/s/setuptools/"
35 41 DEFAULT_SAVE_DIR = os.curdir
36 42
  43 +MEANINGFUL_INVALID_ZIP_ERR_MSG = 'Maybe {0} is corrupted, delete it and try again.'
  44 +
37 45
38 46 def _python_cmd(*args):
39 47 """
... ... @@ -98,8 +106,16 @@ def archive_context(filename):
98 106 old_wd = os.getcwd()
99 107 try:
100 108 os.chdir(tmpdir)
101   - with ContextualZipFile(filename) as archive:
102   - archive.extractall()
  109 + try:
  110 + with ContextualZipFile(filename) as archive:
  111 + archive.extractall()
  112 + except zipfile.BadZipfile as err:
  113 + if not err.args:
  114 + err.args = ('', )
  115 + err.args = err.args + (
  116 + MEANINGFUL_INVALID_ZIP_ERR_MSG.format(filename),
  117 + )
  118 + raise
103 119
104 120 # going in the directory
105 121 subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0])
... ... @@ -114,18 +130,19 @@ def archive_context(filename):
114 130
115 131 def _do_download(version, download_base, to_dir, download_delay):
116 132 """Download Setuptools."""
117   - egg = os.path.join(to_dir, 'setuptools-%s-py%d.%d.egg'
118   - % (version, sys.version_info[0], sys.version_info[1]))
  133 + py_desig = 'py{sys.version_info[0]}.{sys.version_info[1]}'.format(sys=sys)
  134 + tp = 'setuptools-{version}-{py_desig}.egg'
  135 + egg = os.path.join(to_dir, tp.format(**locals()))
119 136 if not os.path.exists(egg):
120 137 archive = download_setuptools(version, download_base,
121   - to_dir, download_delay)
  138 + to_dir, download_delay)
122 139 _build_egg(egg, archive, to_dir)
123 140 sys.path.insert(0, egg)
124 141
125 142 # Remove previously-imported pkg_resources if present (see
126 143 # https://bitbucket.org/pypa/setuptools/pull-request/7/ for details).
127 144 if 'pkg_resources' in sys.modules:
128   - del sys.modules['pkg_resources']
  145 + _unload_pkg_resources()
129 146
130 147 import setuptools
131 148 setuptools.bootstrap_install_from = egg
... ... @@ -140,6 +157,7 @@ def use_setuptools(
140 157 Return None. Raise SystemExit if the requested version
141 158 or later cannot be installed.
142 159 """
  160 + version = _resolve_version(version)
143 161 to_dir = os.path.abspath(to_dir)
144 162
145 163 # prior to importing, capture the module state for
... ... @@ -189,6 +207,11 @@ def _conflict_bail(VC_err, version):
189 207
190 208
191 209 def _unload_pkg_resources():
  210 + sys.meta_path = [
  211 + importer
  212 + for importer in sys.meta_path
  213 + if importer.__class__.__module__ != 'pkg_resources.extern'
  214 + ]
192 215 del_modules = [
193 216 name for name in sys.modules
194 217 if name.startswith('pkg_resources')
... ... @@ -222,8 +245,8 @@ def download_file_powershell(url, target):
222 245 ps_cmd = (
223 246 "[System.Net.WebRequest]::DefaultWebProxy.Credentials = "
224 247 "[System.Net.CredentialCache]::DefaultCredentials; "
225   - "(new-object System.Net.WebClient).DownloadFile(%(url)r, %(target)r)"
226   - % vars()
  248 + '(new-object System.Net.WebClient).DownloadFile("%(url)s", "%(target)s")'
  249 + % locals()
227 250 )
228 251 cmd = [
229 252 'powershell',
... ... @@ -248,7 +271,7 @@ download_file_powershell.viable = has_powershell
248 271
249 272
250 273 def download_file_curl(url, target):
251   - cmd = ['curl', url, '--silent', '--output', target]
  274 + cmd = ['curl', url, '--location', '--silent', '--output', target]
252 275 _clean_check(cmd, target)
253 276
254 277
... ... @@ -321,6 +344,7 @@ def download_setuptools(
321 344 ``downloader_factory`` should be a function taking no arguments and
322 345 returning a function for downloading a URL to a target.
323 346 """
  347 + version = _resolve_version(version)
324 348 # making sure we use the absolute path
325 349 to_dir = os.path.abspath(to_dir)
326 350 zip_name = "setuptools-%s.zip" % version
... ... @@ -333,6 +357,27 @@ def download_setuptools(
333 357 return os.path.realpath(saveto)
334 358
335 359
  360 +def _resolve_version(version):
  361 + """
  362 + Resolve LATEST version
  363 + """
  364 + if version is not LATEST:
  365 + return version
  366 +
  367 + meta_url = urljoin(DEFAULT_URL, '/pypi/setuptools/json')
  368 + resp = urlopen(meta_url)
  369 + with contextlib.closing(resp):
  370 + try:
  371 + charset = resp.info().get_content_charset()
  372 + except Exception:
  373 + # Python 2 compat; assume UTF-8
  374 + charset = 'UTF-8'
  375 + reader = codecs.getreader(charset)
  376 + doc = json.load(reader(resp))
  377 +
  378 + return str(doc['info']['version'])
  379 +
  380 +
336 381 def _build_install_args(options):
337 382 """
338 383 Build the arguments to 'python setup.py install' on the setuptools package.
... ... @@ -347,7 +392,7 @@ def _parse_args():
347 392 parser = optparse.OptionParser()
348 393 parser.add_option(
349 394 '--user', dest='user_install', action='store_true', default=False,
350   - help='install in user site package (requires Python 2.6 or later)')
  395 + help='install in user site package')
351 396 parser.add_option(
352 397 '--download-base', dest='download_base', metavar="URL",
353 398 default=DEFAULT_URL,
... ... @@ -362,9 +407,9 @@ def _parse_args():
362 407 default=DEFAULT_VERSION,
363 408 )
364 409 parser.add_option(
365   - '--to-dir',
366   - help="Directory to save (and re-use) package",
367   - default=DEFAULT_SAVE_DIR,
  410 + '--to-dir',
  411 + help="Directory to save (and re-use) package",
  412 + default=DEFAULT_SAVE_DIR,
368 413 )
369 414 options, args = parser.parse_args()
370 415 # positional arguments are ignored
... ... @@ -372,13 +417,13 @@ def _parse_args():
372 417
373 418
374 419 def _download_args(options):
375   - """Return args for download_setuptools function from cmdline args."""
376   - return dict(
377   - version=options.version,
378   - download_base=options.download_base,
379   - downloader_factory=options.downloader_factory,
380   - to_dir=options.to_dir,
381   - )
  420 + """Return args for download_setuptools function from cmdline args."""
  421 + return dict(
  422 + version=options.version,
  423 + download_base=options.download_base,
  424 + downloader_factory=options.downloader_factory,
  425 + to_dir=options.to_dir,
  426 + )
382 427
383 428
384 429 def main():
... ...
1   -from robot.rebot import rebot_cli
2   -import sys
3   -
4   -def rebot():
5   - rebot_cli(sys.argv[1:])
\ No newline at end of file
... ... @@ -32,9 +32,7 @@ Resource base_keywords.robot
32 32 Можливість підтвердити цінову пропозицію учасником ${username}
33 33 ${status}= Run Keyword IF '${MODE}'=='openeu' Set Variable pending
34 34 ... ELSE IF '${MODE}'=='openua' Set Variable active
35   - ${activestatusresp}= Run As ${username} Змінити цінову пропозицію ${TENDER['TENDER_UAID']} status ${status}
36   - Set To Dictionary ${USERS.users['${username}'].bidresponses} activestatusresp=${activestatusresp}
37   - log ${activestatusresp}
  35 + Run As ${username} Змінити цінову пропозицію ${TENDER['TENDER_UAID']} status ${status}
38 36
39 37 ##############################################################################################
40 38 # OPENEU Bid documentation
... ... @@ -44,9 +42,7 @@ Resource base_keywords.robot
44 42 ${confidentialityRationale}= create_fake_sentence
45 43 ${privat_doc}= create_data_dict data.confidentialityRationale ${confidentialityRationale}
46 44 Set To Dictionary ${privat_doc.data} confidentiality=buyerOnly
47   - ${docid}= Get Variable Value ${USERS.users['${username}'].bidresponses['bid_doc_upload']['upload_response'].data.id}
48   - ${bid_doc_modified}= Run As ${username} Змінити документацію в ставці ${TENDER['TENDER_UAID']} ${privat_doc} ${docid}
49   - Set To Dictionary ${USERS.users['${username}'].bidresponses} bid_doc_modified=${bid_doc_modified}
  45 + Run As ${username} Змінити документацію в ставці ${TENDER['TENDER_UAID']} ${privat_doc} ${USERS.users['${username}']['bid_document']['doc_id']}
50 46
51 47
52 48 Можливість завантажити ${doc_type} документ до пропозиції учасником ${username}
... ... @@ -82,4 +78,8 @@ Resource base_keywords.robot
82 78
83 79
84 80 Можливість перевести тендер на статус очікування обробки мостом
85   - Run As ${tender_owner} Перевести тендер на статус очікування обробки мостом ${TENDER['TENDER_UAID']}
\ No newline at end of file
  81 + Run As ${tender_owner} Перевести тендер на статус очікування обробки мостом ${TENDER['TENDER_UAID']}
  82 +
  83 +
  84 +Активувати тендер другого етапу
  85 + Run As ${tender_owner} активувати другий етап ${TENDER['TENDER_UAID']}
... ...
... ... @@ -35,6 +35,11 @@ Resource resource.robot
35 35 Run as ${username} Пошук тендера по ідентифікатору ${TENDER['TENDER_UAID']}
36 36
37 37
  38 +Можливість знайти тендер по ідентифікатору ${tender_id} та зберегти його в ${save_location} для користувача ${username}
  39 + Дочекатись синхронізації з майданчиком ${username}
  40 + Run as ${username} Пошук тендера по ідентифікатору ${tender_id} ${save_location}
  41 +
  42 +
38 43 Можливість змінити поле ${field_name} тендера на ${field_value}
39 44 Run As ${tender_owner} Внести зміни в тендер ${TENDER['TENDER_UAID']} ${field_name} ${field_value}
40 45
... ... @@ -42,8 +47,11 @@ Resource resource.robot
42 47 Можливість додати документацію до тендера
43 48 ${file_path} ${file_name} ${file_content}= create_fake_doc
44 49 Run As ${tender_owner} Завантажити документ ${file_path} ${TENDER['TENDER_UAID']}
45   - ${doc_id}= get_id_from_doc_name ${file_name}
46   - ${tender_document}= Create Dictionary doc_name=${file_name} doc_id=${doc_id} doc_content=${file_content}
  50 + ${doc_id}= get_id_from_string ${file_name}
  51 + ${tender_document}= Create Dictionary
  52 + ... doc_name=${file_name}
  53 + ... doc_id=${doc_id}
  54 + ... doc_content=${file_content}
47 55 Set To Dictionary ${USERS.users['${tender_owner}']} tender_document=${tender_document}
48 56 Remove File ${file_path}
49 57
... ... @@ -52,7 +60,9 @@ Resource resource.robot
52 60 ${item}= Підготувати дані для створення предмету закупівлі ${USERS.users['${tender_owner}'].initial_data.data['items'][0]['classification']['id']}
53 61 Run As ${tender_owner} Додати предмет закупівлі ${TENDER['TENDER_UAID']} ${item}
54 62 ${item_id}= get_id_from_object ${item}
55   - ${item_data}= Create Dictionary item=${item} item_id=${item_id}
  63 + ${item_data}= Create Dictionary
  64 + ... item=${item}
  65 + ... item_id=${item_id}
56 66 ${item_data}= munch_dict arg=${item_data}
57 67 Set To Dictionary ${USERS.users['${tender_owner}']} item_data=${item_data}
58 68
... ... @@ -79,6 +89,14 @@ Resource resource.robot
79 89 Звірити поле тендера ${username} ${TENDER['TENDER_UAID']} ${USERS.users['${tender_owner}'].initial_data} ${field}
80 90
81 91
  92 +Отримати доступ до тендера другого етапу та зберегти його
  93 + Run as ${tender_owner} Отримати тендер другого етапу та зберегти його ${USERS.users['${tender_owner}'].tender_data.data.stage2TenderID}
  94 + ${TENDER_UAID_second_stage}= BuiltIn.Catenate SEPARATOR= ${TENDER['TENDER_UAID']} .2
  95 + Set to dictionary ${TENDER} TENDER_UAID=${TENDER_UAID_second_stage}
  96 + :FOR ${username} IN ${tender_owner} ${provider} ${provider1} ${viewer}
  97 + \ Можливість знайти тендер по ідентифікатору для користувача ${username}
  98 +
  99 +
82 100 Звірити відображення вмісту документа ${doc_id} із ${left} для користувача ${username}
83 101 ${file_name}= Run as ${username} Отримати документ ${TENDER['TENDER_UAID']} ${doc_id}
84 102 ${right}= Get File ${OUTPUT_DIR}${/}${file_name}
... ... @@ -157,8 +175,11 @@ Resource resource.robot
157 175 ${lot_id}= get_id_from_object ${USERS.users['${tender_owner}'].tender_data.data.lots[${lot_index}]}
158 176 ${file_path} ${file_name} ${file_content}= create_fake_doc
159 177 Run As ${tender_owner} Завантажити документ в лот ${file_path} ${TENDER['TENDER_UAID']} ${lot_id}
160   - ${doc_id}= get_id_from_doc_name ${file_name}
161   - ${data}= Create Dictionary doc_name=${file_name} doc_id=${doc_id} doc_content=${file_content}
  178 + ${doc_id}= get_id_from_string ${file_name}
  179 + ${data}= Create Dictionary
  180 + ... doc_name=${file_name}
  181 + ... doc_id=${doc_id}
  182 + ... doc_content=${file_content}
162 183 ${empty_list}= Create List
163 184 ${lots_documents}= Get variable value ${USERS.users['${tender_owner}'].lots_documents} ${empty_list}
164 185 Append to list ${lots_documents} ${data}
... ... @@ -177,7 +198,9 @@ Resource resource.robot
177 198 ${item}= Підготувати дані для створення предмету закупівлі ${USERS.users['${tender_owner}'].initial_data.data['items'][0]['classification']['id']}
178 199 Run As ${tender_owner} Додати предмет закупівлі в лот ${TENDER['TENDER_UAID']} ${lot_id} ${item}
179 200 ${item_id}= get_id_from_object ${item}
180   - ${item_data}= Create Dictionary item=${item} item_id=${item_id}
  201 + ${item_data}= Create Dictionary
  202 + ... item=${item}
  203 + ... item_id=${item_id}
181 204 ${item_data}= munch_dict arg=${item_data}
182 205 Set To Dictionary ${USERS.users['${tender_owner}']} item_data=${item_data}
183 206
... ... @@ -212,12 +235,16 @@ Resource resource.robot
212 235 Можливість створення лоту із прив’язаним предметом закупівлі
213 236 ${lot}= Підготувати дані для створення лоту ${USERS.users['${tender_owner}'].tender_data.data.value.amount}
214 237 ${item}= Підготувати дані для створення предмету закупівлі ${USERS.users['${tender_owner}'].initial_data.data['items'][0]['classification']['id']}
215   - ${lot_resp}= Run As ${tender_owner} Створити лот із предметом закупівлі ${TENDER['TENDER_UAID']} ${lot} ${item}
  238 + Run As ${tender_owner} Створити лот із предметом закупівлі ${TENDER['TENDER_UAID']} ${lot} ${item}
216 239 ${item_id}= get_id_from_object ${item}
217   - ${item_data}= Create Dictionary item=${item} item_id=${item_id}
  240 + ${item_data}= Create Dictionary
  241 + ... item=${item}
  242 + ... item_id=${item_id}
218 243 ${item_data}= munch_dict arg=${item_data}
219 244 ${lot_id}= get_id_from_object ${lot.data}
220   - ${lot_data}= Create Dictionary lot=${lot} lot_resp=${lot_resp} lot_id=${lot_id}
  245 + ${lot_data}= Create Dictionary
  246 + ... lot=${lot}
  247 + ... lot_id=${lot_id}
221 248 ${lot_data}= munch_dict arg=${lot_data}
222 249 Set To Dictionary ${USERS.users['${tender_owner}']} item_data=${item_data} lot_data=${lot_data}
223 250
... ... @@ -234,11 +261,21 @@ Resource resource.robot
234 261 \ Звірити відображення поля ${field} усіх лотів для користувача ${username}
235 262
236 263
  264 +Звірити відображення поля ${field} усіх лотів другого етапу для усіх користувачів
  265 + :FOR ${username} IN ${viewer} ${tender_owner} ${provider} ${provider1}
  266 + \ Звірити відображення поля ${field} усіх лотів другого етапу для користувача ${username}
  267 +
  268 +
237 269 Звірити відображення поля ${field} усіх лотів для користувача ${username}
238 270 :FOR ${lot_index} IN RANGE ${NUMBER_OF_LOTS}
239 271 \ Звірити відображення поля ${field} ${lot_index} лоту для користувача ${username}
240 272
241 273
  274 +Звірити відображення поля ${field} усіх лотів другого етапу для користувача ${username}
  275 + :FOR ${lot_index} IN RANGE ${NUMBER_OF_LOTS}
  276 + \ Звірити відображення поля ${field} ${lot_index} лоту другого етапу для користувача ${username}
  277 +
  278 +
242 279 Звірити відображення поля ${field} ${lot_index} лоту для користувача ${username}
243 280 Дочекатись синхронізації з майданчиком ${username}
244 281 ${lot_id}= get_id_from_object ${USERS.users['${tender_owner}'].initial_data.data.lots[${lot_index}]}
... ... @@ -246,6 +283,13 @@ Resource resource.robot
246 283 ... ${USERS.users['${tender_owner}'].initial_data.data.lots[${lot_index}].${field}} ${field}
247 284 ... object_id=${lot_id}
248 285
  286 +Звірити відображення поля ${field} ${lot_index} лоту другого етапу для користувача ${username}
  287 + Дочекатись синхронізації з майданчиком ${username}
  288 + ${lot_id}= get_id_from_object ${USERS.users['${tender_owner}'].initial_data.data.lots[${lot_index}]}
  289 + Звірити поле тендера із значенням ${username} ${TENDER['TENDER_UAID']}
  290 + ... ${USERS.users['${tender_owner}'].second_stage_data.data.lots[${lot_index}].${field}} ${field}
  291 + ... object_id=${lot_id}
  292 +
249 293
250 294 Звірити відображення поля ${field} ${lot_index} лоту з ${data} для користувача ${username}
251 295 ${lot_id}= get_id_from_object ${USERS.users['${tender_owner}'].initial_data.data.lots[${lot_index}]}
... ... @@ -286,7 +330,9 @@ Resource resource.robot
286 330 Set To Dictionary ${feature} featureOf=tenderer
287 331 Run As ${tender_owner} Додати неціновий показник на тендер ${TENDER['TENDER_UAID']} ${feature}
288 332 ${feature_id}= get_id_from_object ${feature}
289   - ${feature_data}= Create Dictionary feature=${feature} feature_id=${feature_id}
  333 + ${feature_data}= Create Dictionary
  334 + ... feature=${feature}
  335 + ... feature_id=${feature_id}
290 336 ${feature_data}= munch_dict arg=${feature_data}
291 337 Set To Dictionary ${USERS.users['${tender_owner}']} feature_data=${feature_data}
292 338
... ... @@ -297,7 +343,9 @@ Resource resource.robot
297 343 ${lot_id}= get_id_from_object ${USERS.users['${tender_owner}'].tender_data.data.lots[${lot_index}]}
298 344 Run As ${tender_owner} Додати неціновий показник на лот ${TENDER['TENDER_UAID']} ${feature} ${lot_id}
299 345 ${feature_id}= get_id_from_object ${feature}
300   - ${feature_data}= Create Dictionary feature=${feature} feature_id=${feature_id}
  346 + ${feature_data}= Create Dictionary
  347 + ... feature=${feature}
  348 + ... feature_id=${feature_id}
301 349 ${feature_data}= munch_dict arg=${feature_data}
302 350 Set To Dictionary ${USERS.users['${tender_owner}']} feature_data=${feature_data}
303 351
... ... @@ -308,7 +356,9 @@ Resource resource.robot
308 356 ${item_id}= get_id_from_object ${USERS.users['${tender_owner}'].tender_data.data['items'][${item_index}]}
309 357 Run As ${tender_owner} Додати неціновий показник на предмет ${TENDER['TENDER_UAID']} ${feature} ${item_id}
310 358 ${feature_id}= get_id_from_object ${feature}
311   - ${feature_data}= Create Dictionary feature=${feature} feature_id=${feature_id}
  359 + ${feature_data}= Create Dictionary
  360 + ... feature=${feature}
  361 + ... feature_id=${feature_id}
312 362 ${feature_data}= munch_dict arg=${feature_data}
313 363 Set To Dictionary ${USERS.users['${tender_owner}']} feature_data=${feature_data}
314 364
... ... @@ -357,11 +407,13 @@ Resource resource.robot
357 407
358 408 Можливість задати запитання на тендер користувачем ${username}
359 409 ${question}= Підготувати дані для запитання
360   - ${question_resp}= Run As ${username} Задати запитання на тендер ${TENDER['TENDER_UAID']} ${question}
  410 + Run As ${username} Задати запитання на тендер ${TENDER['TENDER_UAID']} ${question}
361 411 ${now}= Get Current TZdate
362 412 ${question.data.date}= Set variable ${now}
363 413 ${question_id}= get_id_from_object ${question.data}
364   - ${question_data}= Create Dictionary question=${question} question_resp=${question_resp} question_id=${question_id}
  414 + ${question_data}= Create Dictionary
  415 + ... question=${question}
  416 + ... question_id=${question_id}
365 417 ${question_data}= munch_dict arg=${question_data}
366 418 Set To Dictionary ${USERS.users['${username}']} tender_question_data=${question_data}
367 419
... ... @@ -369,11 +421,13 @@ Resource resource.robot
369 421 Можливість задати запитання на ${lot_index} лот користувачем ${username}
370 422 ${lot_id}= get_id_from_object ${USERS.users['${tender_owner}'].tender_data.data.lots[${lot_index}]}
371 423 ${question}= Підготувати дані для запитання
372   - ${question_resp}= Run As ${username} Задати запитання на лот ${TENDER['TENDER_UAID']} ${lot_id} ${question}
  424 + Run As ${username} Задати запитання на лот ${TENDER['TENDER_UAID']} ${lot_id} ${question}
373 425 ${now}= Get Current TZdate
374 426 ${question.data.date}= Set variable ${now}
375 427 ${question_id}= get_id_from_object ${question.data}
376   - ${question_data}= Create Dictionary question=${question} question_resp=${question_resp} question_id=${question_id}
  428 + ${question_data}= Create Dictionary
  429 + ... question=${question}
  430 + ... question_id=${question_id}
377 431 ${question_data}= munch_dict arg=${question_data}
378 432 Set To Dictionary ${USERS.users['${username}']} lots_${lot_index}_question_data=${question_data}
379 433
... ... @@ -381,11 +435,13 @@ Resource resource.robot
381 435 Можливість задати запитання на ${item_index} предмет користувачем ${username}
382 436 ${item_id}= get_id_from_object ${USERS.users['${tender_owner}'].tender_data.data['items'][${item_index}]}
383 437 ${question}= Підготувати дані для запитання
384   - ${question_resp}= Run As ${username} Задати запитання на предмет ${TENDER['TENDER_UAID']} ${item_id} ${question}
  438 + Run As ${username} Задати запитання на предмет ${TENDER['TENDER_UAID']} ${item_id} ${question}
385 439 ${now}= Get Current TZdate
386 440 ${question.data.date}= Set variable ${now}
387 441 ${question_id}= get_id_from_object ${question.data}
388   - ${question_data}= Create Dictionary question=${question} question_resp=${question_resp} question_id=${question_id}
  442 + ${question_data}= Create Dictionary
  443 + ... question=${question}
  444 + ... question_id=${question_id}
389 445 ${question_data}= munch_dict arg=${question_data}
390 446 Set To Dictionary ${USERS.users['${username}']} items_${item_index}_question_data=${question_data}
391 447
... ... @@ -454,7 +510,9 @@ Resource resource.robot
454 510 ... Створити чернетку вимоги про виправлення умов закупівлі
455 511 ... ${TENDER['TENDER_UAID']}
456 512 ... ${claim}
457   - ${claim_data}= Create Dictionary claim=${claim} complaintID=${complaintID}
  513 + ${claim_data}= Create Dictionary
  514 + ... claim=${claim}
  515 + ... complaintID=${complaintID}
458 516 ${claim_data}= munch_dict arg=${claim_data}
459 517 Set To Dictionary ${USERS.users['${provider}']} claim_data ${claim_data}
460 518
... ... @@ -467,7 +525,9 @@ Resource resource.robot
467 525 ... ${TENDER['TENDER_UAID']}
468 526 ... ${claim}
469 527 ... ${lot_id}
470   - ${claim_data}= Create Dictionary claim=${claim} complaintID=${complaintID}
  528 + ${claim_data}= Create Dictionary
  529 + ... claim=${claim}
  530 + ... complaintID=${complaintID}
471 531 ${claim_data}= munch_dict arg=${claim_data}
472 532 Set To Dictionary ${USERS.users['${provider}']} claim_data ${claim_data}
473 533
... ... @@ -479,7 +539,9 @@ Resource resource.robot
479 539 ... ${TENDER['TENDER_UAID']}
480 540 ... ${claim}
481 541 ... ${award_index}
482   - ${claim_data}= Create Dictionary claim=${claim} complaintID=${complaintID}
  542 + ${claim_data}= Create Dictionary
  543 + ... claim=${claim}
  544 + ... complaintID=${complaintID}
483 545 ${claim_data}= munch_dict arg=${claim_data}
484 546 Set To Dictionary ${USERS.users['${provider}']} claim_data ${claim_data}
485 547
... ... @@ -492,8 +554,13 @@ Resource resource.robot
492 554 ... ${TENDER['TENDER_UAID']}
493 555 ... ${claim}
494 556 ... ${file_path}
495   - ${doc_id}= get_id_from_doc_name ${file_name}
496   - ${claim_data}= Create Dictionary claim=${claim} complaintID=${complaintID} doc_name=${file_name} doc_id=${doc_id} doc_content=${file_content}
  557 + ${doc_id}= get_id_from_string ${file_name}
  558 + ${claim_data}= Create Dictionary
  559 + ... claim=${claim}
  560 + ... complaintID=${complaintID}
  561 + ... doc_name=${file_name}
  562 + ... doc_id=${doc_id}
  563 + ... doc_content=${file_content}
497 564 ${claim_data}= munch_dict arg=${claim_data}
498 565 Set To Dictionary ${USERS.users['${provider}']} claim_data ${claim_data}
499 566 Remove File ${file_path}
... ... @@ -509,8 +576,13 @@ Resource resource.robot
509 576 ... ${claim}
510 577 ... ${lot_id}
511 578 ... ${file_path}
512   - ${doc_id}= get_id_from_doc_name ${file_name}
513   - ${claim_data}= Create Dictionary claim=${claim} complaintID=${complaintID} doc_name=${file_name} doc_id=${doc_id} doc_content=${file_content}
  579 + ${doc_id}= get_id_from_string ${file_name}
  580 + ${claim_data}= Create Dictionary
  581 + ... claim=${claim}
  582 + ... complaintID=${complaintID}
  583 + ... doc_name=${file_name}
  584 + ... doc_id=${doc_id}
  585 + ... doc_content=${file_content}
514 586 ${claim_data}= munch_dict arg=${claim_data}
515 587 Set To Dictionary ${USERS.users['${provider}']} claim_data ${claim_data}
516 588 Remove File ${file_path}
... ... @@ -525,8 +597,13 @@ Resource resource.robot
525 597 ... ${claim}
526 598 ... ${award_index}
527 599 ... ${file_path}
528   - ${doc_id}= get_id_from_doc_name ${file_name}
529   - ${claim_data}= Create Dictionary claim=${claim} complaintID=${complaintID} doc_name=${file_name} doc_id=${doc_id} doc_content=${file_content}
  600 + ${doc_id}= get_id_from_string ${file_name}
  601 + ${claim_data}= Create Dictionary
  602 + ... claim=${claim}
  603 + ... complaintID=${complaintID}
  604 + ... doc_name=${file_name}
  605 + ... doc_id=${doc_id}
  606 + ... doc_content=${file_content}
530 607 ${claim_data}= munch_dict arg=${claim_data}
531 608 Set To Dictionary ${USERS.users['${provider}']} claim_data ${claim_data}
532 609 Remove File ${file_path}
... ... @@ -534,7 +611,9 @@ Resource resource.robot
534 611
535 612 Можливість скасувати вимогу про виправлення умов закупівлі
536 613 ${cancellation_reason}= create_fake_sentence
537   - ${data}= Create Dictionary status=cancelled cancellationReason=${cancellation_reason}
  614 + ${data}= Create Dictionary
  615 + ... status=cancelled
  616 + ... cancellationReason=${cancellation_reason}
538 617 ${cancellation_data}= Create Dictionary data=${data}
539 618 ${cancellation_data}= munch_dict arg=${cancellation_data}
540 619 Run As ${provider}
... ... @@ -555,7 +634,9 @@ Resource resource.robot
555 634
556 635 Можливість скасувати вимогу про виправлення умов лоту
557 636 ${cancellation_reason}= create_fake_sentence
558   - ${data}= Create Dictionary status=cancelled cancellationReason=${cancellation_reason}
  637 + ${data}= Create Dictionary
  638 + ... status=cancelled
  639 + ... cancellationReason=${cancellation_reason}
559 640 ${cancellation_data}= Create Dictionary data=${data}
560 641 ${cancellation_data}= munch_dict arg=${cancellation_data}
561 642 Run As ${provider}
... ... @@ -577,7 +658,9 @@ Resource resource.robot
577 658 Можливість скасувати вимогу про виправлення визначення ${award_index} переможця
578 659 ${cancellation_reason}= create_fake_sentence
579 660 ${status}= Set variable if 'open' in '${MODE}' stopping cancelled
580   - ${data}= Create Dictionary status=${status} cancellationReason=${cancellation_reason}
  661 + ${data}= Create Dictionary
  662 + ... status=${status}
  663 + ... cancellationReason=${cancellation_reason}
581 664 ${cancellation_data}= Create Dictionary data=${data}
582 665 ${cancellation_data}= munch_dict arg=${cancellation_data}
583 666 Run As ${provider}
... ... @@ -600,7 +683,9 @@ Resource resource.robot
600 683
601 684
602 685 Можливість перетворити вимогу про виправлення умов закупівлі в скаргу
603   - ${data}= Create Dictionary status=pending satisfied=${False}
  686 + ${data}= Create Dictionary
  687 + ... status=pending
  688 + ... satisfied=${False}
604 689 ${escalation_data}= Create Dictionary data=${data}
605 690 ${escalation_data}= munch_dict arg=${escalation_data}
606 691 Run As ${provider}
... ... @@ -620,7 +705,9 @@ Resource resource.robot
620 705
621 706
622 707 Можливість перетворити вимогу про виправлення умов лоту в скаргу
623   - ${data}= Create Dictionary status=pending satisfied=${False}
  708 + ${data}= Create Dictionary
  709 + ... status=pending
  710 + ... satisfied=${False}
624 711 ${escalation_data}= Create Dictionary data=${data}
625 712 ${escalation_data}= munch_dict arg=${escalation_data}
626 713 Run As ${provider}
... ... @@ -640,7 +727,9 @@ Resource resource.robot
640 727
641 728
642 729 Можливість перетворити вимогу про виправлення визначення ${award_index} переможця в скаргу
643   - ${data}= Create Dictionary status=pending satisfied=${False}
  730 + ${data}= Create Dictionary
  731 + ... status=pending
  732 + ... satisfied=${False}
644 733 ${escalation_data}= Create Dictionary data=${data}
645 734 ${escalation_data}= munch_dict arg=${escalation_data}
646 735 Run As ${provider}
... ... @@ -746,7 +835,9 @@ Resource resource.robot
746 835
747 836
748 837 Можливість підтвердити задоволення вимоги про виправлення умов закупівлі
749   - ${data}= Create Dictionary status=resolved satisfied=${True}
  838 + ${data}= Create Dictionary
  839 + ... status=resolved
  840 + ... satisfied=${True}
750 841 ${confirmation_data}= Create Dictionary data=${data}
751 842 ${confirmation_data}= munch_dict arg=${confirmation_data}
752 843 Run As ${provider}
... ... @@ -766,7 +857,9 @@ Resource resource.robot
766 857
767 858
768 859 Можливість підтвердити задоволення вимоги про виправлення умов лоту
769   - ${data}= Create Dictionary status=resolved satisfied=${True}
  860 + ${data}= Create Dictionary
  861 + ... status=resolved
  862 + ... satisfied=${True}
770 863 ${confirmation_data}= Create Dictionary data=${data}
771 864 ${confirmation_data}= munch_dict arg=${confirmation_data}
772 865 Run As ${provider}
... ... @@ -786,7 +879,9 @@ Resource resource.robot
786 879
787 880
788 881 Можливість підтвердити задоволення вимоги про виправлення визначення ${award_index} переможця
789   - ${data}= Create Dictionary status=resolved satisfied=${True}
  882 + ${data}= Create Dictionary
  883 + ... status=resolved
  884 + ... satisfied=${True}
790 885 ${confirmation_data}= Create Dictionary data=${data}
791 886 ${confirmation_data}= munch_dict arg=${confirmation_data}
792 887 Run As ${provider}
... ... @@ -822,7 +917,22 @@ Resource resource.robot
822 917 ##############################################################################################
823 918
824 919 Можливість подати цінову пропозицію користувачем ${username}
825   - ${bid}= Підготувати дані для подання пропозиції ${username}
  920 + ${bid}= Підготувати дані для подання пропозиції
  921 + ${bidresponses}= Create Dictionary bid=${bid}
  922 + Set To Dictionary ${USERS.users['${username}']} bidresponses=${bidresponses}
  923 + ${lots}= Get Variable Value ${USERS.users['${tender_owner}'].initial_data.data.lots} ${None}
  924 + ${lots_ids}= Run Keyword IF ${lots}
  925 + ... Отримати ідентифікатори об’єктів ${username} lots
  926 + ... ELSE Set Variable ${None}
  927 + ${features}= Get Variable Value ${USERS.users['${tender_owner}'].initial_data.data.features} ${None}
  928 + ${features_ids}= Run Keyword IF ${features}
  929 + ... Отримати ідентифікатори об’єктів ${username} features
  930 + ... ELSE Set Variable ${None}
  931 + Run As ${username} Подати цінову пропозицію ${TENDER['TENDER_UAID']} ${bid} ${lots_ids} ${features_ids}
  932 +
  933 +
  934 +Можливість подати цінову пропозицію на другий етап ${index} користувачем ${username}
  935 + ${bid}= Підготувати дані для подання пропозиції для другого етапу ${index}
826 936 ${bidresponses}= Create Dictionary bid=${bid}
827 937 Set To Dictionary ${USERS.users['${username}']} bidresponses=${bidresponses}
828 938 ${lots}= Get Variable Value ${USERS.users['${username}'].tender_data.data.lots} ${None}
... ... @@ -833,12 +943,10 @@ Resource resource.robot
833 943 ${features_ids}= Run Keyword IF ${features}
834 944 ... Отримати ідентифікатори об’єктів ${username} features
835 945 ... ELSE Set Variable ${None}
836   - ${resp}= Run As ${username} Подати цінову пропозицію ${TENDER['TENDER_UAID']} ${bid} ${lots_ids} ${features_ids}
837   - Set To Dictionary ${USERS.users['${username}'].bidresponses} resp=${resp}
838   -
  946 + Run As ${username} Подати цінову пропозицію ${TENDER['TENDER_UAID']} ${bid} ${lots_ids} ${features_ids}
839 947
840 948 Неможливість подати цінову пропозицію без прив’язки до лоту користувачем ${username}
841   - ${bid}= Підготувати дані для подання пропозиції ${username}
  949 + ${bid}= Підготувати дані для подання пропозиції
842 950 ${values}= Get Variable Value ${bid.data.lotValues[0]}
843 951 Remove From Dictionary ${bid.data} lotValues
844 952 Set_To_Object ${bid} data ${values}
... ... @@ -846,7 +954,7 @@ Resource resource.robot
846 954
847 955
848 956 Неможливість подати цінову пропозицію без нецінових показників користувачем ${username}
849   - ${bid}= Підготувати дані для подання пропозиції ${username}
  957 + ${bid}= Підготувати дані для подання пропозиції
850 958 Remove From Dictionary ${bid.data} parameters
851 959 Require Failure ${username} Подати цінову пропозицію ${TENDER['TENDER_UAID']} ${bid}
852 960
... ... @@ -862,16 +970,25 @@ Resource resource.robot
862 970
863 971 Можливість завантажити документ в пропозицію користувачем ${username}
864 972 ${file_path} ${file_name} ${file_content}= create_fake_doc
865   - ${bid_doc_upload}= Run As ${username} Завантажити документ в ставку ${file_path} ${TENDER['TENDER_UAID']}
866   - Set To Dictionary ${USERS.users['${username}'].bidresponses} bid_doc_upload=${bid_doc_upload}
  973 + ${doc_id}= get_id_from_string ${file_name}
  974 + ${bid_document_data}= Create Dictionary
  975 + ... doc_name=${file_name}
  976 + ... doc_content=${file_content}
  977 + ... doc_id=${doc_id}
  978 + Run As ${username} Завантажити документ в ставку ${file_path} ${TENDER['TENDER_UAID']}
  979 + Set To Dictionary ${USERS.users['${username}']} bid_document=${bid_document_data}
867 980 Remove File ${file_path}
868 981
869 982
870 983 Можливість змінити документацію цінової пропозиції користувачем ${username}
871 984 ${file_path} ${file_name} ${file_content}= create_fake_doc
872   - ${docid}= Get Variable Value ${USERS.users['${username}'].bidresponses['bid_doc_upload']['upload_response'].data.id}
873   - ${bid_doc_modified}= Run As ${username} Змінити документ в ставці ${TENDER['TENDER_UAID']} ${file_path} ${docid}
874   - Set To Dictionary ${USERS.users['${username}'].bidresponses} bid_doc_modified=${bid_doc_modified}
  985 + ${doc_id}= get_id_from_string ${file_name}
  986 + ${bid_document_modified_data}= Create Dictionary
  987 + ... doc_name=${file_name}
  988 + ... doc_content=${file_content}
  989 + ... doc_id=${doc_id}
  990 + Run As ${username} Змінити документ в ставці ${TENDER['TENDER_UAID']} ${file_path} ${USERS.users['${username}']['bid_document']['doc_id']}
  991 + Set To Dictionary ${USERS.users['${username}']} bid_document_modified=${bid_document_modified_data}
875 992 Remove File ${file_path}
876 993
877 994 ##############################################################################################
... ... @@ -885,15 +1002,16 @@ Resource resource.robot
885 1002 # Awarding
886 1003 ##############################################################################################
887 1004
888   -Можливість зареєструвати, додати документацію і підтвердити постачальника до закупівлі
889   - ${supplier_data}= Підготувати дані про постачальника ${tender_owner}
  1005 +Можливість зареєструвати, додати документацію і підтвердити першого постачальника до закупівлі
  1006 + ${lotIndex} = Set Variable If ${NUMBER_OF_LOTS} > 0 0 -1
  1007 + ${supplier_data}= Підготувати дані про постачальника ${tender_owner} ${lotIndex}
890 1008 ${file_path} ${file_name} ${file_content}= create_fake_doc
891 1009 Run as ${tender_owner}
892 1010 ... Створити постачальника, додати документацію і підтвердити його
893 1011 ... ${TENDER['TENDER_UAID']}
894 1012 ... ${supplier_data}
895 1013 ... ${file_path}
896   - ${doc_id}= get_id_from_doc_name ${file_name}
  1014 + ${doc_id}= get_id_from_string ${file_name}
897 1015 Set to dictionary ${USERS.users['${tender_owner}']} award_doc_name=${file_name} award_doc_id=${doc_id} award_doc_content=${file_content}
898 1016 Remove File ${file_path}
899 1017
... ... @@ -903,4 +1021,4 @@ Resource resource.robot
903 1021 ... Підтвердити підписання контракту
904 1022 ... ${TENDER['TENDER_UAID']}
905 1023 ... ${0}
906   - Run Keyword And Ignore Error Remove From Dictionary ${USERS.users['${viewer}'].tender_data.contracts[0]} status
  1024 + Run Keyword And Ignore Error Remove From Dictionary ${USERS.users['${viewer}'].tender_data.data.contracts[0]} status
... ...
... ... @@ -19,9 +19,9 @@ Library openprocurement_client_helper.py
19 19 Підготувати клієнт для користувача
20 20 [Arguments] ${username}
21 21 [Documentation] Відкрити браузер, створити об’єкт api wrapper, тощо
22   - Log ${api_host_url}
23   - Log ${api_version}
24   - ${api_wrapper}= prepare_api_wrapper ${USERS.users['${username}'].api_key} ${api_host_url} ${api_version}
  22 + Log ${API_HOST_URL}
  23 + Log ${API_VERSION}
  24 + ${api_wrapper}= prepare_api_wrapper ${USERS.users['${username}'].api_key} ${API_HOST_URL} ${API_VERSION}
25 25 Set To Dictionary ${USERS.users['${username}']} client=${api_wrapper}
26 26 Set To Dictionary ${USERS.users['${username}']} access_token=${EMPTY}
27 27 ${id_map}= Create Dictionary
... ... @@ -38,6 +38,7 @@ Library openprocurement_client_helper.py
38 38 ${tender}= set_access_key ${tender} ${USERS.users['${username}'].access_token}
39 39 ${reply}= Call Method ${USERS.users['${username}'].client} upload_document ${filepath} ${tender}
40 40 Log object data ${reply} reply
  41 + #return here is needed to have uploaded doc data in `Завантажити документ в лот` keyword
41 42 [return] ${reply}
42 43
43 44
... ... @@ -77,8 +78,15 @@ Library openprocurement_client_helper.py
77 78 Створити тендер
78 79 [Arguments] ${username} ${tender_data}
79 80 ${tender}= Call Method ${USERS.users['${username}'].client} create_tender ${tender_data}
80   - Log object data ${tender} created_tender
  81 + Log ${tender}
81 82 ${access_token}= Get Variable Value ${tender.access.token}
  83 + ${status}= Set Variable If 'open' in '${MODE}' active.tendering ${EMPTY}
  84 + ${status}= Set Variable If 'below' in '${MODE}' active.enquiries ${status}
  85 + ${status}= Set Variable If '${status}'=='${EMPTY}' active ${status}
  86 + Set To Dictionary ${tender['data']} status=${status}
  87 + ${tender}= Call Method ${USERS.users['${username}'].client} patch_tender ${tender}
  88 + Log ${tender}
  89 + Log ${\n}${API_HOST_URL}/api/${API_VERSION}/tenders/${tender.data.id}${\n} WARN
82 90 Set To Dictionary ${USERS.users['${username}']} access_token=${access_token}
83 91 Set To Dictionary ${USERS.users['${username}']} tender_data=${tender}
84 92 Log ${USERS.users['${username}'].tender_data}
... ... @@ -86,16 +94,25 @@ Library openprocurement_client_helper.py
86 94
87 95
88 96 Пошук тендера по ідентифікатору
89   - [Arguments] ${username} ${tender_uaid}
  97 + [Arguments] ${username} ${tender_uaid} ${save_key}=tender_data
90 98 ${internalid}= openprocurement_client.Отримати internal id по UAid ${username} ${tender_uaid}
91 99 ${tender}= Call Method ${USERS.users['${username}'].client} get_tender ${internalid}
92 100 ${tender}= set_access_key ${tender} ${USERS.users['${username}'].access_token}
93   - Set To Dictionary ${USERS.users['${username}']} tender_data=${tender}
  101 + Set To Dictionary ${USERS.users['${username}']} ${save_key}=${tender}
94 102 ${tender}= munch_dict arg=${tender}
95 103 Log ${tender}
96 104 [return] ${tender}
97 105
98 106
  107 +Отримати тендер другого етапу та зберегти його
  108 + [Arguments] ${username} ${tender_id}
  109 + ${response}= Call Method ${USERS.users['${username}'].client} patch_credentials ${tender_id} ${USERS.users['${username}'].access_token}
  110 + ${tender}= set_access_key ${response} ${response.access.token}
  111 + Set To Dictionary ${USERS.users['${username}']} access_token=${response.access.token}
  112 + Set To Dictionary ${USERS.users['${username}']} tender_data=${response}
  113 + Log ${tender.data.tenderID}
  114 +
  115 +
99 116 Оновити сторінку з тендером
100 117 [Arguments] ${username} ${tender_uaid}
101 118 openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
... ... @@ -159,6 +176,7 @@ Library openprocurement_client_helper.py
159 176 [Arguments] ${username} ${tender_uaid} ${lot}
160 177 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
161 178 ${reply}= Call Method ${USERS.users['${username}'].client} create_lot ${tender} ${lot}
  179 + #return here is needed to have created lot id in `Створити лот з предметом закупівлі` keyword
162 180 [return] ${reply}
163 181
164 182
... ... @@ -167,7 +185,6 @@ Library openprocurement_client_helper.py
167 185 ${reply}= openprocurement_client.Створити лот ${username} ${tender_uaid} ${lot}
168 186 ${lot_id}= get_id_from_object ${lot.data}
169 187 openprocurement_client.Додати предмет закупівлі в лот ${username} ${tender_uaid} ${lot_id} ${item}
170   - [return] ${reply}
171 188
172 189
173 190 Отримати інформацію із лоту
... ... @@ -183,7 +200,6 @@ Library openprocurement_client_helper.py
183 200 ${lot}= Create Dictionary data=${tender.data.lots[${lot_index}]}
184 201 Set_To_Object ${lot.data} ${fieldname} ${fieldvalue}
185 202 ${reply}= Call Method ${USERS.users['${username}'].client} patch_lot ${tender} ${lot}
186   - [return] ${reply}
187 203
188 204
189 205 Додати предмет закупівлі в лот
... ... @@ -204,7 +220,6 @@ Library openprocurement_client_helper.py
204 220 ${doc}= openprocurement_client.Завантажити документ ${username} ${filepath} ${tender_uaid}
205 221 ${lot_doc}= test_lot_document_data ${doc} ${lot_id}
206 222 ${reply}= Call Method ${USERS.users['${username}'].client} patch_document ${tender} ${lot_doc}
207   - [return] ${reply}
208 223
209 224
210 225 Видалити лот
... ... @@ -217,14 +232,16 @@ Library openprocurement_client_helper.py
217 232 \ Run Keyword If '${item.relatedLot}'=='${lot.data.id}'
218 233 \ ... openprocurement_client.Видалити предмет закупівлі ${username} ${tender_uaid} ${item_id}
219 234 ${reply}= Call Method ${USERS.users['${username}'].client} delete_lot ${tender} ${lot}
220   - [return] ${reply}
221 235
222 236
223 237 Скасувати лот
224 238 [Arguments] ${username} ${tender_uaid} ${lot_id} ${cancellation_reason} ${document} ${new_description}
225 239 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
226 240 ${lot_id}= Get Variable Value ${tender.data.lots[${lot_index}].id}
227   - ${data}= Create dictionary reason=${cancellation_reason} cancellationOf=lot relatedLot=${lot_id}
  241 + ${data}= Create dictionary
  242 + ... reason=${cancellation_reason}
  243 + ... cancellationOf=lot
  244 + ... relatedLot=${lot_id}
228 245 ${cancellation_data}= Create dictionary data=${data}
229 246 ${cancellation_data}= munch_dict arg=${cancellation_data}
230 247 ${cancel_reply}= Call Method ${USERS.users['${username}'].client} create_cancellation ${tender} ${cancellation_data}
... ... @@ -302,7 +319,6 @@ Library openprocurement_client_helper.py
302 319 ${item_id}= Get Variable Value ${tender.data['items'][${item_index}].id}
303 320 ${question}= test_related_question ${question} item ${item_id}
304 321 ${reply}= Call Method ${USERS.users['${username}'].client} create_question ${tender} ${question}
305   - [return] ${reply}
306 322
307 323
308 324 Задати запитання на лот
... ... @@ -312,14 +328,12 @@ Library openprocurement_client_helper.py
312 328 ${lot_id}= Get Variable Value ${tender.data.lots[${lot_index}].id}
313 329 ${question}= test_related_question ${question} lot ${lot_id}
314 330 ${reply}= Call Method ${USERS.users['${username}'].client} create_question ${tender} ${question}
315   - [return] ${reply}
316 331
317 332
318 333 Задати запитання на тендер
319 334 [Arguments] ${username} ${tender_uaid} ${question}
320 335 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
321 336 ${reply}= Call Method ${USERS.users['${username}'].client} create_question ${tender} ${question}
322   - [return] ${reply}
323 337
324 338
325 339 Отримати інформацію із запитання
... ... @@ -334,7 +348,6 @@ Library openprocurement_client_helper.py
334 348 ${tender}= set_access_key ${tender} ${USERS.users['${username}'].access_token}
335 349 ${answer_data.data.id}= openprocurement_client.Отримати інформацію із запитання ${username} ${tender_uaid} ${question_id} id
336 350 ${reply}= Call Method ${USERS.users['${username}'].client} patch_question ${tender} ${answer_data}
337   - [return] ${reply}
338 351
339 352 ##############################################################################
340 353 # Claims
... ... @@ -698,10 +711,13 @@ Library openprocurement_client_helper.py
698 711 \ ${code}= Get Variable Value ${tender.data.features[${feature_index}].code}
699 712 \ Set To Dictionary ${bid.data.parameters[${index}]} code=${code}
700 713 ${reply}= Call Method ${USERS.users['${username}'].client} create_bid ${tender} ${bid}
  714 + Log ${reply}
  715 + ${status}= Set Variable If '${MODE}'=='openeu' pending active
  716 + Set To Dictionary ${reply['data']} status=${status}
  717 + ${reply_active}= Call Method ${USERS.users['${username}'].client} patch_bid ${tender} ${reply}
701 718 Set To Dictionary ${USERS.users['${username}']} access_token=${reply['access']['token']}
702 719 Set To Dictionary ${USERS.users['${username}'].bidresponses['bid'].data} id=${reply['data']['id']}
703   - Log ${reply}
704   - [return] ${reply}
  720 + Log ${reply_active}
705 721
706 722
707 723 Змінити цінову пропозицію
... ... @@ -709,57 +725,62 @@ Library openprocurement_client_helper.py
709 725 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
710 726 ${bid}= openprocurement_client.Отримати пропозицію ${username} ${tender_uaid}
711 727 Set_To_Object ${bid.data} ${fieldname} ${fieldvalue}
712   - ${tender}= set_access_key ${tender} ${USERS.users['${username}'].bidresponses['resp'].access.token}
  728 + ${tender}= set_access_key ${tender} ${USERS.users['${username}']['access_token']}
713 729 ${reply}= Call Method ${USERS.users['${username}'].client} patch_bid ${tender} ${bid}
714 730 Log ${reply}
715   - [return] ${reply}
716 731
717 732
718 733 Скасувати цінову пропозицію
719 734 [Arguments] ${username} ${tender_uaid}
720 735 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
721 736 ${bid_id}= openprocurement_client.Отримати інформацію із пропозиції ${username} ${tender_uaid} id
722   - ${reply}= Call Method ${USERS.users['${username}'].client} delete_bid ${tender} ${bid_id} ${USERS.users['${username}'].bidresponses['resp'].access.token}
  737 + ${reply}= Call Method ${USERS.users['${username}'].client} delete_bid ${tender} ${bid_id} ${USERS.users['${username}']['access_token']}
723 738 Log ${reply}
724   - [return] ${reply}
725 739
726 740
727 741 Завантажити документ в ставку
728 742 [Arguments] ${username} ${path} ${tender_uaid} ${doc_type}=documents
729   - ${bid_id}= Get Variable Value ${USERS.users['${username}'].bidresponses['resp'].data.id}
  743 + ${bid_id}= Get Variable Value ${USERS.users['${username}'].bidresponses['bid'].data.id}
730 744 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
731   - ${tender}= set_access_key ${tender} ${USERS.users['${username}'].bidresponses['resp'].access.token}
  745 + ${tender}= set_access_key ${tender} ${USERS.users['${username}']['access_token']}
732 746 ${response}= Call Method ${USERS.users['${username}'].client} upload_bid_document ${path} ${tender} ${bid_id} ${doc_type}
733   - ${uploaded_file} = Create Dictionary filepath=${path} upload_response=${response}
  747 + ${uploaded_file} = Create Dictionary
  748 + ... filepath=${path}
  749 + ... upload_response=${response}
734 750 Log object data ${uploaded_file}
735 751 [return] ${uploaded_file}
736 752
737 753
738 754 Змінити документ в ставці
739   - [Arguments] ${username} ${tender_uaid} ${path} ${docid}
740   - ${bid_id}= Get Variable Value ${USERS.users['${username}'].bidresponses['resp'].data.id}
  755 + [Arguments] ${username} ${tender_uaid} ${path} ${doc_id}
  756 + ${bid_id}= Get Variable Value ${USERS.users['${username}'].bidresponses['bid'].data.id}
741 757 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
742   - ${tender}= set_access_key ${tender} ${USERS.users['${username}'].bidresponses['resp'].access.token}
743   - ${response}= Call Method ${USERS.users['${username}'].client} update_bid_document ${path} ${tender} ${bid_id} ${docid}
744   - ${uploaded_file} = Create Dictionary filepath=${path} upload_response=${response}
  758 + ${tender}= set_access_key ${tender} ${USERS.users['${username}']['access_token']}
  759 + ${bid}= openprocurement_client.Отримати пропозицію ${username} ${tender_uaid}
  760 + ${bid_doc}= get_document_by_id ${bid.data} ${doc_id}
  761 + ${response}= Call Method ${USERS.users['${username}'].client} update_bid_document ${path} ${tender} ${bid_id} ${bid_doc['id']}
  762 + ${uploaded_file} = Create Dictionary
  763 + ... filepath=${path}
  764 + ... upload_response=${response}
745 765 Log object data ${uploaded_file}
746 766 [return] ${uploaded_file}
747 767
748 768
749 769 Змінити документацію в ставці
750   - [Arguments] ${username} ${tender_uaid} ${doc_data} ${docid}
751   - ${bid_id}= Get Variable Value ${USERS.users['${username}'].bidresponses['resp'].data.id}
  770 + [Arguments] ${username} ${tender_uaid} ${doc_data} ${doc_id}
  771 + ${bid_id}= Get Variable Value ${USERS.users['${username}'].bidresponses['bid'].data.id}
752 772 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
753   - ${tender}= set_access_key ${tender} ${USERS.users['${username}'].bidresponses['resp'].access.token}
754   - ${reply}= Call Method ${USERS.users['${username}'].client} patch_bid_document ${tender} ${doc_data} ${bid_id} ${docid}
755   - [return] ${reply}
  773 + ${tender}= set_access_key ${tender} ${USERS.users['${username}']['access_token']}
  774 + ${bid}= openprocurement_client.Отримати пропозицію ${username} ${tender_uaid}
  775 + ${bid_doc}= get_document_by_id ${bid.data} ${doc_id}
  776 + ${reply}= Call Method ${USERS.users['${username}'].client} patch_bid_document ${tender} ${doc_data} ${bid_id} ${bid_doc['id']}
756 777
757 778
758 779 Отримати пропозицію
759 780 [Arguments] ${username} ${tender_uaid}
760 781 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
761   - ${bid_id}= Get Variable Value ${USERS.users['${username}'].bidresponses['resp'].data.id}
762   - ${token}= Get Variable Value ${USERS.users['${username}'].bidresponses['resp'].access.token}
  782 + ${bid_id}= Get Variable Value ${USERS.users['${username}'].bidresponses['bid'].data.id}
  783 + ${token}= Get Variable Value ${USERS.users['${username}']['access_token']}
763 784 ${reply}= Call Method ${USERS.users['${username}'].client} get_bid ${tender} ${bid_id} ${token}
764 785 ${reply}= munch_dict arg=${reply}
765 786 [return] ${reply}
... ... @@ -791,7 +812,6 @@ Library openprocurement_client_helper.py
791 812 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
792 813 ${doc}= Call Method ${USERS.users['${username}'].client} upload_award_document ${document} ${tender} ${tender.data.awards[${award_num}].id}
793 814 Log ${doc}
794   - [Return] ${doc}
795 815
796 816
797 817 Підтвердити постачальника
... ... @@ -836,7 +856,6 @@ Library openprocurement_client_helper.py
836 856 Set To Dictionary ${award.data} id=${tender.data.awards[${award_num}].id}
837 857 ${reply}= Call Method ${USERS.users['${username}'].client} patch_award ${tender} ${award}
838 858 Log ${reply}
839   - [Return] ${reply}
840 859
841 860 ##############################################################################
842 861 # Limited procurement
... ... @@ -920,7 +939,7 @@ Library openprocurement_client_helper.py
920 939
921 940
922 941 Отримати інформацію із документа до скасування
923   - [Arguments] ${username} ${tender_uaid} ${doc_id} ${field_name}
  942 + [Arguments] ${username} ${tender_uaid} ${cancel_id} ${doc_id} ${field_name}
924 943 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
925 944 ${document}= get_document_by_id ${tender.data} ${doc_id}
926 945 Log ${document}
... ... @@ -928,7 +947,7 @@ Library openprocurement_client_helper.py
928 947
929 948
930 949 Отримати документ до скасування
931   - [Arguments] ${username} ${tender_uaid} ${doc_id}
  950 + [Arguments] ${username} ${tender_uaid} ${cancel_id} ${doc_id}
932 951 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
933 952 ${document}= get_document_by_id ${tender.data} ${doc_id}
934 953 ${filename}= download_file_from_url ${document.url} ${OUTPUT_DIR}${/}${document.title}
... ... @@ -962,7 +981,6 @@ Library openprocurement_client_helper.py
962 981 Set To Dictionary ${qualification.data} id=${tender.data.qualifications[${qualification_num}].id} eligible=${True} qualified=${True}
963 982 ${reply}= Call Method ${USERS.users['${username}'].client} patch_qualification ${tender} ${qualification}
964 983 Log ${reply}
965   - [Return] ${reply}
966 984
967 985
968 986 Відхилити кваліфікацію
... ... @@ -976,7 +994,6 @@ Library openprocurement_client_helper.py
976 994 Set To Dictionary ${qualification.data} id=${tender.data.qualifications[${qualification_num}].id}
977 995 ${reply}= Call Method ${USERS.users['${username}'].client} patch_qualification ${tender} ${qualification}
978 996 Log ${reply}
979   - [Return] ${reply}
980 997
981 998
982 999 Завантажити документ у кваліфікацію
... ... @@ -988,7 +1005,6 @@ Library openprocurement_client_helper.py
988 1005 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
989 1006 ${doc_reply}= Call Method ${USERS.users['${username}'].client} upload_qualification_document ${document} ${tender} ${tender.data.qualifications[${qualification_num}].id}
990 1007 Log ${doc_reply}
991   - [Return] ${doc_reply}
992 1008
993 1009
994 1010 Скасувати кваліфікацію
... ... @@ -1002,7 +1018,6 @@ Library openprocurement_client_helper.py
1002 1018 Set To Dictionary ${qualification.data} id=${tender.data.qualifications[${qualification_num}].id}
1003 1019 ${reply}= Call Method ${USERS.users['${username}'].client} patch_qualification ${tender} ${qualification}
1004 1020 Log ${reply}
1005   - [Return] ${reply}
1006 1021
1007 1022
1008 1023 Затвердити остаточне рішення кваліфікації
... ... @@ -1019,7 +1034,6 @@ Library openprocurement_client_helper.py
1019 1034 set_to_object ${tender} data.status active.pre-qualification.stand-still
1020 1035 ${reply}= Call Method ${USERS.users['${username}'].client} patch_tender ${tender}
1021 1036 Log ${reply}
1022   - [Return] ${reply}
1023 1037
1024 1038
1025 1039 Перевести тендер на статус очікування обробки мостом
... ... @@ -1036,4 +1050,19 @@ Library openprocurement_client_helper.py
1036 1050 set_to_object ${tender} data.status active.stage2.waiting
1037 1051 ${reply}= Call Method ${USERS.users['${username}'].client} patch_tender ${tender}
1038 1052 Log ${reply}
1039   - [Return] ${reply}
  1053 +
  1054 +
  1055 +Активувати другий етап
  1056 + [Documentation]
  1057 + ... [Arguments] Username and tender uaid
  1058 + ...
  1059 + ... [Description] Find tender using uaid and call patch_tender
  1060 + ...
  1061 + ... [Return] Reply of API
  1062 + [Arguments] ${username} ${tender_uaid}
  1063 + ${internal_id}= openprocurement_client.Отримати internal id по UAid ${username} ${tender_uaid}
  1064 + ${tender}= create_data_dict data.id ${internal_id}
  1065 + ${tender}= set_access_key ${tender} ${USERS.users['${username}'].access_token}
  1066 + set_to_object ${tender} data.status active.tendering
  1067 + ${reply}= Call Method ${USERS.users['${username}'].client} patch_tender ${tender}
  1068 + Log ${reply}
... ...
... ... @@ -10,7 +10,7 @@ import urllib
10 10 def retry_if_request_failed(exception):
11 11 if isinstance(exception, RequestFailed):
12 12 status_code = getattr(exception, 'status_int', None)
13   - if 500 <= status_code < 600 or status_code == 429:
  13 + if 500 <= status_code < 600 or status_code in (409, 429):
14 14 return True
15 15 else:
16 16 return False
... ... @@ -65,6 +65,10 @@ def get_document_by_id(data, doc_id):
65 65 for document in cancellation.get('documents', []):
66 66 if doc_id in document.get('title', ''):
67 67 return document
  68 + for bid in data.get('bids', []):
  69 + for document in bid.get('documents', []):
  70 + if doc_id in document.get('title', ''):
  71 + return document
68 72 raise Exception('Document with id {} not found'.format(doc_id))
69 73
70 74
... ...
... ... @@ -20,6 +20,7 @@ Suite Teardown Test Suite Teardown
20 20 ##############################################################################################
21 21 # TENDER CANCELLATION
22 22 ##############################################################################################
  23 +
23 24 Можливість скасувати тендер
24 25 [Tags] ${USERS.users['${tender_owner}'].broker}: Скасування тендера
25 26 ... tender_owner
... ... @@ -46,7 +47,7 @@ Suite Teardown Test Suite Teardown
46 47 ... ${USERS.users['${viewer}'].broker}
47 48 ... tender_cancelation
48 49 Звірити поле тендера із значенням ${viewer} ${TENDER['TENDER_UAID']}
49   - ... ${USERS.users['${tender_owner}']['cancellation_data']['cancellation_reason']}
  50 + ... ${USERS.users['${tender_owner}']['tender_cancellation_data']['cancellation_reason']}
50 51 ... cancellations[0].reason
51 52
52 53
... ... @@ -55,7 +56,7 @@ Suite Teardown Test Suite Teardown
55 56 ... viewer
56 57 ... ${USERS.users['${viewer}'].broker}
57 58 ... tender_cancelation
58   - Звірити відображення поля description документа до скасування ${USERS.users['${tender_owner}']['cancellation_data']['document']['doc_id']} із ${USERS.users['${tender_owner}']['cancellation_data']['description']} для користувача ${viewer}
  59 + Звірити відображення поля description документа ${USERS.users['${tender_owner}']['tender_cancellation_data']['document']['doc_id']} до скасування ${USERS.users['${tender_owner}']['tender_cancellation_data']['cancellation_id']} із ${USERS.users['${tender_owner}']['tender_cancellation_data']['description']} для користувача ${viewer}
59 60
60 61
61 62 Відображення заголовку документа до скасування тендера
... ... @@ -63,7 +64,7 @@ Suite Teardown Test Suite Teardown
63 64 ... viewer
64 65 ... ${USERS.users['${viewer}'].broker}
65 66 ... tender_cancelation
66   - Звірити відображення поля title документа до скасування ${USERS.users['${tender_owner}']['cancellation_data']['document']['doc_id']} із ${USERS.users['${tender_owner}']['cancellation_data']['document']['doc_name']} для користувача ${viewer}
  67 + Звірити відображення поля title документа ${USERS.users['${tender_owner}']['tender_cancellation_data']['document']['doc_id']} до скасування ${USERS.users['${tender_owner}']['tender_cancellation_data']['cancellation_id']} із ${USERS.users['${tender_owner}']['tender_cancellation_data']['document']['doc_name']} для користувача ${viewer}
67 68
68 69
69 70 Відображення вмісту документа до скасування тендера
... ... @@ -71,7 +72,7 @@ Suite Teardown Test Suite Teardown
71 72 ... viewer
72 73 ... ${USERS.users['${viewer}'].broker}
73 74 ... tender_cancelation
74   - Звірити відображення вмісту документа до скасування ${USERS.users['${tender_owner}']['cancellation_data']['document']['doc_id']} з ${USERS.users['${tender_owner}']['cancellation_data']['document']['doc_content']} для користувача ${viewer}
  75 + Звірити відображення вмісту документа ${USERS.users['${tender_owner}']['tender_cancellation_data']['document']['doc_id']} до скасування ${USERS.users['${tender_owner}']['tender_cancellation_data']['cancellation_id']} з ${USERS.users['${tender_owner}']['tender_cancellation_data']['document']['doc_content']} для користувача ${viewer}
75 76
76 77 ##############################################################################################
77 78 # LOT CANCELLATION
... ... @@ -103,7 +104,7 @@ Suite Teardown Test Suite Teardown
103 104 ... ${USERS.users['${viewer}'].broker}
104 105 ... lot_cancelation
105 106 Звірити поле тендера із значенням ${viewer} ${TENDER['TENDER_UAID']}
106   - ... ${USERS.users['${tender_owner}']['cancellation_data']['cancellation_reason']}
  107 + ... ${USERS.users['${tender_owner}']['lot_cancellation_data']['cancellation_reason']}
107 108 ... cancellations[0].reason
108 109
109 110
... ... @@ -112,7 +113,7 @@ Suite Teardown Test Suite Teardown
112 113 ... viewer
113 114 ... ${USERS.users['${viewer}'].broker}
114 115 ... lot_cancelation
115   - Звірити відображення поля description документа до скасування ${USERS.users['${tender_owner}']['cancellation_data']['document']['doc_id']} із ${USERS.users['${tender_owner}']['cancellation_data']['description']} для користувача ${viewer}
  116 + Звірити відображення поля description документа ${USERS.users['${tender_owner}']['lot_cancellation_data']['document']['doc_id']} до скасування ${USERS.users['${tender_owner}']['lot_cancellation_data']['cancellation_id']} із ${USERS.users['${tender_owner}']['lot_cancellation_data']['description']} для користувача ${viewer}
116 117
117 118
118 119 Відображення заголовку документа до скасування лота
... ... @@ -120,7 +121,7 @@ Suite Teardown Test Suite Teardown
120 121 ... viewer
121 122 ... ${USERS.users['${viewer}'].broker}
122 123 ... lot_cancelation
123   - Звірити відображення поля description документа до скасування ${USERS.users['${tender_owner}']['cancellation_data']['document']['doc_id']} із ${USERS.users['${tender_owner}']['cancellation_data']['document']['doc_name']} для користувача ${viewer}
  124 + Звірити відображення поля title документа ${USERS.users['${tender_owner}']['lot_cancellation_data']['document']['doc_id']} до скасування ${USERS.users['${tender_owner}']['lot_cancellation_data']['cancellation_id']} із ${USERS.users['${tender_owner}']['lot_cancellation_data']['document']['doc_name']} для користувача ${viewer}
124 125
125 126
126 127 Відображення вмісту документа до скасування лота
... ... @@ -128,7 +129,7 @@ Suite Teardown Test Suite Teardown
128 129 ... viewer
129 130 ... ${USERS.users['${viewer}'].broker}
130 131 ... lot_cancelation
131   - Звірити відображення вмісту документа до скасування ${USERS.users['${tender_owner}']['cancellation_data']['document']['doc_id']} з ${USERS.users['${tender_owner}']['cancellation_data']['document']['doc_content']} для користувача ${viewer}
  132 + Звірити відображення вмісту документа ${USERS.users['${tender_owner}']['lot_cancellation_data']['document']['doc_id']} до скасування ${USERS.users['${tender_owner}']['lot_cancellation_data']['cancellation_id']} з ${USERS.users['${tender_owner}']['lot_cancellation_data']['document']['doc_content']} для користувача ${viewer}
132 133
133 134 ##############################################################################################
134 135 # DELETING LOT
... ... @@ -145,17 +146,18 @@ Suite Teardown Test Suite Teardown
145 146
146 147 *** Keywords ***
147 148 Можливість скасувати тендер
148   - ${cancellation_data}= Підготувати дані про скасування ${tender_owner}
  149 + ${cancellation_data}= Підготувати дані про скасування
149 150 Run As ${tender_owner}
150 151 ... Скасувати закупівлю
151 152 ... ${TENDER['TENDER_UAID']}
152 153 ... ${cancellation_data['cancellation_reason']}
153 154 ... ${cancellation_data['document']['doc_path']}
154 155 ... ${cancellation_data['description']}
  156 + Set To Dictionary ${USERS.users['${tender_owner}']} tender_cancellation_data=${cancellation_data}
155 157
156 158
157 159 Можливість скасувати лот
158   - ${cancellation_data}= Підготувати дані про скасування ${tender_owner}
  160 + ${cancellation_data}= Підготувати дані про скасування
159 161 Run As ${tender_owner}
160 162 ... Скасувати лот
161 163 ... ${TENDER['TENDER_UAID']}
... ... @@ -163,14 +165,15 @@ Suite Teardown Test Suite Teardown
163 165 ... ${cancellation_data['cancellation_reason']}
164 166 ... ${cancellation_data['document']['doc_path']}
165 167 ... ${cancellation_data['description']}
  168 + Set To Dictionary ${USERS.users['${tender_owner}']} lot_cancellation_data=${cancellation_data}
166 169
167 170
168   -Звірити відображення поля ${field} документа до скасування ${doc_id} із ${left} для користувача ${username}
169   - ${right}= Run As ${username} Отримати інформацію із документа ${TENDER['TENDER_UAID']} ${doc_id} ${field}
  171 +Звірити відображення поля ${field} документа ${doc_id} до скасування ${cancel_id} із ${left} для користувача ${username}
  172 + ${right}= Run As ${username} Отримати інформацію із документа до скасування ${TENDER['TENDER_UAID']} ${cancel_id} ${doc_id} ${field}
170 173 Порівняти об'єкти ${left} ${right}
171 174
172 175
173   -Звірити відображення вмісту документа до скасування ${doc_id} з ${left} для користувача ${username}
174   - ${file_name}= Run as ${username} Отримати документ до скасування ${TENDER['TENDER_UAID']} ${doc_id}
  176 +Звірити відображення вмісту документа ${doc_id} до скасування ${cancel_id} з ${left} для користувача ${username}
  177 + ${file_name}= Run as ${username} Отримати документ до скасування ${TENDER['TENDER_UAID']} ${cancel_id} ${doc_id}
175 178 ${right}= Get File ${OUTPUT_DIR}${/}${file_name}
176 179 Порівняти об'єкти ${left} ${right}
... ...
... ... @@ -145,6 +145,7 @@ PublicPortal:
145 145 keywords_file: publicportal
146 146 roles:
147 147 viewer: PublicPortal_Viewer
  148 + timeout_on_wait: 300
148 149 SmartTender:
149 150 intervals:
150 151 default:
... ...
... ... @@ -202,10 +202,10 @@ users:
202 202 size: [1000, 720]
203 203 PublicPortal_Viewer:
204 204 broker: PublicPortal
205   - homepage: "http://dev.prozorro.org/"
206   - browser: chrome
207   - position: [0, 0]
208   - size: [640, 480]
  205 + homepage: "https://qa23.prozorro.gov.ua/tender/search/"
  206 + browser: Chrome
  207 + position: [450, 0]
  208 + size: [1200, 720]
209 209 SmartTender_Viewer:
210 210 broker: SmartTender
211 211 homepage: "http://test.smarttender.biz/test-tenders?allcat=1"
... ...
1 1 # -*- coding: utf-8 -
2 2 from datetime import timedelta
3 3 from faker import Factory
  4 +from faker.providers.company.en_US import Provider as CompanyProviderEnUs
  5 +from faker.providers.company.ru_RU import Provider as CompanyProviderRuRu
4 6 from munch import munchify
5 7 from uuid import uuid4
6 8 from tempfile import NamedTemporaryFile
... ... @@ -10,10 +12,16 @@ import os
10 12 import random
11 13
12 14
13   -fake = Factory.create('uk_UA')
14   -fake_ru = Factory.create('ru')
15   -fake_en = Factory.create()
16   -fake.add_provider(OP_Provider)
  15 +fake_en = Factory.create(locale='en_US')
  16 +fake_ru = Factory.create(locale='ru_RU')
  17 +fake_uk = Factory.create(locale='uk_UA')
  18 +fake_uk.add_provider(OP_Provider)
  19 +fake = fake_uk
  20 +
  21 +# This workaround fixes an error caused by missing "catch_phrase" class method
  22 +# for the "ru_RU" locale in Faker >= 0.7.4
  23 +fake_ru.add_provider(CompanyProviderEnUs)
  24 +fake_ru.add_provider(CompanyProviderRuRu)
17 25
18 26
19 27 def create_fake_sentence():
... ... @@ -45,7 +53,7 @@ def create_fake_doc():
45 53 tf = NamedTemporaryFile(delete=False, suffix=suffix, prefix=prefix)
46 54 tf.write(content)
47 55 tf.close()
48   - return tf.name, os.path.basename(tf.name), content
  56 + return tf.name.replace('\\', '\\\\'), os.path.basename(tf.name), content
49 57
50 58
51 59 def test_tender_data(params, periods=("enquiry", "tender")):
... ... @@ -127,6 +135,7 @@ def test_tender_data(params, periods=("enquiry", "tender")):
127 135 data['features'].append(new_feature)
128 136 if not data['features']:
129 137 del data['features']
  138 + data['status'] = 'draft'
130 139 return munchify(data)
131 140
132 141
... ... @@ -136,6 +145,8 @@ def test_tender_data_limited(params):
136 145 del data["minimalStep"]
137 146 del data["enquiryPeriod"]
138 147 del data["tenderPeriod"]
  148 + for lot in data.get('lots', []):
  149 + lot.pop('minimalStep', None)
139 150 data["procuringEntity"]["kind"] = "general"
140 151 data.update({"procurementMethodType": params['mode'], "procurementMethod": "limited"})
141 152 if params['mode'] == "negotiation":
... ... @@ -267,6 +278,7 @@ def test_bid_data():
267 278 })
268 279 bid.data.tenderers[0].address.countryName_en = translate_country_en(bid.data.tenderers[0].address.countryName)
269 280 bid.data.tenderers[0].address.countryName_ru = translate_country_ru(bid.data.tenderers[0].address.countryName)
  281 + bid.data['status'] = 'draft'
270 282 return bid
271 283
272 284
... ... @@ -302,7 +314,10 @@ def test_item_data(cpv=None):
302 314 data["description_en"] = field_with_id("i", data["description_en"])
303 315 data["description_ru"] = field_with_id("i", data["description_ru"])
304 316 days = fake.random_int(min=1, max=30)
305   - data["deliveryDate"] = {"endDate": (get_now() + timedelta(days=days)).isoformat()}
  317 + data["deliveryDate"] = {
  318 + "startDate":(get_now() + timedelta(days=days)).isoformat(),
  319 + "endDate":(get_now() + timedelta(days=days)).isoformat()
  320 + }
306 321 data["deliveryAddress"]["countryName_en"] = translate_country_en(data["deliveryAddress"]["countryName"])
307 322 data["deliveryAddress"]["countryName_ru"] = translate_country_ru(data["deliveryAddress"]["countryName"])
308 323 return munchify(data)
... ...
... ... @@ -35,7 +35,7 @@ Set Suite Variable With Default Value
35 35
36 36
37 37 Порівняти системний і серверний час
38   - ${server_time}= request ${api_host_url} HEAD
  38 + ${server_time}= request ${API_HOST_URL} HEAD
39 39 ${local_time}= Get current TZdate
40 40 Log ${server_time.headers['date']}
41 41 Log ${local_time}
... ... @@ -60,8 +60,8 @@ Set Suite Variable With Default Value
60 60
61 61
62 62 Завантажуємо дані про користувачів і майданчики
63   - Log ${broker}
64   - Log ${role}
  63 + Log ${BROKER}
  64 + Log ${ROLE}
65 65 # Suite variable; should be present in every test suite
66 66 # in `*** Variables ***` section
67 67 Log Many @{USED_ROLES}
... ... @@ -83,13 +83,13 @@ Set Suite Variable With Default Value
83 83 ${used_users}= Create List
84 84
85 85 # Handle `-v role:something`
86   - Run Keyword Unless '${role}' in @{USED_ROLES}
  86 + Run Keyword Unless '${ROLE}' in @{USED_ROLES}
87 87 ... Log
88   - ... Role ${role} is not used in this test suite.
  88 + ... Role ${ROLE} is not used in this test suite.
89 89 ... WARN
90 90 Set Suite Variable With Default Value
91   - ... ${role}
92   - ... ${BROKERS['${broker}'].roles.${role}}
  91 + ... ${ROLE}
  92 + ... ${BROKERS['${BROKER}'].roles.${ROLE}}
93 93
94 94 # Set default value for each role if it is not set yet;
95 95 # fill `used_users`;
... ... @@ -161,7 +161,7 @@ Get Broker Property By Username
161 161
162 162 Створити артефакт
163 163 ${artifact}= Create Dictionary
164   - ... api_version=${api_version}
  164 + ... api_version=${API_VERSION}
165 165 ... tender_uaid=${TENDER['TENDER_UAID']}
166 166 ... last_modification_date=${TENDER['LAST_MODIFICATION_DATE']}
167 167 ... mode=${MODE}
... ... @@ -183,7 +183,10 @@ Get Broker Property By Username
183 183 ${file_path}= Get Variable Value ${ARTIFACT_FILE} artifact.yaml
184 184 ${ARTIFACT}= load_data_from ${file_path}
185 185 Run Keyword And Ignore Error Set To Dictionary ${USERS.users['${tender_owner}']} access_token=${ARTIFACT.access_token}
186   - ${TENDER}= Create Dictionary TENDER_UAID=${ARTIFACT.tender_uaid} LAST_MODIFICATION_DATE=${ARTIFACT.last_modification_date} LOT_ID=${Empty}
  186 + ${TENDER}= Create Dictionary
  187 + ... TENDER_UAID=${ARTIFACT.tender_uaid}
  188 + ... LAST_MODIFICATION_DATE=${ARTIFACT.last_modification_date}
  189 + ... LOT_ID=${Empty}
187 190 ${lot_index}= Get Variable Value ${lot_index} 0
188 191 Run Keyword And Ignore Error Set To Dictionary ${TENDER} LOT_ID=${ARTIFACT.lots[${lot_index}]}
189 192 ${MODE}= Get Variable Value ${MODE} ${ARTIFACT.mode}
... ... @@ -249,33 +252,45 @@ Get Broker Property By Username
249 252
250 253
251 254 Підготувати дані для подання пропозиції
252   - [Arguments] ${username}
253   - ${bid}= generate_test_bid_data ${USERS.users['${username}'].tender_data.data}
  255 + [Arguments]
  256 + ${bid}= generate_test_bid_data ${USERS.users['${tender_owner}'].initial_data.data}
  257 + [Return] ${bid}
  258 +
  259 +
  260 +Підготувати дані для подання пропозиції для другого етапу
  261 + [Arguments] ${index}=0
  262 + ${bid}= generate_test_bid_data_second_stage ${USERS.users['${tender_owner}'].initialdata.data} ${index}
254 263 [Return] ${bid}
255 264
256 265
257 266 Підготувати дані про постачальника
258   - [Arguments] ${username}
  267 + [Arguments] ${username} ${lotIndex}=${-1}
  268 + ${lotIndex}= Convert To Integer ${lotIndex}
259 269 ${supplier_data}= test_supplier_data
260   - Set To Dictionary ${USERS.users['${username}']} supplier_data=${supplier_data}
  270 + Run Keyword If ${lotIndex} > -1 Set To Dictionary ${supplier_data.data} lotID=${USERS.users['${tender_owner}'].initial_data.data['lots'][${lotIndex}]['id']}
  271 + Set To Dictionary ${USERS.users['${tender_owner}']} supplier_data=${supplier_data}
261 272 Log ${supplier_data}
262 273 [Return] ${supplier_data}
263 274
264 275
265 276 Підготувати дані про скасування
266   - [Arguments] ${username}
267 277 ${cancellation_reason}= create_fake_sentence
  278 + ${cancellation_reason}= field_with_id c ${cancellation_reason}
  279 + ${cancellation_id}= get_id_from_string ${cancellation_reason}
268 280 ${file_path} ${file_name} ${file_content}= create_fake_doc
269   - ${doc_id}= get_id_from_doc_name ${file_name}
  281 + ${doc_id}= get_id_from_string ${file_name}
270 282 ${document}= Create Dictionary
271 283 ... doc_path=${file_path}
272 284 ... doc_name=${file_name}
273 285 ... doc_content=${file_content}
274 286 ... doc_id=${doc_id}
275 287 ${new_description}= create_fake_sentence
276   - ${cancellation_data}= Create Dictionary cancellation_reason=${cancellation_reason} document=${document} description=${new_description}
  288 + ${cancellation_data}= Create Dictionary
  289 + ... cancellation_reason=${cancellation_reason}
  290 + ... cancellation_id=${cancellation_id}
  291 + ... document=${document}
  292 + ... description=${new_description}
277 293 ${cancellation_data}= munchify ${cancellation_data}
278   - Set To Dictionary ${USERS.users['${username}']} cancellation_data=${cancellation_data}
279 294 [Return] ${cancellation_data}
280 295
281 296
... ...
... ... @@ -46,7 +46,7 @@ ${ITEM_MEAT} ${False}
46 46 ... add_award
47 47 ... level1
48 48 [Teardown] Оновити LAST_MODIFICATION_DATE
49   - Можливість зареєструвати, додати документацію і підтвердити постачальника до закупівлі
  49 + Можливість зареєструвати, додати документацію і підтвердити першого постачальника до закупівлі
50 50
51 51
52 52 Можливість знайти переговорну процедуру за нагальною потребою по ідентифікатору
... ...
... ... @@ -46,7 +46,7 @@ ${ITEM_MEAT} ${False}
46 46 ... add_award
47 47 ... level1
48 48 [Teardown] Оновити LAST_MODIFICATION_DATE
49   - Можливість зареєструвати, додати документацію і підтвердити постачальника до закупівлі
  49 + Можливість зареєструвати, додати документацію і підтвердити першого постачальника до закупівлі
50 50
51 51
52 52 Можливість знайти переговорну процедуру по ідентифікатору
... ...
... ... @@ -169,8 +169,15 @@ ${ITEM_MEAT} ${True}
169 169 [Setup] Дочекатись синхронізації з майданчиком ${viewer}
170 170 Звірити відображення поля description усіх предметів для усіх користувачів
171 171
  172 +Відображення дати початку доставки номенклатур тендера
  173 + [Tags] ${USERS.users['${viewer}'].broker}: Відображення номенклатури тендера
  174 + ... viewer
  175 + ... ${USERS.users['${viewer}'].broker}
  176 + ... tender_view level2
  177 + Звірити відображення дати deliveryDate.startDate усіх предметів для користувача ${viewer}
172 178
173   -Відображення дати доставки номенклатур тендера
  179 +
  180 +Відображення дати кінця доставки номенклатур тендера
174 181 [Tags] ${USERS.users['${viewer}'].broker}: Відображення номенклатури тендера
175 182 ... viewer
176 183 ... ${USERS.users['${viewer}'].broker}
... ... @@ -1638,7 +1645,7 @@ ${ITEM_MEAT} ${True}
1638 1645 Звірити статус тендера ${tender_owner} ${TENDER['TENDER_UAID']} active.stage2.pending
1639 1646
1640 1647
1641   -Можливість перевести статус очікування обробки мостом
  1648 +Можливість перевести тендер в статус очікування обробки мостом
1642 1649 [Tags] ${USERS.users['${tender_owner}'].broker}: Процес переведення статусу у active.stage2.waiting.
1643 1650 ... tender_owner
1644 1651 ... ${USERS.users['${tender_owner}'].broker}
... ... @@ -1657,3 +1664,189 @@ ${ITEM_MEAT} ${True}
1657 1664 Дочекатися створення нового етапу мостом ${tender_owner} ${TENDER['TENDER_UAID']}
1658 1665 Звірити статус тендера ${tender_owner} ${TENDER['TENDER_UAID']} complete
1659 1666
  1667 +
  1668 +Можливість отримати тендер другого етапу
  1669 + [Tags] ${USERS.user['${tender_owner}'].broker}: Отримати id нового тендеру
  1670 + ... tender_owner
  1671 + ... ${USERS.users['${tender_owner}'].broker}
  1672 + ... get_second_stage
  1673 + Отримати дані із поля stage2TenderID тендера для усіх користувачів
  1674 + ${tender_UAID_second_stage}= Catenate SEPARATOR= ${TENDER['TENDER_UAID']} .2
  1675 + Можливість знайти тендер по ідентифікатору ${tender_UAID_second_stage} та зберегти його в second_stage_data для користувача ${tender_owner}
  1676 +
  1677 +
  1678 +Відображення заголовку тендера другого етапу
  1679 + [Tags] ${USERS.user['${tender_owner}'].broker}: Відображення основних даних тендера другого етапу
  1680 + ... viewer
  1681 + ... ${USERS.users['${tender_owner}'].broker}
  1682 + ... compare_stages
  1683 + Звірити відображення поля title тендера із ${USERS.users['${tender_owner}'].second_stage_data.data.title} для користувача ${viewer}
  1684 +
  1685 +
  1686 +Відображення мінімального кроку закупівлі другого етапу
  1687 + [Tags] ${USERS.user['${tender_owner}'].broker}: Відображення основних даних тендера другого етапу
  1688 + ... viewer
  1689 + ... ${USERS.users['${tender_owner}'].broker}
  1690 + ... compare_stages
  1691 + Звірити відображення поля minimalStep тендера із ${USERS.users['${tender_owner}'].second_stage_data.data.minimalStep} для користувача ${viewer}
  1692 +
  1693 +
  1694 +Відображення доступного бюджету закупівлі другого етапу
  1695 + [Tags] ${USERS.user['${tender_owner}'].broker}: Відображення основних даних тендера другого етапу
  1696 + ... viewer
  1697 + ... ${USERS.users['${tender_owner}'].broker}
  1698 + ... compare_stages
  1699 + Звірити відображення поля value тендера із ${USERS.users['${tender_owner}'].second_stage_data.data.value} для користувача ${viewer}
  1700 +
  1701 +
  1702 +Відображення опису закупівлі другого етапу
  1703 + [Tags] ${USERS.user['${tender_owner}'].broker}: Відображення основних даних тендера другого етапу
  1704 + ... viewer
  1705 + ... ${USERS.users['${tender_owner}'].broker}
  1706 + ... compare_stages
  1707 + Звірити відображення поля description тендера із ${USERS.users['${tender_owner}'].second_stage_data.data.description} для користувача ${viewer}
  1708 +
  1709 +
  1710 +Відображення імені замовника тендера для другого етапу
  1711 + [Tags] ${USERS.user['${tender_owner}'].broker}: Відображення основних даних тендера другого етапу
  1712 + ... viewer
  1713 + ... ${USERS.users['${tender_owner}'].broker}
  1714 + ... compare_stages
  1715 + Звірити відображення поля procuringEntity.name тендера із ${USERS.users['${tender_owner}'].second_stage_data.data.procuringEntity.name} для користувача ${viewer}
  1716 +
  1717 +##############################################################################################
  1718 +# Відображення основних даних лоту для другого етапу
  1719 +##############################################################################################
  1720 +
  1721 +Відображення лоту тендера другого етапу
  1722 + [Tags] ${USERS.users['${viewer}'].broker}: Відображення лоту тендера другого етапу
  1723 + ... viewer tender_owner provider provider1
  1724 + ... ${USERS.users['${viewer}'].broker} ${USERS.users['${tender_owner}'].broker}
  1725 + ... ${USERS.users['${provider}'].broker} ${USERS.users['${provider1}'].broker}
  1726 + ... compare_stages
  1727 + Звірити відображення поля title усіх лотів другого етапу для усіх користувачів
  1728 +
  1729 +
  1730 +Відображення опису лотів для тендера другого етапу
  1731 + [Tags] ${USERS.users['${viewer}'].broker}: Відображення лоту тендера другого етапу
  1732 + ... viewer
  1733 + ... ${USERS.users['${viewer}'].broker}
  1734 + ... compare_stages
  1735 + Звірити відображення поля description усіх лотів другого етапу для користувача ${viewer}
  1736 +
  1737 +
  1738 +Відображення бюджету лотів для тендера другого етапу
  1739 + [Tags] ${USERS.users['${viewer}'].broker}: Відображення лоту тендера другого етапу
  1740 + ... viewer tender_owner provider provider1
  1741 + ... ${USERS.users['${viewer}'].broker} ${USERS.users['${tender_owner}'].broker}
  1742 + ... ${USERS.users['${provider}'].broker} ${USERS.users['${provider1}'].broker}
  1743 + ... compare_stages
  1744 + Звірити відображення поля value.amount усіх лотів другого етапу для усіх користувачів
  1745 +
  1746 +
  1747 +Відображення валюти лотів для тендера другого етапу
  1748 + [Tags] ${USERS.users['${viewer}'].broker}: Відображення лоту тендера другого етапу
  1749 + ... viewer
  1750 + ... ${USERS.users['${viewer}'].broker}
  1751 + ... compare_stages
  1752 + Звірити відображення поля value.currency усіх лотів другого етапу для користувача ${viewer}
  1753 +
  1754 +
  1755 +Відображення ПДВ в бюджеті лотів для тендера другого етапу
  1756 + [Tags] ${USERS.users['${viewer}'].broker}: Відображення лоту тендера другого етапу
  1757 + ... viewer
  1758 + ... ${USERS.users['${viewer}'].broker}
  1759 + ... compare_stages
  1760 + Звірити відображення поля value.valueAddedTaxIncluded усіх лотів другого етапу для користувача ${viewer}
  1761 +
  1762 +
  1763 +Відображення мінімального кроку лотів для тендера другого етапу
  1764 + [Tags] ${USERS.users['${viewer}'].broker}: Відображення лоту тендера другого етапу
  1765 + ... viewer tender_owner provider provider1
  1766 + ... ${USERS.users['${viewer}'].broker} ${USERS.users['${tender_owner}'].broker}
  1767 + ... ${USERS.users['${provider}'].broker} ${USERS.users['${provider1}'].broker}
  1768 + ... compare_stages
  1769 + Звірити відображення поля minimalStep.amount усіх лотів другого етапу для усіх користувачів
  1770 +
  1771 +
  1772 +Відображення валюти мінімального кроку лотів для тендера другого етапу
  1773 + [Tags] ${USERS.users['${viewer}'].broker}: Відображення лоту тендера другого етапу
  1774 + ... viewer
  1775 + ... ${USERS.users['${viewer}'].broker}
  1776 + ... compare_stages
  1777 + Звірити відображення поля minimalStep.currency усіх лотів другого етапу для користувача ${viewer}
  1778 +
  1779 +
  1780 +Відображення ПДВ в мінімальному кроці лотів для тендера другого етапу
  1781 + [Tags] ${USERS.users['${viewer}'].broker}: Відображення лоту тендера другого етапу
  1782 + ... viewer
  1783 + ... ${USERS.users['${viewer}'].broker}
  1784 + ... compare_stages
  1785 + Звірити відображення поля minimalStep.valueAddedTaxIncluded усіх лотів другого етапу для користувача ${viewer}
  1786 +
  1787 +##############################################################################################
  1788 +# END
  1789 +##############################################################################################
  1790 +
  1791 +Можливість отримати доступ до тендера другого етапу
  1792 + [Tags] ${USERS.user['${tender_owner}'].broker}: Отримати токен для другог етапу
  1793 + ... tender_owner
  1794 + ... ${USERS.users['${tender_owner}'].broker}
  1795 + ... save_tender_second_stage
  1796 + Отримати доступ до тендера другого етапу та зберегти його
  1797 +
  1798 +
  1799 +Можливість активувати тендер другого етапу
  1800 + [Tags] ${USERS.users['${viewer}'].broker}: Активувати тендер другого етапу
  1801 + ... tender_owner
  1802 + ... ${USERS.users['${tender_owner}'].broker}
  1803 + ... activate_second_stage
  1804 + Активувати тендер другого етапу
  1805 +
  1806 +
  1807 +Можливість подати пропозицію першим учасником на другому етапі
  1808 + [Tags] ${USERS.users['${provider}'].broker}: Подання пропозиції
  1809 + ... provider
  1810 + ... ${USERS.users['${provider}'].broker}
  1811 + ... make_bid_by_provider_second_stage
  1812 + [Setup] Дочекатись дати початку прийому пропозицій ${provider} ${TENDER['TENDER_UAID']}
  1813 + [Teardown] Оновити LAST_MODIFICATION_DATE
  1814 + Можливість подати цінову пропозицію на другий етап 1 користувачем ${provider}
  1815 +
  1816 +
  1817 +Можливість подати пропозицію другим учасником на другому етапі
  1818 + [Tags] ${USERS.users['${provider1}'].broker}: Подання пропозиції на другий етап
  1819 + ... provider1
  1820 + ... ${USERS.users['${provider1}'].broker}
  1821 + ... make_bid_by_provider1_second_stage
  1822 + [Teardown] Оновити LAST_MODIFICATION_DATE
  1823 + Можливість подати цінову пропозицію на другий етап 2 користувачем ${provider1}
  1824 +
  1825 +
  1826 +Можливість підтвердити першу пропозицію кваліфікації на другому етапі
  1827 + [Tags] ${USERS.users['${tender_owner}'].broker}: Кваліфікація на другому етапі
  1828 + ... tender_owner
  1829 + ... ${USERS.users['${tender_owner}'].broker}
  1830 + ... pre-qualification_approve_first_bid_second_stage
  1831 + [Setup] Дочекатись дати початку періоду прекваліфікації ${tender_owner} ${TENDER['TENDER_UAID']}
  1832 + [Teardown] Оновити LAST_MODIFICATION_DATE
  1833 + Можливість підтвердити 0 пропозицію кваліфікації
  1834 +
  1835 +
  1836 +Можливість підтвердити другу пропозицію кваліфікації на другогму етапі
  1837 + [Tags] ${USERS.users['${tender_owner}'].broker}: Кваліфікація на другому етапі
  1838 + ... tender_owner
  1839 + ... ${USERS.users['${tender_owner}'].broker}
  1840 + ... pre-qualification_approve_second_bid_second_stage
  1841 + [Teardown] Оновити LAST_MODIFICATION_DATE
  1842 + Можливість підтвердити -1 пропозицію кваліфікації
  1843 +
  1844 +
  1845 +Можливість затвердити остаточне рішення кваліфікації на другому етапі
  1846 + [Tags] ${USERS.users['${tender_owner}'].broker}: Кваліфікація на другому етапі
  1847 + ... tender_owner
  1848 + ... ${USERS.users['${tender_owner}'].broker}
  1849 + ... pre-qualification_approve_qualifications_second_stage
  1850 + [Setup] Дочекатись синхронізації з майданчиком ${tender_owner}
  1851 + [Teardown] Оновити LAST_MODIFICATION_DATE
  1852 + Можливість затвердити остаточне рішення кваліфікації
\ No newline at end of file
... ...
... ... @@ -46,7 +46,7 @@ ${ITEM_MEAT} ${False}
46 46 ... add_award
47 47 ... level1
48 48 [Teardown] Оновити LAST_MODIFICATION_DATE
49   - Можливість зареєструвати, додати документацію і підтвердити постачальника до закупівлі
  49 + Можливість зареєструвати, додати документацію і підтвердити першого постачальника до закупівлі
50 50
51 51
52 52 Можливість укласти угоду для звіту про укладений договір
... ...
1 1 *** Variables ***
2   -${api_host_url} https://lb.api-sandbox.openprocurement.org
3   -${api_version} 2.3
4   -${broker} Quinta
5   -${role} viewer
  2 +${API_HOST_URL} https://lb.api-sandbox.openprocurement.org
  3 +${API_VERSION} 2.3
  4 +${BROKER} Quinta
  5 +${ROLE} viewer
... ...
... ... @@ -21,6 +21,7 @@ from .initial_data import (
21 21 create_fake_doc,
22 22 create_fake_sentence,
23 23 fake,
  24 + field_with_id,
24 25 test_bid_data,
25 26 test_bid_value,
26 27 test_claim_answer_data,
... ... @@ -328,7 +329,7 @@ def get_from_object(obj, attribute):
328 329 def set_to_object(obj, attribute, value):
329 330 # Search the list index in path to value
330 331 list_index = re.search('\d+', attribute)
331   - if list_index:
  332 + if list_index and attribute != 'stage2TenderID':
332 333 list_index = list_index.group(0)
333 334 parent, child = attribute.split('[' + list_index + '].')[:2]
334 335 # Split attribute to path to lits (parent) and path to value in list element (child)
... ... @@ -409,8 +410,8 @@ def get_id_from_object(obj):
409 410 return obj_id.group(1)
410 411
411 412
412   -def get_id_from_doc_name(name):
413   - return re.match(r'd\-[0-9a-fA-F]{8}', name).group(0)
  413 +def get_id_from_string(string):
  414 + return re.match(r'[dc]\-[0-9a-fA-F]{8}', string).group(0)
414 415
415 416
416 417 def get_object_type_by_id(object_id):
... ... @@ -443,7 +444,7 @@ def get_complaint_index_by_complaintID(data, complaintID):
443 444
444 445 def generate_test_bid_data(tender_data):
445 446 bid = test_bid_data()
446   - if 'aboveThreshold' in tender_data.get('procurementMethodType', '') or 'competitiveDialogue' in tender_data.get('procurementMethodType', ''):
  447 + if tender_data.get('procurementMethodType', '')[:-2] in ('aboveThreshold', 'competitiveDialogue'):
447 448 bid.data.selfEligible = True
448 449 bid.data.selfQualified = True
449 450 if 'lots' in tender_data:
... ... @@ -466,27 +467,30 @@ def mult_and_round(*args, **kwargs):
466 467 return round(reduce(operator.mul, args), kwargs.get('precision', 2))
467 468
468 469
469   -# GUI Frontends common
470   -def add_data_for_gui_frontends(tender_data):
471   - now = get_now()
472   - # tender_data.data.enquiryPeriod['startDate'] = (now + timedelta(minutes=2)).isoformat()
473   - tender_data.data.enquiryPeriod['endDate'] = (now + timedelta(minutes=6)).isoformat()
474   - tender_data.data.tenderPeriod['startDate'] = (now + timedelta(minutes=7)).isoformat()
475   - tender_data.data.tenderPeriod['endDate'] = (now + timedelta(minutes=11)).isoformat()
476   - return tender_data
477   -
478   -
479   -def convert_date_to_slash_format(isodate):
480   - iso_dt = parse_date(isodate)
481   - date_string = iso_dt.strftime("%d/%m/%Y")
482   - return date_string
483   -
484   -
485   -def convert_datetime_to_dot_format(isodate):
486   - iso_dt = parse_date(isodate)
487   - day_string = iso_dt.strftime("%d.%m.%Y %H:%M")
488   - return day_string
489   -
  470 +def generate_test_bid_data_second_stage(tender_data, index='0'):
  471 + bid = test_bid_data()
  472 + if index.isdigit():
  473 + index = int(index)
  474 + else:
  475 + index = 0
  476 + bid['data']['tenderers'][0]['identifier']['id'] = tender_data['shortlistedFirms'][index]['identifier']['id']
  477 + bid['data']['tenderers'][0]['identifier']['scheme'] = tender_data['shortlistedFirms'][index]['identifier']['scheme']
  478 + bid['data']['tenderers'][0]['identifier']['legalName'] = tender_data['shortlistedFirms'][index]['identifier']['legalName']
490 479
491   -def local_path_to_file(file_name):
492   - return os.path.join(os.path.dirname(__file__), 'documents', file_name)
  480 + if tender_data.get('procurementMethodType', '')[:-2] in ('aboveThreshold', 'competitiveDialogue'):
  481 + bid.data.selfEligible = True
  482 + bid.data.selfQualified = True
  483 + if 'lots' in tender_data:
  484 + bid.data.lotValues = []
  485 + for lot in tender_data['lots']:
  486 + value = test_bid_value(lot['value']['amount'])
  487 + value['relatedLot'] = lot.get('id', '')
  488 + bid.data.lotValues.append(value)
  489 + else:
  490 + bid.data.update(test_bid_value(tender_data['value']['amount']))
  491 + if 'features' in tender_data:
  492 + bid.data.parameters = []
  493 + for feature in tender_data['features']:
  494 + parameter = {"value": fake.random_element(elements=(0.05, 0.01, 0)), "code": feature.get('code', '')}
  495 + bid.data.parameters.append(parameter)
  496 + return bid
... ...
1   - -s openProcedure
  1 +-s openProcedure
2 2
3 3 -v MODE:open_competitive_dialogue
4 4
5   --v api_version:2.3
6   --v api_host_url:http://localhost:6543/
7   -
8 5
9 6 -v NUMBER_OF_ITEMS:1
10 7 -v NUMBER_OF_LOTS:1
... ... @@ -33,3 +30,25 @@
33 30 -i stage2_pending_status_view
34 31
35 32 -i wait_bridge_for_work
  33 +
  34 +-i get_second_stage
  35 +
  36 +-i compare_stages
  37 +
  38 +-i save_tender_second_stage
  39 +
  40 +-i activate_second_stage
  41 +
  42 +-i make_bid_by_provider_second_stage
  43 +-i make_bid_by_provider1_second_stage
  44 +
  45 +-i pre-qualification_approve_first_bid_second_stage
  46 +-i pre-qualification_approve_second_bid_second_stage
  47 +
  48 +-i pre-qualification_approve_qualifications_second_stage
  49 +
  50 +-i auction
  51 +
  52 +-i qualification_approve_first_award
  53 +
  54 +-i contract_sign
\ No newline at end of file
... ...
... ... @@ -18,29 +18,26 @@ setup(name='op_robot_tests',
18 18 zip_safe=False,
19 19 install_requires=[
20 20 # -*- Extra requirements: -*-
21   - 'robotframework',
22   - 'robotframework-selenium2library',
23   - 'robotframework-debuglibrary',
24   - 'robotframework-selenium2screenshots',
  21 + 'Faker',
25 22 'Pillow',
26   - 'iso8601',
27 23 'PyYAML',
28   - 'munch',
29   - 'fake-factory',
  24 + 'barbecue',
  25 + 'chromedriver',
  26 + 'dateutils',
30 27 'dpath',
  28 + 'haversine',
  29 + 'iso8601',
31 30 'jsonpath-rw',
32   - 'dateutils',
33   - 'pytz',
  31 + 'munch',
34 32 'parse',
35   - 'chromedriver',
36   - 'barbecue',
37   - 'haversine'
  33 + 'pytz',
  34 + 'robotframework',
  35 + 'robotframework-selenium2library',
  36 + 'selenium < 3.0.dev0',
38 37 ],
39 38 entry_points={
40 39 'console_scripts': [
41   - 'openprocurement_tests = op_robot_tests.runner:runner',
42 40 'op_tests = op_robot_tests.runner:runner',
43   - 'rebot = op_robot_tests.rebot:rebot'
44 41 ],
45 42 }
46 43 )
... ...
Please register or login to post a comment