diff --git a/op_robot_tests/tests_files/OpenProcurementProcess.robot b/op_robot_tests/tests_files/OpenProcurementProcess.robot index 24d409f..fce1f81 100644 --- a/op_robot_tests/tests_files/OpenProcurementProcess.robot +++ b/op_robot_tests/tests_files/OpenProcurementProcess.robot @@ -4,15 +4,15 @@ Library String LIbrary Collections LIbrary Selenium2Library Library DebugLibrary - +Resource keywords.robot Suite Setup TestCaseSetup Suite Teardown Close all browsers - *** Variables *** -${viewer} E-tender User -${provider} Andrew -@{item_fields} description quantity classification.id classification.description deliveryAddress deliveryDate +${viewer} Tender User +# Tender Viewer +${provider} Tender User + *** Test Cases *** Можливість оголосити тендер @@ -66,9 +66,6 @@ ${provider} Andrew [Tags] ${USERS.users['${viewer}'].broker}: Відображення основних даних оголошеного тендера Звірити поле тендера ${viewer} procuringEntity.name - - - Відображення предмету закупівлі однопредметного тендера [Tags] ${USERS.users['${viewer}'].broker}: Відображення однопредметного тендера Звірити поле тендера ${viewer} items[0].description @@ -84,7 +81,11 @@ ${provider} Andrew Відображення місце поставки закупівлі однопредметного тендера [Tags] ${USERS.users['${viewer}'].broker}: Відображення однопредметного тендера - Звірити поле тендера ${viewer} items[0].deliveryAddress + Звірити поле тендера ${viewer} items[0].deliveryAddress.countryName + Звірити поле тендера ${viewer} items[0].deliveryAddress.locality + Звірити поле тендера ${viewer} items[0].deliveryAddress.postalCode + Звірити поле тендера ${viewer} items[0].deliveryAddress.region + Звірити поле тендера ${viewer} items[0].deliveryAddress.streetAddress Відображення строки поставки закупівлі однопредметного тендера [Tags] ${USERS.users['${viewer}'].broker}: Відображення однопредметного тендера @@ -97,7 +98,6 @@ ${provider} Andrew Set Global Variable ${LAST_MODIFICATION_DATE} отримати останні зміни в тендері - Відображення заголовоку анонімного питання без відповіді [Tags] ${USERS.users['${viewer}'].broker}: Відображення анонімного питання без відповідей Дочекатись синхронізації з майданчиком ${viewer} @@ -108,96 +108,27 @@ ${provider} Andrew [Tags] ${USERS.users['${viewer}'].broker}: Відображення анонімного питання без відповідей Звірити поле тендера ${viewer} questions[0].description - -Відображення дата анонімного питання без відповіді +Відображення дати анонімного питання без відповіді [Tags] ${USERS.users['${viewer}'].broker}: Відображення анонімного питання без відповідей Звірити поле тендера ${viewer} questions[0].date - # ${users_list}= Get Dictionary Items ${USERS.users} - # :FOR ${username} ${User_Data} IN @{users_list} - # \ Run Keyword If '${User_Name}' != '${USERS.tender_owner}' Відображення основних даних оголошеного тендера ${username} -# -# Відображення однопредметного тендера - # ${users_list}= Get Dictionary Items ${USERS.users} - # :FOR ${username} ${User_Data} IN @{users_list} - # \ Run Keyword If '${User_Name}' != '${USERS.tender_owner}' Відображення однопредметного тендера ${username} -# -# -# Можливість змінити основні властивості тендера - # [tags] all_stages - # Власник змінив основні властивості тендера - # Інші учасники побачили створений тендер -# -# Питання і відповідь - # Учасник Andrew задав 1-ше питання - # Інші учасники побачили 1-ше питання - # Власник відповів на 1-ше питання - # Інші учасники побачили відповідь на 1-ше питання -# - - -*** Keywords *** -TestCaseSetup - Завантажуємо дані про корисувачів і площадки - Підготовка початкових даних - - -Завантажуємо дані про корисувачів і площадки - # Init Brokers - ${file_path}= Get Variable Value ${BROKERS_FILE} brokers.yaml - ${BROKERS}= load_initial_data_from ${file_path} - Set Global Variable ${BROKERS} - ${brokers_list}= Get Dictionary Items ${BROKERS} - :FOR ${Broker_Name} ${Broker_Data} IN @{brokers_list} - \ Завантажуємо бібліотеку з реалізацією ${Broker_Data.keywords_file} площадки - # Init Users - ${file_path}= Get Variable Value ${USERS_FILE} users.yaml - ${USERS}= load_initial_data_from ${file_path} - Set Global Variable ${USERS} - ${users_list}= Get Dictionary Items ${USERS.users} - :FOR ${username} ${user_data} IN @{users_list} - \ Викликати для учасника ${username} Підготувати клієнт для користувача - -Підготовка початкових даних - @{QUESTIONS} = Create list - ${question}= test question data - Append to list ${QUESTIONS} ${question} - Set Global Variable ${QUESTIONS} - ${INITIAL_TENDER_DATA}= prepare_test_tender_data - Set Global Variable ${INITIAL_TENDER_DATA} - -Завантажуємо бібліотеку з реалізацією ${keywords_file} площадки - Import Resource ${CURDIR}/brokers/${keywords_file}.robot - - -################################################################################## -Дочекатись синхронізації з майданчиком - [Arguments] ${username} - [Documentation] - ... ${ARGUMENTS[0]} == username - ... ${ARGUMENTS[1]} == tenderId - ... ${ARGUMENTS[2]} == id - - ${now}= Get Current Date - ${delta}= Subtract Date From Date ${now} ${LAST_MODIFICATION_DATE} - ${wait_timout}= Subtract Time From Time ${BROKERS['${USERS.users['${username}'].broker}'].timout_on_wait} ${delta} - Run Keyword If ${wait_timout}>0 Sleep ${wait_timout} - -отримати останні зміни в тендері - ${TENDER_DATA}= Викликати для учасника ${USERS.tender_owner} Пошук тендера по ідентифікатору ${TENDER_DATA.data.tenderID} ${TENDER_DATA.data.id} - Set To Dictionary ${TENDER_DATA} access_token ${access_token} - Set Global Variable ${TENDER_DATA} - Log object data ${TENDER_DATA} tender_with_question - -Звірити поле тендера - [Arguments] ${username} ${field} - ${field_response}= Викликати для учасника ${username} отримати інформацію із тендера ${field} - ${field_value}= Get_From_Object ${TENDER_DATA.data} ${field} - Should Be Equal ${field_value} ${field_response} Майданчик ${USERS.users['${username}'].broker} - - -Викликати для учасника - [Arguments] ${username} ${command} @{arguments} - ${status} ${value}= run_keyword_and_ignore_keyword_definations ${BROKERS['${USERS.users['${username}'].broker}'].keywords_file}.${command} ${username} @{arguments} - Run keyword if '${status}' == 'FAIL' Log Учасник ${username} не зміг виконати "${command}" WARN - [return] ${value} +Відповісти на запитання + [Tags] ${USERS.users['${USERS.tender_owner}'].broker}: Можливість відповісти на запитання + Викликати для учасника ${USERS.tender_owner} Відповісти на питання ${TENDER_DATA.data.id} 0 ${ANSWERS[0]} + ${LAST_MODIFICATION_DATE}= Get Current Date + Set Global Variable ${LAST_MODIFICATION_DATE} + отримати останні зміни в тендері + +Відображення відповіді на запитання + [Tags] ${USERS.users['${viewer}'].broker}: Відображення відповіді на запитання + Дочекатись синхронізації з майданчиком ${viewer} + Викликати для учасника ${viewer} обновити сторінку з тендером ${TENDER_DATA.data.tenderID} ${TENDER_DATA.data.id} + Звірити поле тендера ${viewer} questions[0].answer + + +Подати цінову пропозицію + [Tags] ${USERS.users['${provider}'].broker}: Можливість подати цінову пропозицію + Дочекатись дати початоку прийому пропозицій + ${bid}= test bid data + Log object data ${bid} + Викликати для учасника ${provider} Подати цінову пропозицію ${TENDER_DATA.data.id} ${bid} \ No newline at end of file diff --git a/op_robot_tests/tests_files/brokers/etender.robot b/op_robot_tests/tests_files/brokers/etender.robot index 652cf02..c027e4a 100644 --- a/op_robot_tests/tests_files/brokers/etender.robot +++ b/op_robot_tests/tests_files/brokers/etender.robot @@ -157,12 +157,16 @@ ${locator.enquiryPeriod.endDate} jquery=tender-procedure-info>div.row:contai [return] ${return_value} отримати інформацію про questions[${question_id}].description - відмітити на сторінці поле з тендера questions title jquery=tender-questions>div:eq(1)>div.row:contains("Питання:")>:eq(1)> + відмітити на сторінці поле з тендера questions description jquery=tender-questions>div:eq(1)>div.row:contains("Питання:")>:eq(1)> ${return_value}= Get Text jquery=tender-questions>div:eq(1)>div.row:contains("Питання:")>:eq(1)> [return] ${return_value} отримати інформацію про questions[${question_id}].date - відмітити на сторінці поле з тендера questions title jquery=tender-questions>div:eq(1)>div.row:contains("Дата:")>:eq(1)> + відмітити на сторінці поле з тендера question date jquery=tender-questions>div:eq(1)>div.row:contains("Дата:")>:eq(1)> ${return_value}= Get Text jquery=tender-questions>div:eq(1)>div.row:contains("Дата:")>:eq(1)> [return] ${return_value} +отримати інформацію про questions[${question_id}].answer + відмітити на сторінці поле з тендера question answer jquery=tender-questions>div:eq(1)>div:last> + ${return_value}= Get Text jquery=tender-questions>div:eq(1)>div:last> + [return] ${return_value} \ No newline at end of file diff --git a/op_robot_tests/tests_files/brokers/openprocurement_client.robot b/op_robot_tests/tests_files/brokers/openprocurement_client.robot index fd3d21e..4874382 100644 --- a/op_robot_tests/tests_files/brokers/openprocurement_client.robot +++ b/op_robot_tests/tests_files/brokers/openprocurement_client.robot @@ -34,53 +34,23 @@ Library op_robot_tests.tests_files.brokers.openprocurement_client_helper [return] ${tender_data} -отримати інформацію із тендера - [Arguments] @{ARGUMENTS} - [Documentation] - ... ${ARGUMENTS[0]} == username - ... ${ARGUMENTS[1]} == fieldname - [return] ${USERS.users['${ARGUMENTS[0]}'].tender_data.data.${ARGUMENTS[1]}} - - - -отримати інформацію про description для предмету закупівлі в однопредметному тендері - [Arguments] @{ARGUMENTS} - [Documentation] - ... ${ARGUMENTS[0]} == username - [return] ${USERS.users['${ARGUMENTS[0]}'].tender_data.data['items'][0].description} - -отримати інформацію про quantity для предмету закупівлі в однопредметному тендері - [Arguments] @{ARGUMENTS} - [Documentation] - ... ${ARGUMENTS[0]} == username - [return] ${USERS.users['${ARGUMENTS[0]}'].tender_data.data['items'][0].quantity} - - -отримати інформацію про classification.id для предмету закупівлі в однопредметному тендері - [Arguments] @{ARGUMENTS} - [Documentation] - ... ${ARGUMENTS[0]} == username - [return] ${USERS.users['${ARGUMENTS[0]}'].tender_data.data['items'][0].classification.id} - - -отримати інформацію про classification.description для предмету закупівлі в однопредметному тендері +обновити сторінку з тендером [Arguments] @{ARGUMENTS} [Documentation] ... ${ARGUMENTS[0]} == username - [return] ${USERS.users['${ARGUMENTS[0]}'].tender_data.data['items'][0].classification.description} + ... ${ARGUMENTS[1]} == tenderId + ... ${ARGUMENTS[2]} == id + openprocurement_client.Пошук тендера по ідентифікатору @{ARGUMENTS} -отримати інформацію про deliveryAddress для предмету закупівлі в однопредметному тендері +отримати інформацію із тендера [Arguments] @{ARGUMENTS} [Documentation] ... ${ARGUMENTS[0]} == username - [return] ${USERS.users['${ARGUMENTS[0]}'].tender_data.data['items'][0].deliveryAddress} + ... ${ARGUMENTS[1]} == fieldname + ${field_value}= Get_From_Object ${USERS.users['${ARGUMENTS[0]}'].tender_data.data} ${ARGUMENTS[1]} + [return] ${field_value} -отримати інформацію про deliveryDate для предмету закупівлі в однопредметному тендері - [Arguments] @{ARGUMENTS} - [Documentation] - ... ${ARGUMENTS[0]} == username - [return] ${USERS.users['${ARGUMENTS[0]}'].tender_data.data['items'][0].deliveryDate} Внести зміни в тендер [Arguments] @{ARGUMENTS} @@ -91,7 +61,6 @@ Library op_robot_tests.tests_files.brokers.openprocurement_client_helper ... ${ARGUMENTS[3]} == fieldvalue отримати тендер ${ARGUMENTS[0]} ${ARGUMENTS[1]} Set_To_Object ${TENDER_DATA.data} ${ARGUMENTS[2]} ${ARGUMENTS[3]} - ${TENDER_DATA}= Call Method ${USERS.users['${ARGUMENTS[0]}'].client} patch_tender ${TENDER_DATA} ${TENDER_DATA}= set_access_key ${TENDER_DATA} ${USERS.users['${ARGUMENTS[0]}'].access_token} Set Global Variable ${TENDER_DATA} @@ -107,13 +76,39 @@ Library op_robot_tests.tests_files.brokers.openprocurement_client_helper Set Global Variable ${TENDER_DATA} - Задати питання [Documentation] ... ${ARGUMENTS[0]} == username ... ${ARGUMENTS[1]} == tender_uid ... ${ARGUMENTS[2]} == question [Arguments] @{ARGUMENTS} + log many @{ARGUMENTS} ${tender}= Call Method ${USERS.users['${ARGUMENTS[0]}'].client} get_tender ${ARGUMENTS[1]} ${question}= Call Method ${USERS.users['${ARGUMENTS[0]}'].client} create_question ${tender} ${ARGUMENTS[2]} - Log object data ${question} question \ No newline at end of file + Log object data ${question} question + +Відповісти на питання + [Documentation] + ... ${ARGUMENTS[0]} == username + ... ${ARGUMENTS[1]} == tender_uid + ... ${ARGUMENTS[2]} == question_id + ... ${ARGUMENTS[3]} == answer_data + [Arguments] @{ARGUMENTS} + log many @{ARGUMENTS} + ${tender}= Call Method ${USERS.users['${ARGUMENTS[0]}'].client} get_tender ${ARGUMENTS[1]} + ${tender}= set_access_key ${tender} ${USERS.users['${ARGUMENTS[0]}'].access_token} + ${ARGUMENTS[3].data.id}= Set Variable ${tender.data.questions[${ARGUMENTS[2]}].id} + ${quvestion_with_answer}= Call Method ${USERS.users['${ARGUMENTS[0]}'].client} patch_question ${tender} ${ARGUMENTS[3]} + Log object data ${quvestion_with_answer} quvestion_with_answer + + +Подати цінову пропозицію + [Documentation] + ... ${ARGUMENTS[0]} == username + ... ${ARGUMENTS[1]} == tender_uid + ... ${ARGUMENTS[2]} == bid + [Arguments] @{ARGUMENTS} + log many @{ARGUMENTS} + ${tender}= Call Method ${USERS.users['${ARGUMENTS[0]}'].client} get_tender ${ARGUMENTS[1]} + ${bid}= Call Method ${USERS.users['${ARGUMENTS[0]}'].client} create_bid ${tender} ${ARGUMENTS[2]} + Log object data ${question} bid diff --git a/op_robot_tests/tests_files/data/users.yaml b/op_robot_tests/tests_files/data/users.yaml index 6071f97..f67fd92 100644 --- a/op_robot_tests/tests_files/data/users.yaml +++ b/op_robot_tests/tests_files/data/users.yaml @@ -2,11 +2,11 @@ tender_owner: Tender Owner users: Tender Owner: broker: Quinta - E-tender User: + Tender Viewer: broker: E-tender username: test browser: chrome position: [960, 0] size: [960, 1000] - Andrew: + Tender User: broker: Quinta \ No newline at end of file diff --git a/op_robot_tests/tests_files/initial_data.py b/op_robot_tests/tests_files/initial_data.py index 02e6d57..31d0724 100644 --- a/op_robot_tests/tests_files/initial_data.py +++ b/op_robot_tests/tests_files/initial_data.py @@ -80,16 +80,16 @@ test_tender_data = { } ], "enquiryPeriod": { - "endDate": (now + timedelta(days=1)).isoformat() + "endDate": (now + timedelta(minutes=2)).isoformat() }, "tenderPeriod": { - "endDate": (now + timedelta(days=2)).isoformat() + "endDate": (now + timedelta(minutes=5)).isoformat() } } def test_question_data(): - return { + return munchify({ "data": { "author": { "address": { @@ -113,15 +113,15 @@ def test_question_data(): "description": fake.sentence(nb_words=10, variable_nb_words=True), "title": fake.sentence(nb_words=6, variable_nb_words=True) } - } + }) def test_question_answer_data(): - return { + return munchify({ "data": { "answer": fake.sentence(nb_words=40, variable_nb_words=True) } - } + }) def test_bid_data(): diff --git a/op_robot_tests/tests_files/keywords.robot b/op_robot_tests/tests_files/keywords.robot index 83555d3..30b3bee 100644 --- a/op_robot_tests/tests_files/keywords.robot +++ b/op_robot_tests/tests_files/keywords.robot @@ -71,4 +71,14 @@ TestCaseSetup [Arguments] ${username} ${command} @{arguments} ${status} ${value}= run_keyword_and_ignore_keyword_definations ${BROKERS['${USERS.users['${username}'].broker}'].keywords_file}.${command} ${username} @{arguments} Run keyword if '${status}' == 'FAIL' Log Учасник ${username} не зміг виконати "${command}" WARN - [return] ${value} \ No newline at end of file + [return] ${value} + + +Дочекатись дати + [Arguments] ${date} + ${wait_timout}= wait_to_date ${date} + Run Keyword If ${wait_timout}>0 Sleep ${wait_timout} + + +Дочекатись дати початоку прийому пропозицій + Дочекатись дати ${TENDER_DATA.data.tenderPeriod.startDate} \ No newline at end of file diff --git a/op_robot_tests/tests_files/service_keywords.py b/op_robot_tests/tests_files/service_keywords.py index 141247e..c72c667 100644 --- a/op_robot_tests/tests_files/service_keywords.py +++ b/op_robot_tests/tests_files/service_keywords.py @@ -7,8 +7,10 @@ from robot.output.loggerhelper import Message from robot.libraries.BuiltIn import BuiltIn from robot.errors import HandlerExecutionFailed from datetime import datetime, timedelta +from dateutil.parser import parse +from dateutil.tz import tzlocal from dpath.util import set as xpathset -from jsonpath_rw import parse +from jsonpath_rw import parse as parse_path from .initial_data import ( test_tender_data, test_question_data, test_question_answer_data, test_bid_data @@ -88,8 +90,20 @@ def set_to_object(obj, attribute, value): def get_from_object(obj, attribute): """Gets data from a dictionary using a dotted accessor-string""" - jsonpath_expr = parse(attribute) + jsonpath_expr = parse_path(attribute) return_list = [i.value for i in jsonpath_expr.find(obj)] if return_list: return return_list[0] return None + + +def wait_to_date(date_stamp): + date = parse(date_stamp) + LOGGER.log_message(Message("date: {}".format(date.isoformat()), "INFO")) + now = datetime.now(tzlocal()) + LOGGER.log_message(Message("now: {}".format(now.isoformat()), "INFO")) + wait_seconds = (date - now).total_seconds() + wait_seconds += 2 + if wait_seconds < 0: + return 0 + return wait_seconds diff --git a/setup.py b/setup.py index 42e0370..7cfdd6e 100644 --- a/setup.py +++ b/setup.py @@ -29,7 +29,8 @@ setup(name='op_robot_tests', 'munch', 'fake-factory', 'dpath', - 'jsonpath-rw' + 'jsonpath-rw', + 'dateutils' ], entry_points={ 'console_scripts': [