Commit f9a5a0a60fbf505e42c1aee45ff9dbdec7977f6b

Authored by selurvedu
2 parents 11009ec0 6e451572

Merge branch 'devel' into master

@@ -14,6 +14,7 @@ recipe = zc.recipe.egg @@ -14,6 +14,7 @@ recipe = zc.recipe.egg
14 eggs = 14 eggs =
15 op_robot_tests 15 op_robot_tests
16 openprocurement_client 16 openprocurement_client
  17 + robotframework
17 robotframework-lint 18 robotframework-lint
18 robotframework-debuglibrary 19 robotframework-debuglibrary
19 robot_tests.broker.dzo 20 robot_tests.broker.dzo
@@ -70,8 +71,14 @@ robot_tests.broker.uub = git ${remotes:gh}openprocurement/robot_tests.b @@ -70,8 +71,14 @@ robot_tests.broker.uub = git ${remotes:gh}openprocurement/robot_tests.b
70 robot_tests.broker.aps = git ${remotes:gh}openprocurement/robot_tests.broker.aps.git 71 robot_tests.broker.aps = git ${remotes:gh}openprocurement/robot_tests.broker.aps.git
71 72
72 [versions] 73 [versions]
73 -fake-factory = 0.5.3 74 +Faker = 0.7.7
  75 +mr.developer = 1.34
74 restkit = 4.2.2.op1 76 restkit = 4.2.2.op1
75 rfc6266 = 0.0.6.op1 77 rfc6266 = 0.0.6.op1
76 robotframework = 3.0.0 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,6 +3,8 @@
3 """ 3 """
4 Setuptools bootstrapping installer. 4 Setuptools bootstrapping installer.
5 5
  6 +Maintained at https://github.com/pypa/setuptools/tree/bootstrap.
  7 +
6 Run this script to install or upgrade setuptools. 8 Run this script to install or upgrade setuptools.
7 """ 9 """
8 10
@@ -16,24 +18,30 @@ import subprocess @@ -16,24 +18,30 @@ import subprocess
16 import platform 18 import platform
17 import textwrap 19 import textwrap
18 import contextlib 20 import contextlib
19 -import warnings 21 +import json
  22 +import codecs
20 23
21 from distutils import log 24 from distutils import log
22 25
23 try: 26 try:
24 from urllib.request import urlopen 27 from urllib.request import urlopen
  28 + from urllib.parse import urljoin
25 except ImportError: 29 except ImportError:
26 from urllib2 import urlopen 30 from urllib2 import urlopen
  31 + from urlparse import urljoin
27 32
28 try: 33 try:
29 from site import USER_SITE 34 from site import USER_SITE
30 except ImportError: 35 except ImportError:
31 USER_SITE = None 36 USER_SITE = None
32 37
  38 +LATEST = object()
33 DEFAULT_VERSION = "18.3.2" 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 DEFAULT_SAVE_DIR = os.curdir 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 def _python_cmd(*args): 46 def _python_cmd(*args):
39 """ 47 """
@@ -98,8 +106,16 @@ def archive_context(filename): @@ -98,8 +106,16 @@ def archive_context(filename):
98 old_wd = os.getcwd() 106 old_wd = os.getcwd()
99 try: 107 try:
100 os.chdir(tmpdir) 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 # going in the directory 120 # going in the directory
105 subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) 121 subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0])
@@ -114,18 +130,19 @@ def archive_context(filename): @@ -114,18 +130,19 @@ def archive_context(filename):
114 130
115 def _do_download(version, download_base, to_dir, download_delay): 131 def _do_download(version, download_base, to_dir, download_delay):
116 """Download Setuptools.""" 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 if not os.path.exists(egg): 136 if not os.path.exists(egg):
120 archive = download_setuptools(version, download_base, 137 archive = download_setuptools(version, download_base,
121 - to_dir, download_delay) 138 + to_dir, download_delay)
122 _build_egg(egg, archive, to_dir) 139 _build_egg(egg, archive, to_dir)
123 sys.path.insert(0, egg) 140 sys.path.insert(0, egg)
124 141
125 # Remove previously-imported pkg_resources if present (see 142 # Remove previously-imported pkg_resources if present (see
126 # https://bitbucket.org/pypa/setuptools/pull-request/7/ for details). 143 # https://bitbucket.org/pypa/setuptools/pull-request/7/ for details).
127 if 'pkg_resources' in sys.modules: 144 if 'pkg_resources' in sys.modules:
128 - del sys.modules['pkg_resources'] 145 + _unload_pkg_resources()
129 146
130 import setuptools 147 import setuptools
131 setuptools.bootstrap_install_from = egg 148 setuptools.bootstrap_install_from = egg
@@ -140,6 +157,7 @@ def use_setuptools( @@ -140,6 +157,7 @@ def use_setuptools(
140 Return None. Raise SystemExit if the requested version 157 Return None. Raise SystemExit if the requested version
141 or later cannot be installed. 158 or later cannot be installed.
142 """ 159 """
  160 + version = _resolve_version(version)
143 to_dir = os.path.abspath(to_dir) 161 to_dir = os.path.abspath(to_dir)
144 162
145 # prior to importing, capture the module state for 163 # prior to importing, capture the module state for
@@ -189,6 +207,11 @@ def _conflict_bail(VC_err, version): @@ -189,6 +207,11 @@ def _conflict_bail(VC_err, version):
189 207
190 208
191 def _unload_pkg_resources(): 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 del_modules = [ 215 del_modules = [
193 name for name in sys.modules 216 name for name in sys.modules
194 if name.startswith('pkg_resources') 217 if name.startswith('pkg_resources')
@@ -222,8 +245,8 @@ def download_file_powershell(url, target): @@ -222,8 +245,8 @@ def download_file_powershell(url, target):
222 ps_cmd = ( 245 ps_cmd = (
223 "[System.Net.WebRequest]::DefaultWebProxy.Credentials = " 246 "[System.Net.WebRequest]::DefaultWebProxy.Credentials = "
224 "[System.Net.CredentialCache]::DefaultCredentials; " 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 cmd = [ 251 cmd = [
229 'powershell', 252 'powershell',
@@ -248,7 +271,7 @@ download_file_powershell.viable = has_powershell @@ -248,7 +271,7 @@ download_file_powershell.viable = has_powershell
248 271
249 272
250 def download_file_curl(url, target): 273 def download_file_curl(url, target):
251 - cmd = ['curl', url, '--silent', '--output', target] 274 + cmd = ['curl', url, '--location', '--silent', '--output', target]
252 _clean_check(cmd, target) 275 _clean_check(cmd, target)
253 276
254 277
@@ -321,6 +344,7 @@ def download_setuptools( @@ -321,6 +344,7 @@ def download_setuptools(
321 ``downloader_factory`` should be a function taking no arguments and 344 ``downloader_factory`` should be a function taking no arguments and
322 returning a function for downloading a URL to a target. 345 returning a function for downloading a URL to a target.
323 """ 346 """
  347 + version = _resolve_version(version)
324 # making sure we use the absolute path 348 # making sure we use the absolute path
325 to_dir = os.path.abspath(to_dir) 349 to_dir = os.path.abspath(to_dir)
326 zip_name = "setuptools-%s.zip" % version 350 zip_name = "setuptools-%s.zip" % version
@@ -333,6 +357,27 @@ def download_setuptools( @@ -333,6 +357,27 @@ def download_setuptools(
333 return os.path.realpath(saveto) 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 def _build_install_args(options): 381 def _build_install_args(options):
337 """ 382 """
338 Build the arguments to 'python setup.py install' on the setuptools package. 383 Build the arguments to 'python setup.py install' on the setuptools package.
@@ -347,7 +392,7 @@ def _parse_args(): @@ -347,7 +392,7 @@ def _parse_args():
347 parser = optparse.OptionParser() 392 parser = optparse.OptionParser()
348 parser.add_option( 393 parser.add_option(
349 '--user', dest='user_install', action='store_true', default=False, 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 parser.add_option( 396 parser.add_option(
352 '--download-base', dest='download_base', metavar="URL", 397 '--download-base', dest='download_base', metavar="URL",
353 default=DEFAULT_URL, 398 default=DEFAULT_URL,
@@ -362,9 +407,9 @@ def _parse_args(): @@ -362,9 +407,9 @@ def _parse_args():
362 default=DEFAULT_VERSION, 407 default=DEFAULT_VERSION,
363 ) 408 )
364 parser.add_option( 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 options, args = parser.parse_args() 414 options, args = parser.parse_args()
370 # positional arguments are ignored 415 # positional arguments are ignored
@@ -372,13 +417,13 @@ def _parse_args(): @@ -372,13 +417,13 @@ def _parse_args():
372 417
373 418
374 def _download_args(options): 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 def main(): 429 def main():
1 -from robot.rebot import rebot_cli  
2 -import sys  
3 -  
4 -def rebot():  
5 - rebot_cli(sys.argv[1:])  
@@ -32,9 +32,7 @@ Resource base_keywords.robot @@ -32,9 +32,7 @@ Resource base_keywords.robot
32 Можливість підтвердити цінову пропозицію учасником ${username} 32 Можливість підтвердити цінову пропозицію учасником ${username}
33 ${status}= Run Keyword IF '${MODE}'=='openeu' Set Variable pending 33 ${status}= Run Keyword IF '${MODE}'=='openeu' Set Variable pending
34 ... ELSE IF '${MODE}'=='openua' Set Variable active 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 # OPENEU Bid documentation 38 # OPENEU Bid documentation
@@ -44,9 +42,7 @@ Resource base_keywords.robot @@ -44,9 +42,7 @@ Resource base_keywords.robot
44 ${confidentialityRationale}= create_fake_sentence 42 ${confidentialityRationale}= create_fake_sentence
45 ${privat_doc}= create_data_dict data.confidentialityRationale ${confidentialityRationale} 43 ${privat_doc}= create_data_dict data.confidentialityRationale ${confidentialityRationale}
46 Set To Dictionary ${privat_doc.data} confidentiality=buyerOnly 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 Можливість завантажити ${doc_type} документ до пропозиції учасником ${username} 48 Можливість завантажити ${doc_type} документ до пропозиції учасником ${username}
@@ -82,4 +78,8 @@ Resource base_keywords.robot @@ -82,4 +78,8 @@ Resource base_keywords.robot
82 78
83 79
84 Можливість перевести тендер на статус очікування обробки мостом 80 Можливість перевести тендер на статус очікування обробки мостом
85 - Run As ${tender_owner} Перевести тендер на статус очікування обробки мостом ${TENDER['TENDER_UAID']}  
  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,6 +35,11 @@ Resource resource.robot
35 Run as ${username} Пошук тендера по ідентифікатору ${TENDER['TENDER_UAID']} 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 Можливість змінити поле ${field_name} тендера на ${field_value} 43 Можливість змінити поле ${field_name} тендера на ${field_value}
39 Run As ${tender_owner} Внести зміни в тендер ${TENDER['TENDER_UAID']} ${field_name} ${field_value} 44 Run As ${tender_owner} Внести зміни в тендер ${TENDER['TENDER_UAID']} ${field_name} ${field_value}
40 45
@@ -42,8 +47,11 @@ Resource resource.robot @@ -42,8 +47,11 @@ Resource resource.robot
42 Можливість додати документацію до тендера 47 Можливість додати документацію до тендера
43 ${file_path} ${file_name} ${file_content}= create_fake_doc 48 ${file_path} ${file_name} ${file_content}= create_fake_doc
44 Run As ${tender_owner} Завантажити документ ${file_path} ${TENDER['TENDER_UAID']} 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 Set To Dictionary ${USERS.users['${tender_owner}']} tender_document=${tender_document} 55 Set To Dictionary ${USERS.users['${tender_owner}']} tender_document=${tender_document}
48 Remove File ${file_path} 56 Remove File ${file_path}
49 57
@@ -52,7 +60,9 @@ Resource resource.robot @@ -52,7 +60,9 @@ Resource resource.robot
52 ${item}= Підготувати дані для створення предмету закупівлі ${USERS.users['${tender_owner}'].initial_data.data['items'][0]['classification']['id']} 60 ${item}= Підготувати дані для створення предмету закупівлі ${USERS.users['${tender_owner}'].initial_data.data['items'][0]['classification']['id']}
53 Run As ${tender_owner} Додати предмет закупівлі ${TENDER['TENDER_UAID']} ${item} 61 Run As ${tender_owner} Додати предмет закупівлі ${TENDER['TENDER_UAID']} ${item}
54 ${item_id}= get_id_from_object ${item} 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 ${item_data}= munch_dict arg=${item_data} 66 ${item_data}= munch_dict arg=${item_data}
57 Set To Dictionary ${USERS.users['${tender_owner}']} item_data=${item_data} 67 Set To Dictionary ${USERS.users['${tender_owner}']} item_data=${item_data}
58 68
@@ -79,6 +89,14 @@ Resource resource.robot @@ -79,6 +89,14 @@ Resource resource.robot
79 Звірити поле тендера ${username} ${TENDER['TENDER_UAID']} ${USERS.users['${tender_owner}'].initial_data} ${field} 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 Звірити відображення вмісту документа ${doc_id} із ${left} для користувача ${username} 100 Звірити відображення вмісту документа ${doc_id} із ${left} для користувача ${username}
83 ${file_name}= Run as ${username} Отримати документ ${TENDER['TENDER_UAID']} ${doc_id} 101 ${file_name}= Run as ${username} Отримати документ ${TENDER['TENDER_UAID']} ${doc_id}
84 ${right}= Get File ${OUTPUT_DIR}${/}${file_name} 102 ${right}= Get File ${OUTPUT_DIR}${/}${file_name}
@@ -157,8 +175,11 @@ Resource resource.robot @@ -157,8 +175,11 @@ Resource resource.robot
157 ${lot_id}= get_id_from_object ${USERS.users['${tender_owner}'].tender_data.data.lots[${lot_index}]} 175 ${lot_id}= get_id_from_object ${USERS.users['${tender_owner}'].tender_data.data.lots[${lot_index}]}
158 ${file_path} ${file_name} ${file_content}= create_fake_doc 176 ${file_path} ${file_name} ${file_content}= create_fake_doc
159 Run As ${tender_owner} Завантажити документ в лот ${file_path} ${TENDER['TENDER_UAID']} ${lot_id} 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 ${empty_list}= Create List 183 ${empty_list}= Create List
163 ${lots_documents}= Get variable value ${USERS.users['${tender_owner}'].lots_documents} ${empty_list} 184 ${lots_documents}= Get variable value ${USERS.users['${tender_owner}'].lots_documents} ${empty_list}
164 Append to list ${lots_documents} ${data} 185 Append to list ${lots_documents} ${data}
@@ -177,7 +198,9 @@ Resource resource.robot @@ -177,7 +198,9 @@ Resource resource.robot
177 ${item}= Підготувати дані для створення предмету закупівлі ${USERS.users['${tender_owner}'].initial_data.data['items'][0]['classification']['id']} 198 ${item}= Підготувати дані для створення предмету закупівлі ${USERS.users['${tender_owner}'].initial_data.data['items'][0]['classification']['id']}
178 Run As ${tender_owner} Додати предмет закупівлі в лот ${TENDER['TENDER_UAID']} ${lot_id} ${item} 199 Run As ${tender_owner} Додати предмет закупівлі в лот ${TENDER['TENDER_UAID']} ${lot_id} ${item}
179 ${item_id}= get_id_from_object ${item} 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 ${item_data}= munch_dict arg=${item_data} 204 ${item_data}= munch_dict arg=${item_data}
182 Set To Dictionary ${USERS.users['${tender_owner}']} item_data=${item_data} 205 Set To Dictionary ${USERS.users['${tender_owner}']} item_data=${item_data}
183 206
@@ -212,12 +235,16 @@ Resource resource.robot @@ -212,12 +235,16 @@ Resource resource.robot
212 Можливість створення лоту із прив’язаним предметом закупівлі 235 Можливість створення лоту із прив’язаним предметом закупівлі
213 ${lot}= Підготувати дані для створення лоту ${USERS.users['${tender_owner}'].tender_data.data.value.amount} 236 ${lot}= Підготувати дані для створення лоту ${USERS.users['${tender_owner}'].tender_data.data.value.amount}
214 ${item}= Підготувати дані для створення предмету закупівлі ${USERS.users['${tender_owner}'].initial_data.data['items'][0]['classification']['id']} 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 ${item_id}= get_id_from_object ${item} 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 ${item_data}= munch_dict arg=${item_data} 243 ${item_data}= munch_dict arg=${item_data}
219 ${lot_id}= get_id_from_object ${lot.data} 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 ${lot_data}= munch_dict arg=${lot_data} 248 ${lot_data}= munch_dict arg=${lot_data}
222 Set To Dictionary ${USERS.users['${tender_owner}']} item_data=${item_data} lot_data=${lot_data} 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,11 +261,21 @@ Resource resource.robot
234 \ Звірити відображення поля ${field} усіх лотів для користувача ${username} 261 \ Звірити відображення поля ${field} усіх лотів для користувача ${username}
235 262
236 263
  264 +Звірити відображення поля ${field} усіх лотів другого етапу для усіх користувачів
  265 + :FOR ${username} IN ${viewer} ${tender_owner} ${provider} ${provider1}
  266 + \ Звірити відображення поля ${field} усіх лотів другого етапу для користувача ${username}
  267 +
  268 +
237 Звірити відображення поля ${field} усіх лотів для користувача ${username} 269 Звірити відображення поля ${field} усіх лотів для користувача ${username}
238 :FOR ${lot_index} IN RANGE ${NUMBER_OF_LOTS} 270 :FOR ${lot_index} IN RANGE ${NUMBER_OF_LOTS}
239 \ Звірити відображення поля ${field} ${lot_index} лоту для користувача ${username} 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 Звірити відображення поля ${field} ${lot_index} лоту для користувача ${username} 279 Звірити відображення поля ${field} ${lot_index} лоту для користувача ${username}
243 Дочекатись синхронізації з майданчиком ${username} 280 Дочекатись синхронізації з майданчиком ${username}
244 ${lot_id}= get_id_from_object ${USERS.users['${tender_owner}'].initial_data.data.lots[${lot_index}]} 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,6 +283,13 @@ Resource resource.robot
246 ... ${USERS.users['${tender_owner}'].initial_data.data.lots[${lot_index}].${field}} ${field} 283 ... ${USERS.users['${tender_owner}'].initial_data.data.lots[${lot_index}].${field}} ${field}
247 ... object_id=${lot_id} 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 Звірити відображення поля ${field} ${lot_index} лоту з ${data} для користувача ${username} 294 Звірити відображення поля ${field} ${lot_index} лоту з ${data} для користувача ${username}
251 ${lot_id}= get_id_from_object ${USERS.users['${tender_owner}'].initial_data.data.lots[${lot_index}]} 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,7 +330,9 @@ Resource resource.robot
286 Set To Dictionary ${feature} featureOf=tenderer 330 Set To Dictionary ${feature} featureOf=tenderer
287 Run As ${tender_owner} Додати неціновий показник на тендер ${TENDER['TENDER_UAID']} ${feature} 331 Run As ${tender_owner} Додати неціновий показник на тендер ${TENDER['TENDER_UAID']} ${feature}
288 ${feature_id}= get_id_from_object ${feature} 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 ${feature_data}= munch_dict arg=${feature_data} 336 ${feature_data}= munch_dict arg=${feature_data}
291 Set To Dictionary ${USERS.users['${tender_owner}']} feature_data=${feature_data} 337 Set To Dictionary ${USERS.users['${tender_owner}']} feature_data=${feature_data}
292 338
@@ -297,7 +343,9 @@ Resource resource.robot @@ -297,7 +343,9 @@ Resource resource.robot
297 ${lot_id}= get_id_from_object ${USERS.users['${tender_owner}'].tender_data.data.lots[${lot_index}]} 343 ${lot_id}= get_id_from_object ${USERS.users['${tender_owner}'].tender_data.data.lots[${lot_index}]}
298 Run As ${tender_owner} Додати неціновий показник на лот ${TENDER['TENDER_UAID']} ${feature} ${lot_id} 344 Run As ${tender_owner} Додати неціновий показник на лот ${TENDER['TENDER_UAID']} ${feature} ${lot_id}
299 ${feature_id}= get_id_from_object ${feature} 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 ${feature_data}= munch_dict arg=${feature_data} 349 ${feature_data}= munch_dict arg=${feature_data}
302 Set To Dictionary ${USERS.users['${tender_owner}']} feature_data=${feature_data} 350 Set To Dictionary ${USERS.users['${tender_owner}']} feature_data=${feature_data}
303 351
@@ -308,7 +356,9 @@ Resource resource.robot @@ -308,7 +356,9 @@ Resource resource.robot
308 ${item_id}= get_id_from_object ${USERS.users['${tender_owner}'].tender_data.data['items'][${item_index}]} 356 ${item_id}= get_id_from_object ${USERS.users['${tender_owner}'].tender_data.data['items'][${item_index}]}
309 Run As ${tender_owner} Додати неціновий показник на предмет ${TENDER['TENDER_UAID']} ${feature} ${item_id} 357 Run As ${tender_owner} Додати неціновий показник на предмет ${TENDER['TENDER_UAID']} ${feature} ${item_id}
310 ${feature_id}= get_id_from_object ${feature} 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 ${feature_data}= munch_dict arg=${feature_data} 362 ${feature_data}= munch_dict arg=${feature_data}
313 Set To Dictionary ${USERS.users['${tender_owner}']} feature_data=${feature_data} 363 Set To Dictionary ${USERS.users['${tender_owner}']} feature_data=${feature_data}
314 364
@@ -357,11 +407,13 @@ Resource resource.robot @@ -357,11 +407,13 @@ Resource resource.robot
357 407
358 Можливість задати запитання на тендер користувачем ${username} 408 Можливість задати запитання на тендер користувачем ${username}
359 ${question}= Підготувати дані для запитання 409 ${question}= Підготувати дані для запитання
360 - ${question_resp}= Run As ${username} Задати запитання на тендер ${TENDER['TENDER_UAID']} ${question} 410 + Run As ${username} Задати запитання на тендер ${TENDER['TENDER_UAID']} ${question}
361 ${now}= Get Current TZdate 411 ${now}= Get Current TZdate
362 ${question.data.date}= Set variable ${now} 412 ${question.data.date}= Set variable ${now}
363 ${question_id}= get_id_from_object ${question.data} 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 ${question_data}= munch_dict arg=${question_data} 417 ${question_data}= munch_dict arg=${question_data}
366 Set To Dictionary ${USERS.users['${username}']} tender_question_data=${question_data} 418 Set To Dictionary ${USERS.users['${username}']} tender_question_data=${question_data}
367 419
@@ -369,11 +421,13 @@ Resource resource.robot @@ -369,11 +421,13 @@ Resource resource.robot
369 Можливість задати запитання на ${lot_index} лот користувачем ${username} 421 Можливість задати запитання на ${lot_index} лот користувачем ${username}
370 ${lot_id}= get_id_from_object ${USERS.users['${tender_owner}'].tender_data.data.lots[${lot_index}]} 422 ${lot_id}= get_id_from_object ${USERS.users['${tender_owner}'].tender_data.data.lots[${lot_index}]}
371 ${question}= Підготувати дані для запитання 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 ${now}= Get Current TZdate 425 ${now}= Get Current TZdate
374 ${question.data.date}= Set variable ${now} 426 ${question.data.date}= Set variable ${now}
375 ${question_id}= get_id_from_object ${question.data} 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 ${question_data}= munch_dict arg=${question_data} 431 ${question_data}= munch_dict arg=${question_data}
378 Set To Dictionary ${USERS.users['${username}']} lots_${lot_index}_question_data=${question_data} 432 Set To Dictionary ${USERS.users['${username}']} lots_${lot_index}_question_data=${question_data}
379 433
@@ -381,11 +435,13 @@ Resource resource.robot @@ -381,11 +435,13 @@ Resource resource.robot
381 Можливість задати запитання на ${item_index} предмет користувачем ${username} 435 Можливість задати запитання на ${item_index} предмет користувачем ${username}
382 ${item_id}= get_id_from_object ${USERS.users['${tender_owner}'].tender_data.data['items'][${item_index}]} 436 ${item_id}= get_id_from_object ${USERS.users['${tender_owner}'].tender_data.data['items'][${item_index}]}
383 ${question}= Підготувати дані для запитання 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 ${now}= Get Current TZdate 439 ${now}= Get Current TZdate
386 ${question.data.date}= Set variable ${now} 440 ${question.data.date}= Set variable ${now}
387 ${question_id}= get_id_from_object ${question.data} 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 ${question_data}= munch_dict arg=${question_data} 445 ${question_data}= munch_dict arg=${question_data}
390 Set To Dictionary ${USERS.users['${username}']} items_${item_index}_question_data=${question_data} 446 Set To Dictionary ${USERS.users['${username}']} items_${item_index}_question_data=${question_data}
391 447
@@ -454,7 +510,9 @@ Resource resource.robot @@ -454,7 +510,9 @@ Resource resource.robot
454 ... Створити чернетку вимоги про виправлення умов закупівлі 510 ... Створити чернетку вимоги про виправлення умов закупівлі
455 ... ${TENDER['TENDER_UAID']} 511 ... ${TENDER['TENDER_UAID']}
456 ... ${claim} 512 ... ${claim}
457 - ${claim_data}= Create Dictionary claim=${claim} complaintID=${complaintID} 513 + ${claim_data}= Create Dictionary
  514 + ... claim=${claim}
  515 + ... complaintID=${complaintID}
458 ${claim_data}= munch_dict arg=${claim_data} 516 ${claim_data}= munch_dict arg=${claim_data}
459 Set To Dictionary ${USERS.users['${provider}']} claim_data ${claim_data} 517 Set To Dictionary ${USERS.users['${provider}']} claim_data ${claim_data}
460 518
@@ -467,7 +525,9 @@ Resource resource.robot @@ -467,7 +525,9 @@ Resource resource.robot
467 ... ${TENDER['TENDER_UAID']} 525 ... ${TENDER['TENDER_UAID']}
468 ... ${claim} 526 ... ${claim}
469 ... ${lot_id} 527 ... ${lot_id}
470 - ${claim_data}= Create Dictionary claim=${claim} complaintID=${complaintID} 528 + ${claim_data}= Create Dictionary
  529 + ... claim=${claim}
  530 + ... complaintID=${complaintID}
471 ${claim_data}= munch_dict arg=${claim_data} 531 ${claim_data}= munch_dict arg=${claim_data}
472 Set To Dictionary ${USERS.users['${provider}']} claim_data ${claim_data} 532 Set To Dictionary ${USERS.users['${provider}']} claim_data ${claim_data}
473 533
@@ -479,7 +539,9 @@ Resource resource.robot @@ -479,7 +539,9 @@ Resource resource.robot
479 ... ${TENDER['TENDER_UAID']} 539 ... ${TENDER['TENDER_UAID']}
480 ... ${claim} 540 ... ${claim}
481 ... ${award_index} 541 ... ${award_index}
482 - ${claim_data}= Create Dictionary claim=${claim} complaintID=${complaintID} 542 + ${claim_data}= Create Dictionary
  543 + ... claim=${claim}
  544 + ... complaintID=${complaintID}
483 ${claim_data}= munch_dict arg=${claim_data} 545 ${claim_data}= munch_dict arg=${claim_data}
484 Set To Dictionary ${USERS.users['${provider}']} claim_data ${claim_data} 546 Set To Dictionary ${USERS.users['${provider}']} claim_data ${claim_data}
485 547
@@ -492,8 +554,13 @@ Resource resource.robot @@ -492,8 +554,13 @@ Resource resource.robot
492 ... ${TENDER['TENDER_UAID']} 554 ... ${TENDER['TENDER_UAID']}
493 ... ${claim} 555 ... ${claim}
494 ... ${file_path} 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 ${claim_data}= munch_dict arg=${claim_data} 564 ${claim_data}= munch_dict arg=${claim_data}
498 Set To Dictionary ${USERS.users['${provider}']} claim_data ${claim_data} 565 Set To Dictionary ${USERS.users['${provider}']} claim_data ${claim_data}
499 Remove File ${file_path} 566 Remove File ${file_path}
@@ -509,8 +576,13 @@ Resource resource.robot @@ -509,8 +576,13 @@ Resource resource.robot
509 ... ${claim} 576 ... ${claim}
510 ... ${lot_id} 577 ... ${lot_id}
511 ... ${file_path} 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 ${claim_data}= munch_dict arg=${claim_data} 586 ${claim_data}= munch_dict arg=${claim_data}
515 Set To Dictionary ${USERS.users['${provider}']} claim_data ${claim_data} 587 Set To Dictionary ${USERS.users['${provider}']} claim_data ${claim_data}
516 Remove File ${file_path} 588 Remove File ${file_path}
@@ -525,8 +597,13 @@ Resource resource.robot @@ -525,8 +597,13 @@ Resource resource.robot
525 ... ${claim} 597 ... ${claim}
526 ... ${award_index} 598 ... ${award_index}
527 ... ${file_path} 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 ${claim_data}= munch_dict arg=${claim_data} 607 ${claim_data}= munch_dict arg=${claim_data}
531 Set To Dictionary ${USERS.users['${provider}']} claim_data ${claim_data} 608 Set To Dictionary ${USERS.users['${provider}']} claim_data ${claim_data}
532 Remove File ${file_path} 609 Remove File ${file_path}
@@ -534,7 +611,9 @@ Resource resource.robot @@ -534,7 +611,9 @@ Resource resource.robot
534 611
535 Можливість скасувати вимогу про виправлення умов закупівлі 612 Можливість скасувати вимогу про виправлення умов закупівлі
536 ${cancellation_reason}= create_fake_sentence 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 ${cancellation_data}= Create Dictionary data=${data} 617 ${cancellation_data}= Create Dictionary data=${data}
539 ${cancellation_data}= munch_dict arg=${cancellation_data} 618 ${cancellation_data}= munch_dict arg=${cancellation_data}
540 Run As ${provider} 619 Run As ${provider}
@@ -555,7 +634,9 @@ Resource resource.robot @@ -555,7 +634,9 @@ Resource resource.robot
555 634
556 Можливість скасувати вимогу про виправлення умов лоту 635 Можливість скасувати вимогу про виправлення умов лоту
557 ${cancellation_reason}= create_fake_sentence 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 ${cancellation_data}= Create Dictionary data=${data} 640 ${cancellation_data}= Create Dictionary data=${data}
560 ${cancellation_data}= munch_dict arg=${cancellation_data} 641 ${cancellation_data}= munch_dict arg=${cancellation_data}
561 Run As ${provider} 642 Run As ${provider}
@@ -577,7 +658,9 @@ Resource resource.robot @@ -577,7 +658,9 @@ Resource resource.robot
577 Можливість скасувати вимогу про виправлення визначення ${award_index} переможця 658 Можливість скасувати вимогу про виправлення визначення ${award_index} переможця
578 ${cancellation_reason}= create_fake_sentence 659 ${cancellation_reason}= create_fake_sentence
579 ${status}= Set variable if 'open' in '${MODE}' stopping cancelled 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 ${cancellation_data}= Create Dictionary data=${data} 664 ${cancellation_data}= Create Dictionary data=${data}
582 ${cancellation_data}= munch_dict arg=${cancellation_data} 665 ${cancellation_data}= munch_dict arg=${cancellation_data}
583 Run As ${provider} 666 Run As ${provider}
@@ -600,7 +683,9 @@ Resource resource.robot @@ -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 ${escalation_data}= Create Dictionary data=${data} 689 ${escalation_data}= Create Dictionary data=${data}
605 ${escalation_data}= munch_dict arg=${escalation_data} 690 ${escalation_data}= munch_dict arg=${escalation_data}
606 Run As ${provider} 691 Run As ${provider}
@@ -620,7 +705,9 @@ Resource resource.robot @@ -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 ${escalation_data}= Create Dictionary data=${data} 711 ${escalation_data}= Create Dictionary data=${data}
625 ${escalation_data}= munch_dict arg=${escalation_data} 712 ${escalation_data}= munch_dict arg=${escalation_data}
626 Run As ${provider} 713 Run As ${provider}
@@ -640,7 +727,9 @@ Resource resource.robot @@ -640,7 +727,9 @@ Resource resource.robot
640 727
641 728
642 Можливість перетворити вимогу про виправлення визначення ${award_index} переможця в скаргу 729 Можливість перетворити вимогу про виправлення визначення ${award_index} переможця в скаргу
643 - ${data}= Create Dictionary status=pending satisfied=${False} 730 + ${data}= Create Dictionary
  731 + ... status=pending
  732 + ... satisfied=${False}
644 ${escalation_data}= Create Dictionary data=${data} 733 ${escalation_data}= Create Dictionary data=${data}
645 ${escalation_data}= munch_dict arg=${escalation_data} 734 ${escalation_data}= munch_dict arg=${escalation_data}
646 Run As ${provider} 735 Run As ${provider}
@@ -746,7 +835,9 @@ Resource resource.robot @@ -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 ${confirmation_data}= Create Dictionary data=${data} 841 ${confirmation_data}= Create Dictionary data=${data}
751 ${confirmation_data}= munch_dict arg=${confirmation_data} 842 ${confirmation_data}= munch_dict arg=${confirmation_data}
752 Run As ${provider} 843 Run As ${provider}
@@ -766,7 +857,9 @@ Resource resource.robot @@ -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 ${confirmation_data}= Create Dictionary data=${data} 863 ${confirmation_data}= Create Dictionary data=${data}
771 ${confirmation_data}= munch_dict arg=${confirmation_data} 864 ${confirmation_data}= munch_dict arg=${confirmation_data}
772 Run As ${provider} 865 Run As ${provider}
@@ -786,7 +879,9 @@ Resource resource.robot @@ -786,7 +879,9 @@ Resource resource.robot
786 879
787 880
788 Можливість підтвердити задоволення вимоги про виправлення визначення ${award_index} переможця 881 Можливість підтвердити задоволення вимоги про виправлення визначення ${award_index} переможця
789 - ${data}= Create Dictionary status=resolved satisfied=${True} 882 + ${data}= Create Dictionary
  883 + ... status=resolved
  884 + ... satisfied=${True}
790 ${confirmation_data}= Create Dictionary data=${data} 885 ${confirmation_data}= Create Dictionary data=${data}
791 ${confirmation_data}= munch_dict arg=${confirmation_data} 886 ${confirmation_data}= munch_dict arg=${confirmation_data}
792 Run As ${provider} 887 Run As ${provider}
@@ -822,7 +917,22 @@ Resource resource.robot @@ -822,7 +917,22 @@ Resource resource.robot
822 ############################################################################################## 917 ##############################################################################################
823 918
824 Можливість подати цінову пропозицію користувачем ${username} 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 ${bidresponses}= Create Dictionary bid=${bid} 936 ${bidresponses}= Create Dictionary bid=${bid}
827 Set To Dictionary ${USERS.users['${username}']} bidresponses=${bidresponses} 937 Set To Dictionary ${USERS.users['${username}']} bidresponses=${bidresponses}
828 ${lots}= Get Variable Value ${USERS.users['${username}'].tender_data.data.lots} ${None} 938 ${lots}= Get Variable Value ${USERS.users['${username}'].tender_data.data.lots} ${None}
@@ -833,12 +943,10 @@ Resource resource.robot @@ -833,12 +943,10 @@ Resource resource.robot
833 ${features_ids}= Run Keyword IF ${features} 943 ${features_ids}= Run Keyword IF ${features}
834 ... Отримати ідентифікатори об’єктів ${username} features 944 ... Отримати ідентифікатори об’єктів ${username} features
835 ... ELSE Set Variable ${None} 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 Неможливість подати цінову пропозицію без прив’язки до лоту користувачем ${username} 948 Неможливість подати цінову пропозицію без прив’язки до лоту користувачем ${username}
841 - ${bid}= Підготувати дані для подання пропозиції ${username} 949 + ${bid}= Підготувати дані для подання пропозиції
842 ${values}= Get Variable Value ${bid.data.lotValues[0]} 950 ${values}= Get Variable Value ${bid.data.lotValues[0]}
843 Remove From Dictionary ${bid.data} lotValues 951 Remove From Dictionary ${bid.data} lotValues
844 Set_To_Object ${bid} data ${values} 952 Set_To_Object ${bid} data ${values}
@@ -846,7 +954,7 @@ Resource resource.robot @@ -846,7 +954,7 @@ Resource resource.robot
846 954
847 955
848 Неможливість подати цінову пропозицію без нецінових показників користувачем ${username} 956 Неможливість подати цінову пропозицію без нецінових показників користувачем ${username}
849 - ${bid}= Підготувати дані для подання пропозиції ${username} 957 + ${bid}= Підготувати дані для подання пропозиції
850 Remove From Dictionary ${bid.data} parameters 958 Remove From Dictionary ${bid.data} parameters
851 Require Failure ${username} Подати цінову пропозицію ${TENDER['TENDER_UAID']} ${bid} 959 Require Failure ${username} Подати цінову пропозицію ${TENDER['TENDER_UAID']} ${bid}
852 960
@@ -862,16 +970,25 @@ Resource resource.robot @@ -862,16 +970,25 @@ Resource resource.robot
862 970
863 Можливість завантажити документ в пропозицію користувачем ${username} 971 Можливість завантажити документ в пропозицію користувачем ${username}
864 ${file_path} ${file_name} ${file_content}= create_fake_doc 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 Remove File ${file_path} 980 Remove File ${file_path}
868 981
869 982
870 Можливість змінити документацію цінової пропозиції користувачем ${username} 983 Можливість змінити документацію цінової пропозиції користувачем ${username}
871 ${file_path} ${file_name} ${file_content}= create_fake_doc 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 Remove File ${file_path} 992 Remove File ${file_path}
876 993
877 ############################################################################################## 994 ##############################################################################################
@@ -885,15 +1002,16 @@ Resource resource.robot @@ -885,15 +1002,16 @@ Resource resource.robot
885 # Awarding 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 ${file_path} ${file_name} ${file_content}= create_fake_doc 1008 ${file_path} ${file_name} ${file_content}= create_fake_doc
891 Run as ${tender_owner} 1009 Run as ${tender_owner}
892 ... Створити постачальника, додати документацію і підтвердити його 1010 ... Створити постачальника, додати документацію і підтвердити його
893 ... ${TENDER['TENDER_UAID']} 1011 ... ${TENDER['TENDER_UAID']}
894 ... ${supplier_data} 1012 ... ${supplier_data}
895 ... ${file_path} 1013 ... ${file_path}
896 - ${doc_id}= get_id_from_doc_name ${file_name} 1014 + ${doc_id}= get_id_from_string ${file_name}
897 Set to dictionary ${USERS.users['${tender_owner}']} award_doc_name=${file_name} award_doc_id=${doc_id} award_doc_content=${file_content} 1015 Set to dictionary ${USERS.users['${tender_owner}']} award_doc_name=${file_name} award_doc_id=${doc_id} award_doc_content=${file_content}
898 Remove File ${file_path} 1016 Remove File ${file_path}
899 1017
@@ -903,4 +1021,4 @@ Resource resource.robot @@ -903,4 +1021,4 @@ Resource resource.robot
903 ... Підтвердити підписання контракту 1021 ... Підтвердити підписання контракту
904 ... ${TENDER['TENDER_UAID']} 1022 ... ${TENDER['TENDER_UAID']}
905 ... ${0} 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,9 +19,9 @@ Library openprocurement_client_helper.py
19 Підготувати клієнт для користувача 19 Підготувати клієнт для користувача
20 [Arguments] ${username} 20 [Arguments] ${username}
21 [Documentation] Відкрити браузер, створити об’єкт api wrapper, тощо 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 Set To Dictionary ${USERS.users['${username}']} client=${api_wrapper} 25 Set To Dictionary ${USERS.users['${username}']} client=${api_wrapper}
26 Set To Dictionary ${USERS.users['${username}']} access_token=${EMPTY} 26 Set To Dictionary ${USERS.users['${username}']} access_token=${EMPTY}
27 ${id_map}= Create Dictionary 27 ${id_map}= Create Dictionary
@@ -38,6 +38,7 @@ Library openprocurement_client_helper.py @@ -38,6 +38,7 @@ Library openprocurement_client_helper.py
38 ${tender}= set_access_key ${tender} ${USERS.users['${username}'].access_token} 38 ${tender}= set_access_key ${tender} ${USERS.users['${username}'].access_token}
39 ${reply}= Call Method ${USERS.users['${username}'].client} upload_document ${filepath} ${tender} 39 ${reply}= Call Method ${USERS.users['${username}'].client} upload_document ${filepath} ${tender}
40 Log object data ${reply} reply 40 Log object data ${reply} reply
  41 + #return here is needed to have uploaded doc data in `Завантажити документ в лот` keyword
41 [return] ${reply} 42 [return] ${reply}
42 43
43 44
@@ -77,8 +78,15 @@ Library openprocurement_client_helper.py @@ -77,8 +78,15 @@ Library openprocurement_client_helper.py
77 Створити тендер 78 Створити тендер
78 [Arguments] ${username} ${tender_data} 79 [Arguments] ${username} ${tender_data}
79 ${tender}= Call Method ${USERS.users['${username}'].client} create_tender ${tender_data} 80 ${tender}= Call Method ${USERS.users['${username}'].client} create_tender ${tender_data}
80 - Log object data ${tender} created_tender 81 + Log ${tender}
81 ${access_token}= Get Variable Value ${tender.access.token} 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 Set To Dictionary ${USERS.users['${username}']} access_token=${access_token} 90 Set To Dictionary ${USERS.users['${username}']} access_token=${access_token}
83 Set To Dictionary ${USERS.users['${username}']} tender_data=${tender} 91 Set To Dictionary ${USERS.users['${username}']} tender_data=${tender}
84 Log ${USERS.users['${username}'].tender_data} 92 Log ${USERS.users['${username}'].tender_data}
@@ -86,16 +94,25 @@ Library openprocurement_client_helper.py @@ -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 ${internalid}= openprocurement_client.Отримати internal id по UAid ${username} ${tender_uaid} 98 ${internalid}= openprocurement_client.Отримати internal id по UAid ${username} ${tender_uaid}
91 ${tender}= Call Method ${USERS.users['${username}'].client} get_tender ${internalid} 99 ${tender}= Call Method ${USERS.users['${username}'].client} get_tender ${internalid}
92 ${tender}= set_access_key ${tender} ${USERS.users['${username}'].access_token} 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 ${tender}= munch_dict arg=${tender} 102 ${tender}= munch_dict arg=${tender}
95 Log ${tender} 103 Log ${tender}
96 [return] ${tender} 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 [Arguments] ${username} ${tender_uaid} 117 [Arguments] ${username} ${tender_uaid}
101 openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} 118 openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
@@ -159,6 +176,7 @@ Library openprocurement_client_helper.py @@ -159,6 +176,7 @@ Library openprocurement_client_helper.py
159 [Arguments] ${username} ${tender_uaid} ${lot} 176 [Arguments] ${username} ${tender_uaid} ${lot}
160 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} 177 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
161 ${reply}= Call Method ${USERS.users['${username}'].client} create_lot ${tender} ${lot} 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 [return] ${reply} 180 [return] ${reply}
163 181
164 182
@@ -167,7 +185,6 @@ Library openprocurement_client_helper.py @@ -167,7 +185,6 @@ Library openprocurement_client_helper.py
167 ${reply}= openprocurement_client.Створити лот ${username} ${tender_uaid} ${lot} 185 ${reply}= openprocurement_client.Створити лот ${username} ${tender_uaid} ${lot}
168 ${lot_id}= get_id_from_object ${lot.data} 186 ${lot_id}= get_id_from_object ${lot.data}
169 openprocurement_client.Додати предмет закупівлі в лот ${username} ${tender_uaid} ${lot_id} ${item} 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,7 +200,6 @@ Library openprocurement_client_helper.py
183 ${lot}= Create Dictionary data=${tender.data.lots[${lot_index}]} 200 ${lot}= Create Dictionary data=${tender.data.lots[${lot_index}]}
184 Set_To_Object ${lot.data} ${fieldname} ${fieldvalue} 201 Set_To_Object ${lot.data} ${fieldname} ${fieldvalue}
185 ${reply}= Call Method ${USERS.users['${username}'].client} patch_lot ${tender} ${lot} 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,7 +220,6 @@ Library openprocurement_client_helper.py
204 ${doc}= openprocurement_client.Завантажити документ ${username} ${filepath} ${tender_uaid} 220 ${doc}= openprocurement_client.Завантажити документ ${username} ${filepath} ${tender_uaid}
205 ${lot_doc}= test_lot_document_data ${doc} ${lot_id} 221 ${lot_doc}= test_lot_document_data ${doc} ${lot_id}
206 ${reply}= Call Method ${USERS.users['${username}'].client} patch_document ${tender} ${lot_doc} 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,14 +232,16 @@ Library openprocurement_client_helper.py
217 \ Run Keyword If '${item.relatedLot}'=='${lot.data.id}' 232 \ Run Keyword If '${item.relatedLot}'=='${lot.data.id}'
218 \ ... openprocurement_client.Видалити предмет закупівлі ${username} ${tender_uaid} ${item_id} 233 \ ... openprocurement_client.Видалити предмет закупівлі ${username} ${tender_uaid} ${item_id}
219 ${reply}= Call Method ${USERS.users['${username}'].client} delete_lot ${tender} ${lot} 234 ${reply}= Call Method ${USERS.users['${username}'].client} delete_lot ${tender} ${lot}
220 - [return] ${reply}  
221 235
222 236
223 Скасувати лот 237 Скасувати лот
224 [Arguments] ${username} ${tender_uaid} ${lot_id} ${cancellation_reason} ${document} ${new_description} 238 [Arguments] ${username} ${tender_uaid} ${lot_id} ${cancellation_reason} ${document} ${new_description}
225 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} 239 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
226 ${lot_id}= Get Variable Value ${tender.data.lots[${lot_index}].id} 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 ${cancellation_data}= Create dictionary data=${data} 245 ${cancellation_data}= Create dictionary data=${data}
229 ${cancellation_data}= munch_dict arg=${cancellation_data} 246 ${cancellation_data}= munch_dict arg=${cancellation_data}
230 ${cancel_reply}= Call Method ${USERS.users['${username}'].client} create_cancellation ${tender} ${cancellation_data} 247 ${cancel_reply}= Call Method ${USERS.users['${username}'].client} create_cancellation ${tender} ${cancellation_data}
@@ -302,7 +319,6 @@ Library openprocurement_client_helper.py @@ -302,7 +319,6 @@ Library openprocurement_client_helper.py
302 ${item_id}= Get Variable Value ${tender.data['items'][${item_index}].id} 319 ${item_id}= Get Variable Value ${tender.data['items'][${item_index}].id}
303 ${question}= test_related_question ${question} item ${item_id} 320 ${question}= test_related_question ${question} item ${item_id}
304 ${reply}= Call Method ${USERS.users['${username}'].client} create_question ${tender} ${question} 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,14 +328,12 @@ Library openprocurement_client_helper.py
312 ${lot_id}= Get Variable Value ${tender.data.lots[${lot_index}].id} 328 ${lot_id}= Get Variable Value ${tender.data.lots[${lot_index}].id}
313 ${question}= test_related_question ${question} lot ${lot_id} 329 ${question}= test_related_question ${question} lot ${lot_id}
314 ${reply}= Call Method ${USERS.users['${username}'].client} create_question ${tender} ${question} 330 ${reply}= Call Method ${USERS.users['${username}'].client} create_question ${tender} ${question}
315 - [return] ${reply}  
316 331
317 332
318 Задати запитання на тендер 333 Задати запитання на тендер
319 [Arguments] ${username} ${tender_uaid} ${question} 334 [Arguments] ${username} ${tender_uaid} ${question}
320 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} 335 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
321 ${reply}= Call Method ${USERS.users['${username}'].client} create_question ${tender} ${question} 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,7 +348,6 @@ Library openprocurement_client_helper.py
334 ${tender}= set_access_key ${tender} ${USERS.users['${username}'].access_token} 348 ${tender}= set_access_key ${tender} ${USERS.users['${username}'].access_token}
335 ${answer_data.data.id}= openprocurement_client.Отримати інформацію із запитання ${username} ${tender_uaid} ${question_id} id 349 ${answer_data.data.id}= openprocurement_client.Отримати інформацію із запитання ${username} ${tender_uaid} ${question_id} id
336 ${reply}= Call Method ${USERS.users['${username}'].client} patch_question ${tender} ${answer_data} 350 ${reply}= Call Method ${USERS.users['${username}'].client} patch_question ${tender} ${answer_data}
337 - [return] ${reply}  
338 351
339 ############################################################################## 352 ##############################################################################
340 # Claims 353 # Claims
@@ -698,10 +711,13 @@ Library openprocurement_client_helper.py @@ -698,10 +711,13 @@ Library openprocurement_client_helper.py
698 \ ${code}= Get Variable Value ${tender.data.features[${feature_index}].code} 711 \ ${code}= Get Variable Value ${tender.data.features[${feature_index}].code}
699 \ Set To Dictionary ${bid.data.parameters[${index}]} code=${code} 712 \ Set To Dictionary ${bid.data.parameters[${index}]} code=${code}
700 ${reply}= Call Method ${USERS.users['${username}'].client} create_bid ${tender} ${bid} 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 Set To Dictionary ${USERS.users['${username}']} access_token=${reply['access']['token']} 718 Set To Dictionary ${USERS.users['${username}']} access_token=${reply['access']['token']}
702 Set To Dictionary ${USERS.users['${username}'].bidresponses['bid'].data} id=${reply['data']['id']} 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,57 +725,62 @@ Library openprocurement_client_helper.py
709 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} 725 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
710 ${bid}= openprocurement_client.Отримати пропозицію ${username} ${tender_uaid} 726 ${bid}= openprocurement_client.Отримати пропозицію ${username} ${tender_uaid}
711 Set_To_Object ${bid.data} ${fieldname} ${fieldvalue} 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 ${reply}= Call Method ${USERS.users['${username}'].client} patch_bid ${tender} ${bid} 729 ${reply}= Call Method ${USERS.users['${username}'].client} patch_bid ${tender} ${bid}
714 Log ${reply} 730 Log ${reply}
715 - [return] ${reply}  
716 731
717 732
718 Скасувати цінову пропозицію 733 Скасувати цінову пропозицію
719 [Arguments] ${username} ${tender_uaid} 734 [Arguments] ${username} ${tender_uaid}
720 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} 735 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
721 ${bid_id}= openprocurement_client.Отримати інформацію із пропозиції ${username} ${tender_uaid} id 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 Log ${reply} 738 Log ${reply}
724 - [return] ${reply}  
725 739
726 740
727 Завантажити документ в ставку 741 Завантажити документ в ставку
728 [Arguments] ${username} ${path} ${tender_uaid} ${doc_type}=documents 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 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} 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 ${response}= Call Method ${USERS.users['${username}'].client} upload_bid_document ${path} ${tender} ${bid_id} ${doc_type} 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 Log object data ${uploaded_file} 750 Log object data ${uploaded_file}
735 [return] ${uploaded_file} 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 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} 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 Log object data ${uploaded_file} 765 Log object data ${uploaded_file}
746 [return] ${uploaded_file} 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 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} 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 [Arguments] ${username} ${tender_uaid} 780 [Arguments] ${username} ${tender_uaid}
760 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} 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 ${reply}= Call Method ${USERS.users['${username}'].client} get_bid ${tender} ${bid_id} ${token} 784 ${reply}= Call Method ${USERS.users['${username}'].client} get_bid ${tender} ${bid_id} ${token}
764 ${reply}= munch_dict arg=${reply} 785 ${reply}= munch_dict arg=${reply}
765 [return] ${reply} 786 [return] ${reply}
@@ -791,7 +812,6 @@ Library openprocurement_client_helper.py @@ -791,7 +812,6 @@ Library openprocurement_client_helper.py
791 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} 812 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
792 ${doc}= Call Method ${USERS.users['${username}'].client} upload_award_document ${document} ${tender} ${tender.data.awards[${award_num}].id} 813 ${doc}= Call Method ${USERS.users['${username}'].client} upload_award_document ${document} ${tender} ${tender.data.awards[${award_num}].id}
793 Log ${doc} 814 Log ${doc}
794 - [Return] ${doc}  
795 815
796 816
797 Підтвердити постачальника 817 Підтвердити постачальника
@@ -836,7 +856,6 @@ Library openprocurement_client_helper.py @@ -836,7 +856,6 @@ Library openprocurement_client_helper.py
836 Set To Dictionary ${award.data} id=${tender.data.awards[${award_num}].id} 856 Set To Dictionary ${award.data} id=${tender.data.awards[${award_num}].id}
837 ${reply}= Call Method ${USERS.users['${username}'].client} patch_award ${tender} ${award} 857 ${reply}= Call Method ${USERS.users['${username}'].client} patch_award ${tender} ${award}
838 Log ${reply} 858 Log ${reply}
839 - [Return] ${reply}  
840 859
841 ############################################################################## 860 ##############################################################################
842 # Limited procurement 861 # Limited procurement
@@ -920,7 +939,7 @@ Library openprocurement_client_helper.py @@ -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 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} 943 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
925 ${document}= get_document_by_id ${tender.data} ${doc_id} 944 ${document}= get_document_by_id ${tender.data} ${doc_id}
926 Log ${document} 945 Log ${document}
@@ -928,7 +947,7 @@ Library openprocurement_client_helper.py @@ -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 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} 951 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
933 ${document}= get_document_by_id ${tender.data} ${doc_id} 952 ${document}= get_document_by_id ${tender.data} ${doc_id}
934 ${filename}= download_file_from_url ${document.url} ${OUTPUT_DIR}${/}${document.title} 953 ${filename}= download_file_from_url ${document.url} ${OUTPUT_DIR}${/}${document.title}
@@ -962,7 +981,6 @@ Library openprocurement_client_helper.py @@ -962,7 +981,6 @@ Library openprocurement_client_helper.py
962 Set To Dictionary ${qualification.data} id=${tender.data.qualifications[${qualification_num}].id} eligible=${True} qualified=${True} 981 Set To Dictionary ${qualification.data} id=${tender.data.qualifications[${qualification_num}].id} eligible=${True} qualified=${True}
963 ${reply}= Call Method ${USERS.users['${username}'].client} patch_qualification ${tender} ${qualification} 982 ${reply}= Call Method ${USERS.users['${username}'].client} patch_qualification ${tender} ${qualification}
964 Log ${reply} 983 Log ${reply}
965 - [Return] ${reply}  
966 984
967 985
968 Відхилити кваліфікацію 986 Відхилити кваліфікацію
@@ -976,7 +994,6 @@ Library openprocurement_client_helper.py @@ -976,7 +994,6 @@ Library openprocurement_client_helper.py
976 Set To Dictionary ${qualification.data} id=${tender.data.qualifications[${qualification_num}].id} 994 Set To Dictionary ${qualification.data} id=${tender.data.qualifications[${qualification_num}].id}
977 ${reply}= Call Method ${USERS.users['${username}'].client} patch_qualification ${tender} ${qualification} 995 ${reply}= Call Method ${USERS.users['${username}'].client} patch_qualification ${tender} ${qualification}
978 Log ${reply} 996 Log ${reply}
979 - [Return] ${reply}  
980 997
981 998
982 Завантажити документ у кваліфікацію 999 Завантажити документ у кваліфікацію
@@ -988,7 +1005,6 @@ Library openprocurement_client_helper.py @@ -988,7 +1005,6 @@ Library openprocurement_client_helper.py
988 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} 1005 ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
989 ${doc_reply}= Call Method ${USERS.users['${username}'].client} upload_qualification_document ${document} ${tender} ${tender.data.qualifications[${qualification_num}].id} 1006 ${doc_reply}= Call Method ${USERS.users['${username}'].client} upload_qualification_document ${document} ${tender} ${tender.data.qualifications[${qualification_num}].id}
990 Log ${doc_reply} 1007 Log ${doc_reply}
991 - [Return] ${doc_reply}  
992 1008
993 1009
994 Скасувати кваліфікацію 1010 Скасувати кваліфікацію
@@ -1002,7 +1018,6 @@ Library openprocurement_client_helper.py @@ -1002,7 +1018,6 @@ Library openprocurement_client_helper.py
1002 Set To Dictionary ${qualification.data} id=${tender.data.qualifications[${qualification_num}].id} 1018 Set To Dictionary ${qualification.data} id=${tender.data.qualifications[${qualification_num}].id}
1003 ${reply}= Call Method ${USERS.users['${username}'].client} patch_qualification ${tender} ${qualification} 1019 ${reply}= Call Method ${USERS.users['${username}'].client} patch_qualification ${tender} ${qualification}
1004 Log ${reply} 1020 Log ${reply}
1005 - [Return] ${reply}  
1006 1021
1007 1022
1008 Затвердити остаточне рішення кваліфікації 1023 Затвердити остаточне рішення кваліфікації
@@ -1019,7 +1034,6 @@ Library openprocurement_client_helper.py @@ -1019,7 +1034,6 @@ Library openprocurement_client_helper.py
1019 set_to_object ${tender} data.status active.pre-qualification.stand-still 1034 set_to_object ${tender} data.status active.pre-qualification.stand-still
1020 ${reply}= Call Method ${USERS.users['${username}'].client} patch_tender ${tender} 1035 ${reply}= Call Method ${USERS.users['${username}'].client} patch_tender ${tender}
1021 Log ${reply} 1036 Log ${reply}
1022 - [Return] ${reply}  
1023 1037
1024 1038
1025 Перевести тендер на статус очікування обробки мостом 1039 Перевести тендер на статус очікування обробки мостом
@@ -1036,4 +1050,19 @@ Library openprocurement_client_helper.py @@ -1036,4 +1050,19 @@ Library openprocurement_client_helper.py
1036 set_to_object ${tender} data.status active.stage2.waiting 1050 set_to_object ${tender} data.status active.stage2.waiting
1037 ${reply}= Call Method ${USERS.users['${username}'].client} patch_tender ${tender} 1051 ${reply}= Call Method ${USERS.users['${username}'].client} patch_tender ${tender}
1038 Log ${reply} 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,7 +10,7 @@ import urllib
10 def retry_if_request_failed(exception): 10 def retry_if_request_failed(exception):
11 if isinstance(exception, RequestFailed): 11 if isinstance(exception, RequestFailed):
12 status_code = getattr(exception, 'status_int', None) 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 return True 14 return True
15 else: 15 else:
16 return False 16 return False
@@ -65,6 +65,10 @@ def get_document_by_id(data, doc_id): @@ -65,6 +65,10 @@ def get_document_by_id(data, doc_id):
65 for document in cancellation.get('documents', []): 65 for document in cancellation.get('documents', []):
66 if doc_id in document.get('title', ''): 66 if doc_id in document.get('title', ''):
67 return document 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 raise Exception('Document with id {} not found'.format(doc_id)) 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,6 +20,7 @@ Suite Teardown Test Suite Teardown
20 ############################################################################################## 20 ##############################################################################################
21 # TENDER CANCELLATION 21 # TENDER CANCELLATION
22 ############################################################################################## 22 ##############################################################################################
  23 +
23 Можливість скасувати тендер 24 Можливість скасувати тендер
24 [Tags] ${USERS.users['${tender_owner}'].broker}: Скасування тендера 25 [Tags] ${USERS.users['${tender_owner}'].broker}: Скасування тендера
25 ... tender_owner 26 ... tender_owner
@@ -46,7 +47,7 @@ Suite Teardown Test Suite Teardown @@ -46,7 +47,7 @@ Suite Teardown Test Suite Teardown
46 ... ${USERS.users['${viewer}'].broker} 47 ... ${USERS.users['${viewer}'].broker}
47 ... tender_cancelation 48 ... tender_cancelation
48 Звірити поле тендера із значенням ${viewer} ${TENDER['TENDER_UAID']} 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 ... cancellations[0].reason 51 ... cancellations[0].reason
51 52
52 53
@@ -55,7 +56,7 @@ Suite Teardown Test Suite Teardown @@ -55,7 +56,7 @@ Suite Teardown Test Suite Teardown
55 ... viewer 56 ... viewer
56 ... ${USERS.users['${viewer}'].broker} 57 ... ${USERS.users['${viewer}'].broker}
57 ... tender_cancelation 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,7 +64,7 @@ Suite Teardown Test Suite Teardown
63 ... viewer 64 ... viewer
64 ... ${USERS.users['${viewer}'].broker} 65 ... ${USERS.users['${viewer}'].broker}
65 ... tender_cancelation 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,7 +72,7 @@ Suite Teardown Test Suite Teardown
71 ... viewer 72 ... viewer
72 ... ${USERS.users['${viewer}'].broker} 73 ... ${USERS.users['${viewer}'].broker}
73 ... tender_cancelation 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 # LOT CANCELLATION 78 # LOT CANCELLATION
@@ -103,7 +104,7 @@ Suite Teardown Test Suite Teardown @@ -103,7 +104,7 @@ Suite Teardown Test Suite Teardown
103 ... ${USERS.users['${viewer}'].broker} 104 ... ${USERS.users['${viewer}'].broker}
104 ... lot_cancelation 105 ... lot_cancelation
105 Звірити поле тендера із значенням ${viewer} ${TENDER['TENDER_UAID']} 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 ... cancellations[0].reason 108 ... cancellations[0].reason
108 109
109 110
@@ -112,7 +113,7 @@ Suite Teardown Test Suite Teardown @@ -112,7 +113,7 @@ Suite Teardown Test Suite Teardown
112 ... viewer 113 ... viewer
113 ... ${USERS.users['${viewer}'].broker} 114 ... ${USERS.users['${viewer}'].broker}
114 ... lot_cancelation 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,7 +121,7 @@ Suite Teardown Test Suite Teardown
120 ... viewer 121 ... viewer
121 ... ${USERS.users['${viewer}'].broker} 122 ... ${USERS.users['${viewer}'].broker}
122 ... lot_cancelation 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,7 +129,7 @@ Suite Teardown Test Suite Teardown
128 ... viewer 129 ... viewer
129 ... ${USERS.users['${viewer}'].broker} 130 ... ${USERS.users['${viewer}'].broker}
130 ... lot_cancelation 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 # DELETING LOT 135 # DELETING LOT
@@ -145,17 +146,18 @@ Suite Teardown Test Suite Teardown @@ -145,17 +146,18 @@ Suite Teardown Test Suite Teardown
145 146
146 *** Keywords *** 147 *** Keywords ***
147 Можливість скасувати тендер 148 Можливість скасувати тендер
148 - ${cancellation_data}= Підготувати дані про скасування ${tender_owner} 149 + ${cancellation_data}= Підготувати дані про скасування
149 Run As ${tender_owner} 150 Run As ${tender_owner}
150 ... Скасувати закупівлю 151 ... Скасувати закупівлю
151 ... ${TENDER['TENDER_UAID']} 152 ... ${TENDER['TENDER_UAID']}
152 ... ${cancellation_data['cancellation_reason']} 153 ... ${cancellation_data['cancellation_reason']}
153 ... ${cancellation_data['document']['doc_path']} 154 ... ${cancellation_data['document']['doc_path']}
154 ... ${cancellation_data['description']} 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 Run As ${tender_owner} 161 Run As ${tender_owner}
160 ... Скасувати лот 162 ... Скасувати лот
161 ... ${TENDER['TENDER_UAID']} 163 ... ${TENDER['TENDER_UAID']}
@@ -163,14 +165,15 @@ Suite Teardown Test Suite Teardown @@ -163,14 +165,15 @@ Suite Teardown Test Suite Teardown
163 ... ${cancellation_data['cancellation_reason']} 165 ... ${cancellation_data['cancellation_reason']}
164 ... ${cancellation_data['document']['doc_path']} 166 ... ${cancellation_data['document']['doc_path']}
165 ... ${cancellation_data['description']} 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 Порівняти об'єкти ${left} ${right} 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 ${right}= Get File ${OUTPUT_DIR}${/}${file_name} 178 ${right}= Get File ${OUTPUT_DIR}${/}${file_name}
176 Порівняти об'єкти ${left} ${right} 179 Порівняти об'єкти ${left} ${right}
@@ -145,6 +145,7 @@ PublicPortal: @@ -145,6 +145,7 @@ PublicPortal:
145 keywords_file: publicportal 145 keywords_file: publicportal
146 roles: 146 roles:
147 viewer: PublicPortal_Viewer 147 viewer: PublicPortal_Viewer
  148 + timeout_on_wait: 300
148 SmartTender: 149 SmartTender:
149 intervals: 150 intervals:
150 default: 151 default:
@@ -202,10 +202,10 @@ users: @@ -202,10 +202,10 @@ users:
202 size: [1000, 720] 202 size: [1000, 720]
203 PublicPortal_Viewer: 203 PublicPortal_Viewer:
204 broker: PublicPortal 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 SmartTender_Viewer: 209 SmartTender_Viewer:
210 broker: SmartTender 210 broker: SmartTender
211 homepage: "http://test.smarttender.biz/test-tenders?allcat=1" 211 homepage: "http://test.smarttender.biz/test-tenders?allcat=1"
1 # -*- coding: utf-8 - 1 # -*- coding: utf-8 -
2 from datetime import timedelta 2 from datetime import timedelta
3 from faker import Factory 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 from munch import munchify 6 from munch import munchify
5 from uuid import uuid4 7 from uuid import uuid4
6 from tempfile import NamedTemporaryFile 8 from tempfile import NamedTemporaryFile
@@ -10,10 +12,16 @@ import os @@ -10,10 +12,16 @@ import os
10 import random 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 def create_fake_sentence(): 27 def create_fake_sentence():
@@ -45,7 +53,7 @@ def create_fake_doc(): @@ -45,7 +53,7 @@ def create_fake_doc():
45 tf = NamedTemporaryFile(delete=False, suffix=suffix, prefix=prefix) 53 tf = NamedTemporaryFile(delete=False, suffix=suffix, prefix=prefix)
46 tf.write(content) 54 tf.write(content)
47 tf.close() 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 def test_tender_data(params, periods=("enquiry", "tender")): 59 def test_tender_data(params, periods=("enquiry", "tender")):
@@ -127,6 +135,7 @@ def test_tender_data(params, periods=("enquiry", "tender")): @@ -127,6 +135,7 @@ def test_tender_data(params, periods=("enquiry", "tender")):
127 data['features'].append(new_feature) 135 data['features'].append(new_feature)
128 if not data['features']: 136 if not data['features']:
129 del data['features'] 137 del data['features']
  138 + data['status'] = 'draft'
130 return munchify(data) 139 return munchify(data)
131 140
132 141
@@ -136,6 +145,8 @@ def test_tender_data_limited(params): @@ -136,6 +145,8 @@ def test_tender_data_limited(params):
136 del data["minimalStep"] 145 del data["minimalStep"]
137 del data["enquiryPeriod"] 146 del data["enquiryPeriod"]
138 del data["tenderPeriod"] 147 del data["tenderPeriod"]
  148 + for lot in data.get('lots', []):
  149 + lot.pop('minimalStep', None)
139 data["procuringEntity"]["kind"] = "general" 150 data["procuringEntity"]["kind"] = "general"
140 data.update({"procurementMethodType": params['mode'], "procurementMethod": "limited"}) 151 data.update({"procurementMethodType": params['mode'], "procurementMethod": "limited"})
141 if params['mode'] == "negotiation": 152 if params['mode'] == "negotiation":
@@ -267,6 +278,7 @@ def test_bid_data(): @@ -267,6 +278,7 @@ def test_bid_data():
267 }) 278 })
268 bid.data.tenderers[0].address.countryName_en = translate_country_en(bid.data.tenderers[0].address.countryName) 279 bid.data.tenderers[0].address.countryName_en = translate_country_en(bid.data.tenderers[0].address.countryName)
269 bid.data.tenderers[0].address.countryName_ru = translate_country_ru(bid.data.tenderers[0].address.countryName) 280 bid.data.tenderers[0].address.countryName_ru = translate_country_ru(bid.data.tenderers[0].address.countryName)
  281 + bid.data['status'] = 'draft'
270 return bid 282 return bid
271 283
272 284
@@ -302,7 +314,10 @@ def test_item_data(cpv=None): @@ -302,7 +314,10 @@ def test_item_data(cpv=None):
302 data["description_en"] = field_with_id("i", data["description_en"]) 314 data["description_en"] = field_with_id("i", data["description_en"])
303 data["description_ru"] = field_with_id("i", data["description_ru"]) 315 data["description_ru"] = field_with_id("i", data["description_ru"])
304 days = fake.random_int(min=1, max=30) 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 data["deliveryAddress"]["countryName_en"] = translate_country_en(data["deliveryAddress"]["countryName"]) 321 data["deliveryAddress"]["countryName_en"] = translate_country_en(data["deliveryAddress"]["countryName"])
307 data["deliveryAddress"]["countryName_ru"] = translate_country_ru(data["deliveryAddress"]["countryName"]) 322 data["deliveryAddress"]["countryName_ru"] = translate_country_ru(data["deliveryAddress"]["countryName"])
308 return munchify(data) 323 return munchify(data)
@@ -35,7 +35,7 @@ Set Suite Variable With Default Value @@ -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 ${local_time}= Get current TZdate 39 ${local_time}= Get current TZdate
40 Log ${server_time.headers['date']} 40 Log ${server_time.headers['date']}
41 Log ${local_time} 41 Log ${local_time}
@@ -60,8 +60,8 @@ Set Suite Variable With Default Value @@ -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 # Suite variable; should be present in every test suite 65 # Suite variable; should be present in every test suite
66 # in `*** Variables ***` section 66 # in `*** Variables ***` section
67 Log Many @{USED_ROLES} 67 Log Many @{USED_ROLES}
@@ -83,13 +83,13 @@ Set Suite Variable With Default Value @@ -83,13 +83,13 @@ Set Suite Variable With Default Value
83 ${used_users}= Create List 83 ${used_users}= Create List
84 84
85 # Handle `-v role:something` 85 # Handle `-v role:something`
86 - Run Keyword Unless '${role}' in @{USED_ROLES} 86 + Run Keyword Unless '${ROLE}' in @{USED_ROLES}
87 ... Log 87 ... Log
88 - ... Role ${role} is not used in this test suite. 88 + ... Role ${ROLE} is not used in this test suite.
89 ... WARN 89 ... WARN
90 Set Suite Variable With Default Value 90 Set Suite Variable With Default Value
91 - ... ${role}  
92 - ... ${BROKERS['${broker}'].roles.${role}} 91 + ... ${ROLE}
  92 + ... ${BROKERS['${BROKER}'].roles.${ROLE}}
93 93
94 # Set default value for each role if it is not set yet; 94 # Set default value for each role if it is not set yet;
95 # fill `used_users`; 95 # fill `used_users`;
@@ -161,7 +161,7 @@ Get Broker Property By Username @@ -161,7 +161,7 @@ Get Broker Property By Username
161 161
162 Створити артефакт 162 Створити артефакт
163 ${artifact}= Create Dictionary 163 ${artifact}= Create Dictionary
164 - ... api_version=${api_version} 164 + ... api_version=${API_VERSION}
165 ... tender_uaid=${TENDER['TENDER_UAID']} 165 ... tender_uaid=${TENDER['TENDER_UAID']}
166 ... last_modification_date=${TENDER['LAST_MODIFICATION_DATE']} 166 ... last_modification_date=${TENDER['LAST_MODIFICATION_DATE']}
167 ... mode=${MODE} 167 ... mode=${MODE}
@@ -183,7 +183,10 @@ Get Broker Property By Username @@ -183,7 +183,10 @@ Get Broker Property By Username
183 ${file_path}= Get Variable Value ${ARTIFACT_FILE} artifact.yaml 183 ${file_path}= Get Variable Value ${ARTIFACT_FILE} artifact.yaml
184 ${ARTIFACT}= load_data_from ${file_path} 184 ${ARTIFACT}= load_data_from ${file_path}
185 Run Keyword And Ignore Error Set To Dictionary ${USERS.users['${tender_owner}']} access_token=${ARTIFACT.access_token} 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 ${lot_index}= Get Variable Value ${lot_index} 0 190 ${lot_index}= Get Variable Value ${lot_index} 0
188 Run Keyword And Ignore Error Set To Dictionary ${TENDER} LOT_ID=${ARTIFACT.lots[${lot_index}]} 191 Run Keyword And Ignore Error Set To Dictionary ${TENDER} LOT_ID=${ARTIFACT.lots[${lot_index}]}
189 ${MODE}= Get Variable Value ${MODE} ${ARTIFACT.mode} 192 ${MODE}= Get Variable Value ${MODE} ${ARTIFACT.mode}
@@ -249,33 +252,45 @@ Get Broker Property By Username @@ -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 [Return] ${bid} 263 [Return] ${bid}
255 264
256 265
257 Підготувати дані про постачальника 266 Підготувати дані про постачальника
258 - [Arguments] ${username} 267 + [Arguments] ${username} ${lotIndex}=${-1}
  268 + ${lotIndex}= Convert To Integer ${lotIndex}
259 ${supplier_data}= test_supplier_data 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 Log ${supplier_data} 272 Log ${supplier_data}
262 [Return] ${supplier_data} 273 [Return] ${supplier_data}
263 274
264 275
265 Підготувати дані про скасування 276 Підготувати дані про скасування
266 - [Arguments] ${username}  
267 ${cancellation_reason}= create_fake_sentence 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 ${file_path} ${file_name} ${file_content}= create_fake_doc 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 ${document}= Create Dictionary 282 ${document}= Create Dictionary
271 ... doc_path=${file_path} 283 ... doc_path=${file_path}
272 ... doc_name=${file_name} 284 ... doc_name=${file_name}
273 ... doc_content=${file_content} 285 ... doc_content=${file_content}
274 ... doc_id=${doc_id} 286 ... doc_id=${doc_id}
275 ${new_description}= create_fake_sentence 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 ${cancellation_data}= munchify ${cancellation_data} 293 ${cancellation_data}= munchify ${cancellation_data}
278 - Set To Dictionary ${USERS.users['${username}']} cancellation_data=${cancellation_data}  
279 [Return] ${cancellation_data} 294 [Return] ${cancellation_data}
280 295
281 296
@@ -46,7 +46,7 @@ ${ITEM_MEAT} ${False} @@ -46,7 +46,7 @@ ${ITEM_MEAT} ${False}
46 ... add_award 46 ... add_award
47 ... level1 47 ... level1
48 [Teardown] Оновити LAST_MODIFICATION_DATE 48 [Teardown] Оновити LAST_MODIFICATION_DATE
49 - Можливість зареєструвати, додати документацію і підтвердити постачальника до закупівлі 49 + Можливість зареєструвати, додати документацію і підтвердити першого постачальника до закупівлі
50 50
51 51
52 Можливість знайти переговорну процедуру за нагальною потребою по ідентифікатору 52 Можливість знайти переговорну процедуру за нагальною потребою по ідентифікатору
@@ -46,7 +46,7 @@ ${ITEM_MEAT} ${False} @@ -46,7 +46,7 @@ ${ITEM_MEAT} ${False}
46 ... add_award 46 ... add_award
47 ... level1 47 ... level1
48 [Teardown] Оновити LAST_MODIFICATION_DATE 48 [Teardown] Оновити LAST_MODIFICATION_DATE
49 - Можливість зареєструвати, додати документацію і підтвердити постачальника до закупівлі 49 + Можливість зареєструвати, додати документацію і підтвердити першого постачальника до закупівлі
50 50
51 51
52 Можливість знайти переговорну процедуру по ідентифікатору 52 Можливість знайти переговорну процедуру по ідентифікатору
@@ -169,8 +169,15 @@ ${ITEM_MEAT} ${True} @@ -169,8 +169,15 @@ ${ITEM_MEAT} ${True}
169 [Setup] Дочекатись синхронізації з майданчиком ${viewer} 169 [Setup] Дочекатись синхронізації з майданчиком ${viewer}
170 Звірити відображення поля description усіх предметів для усіх користувачів 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 [Tags] ${USERS.users['${viewer}'].broker}: Відображення номенклатури тендера 181 [Tags] ${USERS.users['${viewer}'].broker}: Відображення номенклатури тендера
175 ... viewer 182 ... viewer
176 ... ${USERS.users['${viewer}'].broker} 183 ... ${USERS.users['${viewer}'].broker}
@@ -1638,7 +1645,7 @@ ${ITEM_MEAT} ${True} @@ -1638,7 +1645,7 @@ ${ITEM_MEAT} ${True}
1638 Звірити статус тендера ${tender_owner} ${TENDER['TENDER_UAID']} active.stage2.pending 1645 Звірити статус тендера ${tender_owner} ${TENDER['TENDER_UAID']} active.stage2.pending
1639 1646
1640 1647
1641 -Можливість перевести статус очікування обробки мостом 1648 +Можливість перевести тендер в статус очікування обробки мостом
1642 [Tags] ${USERS.users['${tender_owner}'].broker}: Процес переведення статусу у active.stage2.waiting. 1649 [Tags] ${USERS.users['${tender_owner}'].broker}: Процес переведення статусу у active.stage2.waiting.
1643 ... tender_owner 1650 ... tender_owner
1644 ... ${USERS.users['${tender_owner}'].broker} 1651 ... ${USERS.users['${tender_owner}'].broker}
@@ -1657,3 +1664,189 @@ ${ITEM_MEAT} ${True} @@ -1657,3 +1664,189 @@ ${ITEM_MEAT} ${True}
1657 Дочекатися створення нового етапу мостом ${tender_owner} ${TENDER['TENDER_UAID']} 1664 Дочекатися створення нового етапу мостом ${tender_owner} ${TENDER['TENDER_UAID']}
1658 Звірити статус тендера ${tender_owner} ${TENDER['TENDER_UAID']} complete 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 + Можливість затвердити остаточне рішення кваліфікації
@@ -46,7 +46,7 @@ ${ITEM_MEAT} ${False} @@ -46,7 +46,7 @@ ${ITEM_MEAT} ${False}
46 ... add_award 46 ... add_award
47 ... level1 47 ... level1
48 [Teardown] Оновити LAST_MODIFICATION_DATE 48 [Teardown] Оновити LAST_MODIFICATION_DATE
49 - Можливість зареєструвати, додати документацію і підтвердити постачальника до закупівлі 49 + Можливість зареєструвати, додати документацію і підтвердити першого постачальника до закупівлі
50 50
51 51
52 Можливість укласти угоду для звіту про укладений договір 52 Можливість укласти угоду для звіту про укладений договір
1 *** Variables *** 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,6 +21,7 @@ from .initial_data import (
21 create_fake_doc, 21 create_fake_doc,
22 create_fake_sentence, 22 create_fake_sentence,
23 fake, 23 fake,
  24 + field_with_id,
24 test_bid_data, 25 test_bid_data,
25 test_bid_value, 26 test_bid_value,
26 test_claim_answer_data, 27 test_claim_answer_data,
@@ -328,7 +329,7 @@ def get_from_object(obj, attribute): @@ -328,7 +329,7 @@ def get_from_object(obj, attribute):
328 def set_to_object(obj, attribute, value): 329 def set_to_object(obj, attribute, value):
329 # Search the list index in path to value 330 # Search the list index in path to value
330 list_index = re.search('\d+', attribute) 331 list_index = re.search('\d+', attribute)
331 - if list_index: 332 + if list_index and attribute != 'stage2TenderID':
332 list_index = list_index.group(0) 333 list_index = list_index.group(0)
333 parent, child = attribute.split('[' + list_index + '].')[:2] 334 parent, child = attribute.split('[' + list_index + '].')[:2]
334 # Split attribute to path to lits (parent) and path to value in list element (child) 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,8 +410,8 @@ def get_id_from_object(obj):
409 return obj_id.group(1) 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 def get_object_type_by_id(object_id): 417 def get_object_type_by_id(object_id):
@@ -443,7 +444,7 @@ def get_complaint_index_by_complaintID(data, complaintID): @@ -443,7 +444,7 @@ def get_complaint_index_by_complaintID(data, complaintID):
443 444
444 def generate_test_bid_data(tender_data): 445 def generate_test_bid_data(tender_data):
445 bid = test_bid_data() 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 bid.data.selfEligible = True 448 bid.data.selfEligible = True
448 bid.data.selfQualified = True 449 bid.data.selfQualified = True
449 if 'lots' in tender_data: 450 if 'lots' in tender_data:
@@ -466,27 +467,30 @@ def mult_and_round(*args, **kwargs): @@ -466,27 +467,30 @@ def mult_and_round(*args, **kwargs):
466 return round(reduce(operator.mul, args), kwargs.get('precision', 2)) 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 -v MODE:open_competitive_dialogue 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 -v NUMBER_OF_ITEMS:1 6 -v NUMBER_OF_ITEMS:1
10 -v NUMBER_OF_LOTS:1 7 -v NUMBER_OF_LOTS:1
@@ -33,3 +30,25 @@ @@ -33,3 +30,25 @@
33 -i stage2_pending_status_view 30 -i stage2_pending_status_view
34 31
35 -i wait_bridge_for_work 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
@@ -18,29 +18,26 @@ setup(name='op_robot_tests', @@ -18,29 +18,26 @@ setup(name='op_robot_tests',
18 zip_safe=False, 18 zip_safe=False,
19 install_requires=[ 19 install_requires=[
20 # -*- Extra requirements: -*- 20 # -*- Extra requirements: -*-
21 - 'robotframework',  
22 - 'robotframework-selenium2library',  
23 - 'robotframework-debuglibrary',  
24 - 'robotframework-selenium2screenshots', 21 + 'Faker',
25 'Pillow', 22 'Pillow',
26 - 'iso8601',  
27 'PyYAML', 23 'PyYAML',
28 - 'munch',  
29 - 'fake-factory', 24 + 'barbecue',
  25 + 'chromedriver',
  26 + 'dateutils',
30 'dpath', 27 'dpath',
  28 + 'haversine',
  29 + 'iso8601',
31 'jsonpath-rw', 30 'jsonpath-rw',
32 - 'dateutils',  
33 - 'pytz', 31 + 'munch',
34 'parse', 32 'parse',
35 - 'chromedriver',  
36 - 'barbecue',  
37 - 'haversine' 33 + 'pytz',
  34 + 'robotframework',
  35 + 'robotframework-selenium2library',
  36 + 'selenium < 3.0.dev0',
38 ], 37 ],
39 entry_points={ 38 entry_points={
40 'console_scripts': [ 39 'console_scripts': [
41 - 'openprocurement_tests = op_robot_tests.runner:runner',  
42 'op_tests = op_robot_tests.runner:runner', 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