Hide Forgot
I'm trying to build python-ansible-tower-cli and all tests are ok with py2.7. When they are run on py3.5, the following tests fail: ====================================================================== ERROR: Establish that if connection fails and protocol not given, ---------------------------------------------------------------------- Traceback (most recent call last): File "/builddir/build/BUILD/tower-cli-3.0.1/tests/test_api.py", line 199, in test_failed_suggestion_protocol secho.assert_called() File "/usr/lib64/python3.5/unittest/mock.py", line 583, in __getattr__ raise AttributeError(name) AttributeError: assert_called ====================================================================== FAIL: Establish that if `tower-cli config` is sent an invalid key, ---------------------------------------------------------------------- Traceback (most recent call last): File "/builddir/build/BUILD/tower-cli-3.0.1/tests/test_commands_config.py", line 193, in test_error_invalid_key self.assertEqual(result.exit_code, 1) AssertionError: -1 != 1 ====================================================================== FAIL: Establish that if no global config file exists, that tower-cli ---------------------------------------------------------------------- Traceback (most recent call last): File "/builddir/build/BUILD/tower-cli-3.0.1/tests/test_commands_config.py", line 214, in test_error_no_global_config_file isdir.assert_called_once_with('/etc/tower/') File "/usr/lib64/python3.5/unittest/mock.py", line 802, in assert_called_once_with raise AssertionError(msg) AssertionError: Expected 'isdir' to be called once. Called 0 times. ====================================================================== FAIL: Establish that if `tower-cli config` is called with both a value ---------------------------------------------------------------------- Traceback (most recent call last): File "/builddir/build/BUILD/tower-cli-3.0.1/tests/test_commands_config.py", line 202, in test_error_value_and_unset self.assertEqual(result.exit_code, 2) AssertionError: -1 != 2 ====================================================================== FAIL: Establish that if we are given a key and no value, that the ---------------------------------------------------------------------- Traceback (most recent call last): File "/builddir/build/BUILD/tower-cli-3.0.1/tests/test_commands_config.py", line 59, in test_key_and_no_value self.assertEqual(result.exit_code, 0) AssertionError: -1 != 0 ====================================================================== FAIL: Establish that if `tower-cli config` is called with no arguments, ---------------------------------------------------------------------- Traceback (most recent call last): File "/builddir/build/BUILD/tower-cli-3.0.1/tests/test_commands_config.py", line 46, in test_no_arguments self.assertEqual(result.exit_code, 0) AssertionError: -1 != 0 ====================================================================== FAIL: Warn user if configuration file permissions can not be set ---------------------------------------------------------------------- Traceback (most recent call last): File "/builddir/build/BUILD/tower-cli-3.0.1/tests/test_commands_config.py", line 101, in test_permissions_warning warn.assert_called_once_with(mock.ANY, UserWarning) File "/usr/lib64/python3.5/unittest/mock.py", line 802, in assert_called_once_with raise AssertionError(msg) AssertionError: Expected 'warn' to be called once. Called 0 times. ====================================================================== FAIL: Establish that calling `tower-cli config --unset` works in the ---------------------------------------------------------------------- Traceback (most recent call last): File "/builddir/build/BUILD/tower-cli-3.0.1/tests/test_commands_config.py", line 180, in test_unset self.assertEqual(result.exit_code, 0) AssertionError: -1 != 0 ====================================================================== FAIL: Establish that if we attempt to write a valid setting, that ---------------------------------------------------------------------- Traceback (most recent call last): File "/builddir/build/BUILD/tower-cli-3.0.1/tests/test_commands_config.py", line 126, in test_write_global_setting isdir.assert_called_once_with('/etc/tower/') File "/usr/lib64/python3.5/unittest/mock.py", line 802, in assert_called_once_with raise AssertionError(msg) AssertionError: Expected 'isdir' to be called once. Called 0 times. ====================================================================== FAIL: Establish that if we attempt to write a valid setting locally, that ---------------------------------------------------------------------- Traceback (most recent call last): File "/builddir/build/BUILD/tower-cli-3.0.1/tests/test_commands_config.py", line 154, in test_write_local_setting chmod.assert_called_once_with(filename, int('0600', 8)) File "/usr/lib64/python3.5/unittest/mock.py", line 802, in assert_called_once_with raise AssertionError(msg) AssertionError: Expected 'chmod' to be called once. Called 0 times. ====================================================================== FAIL: Establish that if we attempt to write a valid setting, that ---------------------------------------------------------------------- Traceback (most recent call last): File "/builddir/build/BUILD/tower-cli-3.0.1/tests/test_commands_config.py", line 75, in test_write_setting chmod.assert_called_once_with(filename, int('0600', 8)) File "/usr/lib64/python3.5/unittest/mock.py", line 802, in assert_called_once_with raise AssertionError(msg) AssertionError: Expected 'chmod' to be called once. Called 0 times. ====================================================================== FAIL: Establish that if we attempt to write a valid setting, that ---------------------------------------------------------------------- Traceback (most recent call last): File "/builddir/build/BUILD/tower-cli-3.0.1/tests/test_commands_config.py", line 264, in test_write_global_setting_deprecated DeprecationWarning) File "/usr/lib64/python3.5/unittest/mock.py", line 802, in assert_called_once_with raise AssertionError(msg) AssertionError: Expected 'warn' to be called once. Called 0 times. ====================================================================== FAIL: Establish that the version command gives a nice error in cases ---------------------------------------------------------------------- Traceback (most recent call last): File "/builddir/build/BUILD/tower-cli-3.0.1/tests/test_commands_version.py", line 58, in test_cannot_connect self.assertEqual(result.exit_code, 1) AssertionError: -1 != 1 ====================================================================== FAIL: Establish that the version command returns the output we ---------------------------------------------------------------------- Traceback (most recent call last): File "/builddir/build/BUILD/tower-cli-3.0.1/tests/test_commands_version.py", line 45, in test_version_command self.assertEqual(result.exit_code, 0) AssertionError: -1 != 0 ====================================================================== FAIL: Establish that no_args_is_help causes the help to be printed, ---------------------------------------------------------------------- Traceback (most recent call last): File "/builddir/build/BUILD/tower-cli-3.0.1/tests/test_utils_command.py", line 42, in test_dash_dash_help self.assertEqual(self.runner.invoke(foo, ['bar']).output, 'bar\n') AssertionError: '' != 'bar\n' + bar Looking the code, it seems like those tests rely heavily on click: https://github.com/ansible/tower-cli/blob/master/tests/test_commands_config.py https://github.com/ansible/tower-cli/blob/master/tests/test_commands_version.py https://github.com/ansible/tower-cli/blob/master/tests/test_utils_command.py Upstream is running the same tests without problem, so I guess it has to be something with out python3-click build
Robert, do you want to investigate this issue? Please reassign to me if you want Python-Maint to do it.
Traceback (most recent call last): File "/builddir/build/BUILD/tower-cli-3.0.1/tests/test_api.py", line 199, in test_failed_suggestion_protocol secho.assert_called() File "/usr/lib64/python3.5/unittest/mock.py", line 583, in __getattr__ raise AttributeError(name) AttributeError: assert_called python3-click is alright, actually upstream doesn't support python3.5 yet[0]. This is casued by simply MagicMock object not containing `assert_called`, this attribute is missing also in Python-3.4' mock, my guess is that it is somehow called via overloaded __getattr__ function[1]. I couldn't reproduce the other errors using: > https://github.com/ansible/tower-cli.git && cd towe-cli > git checkout tags/v3.0.1 > # edited tox to include py3.5 > tox I suggest you to contact upstream. Feel free to reopen if you disagree with my findings :-) [0] https://travis-ci.org/ansible/tower-cli/jobs/163117680 [1] https://github.com/python/cpython/blob/3.4/Lib/unittest/mock.py#L569
To reword: This is casued by simply MagicMock object not containing `assert_called` so the failure is expected. This attribute is missing also in Python-3.4' mock, the reason why tests pass there is probably overloaded function `__getattr__`[1] but I don't really have a time to deep dive into Mock implementation :-). Python 3.5.1 (default, Sep 19 2016, 10:16:17) [GCC 6.1.1 20160621 (Red Hat 6.1.1-3)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from unittest import mock >>> dir(mock.MagicMock()) ['assert_any_call', 'assert_called_once_with', 'assert_called_with', 'assert_has_calls', 'assert_not_called', 'attach_mock', 'call_args', 'call_args_list', 'call_count', 'called', 'configure_mock', 'method_calls', 'mock_add_spec', 'mock_calls', 'reset_mock', 'return_value', 'side_effect'] >>> mock.MagicMock().assert_called Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib64/python3.5/unittest/mock.py", line 583, in __getattr__ raise AttributeError(name) AttributeError: assert_called Python 3.4.3 (default, Jun 29 2015, 12:16:01) [GCC 5.1.1 20150618 (Red Hat 5.1.1-4)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from unittest import mock >>> mock.MagicMock().assert_called <MagicMock name='mock.assert_called' id='139786006442560'> >>> dir(mock.MagicMock()) ['assert_any_call', 'assert_called_once_with', 'assert_called_with', 'assert_has_calls', 'attach_mock', 'call_args', 'call_args_list', 'call_count', 'called', 'configure_mock', 'method_calls', 'mock_add_spec', 'mock_calls', 'reset_mock', 'return_value', 'side_effect']
Aside from the first error (which upstream had too, and has now been fixed by me) all the other errors are click related in my opinion.
To quote myself: > I couldn't reproduce the other errors using: > > > git clone https://github.com/ansible/tower-cli.git && cd tower-cli > > git checkout tags/v3.0.1 > > # edited tox to include py3.5 > > tox You have to provide a reproducer, the template for reporting a bug exists for a reason.
Sorry for the delay. So, I'm trying to create an RPM, and this is the SRPM: https://fale.fedorapeople.org/rpms/python-ansible-tower-cli-3.0.1-1.fc24.src.rpm This is the spec file: https://fale.fedorapeople.org/rpms/python-ansible-tower-cli.spec This is the patch I'm applying: https://fale.fedorapeople.org/rpms/tower-cli-fix_py35_tests.patch (that is a cherrypick of https://github.com/ansible/tower-cli/commit/3317c834a30bb4c616eedad82a28bcd1f95bbe66). This patch does solve the assert_called problem. Trying to build this on F24, this is the result: http://koji.fedoraproject.org/koji/taskinfo?taskID=15951996
I couldn't reproduce the issue unless I run mkdir -p /etc/tower touch /etc/tower/tower_cli.cfg before running tests, without it tests pass just fine, looking at the tower-cli CI [0] I can't see them to create tower_cli.cfg so I assume thats the reason for failing the other tests. [0] https://travis-ci.org/ansible/tower-cli/jobs/166447312
Thanks a lot for the help and sorry for the bug that was not right