This is an automated email from the ASF dual-hosted git repository. dill0wn pushed a commit to branch dw/8455 in repository https://gitbox.apache.org/repos/asf/allura.git
commit 47ec7df62614ae02e7731b5470c63c5bf5ccd8a0 Author: Dillon Walls <[email protected]> AuthorDate: Wed Sep 14 14:37:01 2022 +0000 fixup! [#8455] allura pytest - fix misc test failures that popped up during pytest conversion --- Allura/allura/tests/exclude_from_rewrite_hook.py | 31 +++++++ .../allura/tests/functional/test_neighborhood.py | 8 +- Allura/allura/tests/test_plugin.py | 35 ++++--- Allura/allura/tests/test_tasks.py | 38 +++----- Allura/allura/tests/test_webhooks.py | 101 +++++++++++---------- 5 files changed, 117 insertions(+), 96 deletions(-) diff --git a/Allura/allura/tests/exclude_from_rewrite_hook.py b/Allura/allura/tests/exclude_from_rewrite_hook.py new file mode 100644 index 000000000..509841776 --- /dev/null +++ b/Allura/allura/tests/exclude_from_rewrite_hook.py @@ -0,0 +1,31 @@ +import sys + +from allura.app import Application +from allura.lib.decorators import task +from allura.lib.exceptions import CompoundError + + +class ThemeProviderTestApp(Application): + """ + If this test class is added directly to a test module, pkg_resources internals + will throw this error: + NotImplementedError: Can't perform this operation for unregistered loader type + This is because pytest adds a hook to override the default assert behavior and this + conflicts/messes-with pkg_resources. Theoretically on python > py37, importlib.resources + can do the same things as pkg_resources and faster, but those solutions don't currently + work on py37. + """ + icons = { + 24: 'images/testapp_24.png', + } + + +@task +def raise_compound_exception(): + errs = [] + for x in range(10): + try: + assert False, 'assert %d' % x + except Exception: + errs.append(sys.exc_info()) + raise CompoundError(*errs) \ No newline at end of file diff --git a/Allura/allura/tests/functional/test_neighborhood.py b/Allura/allura/tests/functional/test_neighborhood.py index 5076ef049..3268a3b51 100644 --- a/Allura/allura/tests/functional/test_neighborhood.py +++ b/Allura/allura/tests/functional/test_neighborhood.py @@ -43,12 +43,12 @@ from allura.tests.pytest_helpers import with_nose_compatibility @with_nose_compatibility class TestNeighborhood(TestController): - def setUp(self): - super().setUp() + def setup_method(self, method): + super().setup_method(method) self._cleanup_audit_log() - def tearDown(self): - super().tearDown() + def teardown_method(self, method): + super().teardown_method(method) self._cleanup_audit_log() def _cleanup_audit_log(self): diff --git a/Allura/allura/tests/test_plugin.py b/Allura/allura/tests/test_plugin.py index 22a7ed8bf..56b358a79 100644 --- a/Allura/allura/tests/test_plugin.py +++ b/Allura/allura/tests/test_plugin.py @@ -35,7 +35,6 @@ from alluratest.tools import ( from mock import Mock, MagicMock, patch from allura import model as M -from allura.app import Application from allura.lib import plugin from allura.lib import phone from allura.lib import helpers as h @@ -44,15 +43,19 @@ from allura.lib.plugin import ProjectRegistrationProvider from allura.lib.plugin import ThemeProvider from allura.lib.exceptions import ProjectConflict, ProjectShortnameInvalid from allura.tests.decorators import audits +from allura.tests.exclude_from_rewrite_hook import ThemeProviderTestApp from alluratest.controller import setup_basic_test, setup_global_objects from allura.tests.pytest_helpers import with_nose_compatibility +def setup_module(module): + setup_basic_test() + + @with_nose_compatibility class TestProjectRegistrationProvider: def setup_method(self, method): - setup_basic_test() self.provider = ProjectRegistrationProvider() @patch('allura.lib.security.has_access') @@ -170,7 +173,6 @@ class TestProjectRegistrationProviderPhoneVerification: self.user = UserMock() self.nbhd = MagicMock() - def test_phone_verified_disabled(self): with h.push_config(tg.config, **{'project.verify_phone': 'false'}): assert self.p.phone_verified(self.user, self.nbhd) @@ -280,36 +282,31 @@ class TestProjectRegistrationProviderPhoneVerification: assert result == g.phone_service.verify.return_value assert 5 == g.phone_service.verify.call_count + @with_nose_compatibility class TestThemeProvider: @patch('allura.app.g') @patch('allura.lib.plugin.g') + # FIXME: check with dave. def test_app_icon_str(self, plugin_g, app_g): - class TestApp(Application): - icons = { - 24: 'images/testapp_24.png', - } - plugin_g.entry_points = {'tool': {'testapp': TestApp}} - assert (ThemeProvider().app_icon_url('testapp', 24) == - app_g.theme_href.return_value) + plugin_g.entry_points = {'tool': {'testapp': ThemeProviderTestApp}} + app_icon = ThemeProvider().app_icon_url('testapp', 24) + other = app_g.theme_href.return_value + assert app_icon == other + app_g.theme_href.assert_called_with('images/testapp_24.png') @patch('allura.lib.plugin.g') def test_app_icon_str_invalid(self, g): g.entry_points = {'tool': {'testapp': Mock()}} - assert (ThemeProvider().app_icon_url('invalid', 24) == - None) + assert ThemeProvider().app_icon_url('invalid', 24) == None @patch('allura.app.g') def test_app_icon_app(self, g): - class TestApp(Application): - icons = { - 24: 'images/testapp_24.png', - } - app = TestApp(None, None) - assert (ThemeProvider().app_icon_url(app, 24) == - g.theme_href.return_value) + app = ThemeProviderTestApp(None, None) + assert ThemeProvider().app_icon_url(app, 24) == \ + g.theme_href.return_value g.theme_href.assert_called_with('images/testapp_24.png') diff --git a/Allura/allura/tests/test_tasks.py b/Allura/allura/tests/test_tasks.py index 735b3294b..429effd80 100644 --- a/Allura/allura/tests/test_tasks.py +++ b/Allura/allura/tests/test_tasks.py @@ -18,6 +18,7 @@ import operator import shutil import sys +from textwrap import dedent import unittest import six @@ -52,6 +53,7 @@ from allura.tasks import export_tasks from allura.tasks import admin_tasks from allura.tests import decorators as td from allura.tests.pytest_helpers import with_nose_compatibility +from allura.tests.exclude_from_rewrite_hook import raise_compound_exception from allura.lib.decorators import event_handler, task @@ -148,7 +150,7 @@ class TestEventTasks(unittest.TestCase): assert M.MonQTask.query.get(task_name='allura.tasks.event_tasks.event', args=['my_event4']) def test_compound_error(self): - t = raise_exc.post() + t = raise_compound_exception.post() with LogCapture(level=logging.ERROR) as l, \ mock.patch.dict(tg.config, {'monq.raise_errors': False}): # match normal non-test behavior t() @@ -158,7 +160,7 @@ class TestEventTasks(unittest.TestCase): assert "AssertionError('assert 0'" in msg assert "AssertionError('assert 5'" in msg assert ' on job <MonQTask ' in msg - assert ' (error) P:10 allura.tests.test_tasks.raise_exc ' in msg + assert ' (error) P:10 allura.tests.exclude_from_rewrite_hook.raise_compound_exception ' in msg for x in range(10): assert ('assert %d' % x) in t.result @@ -510,16 +512,17 @@ class TestMailTasks(unittest.TestCase): @td.with_tool('test', 'Tickets', 'bugs') def test_receive_autoresponse(self): - message = '''Date: Wed, 30 Oct 2013 01:38:40 -0700 -From: <[email protected]> -To: <[email protected]> -Message-ID: <super-unique-id> -Subject: Not here Re: Message notification -Precedence: bulk -X-Autoreply: yes -Auto-Submitted: auto-replied - -I'm not here''' + message = dedent('''\ + Date: Wed, 30 Oct 2013 01:38:40 -0700 + From: <[email protected]> + To: <[email protected]> + Message-ID: <super-unique-id> + Subject: Not here Re: Message notification + Precedence: bulk + X-Autoreply: yes + Auto-Submitted: auto-replied + + I'm not here''') import forgetracker c.user = M.User.by_username('test-admin') with mock.patch.object(forgetracker.tracker_main.ForgeTrackerApp, 'handle_message') as hm: @@ -597,17 +600,6 @@ def _my_event(event_type, testcase, *args, **kwargs): testcase.called_with.append((args, kwargs)) -@task -def raise_exc(): - errs = [] - for x in range(10): - try: - assert False, 'assert %d' % x - except Exception: - errs.append(sys.exc_info()) - raise CompoundError(*errs) - - class _TestArtifact(M.Artifact): _shorthand_id = FieldProperty(str) text = FieldProperty(str) diff --git a/Allura/allura/tests/test_webhooks.py b/Allura/allura/tests/test_webhooks.py index 5b9d5b1f2..8237847d6 100644 --- a/Allura/allura/tests/test_webhooks.py +++ b/Allura/allura/tests/test_webhooks.py @@ -132,6 +132,7 @@ class TestValidators(TestWebhookBase): @with_nose_compatibility class TestWebhookController(TestController): + def setup_method(self, method): super().setup_method(method) self.patches = self.monkey_patch() @@ -182,6 +183,56 @@ class TestWebhookController(TestController): else: assert False, 'Validation error not found' + def test_AAAA_WORKAROUND__edit(self): + """ + This must run first in this test class for unknown reasons ever since + https://github.com/TurboGears/tg2/commit/02fb49b14e70fdd8ac16973488fb3637e5e59114 + + If any test runs the self.app.post from create_webhook before this one, then this test will fail on: + with td.audits(msg): + r = form.submit() + because WebhookValidator's `value` will be "create" instead of an objectid str + + Maybe something to do with WebhookControllerMeta setup of `validate` decorators? + """ + data1 = {'url': 'http://httpbin.org/post', + 'secret': 'secret'} + data2 = {'url': 'http://example.com/hook', + 'secret': 'secret2'} + self.create_webhook(data1).follow() + self.create_webhook(data2).follow() + assert M.Webhook.query.find().count() == 2 + wh1 = M.Webhook.query.get(hook_url=data1['url']) + r = self.app.get(self.url + '/repo-push/%s' % wh1._id) + form = r.forms[0] + assert form['url'].value == data1['url'] + assert form['secret'].value == data1['secret'] + assert form['webhook'].value == str(wh1._id) + form['url'] = 'http://host.org/hook' + form['secret'] = 'new secret' + msg = 'edit webhook repo-push\n{} => {}\n{}'.format( + data1['url'], form['url'].value, 'secret changed') + with td.audits(msg): + r = form.submit() + wf = json.loads(self.webflash(r)) + assert wf['status'] == 'ok' + assert wf['message'] == 'Edited successfully' + assert M.Webhook.query.find().count() == 2 + wh1 = M.Webhook.query.get(_id=wh1._id) + assert wh1.hook_url == 'http://host.org/hook' + assert wh1.app_config_id == self.git.config._id + assert wh1.secret == 'new secret' + assert wh1.type == 'repo-push' + + # Duplicates + r = self.app.get(self.url + '/repo-push/%s' % wh1._id) + form = r.forms[0] + form['url'] = data2['url'] + r = form.submit() + self.find_error(r, '_the_form', + '"repo-push" webhook already exists for Git http://example.com/hook', + form_type='edit') + def test_access(self): self.app.get(self.url + '/repo-push/') self.app.get(self.url + '/repo-push/', @@ -256,56 +307,6 @@ class TestWebhookController(TestController): self.find_error(r, 'url', 'You must provide a full domain name (like qwer.com)') - def test_AAAA_WORKAROUND__edit(self): - """ - This must run first in this test class for unknown reasons ever since - https://github.com/TurboGears/tg2/commit/02fb49b14e70fdd8ac16973488fb3637e5e59114 - - If any test runs the self.app.post from create_webhook before this one, then this test will fail on: - with td.audits(msg): - r = form.submit() - because WebhookValidator's `value` will be "create" instead of an objectid str - - Maybe something to do with WebhookControllerMeta setup of `validate` decorators? - """ - data1 = {'url': 'http://httpbin.org/post', - 'secret': 'secret'} - data2 = {'url': 'http://example.com/hook', - 'secret': 'secret2'} - self.create_webhook(data1).follow() - self.create_webhook(data2).follow() - assert M.Webhook.query.find().count() == 2 - wh1 = M.Webhook.query.get(hook_url=data1['url']) - r = self.app.get(self.url + '/repo-push/%s' % wh1._id) - form = r.forms[0] - assert form['url'].value == data1['url'] - assert form['secret'].value == data1['secret'] - assert form['webhook'].value == str(wh1._id) - form['url'] = 'http://host.org/hook' - form['secret'] = 'new secret' - msg = 'edit webhook repo-push\n{} => {}\n{}'.format( - data1['url'], form['url'].value, 'secret changed') - with td.audits(msg): - r = form.submit() - wf = json.loads(self.webflash(r)) - assert wf['status'] == 'ok' - assert wf['message'] == 'Edited successfully' - assert M.Webhook.query.find().count() == 2 - wh1 = M.Webhook.query.get(_id=wh1._id) - assert wh1.hook_url == 'http://host.org/hook' - assert wh1.app_config_id == self.git.config._id - assert wh1.secret == 'new secret' - assert wh1.type == 'repo-push' - - # Duplicates - r = self.app.get(self.url + '/repo-push/%s' % wh1._id) - form = r.forms[0] - form['url'] = data2['url'] - r = form.submit() - self.find_error(r, '_the_form', - '"repo-push" webhook already exists for Git http://example.com/hook', - form_type='edit') - def test_edit_validation(self): invalid = M.Webhook( type='invalid type',
