Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Object comparison and IDs #341

Open
wants to merge 8 commits into
base: eauction-devel
Choose a base branch
from

Conversation

selurvedu
Copy link
Contributor

@selurvedu selurvedu commented Oct 24, 2016

  • Extend get_id_from_object: add meaningful error messages and comments, make it more error-proof generally.
  • Rewrite Порівняти об'єкти in Python (compare_objects), add three new keyword arguments: inequal to reverse a comparison (i.e. Should Not Be Equal) and msg to add a custom error message.
  • Add stricter requirements for expected failure.
  • A few minor changes and fixes.

This change is Reviewable

@selurvedu
Copy link
Contributor Author

selurvedu commented Oct 25, 2016

До Compare Objects додались ще два аргументи, які не були передбачені, але стануть в нагоді.

Зараз з цим PR я бачу наступне:

------------------------------------------------------------------------------
Неможливість змінити початкову вартість тендера                       | FAIL |
Expected error 'Failed to modify "value.amount"' but got 'Calling method 'patch_tender' failed: RequestFailed: Internal Server Error'.
------------------------------------------------------------------------------
Неможливість змінити мінімальний крок тендера                         | FAIL |
Expected error 'Failed to modify "minimalStep.amount"' but got 'Calling method 'patch_tender' failed: RequestFailed: Internal Server Error'.
------------------------------------------------------------------------------
------------------------------------------------------------------------------
Можливість внести зміни у тендер після запитання                      | FAIL |
Failed to modify "description"
------------------------------------------------------------------------------

+(review wanted) +@kosaniak +@annawzz

@selurvedu
Copy link
Contributor Author

selurvedu commented Oct 25, 2016

Є і суттєвий недолік в такому підході: всі майданчики теж мусять видавати помилку з таким повідомленням коли в них провалюється ключове слово на зміну того чи іншого поля. Тому... +(backward incompatible)

Було б дуже добре, якби в драйверах майданчиків теж можна було розрізняти деякі конкретні помилки.

This allows running test suites in parallel without overwriting
the artifact file. All you need is the `-d` (`--outputdir`) argument.
@selurvedu
Copy link
Contributor Author

Докинув коміт, який переміщає артефакт в ${OUTPUT_DIR}. Це доволяє запускати багато екземплярів тестів паралельно і повністю незалежно з допомогою одної лиш опції -d (--outputdir).

@mykhaly
Copy link
Contributor

mykhaly commented Oct 31, 2016

:lgtm_strong:


Reviewed 1 of 1 files at r1, 1 of 1 files at r2, 1 of 1 files at r3, 1 of 1 files at r4, 1 of 1 files at r5, 5 of 5 files at r6, 2 of 2 files at r7, 2 of 2 files at r8.
Review status: all files reviewed at latest revision, 5 unresolved discussions.


op_robot_tests/tests_files/service_keywords.py, line 437 at r1 (raw file):

        if element_id == object_id:
            break
        else:

Дарма ти це зробив. else стосувалося for (вихід з циклу без break). Тобто, якщо такої айдішки не знаходилося, то це якийсь новий елемент і ми його дані ще не зчитували. Тоді ми логічно припускаємо, що його індекс буде на одиницю більшим, ніж останнього прочитаного елементу.


op_robot_tests/tests_files/service_keywords.py, line 434 at r3 (raw file):

    if 'title' in obj.keys():
        title_id = _get_id_from_object(obj, 'title')

FYI: це можна написати трошки по-іншому

title_id = _get_id_from_object(obj, 'title') if 'title' in obj.keys() else None

Чи так краще - вирішувати тобі.


op_robot_tests/tests_files/service_keywords.py, line 427 at r4 (raw file):

                mandatory key, either "title" or "description".
                The value mapped to that key should begin with a prefix which
                holds an automatically generated identifier of the object

Можеш ще вказати функцію, яка ту айдішку додає. Було б корисно.


op_robot_tests/tests_files/service_keywords.py, line 84 at r5 (raw file):
Якщо first буде не (юнікодовим???) стрінгом, то цей unicode нічого не дасть:

>>> a=u"aaaàçççñññ"
>>> print a
aaaàçççñññ
>>> print unicode(a)
aaaàçççñññ
>>> x = [1, a, 2, 3]
>>> print unicode(x)
[1, u'aaa\xe0\xe7\xe7\xe7\xf1\xf1\xf1', 2, 3]
>>> b = 'aaa\xe0\xe7\xe7\xe7\xf1\xf1\xf1'
>>> b
'aaa\xe0\xe7\xe7\xe7\xf1\xf1\xf1'
>>> unicode(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 3: ordinal not in range(128)
>>> c = u'aaa\xe0\xe7\xe7\xe7\xf1\xf1\xf1'
>>> c
u'aaa\xe0\xe7\xe7\xe7\xf1\xf1\xf1'
>>> unicode(c)
u'aaa\xe0\xe7\xe7\xe7\xf1\xf1\xf1'
>>> print c
aaaàçççñññ

op_robot_tests/tests_files/brokers/openprocurement_client.robot, line 196 at r7 (raw file):

  # The two values should differ. If they are equal, then probably the server refused to,
  # or failed to modify the value of a field, so this keyword should instantly fail.
  ${new_value}=  Get From Object  ${USERS.users['${username}'].tender_data.data}  ${fieldname}

Це ж будуть старі дані, нє? Тре брати Get From Object ${tender.data}....


Comments from Reviewable

@selurvedu
Copy link
Contributor Author

Класне рев'ю!


Reviewed 1 of 1 files at r2, 1 of 1 files at r3, 1 of 1 files at r5, 5 of 5 files at r6, 2 of 2 files at r7, 2 of 2 files at r8.
Review status: all files reviewed at latest revision, 5 unresolved discussions.


op_robot_tests/tests_files/service_keywords.py, line 437 at r1 (raw file):

Previously, mykhaly (Yurii Mykhalchuk) wrote…

Дарма ти це зробив. else стосувалося for (вихід з циклу без break). Тобто, якщо такої айдішки не знаходилося, то це якийсь новий елемент і ми його дані ще не зчитували. Тоді ми логічно припускаємо, що його індекс буде на одиницю більшим, ніж останнього прочитаного елементу.

Маєш рацію. Я не знав, що `for` може мати `else`. Век живи – век учись.

op_robot_tests/tests_files/service_keywords.py, line 434 at r3 (raw file):

Previously, mykhaly (Yurii Mykhalchuk) wrote…

FYI: це можна написати трошки по-іншому

title_id = _get_id_from_object(obj, 'title') if 'title' in obj.keys() else None

Чи так краще - вирішувати тобі.

Дійсно, я нерідко так і писав. Поправлю.

op_robot_tests/tests_files/service_keywords.py, line 427 at r4 (raw file):

Previously, mykhaly (Yurii Mykhalchuk) wrote…

Можеш ще вказати функцію, яка ту айдішку додає. Було б корисно.

Вкажу.

op_robot_tests/tests_files/service_keywords.py, line 84 at r5 (raw file):

Previously, mykhaly (Yurii Mykhalchuk) wrote…

Якщо first буде не (юнікодовим???) стрінгом, то цей unicode нічого не дасть:

>>> a=u"aaaàçççñññ"
>>> print a
aaaàçççñññ
>>> print unicode(a)
aaaàçççñññ
>>> x = [1, a, 2, 3]
>>> print unicode(x)
[1, u'aaa\xe0\xe7\xe7\xe7\xf1\xf1\xf1', 2, 3]
>>> b = 'aaa\xe0\xe7\xe7\xe7\xf1\xf1\xf1'
>>> b
'aaa\xe0\xe7\xe7\xe7\xf1\xf1\xf1'
>>> unicode(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 3: ordinal not in range(128)
>>> c = u'aaa\xe0\xe7\xe7\xe7\xf1\xf1\xf1'
>>> c
u'aaa\xe0\xe7\xe7\xe7\xf1\xf1\xf1'
>>> unicode(c)
u'aaa\xe0\xe7\xe7\xe7\xf1\xf1\xf1'
>>> print c
aaaàçççñññ
Тут ні `unicode`, ні `str.decode`, ні `repr` не дає стовідсоткового результату. Є ідеї як це виправити?

op_robot_tests/tests_files/brokers/openprocurement_client.robot, line 196 at r7 (raw file):

Previously, mykhaly (Yurii Mykhalchuk) wrote…

Це ж будуть старі дані, нє? Тре брати Get From Object ${tender.data}....

You're absolutely right. Я просто-напросто недогледів.

Comments from Reviewable

@mykhaly
Copy link
Contributor

mykhaly commented Nov 2, 2016

Дякую :)


Review status: all files reviewed at latest revision, 5 unresolved discussions.


op_robot_tests/tests_files/service_keywords.py, line 84 at r5 (raw file):

Previously, selurvedu wrote…

Тут ні unicode, ні str.decode, ні repr не дає стовідсоткового результату. Є ідеї як це виправити?

Я не дуже розбираюся в тому питанні, бо кожен раз, коли в другому пітоні виникає якась проблема з юнікодом, застрягаю надовго з stackoverflow'ом, дебагером і пітонівською консоллю в руках. Але, по-ідеї, сюди крім манча, ліста чи базового типу нічого не може прийти. Тоді робити перевірку на `isinstance` і відштовхуватися від результату. Конретніший код придумаю, можливо, пізніше.

Comments from Reviewable

@selurvedu
Copy link
Contributor Author

Review status: all files reviewed at latest revision, 5 unresolved discussions.


op_robot_tests/tests_files/service_keywords.py, line 84 at r5 (raw file):

Previously, mykhaly (Yurii Mykhalchuk) wrote…

Я не дуже розбираюся в тому питанні, бо кожен раз, коли в другому пітоні виникає якась проблема з юнікодом, застрягаю надовго з stackoverflow'ом, дебагером і пітонівською консоллю в руках.
Але, по-ідеї, сюди крім манча, ліста чи базового типу нічого не може прийти. Тоді робити перевірку на isinstance і відштовхуватися від результату. Конретніший код придумаю, можливо, пізніше.

Обійдуся `repr`'ом. В Python 2 він завжди стовідсотково повертає `str` і не може видати `unicode`, а чи конвертується він перед тим в читабельний вигляд – вже не так важливо. Краще мати `u'aaa\xe0\xe7\xe7\xe7\xf1\xf1\xf1'`, ніж `UnicodeDecodeError`. :)

Comments from Reviewable

@mykhaly
Copy link
Contributor

mykhaly commented Nov 6, 2016

Review status: all files reviewed at latest revision, 5 unresolved discussions.


op_robot_tests/tests_files/service_keywords.py, line 84 at r5 (raw file):

Previously, selurvedu wrote…

Обійдуся repr'ом. В Python 2 він завжди стовідсотково повертає str і не може видати unicode, а чи конвертується він перед тим в читабельний вигляд – вже не так важливо. Краще мати u'aaa\xe0\xe7\xe7\xe7\xf1\xf1\xf1', ніж UnicodeDecodeError. :)

Ну якщо ти прийняв таке рішення, то чим просто `logger.info('first: {}'.format(first))` не ок? Чи `logger.info('first: ' + str(first))`?

Comments from Reviewable

@selurvedu
Copy link
Contributor Author

Review status: all files reviewed at latest revision, 5 unresolved discussions, some commit checks failed.


op_robot_tests/tests_files/service_keywords.py, line 84 at r5 (raw file):
Ну це воно і є. :)

>>> class C:
...   def __str__(self):
...     return 'nothing'
... 
>>> c = C()
>>> c
<__main__.C instance at 0x7fb507c8d290>
>>> repr(c)
'<__main__.C instance at 0x7fb507c8d290>'
>>> str(c)
'nothing'

Comments from Reviewable

@kosaniak kosaniak closed this Jan 25, 2017
@kosaniak kosaniak reopened this Jan 26, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants