This is an automated email from the ASF dual-hosted git repository. dill0wn pushed a commit to branch dw/8455-part2 in repository https://gitbox.apache.org/repos/asf/allura.git
commit e26ca2e2b60e5e1057e0d05fa1de2734e32bd05a Author: Dillon Walls <[email protected]> AuthorDate: Fri Sep 30 00:30:54 2022 +0000 fixup! fixup! fixup! [#8455] remove @with_setup --- Allura/allura/tests/test_app.py | 295 +++++++++++++++++++--------------------- 1 file changed, 143 insertions(+), 152 deletions(-) diff --git a/Allura/allura/tests/test_app.py b/Allura/allura/tests/test_app.py index 71733a2d5..8a6924ce2 100644 --- a/Allura/allura/tests/test_app.py +++ b/Allura/allura/tests/test_app.py @@ -20,161 +20,152 @@ import mock from ming.base import Object import pytest from formencode import validators as fev +from textwrap import dedent from alluratest.controller import setup_unit_test from alluratest.tools import with_setup from allura import app from allura.lib.app_globals import Icon from allura.lib import mail_util -from alluratest.pytest_helpers import with_nose_compatibility - - -def setup_method(): - setup_unit_test() - c.user._id = None - c.project = mock.Mock() - c.project.name = 'Test Project' - c.project.shortname = 'tp' - c.project._id = 'testproject/' - c.project.url = lambda: '/testproject/' - app_config = mock.Mock() - app_config._id = None - app_config.project_id = 'testproject/' - app_config.tool_name = 'tool' - app_config.options = Object(mount_point='foo') - c.app = mock.Mock() - c.app.config = app_config - c.app.config.script_name = lambda: '/testproject/test_application/' - c.app.config.url = lambda: 'http://testproject/test_application/' - c.app.url = c.app.config.url() - c.app.__version__ = '0.0' - -def test_config_options(): - options = [ - app.ConfigOption('test1', str, 'MyTestValue'), - app.ConfigOption('test2', str, lambda:'MyTestValue')] - assert options[0].default == 'MyTestValue' - assert options[1].default == 'MyTestValue' - - -def test_config_options_render_attrs(): - opt = app.ConfigOption('test1', str, None, extra_attrs={'type': 'url'}) - assert opt.render_attrs() == 'type="url"' - - -def test_config_option_without_validator(): - opt = app.ConfigOption('test1', str, None) - assert opt.validate(None) == None - assert opt.validate('') == '' - assert opt.validate('val') == 'val' - - -def test_config_option_with_validator(): - v = fev.NotEmpty() - opt = app.ConfigOption('test1', str, None, validator=v) - assert opt.validate('val') == 'val' - pytest.raises(fev.Invalid, opt.validate, None) - pytest.raises(fev.Invalid, opt.validate, '') - - -@with_setup(setup_method) -def test_options_on_install_default(): - a = app.Application(c.project, c.app.config) - assert a.options_on_install() == [] - - -@with_setup(setup_method) -def test_options_on_install(): - opts = [app.ConfigOption('url', str, None), - app.ConfigOption('private', bool, None)] - class TestApp(app.Application): - config_options = app.Application.config_options + opts + [ - app.ConfigOption('not_on_install', str, None), - ] - config_on_install = ['url', 'private'] - - a = TestApp(c.project, c.app.config) - assert a.options_on_install() == opts - -@with_setup(setup_method) -def test_main_menu(): - class TestApp(app.Application): - @property - def sitemap(self): - children = [app.SitemapEntry('New', 'new', ui_icon=Icon('some-icon')), - app.SitemapEntry('Recent', 'recent'), - ] - return [app.SitemapEntry('My Tool', '.')[children]] - - a = TestApp(c.project, c.app.config) - main_menu = a.main_menu() - assert len(main_menu) == 1 - assert main_menu[0].children == [] # default main_menu implementation should drop the children from sitemap() - - -@with_setup(setup_method) -def test_sitemap(): - sm = app.SitemapEntry('test', '')[ - app.SitemapEntry('a', 'a/'), - app.SitemapEntry('b', 'b/')] - sm[app.SitemapEntry(lambda app:app.config.script_name(), 'c/')] - bound_sm = sm.bind_app(c.app) - assert bound_sm.url == 'http://testproject/test_application/', bound_sm.url - assert bound_sm.children[ - -1].label == '/testproject/test_application/', bound_sm.children[-1].label - assert len(sm.children) == 3 - sm.extend([app.SitemapEntry('a', 'a/')[ - app.SitemapEntry('d', 'd/')]]) - assert len(sm.children) == 3 - - -@with_setup(setup_method) [email protected]('allura.app.Application.PostClass.query.get') -def test_handle_artifact_unicode(qg): - """ - Tests that app.handle_artifact_message can accept utf strings - """ - ticket = mock.MagicMock() - ticket.get_discussion_thread.return_value = (mock.MagicMock(), mock.MagicMock()) - post = mock.MagicMock() - qg.return_value = post - - a = app.Application(c.project, c.app.config) - - msg = dict(payload='foo ƒ†©¥˙¨ˆ'.encode(), message_id=1, headers={}) - a.handle_artifact_message(ticket, msg) - assert post.attach.call_args[0][1].getvalue() == 'foo ƒ†©¥˙¨ˆ'.encode() - - msg = dict(payload=b'foo', message_id=1, headers={}) - a.handle_artifact_message(ticket, msg) - assert post.attach.call_args[0][1].getvalue() == b'foo' - - msg = dict(payload="\x94my quote\x94".encode(), message_id=1, headers={}) - a.handle_artifact_message(ticket, msg) - assert post.attach.call_args[0][1].getvalue() == '\x94my quote\x94'.encode() - - # assert against prod example - msg_raw = """Message-Id: <1502352031.3216858.1068961568.19ef4...@webmail.messagingengine.com> -From: foo <[email protected]> -To: "[forge:site-support]" <[email protected]> -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Content-Type: multipart/alternative; boundary="_----------=_150235203132168580" -Date: Thu, 10 Aug 2017 10:00:31 +0200 -Subject: Re: [forge:site-support] #15391 Unable to join (my own) mailing list -This is a multi-part message in MIME format. ---_----------=_150235203132168580 -Content-Transfer-Encoding: quoted-printable -Content-Type: text/plain; charset="utf-8" -Hi ---_----------=_150235203132168580 -Content-Transfer-Encoding: quoted-printable -Content-Type: text/html; charset="utf-8" -<!DOCTYPE html> -<html><body>Hi</body></html> ---_----------=_150235203132168580-- - """ - msg = mail_util.parse_message(msg_raw) - for p in [p for p in msg['parts'] if p['payload'] is not None]: - # filter here mimics logic in `route_email` - a.handle_artifact_message(ticket, p) + + +class TestApp: + + def setup_method(self): + setup_unit_test() + c.user._id = None + c.project = mock.Mock() + c.project.name = 'Test Project' + c.project.shortname = 'tp' + c.project._id = 'testproject/' + c.project.url = lambda: '/testproject/' + app_config = mock.Mock() + app_config._id = None + app_config.project_id = 'testproject/' + app_config.tool_name = 'tool' + app_config.options = Object(mount_point='foo') + c.app = mock.Mock() + c.app.config = app_config + c.app.config.script_name = lambda: '/testproject/test_application/' + c.app.config.url = lambda: 'http://testproject/test_application/' + c.app.url = c.app.config.url() + c.app.__version__ = '0.0' + + def test_config_options(self): + options = [ + app.ConfigOption('test1', str, 'MyTestValue'), + app.ConfigOption('test2', str, lambda:'MyTestValue')] + assert options[0].default == 'MyTestValue' + assert options[1].default == 'MyTestValue' + + def test_config_options_render_attrs(self): + opt = app.ConfigOption('test1', str, None, extra_attrs={'type': 'url'}) + assert opt.render_attrs() == 'type="url"' + + def test_config_option_without_validator(self): + opt = app.ConfigOption('test1', str, None) + assert opt.validate(None) == None + assert opt.validate('') == '' + assert opt.validate('val') == 'val' + + def test_config_option_with_validator(self): + v = fev.NotEmpty() + opt = app.ConfigOption('test1', str, None, validator=v) + assert opt.validate('val') == 'val' + pytest.raises(fev.Invalid, opt.validate, None) + pytest.raises(fev.Invalid, opt.validate, '') + + def test_options_on_install_default(self): + a = app.Application(c.project, c.app.config) + assert a.options_on_install() == [] + + def test_options_on_install(self): + opts = [app.ConfigOption('url', str, None), + app.ConfigOption('private', bool, None)] + class TestApp(app.Application): + config_options = app.Application.config_options + opts + [ + app.ConfigOption('not_on_install', str, None), + ] + config_on_install = ['url', 'private'] + + a = TestApp(c.project, c.app.config) + assert a.options_on_install() == opts + + def test_main_menu(self): + class TestApp(app.Application): + @property + def sitemap(self): + children = [app.SitemapEntry('New', 'new', ui_icon=Icon('some-icon')), + app.SitemapEntry('Recent', 'recent'), + ] + return [app.SitemapEntry('My Tool', '.')[children]] + + a = TestApp(c.project, c.app.config) + main_menu = a.main_menu() + assert len(main_menu) == 1 + assert main_menu[0].children == [] # default main_menu implementation should drop the children from sitemap() + + def test_sitemap(self): + sm = app.SitemapEntry('test', '')[ + app.SitemapEntry('a', 'a/'), + app.SitemapEntry('b', 'b/')] + sm[app.SitemapEntry(lambda app:app.config.script_name(), 'c/')] + bound_sm = sm.bind_app(c.app) + assert bound_sm.url == 'http://testproject/test_application/', bound_sm.url + assert bound_sm.children[ + -1].label == '/testproject/test_application/', bound_sm.children[-1].label + assert len(sm.children) == 3 + sm.extend([app.SitemapEntry('a', 'a/')[ + app.SitemapEntry('d', 'd/')]]) + assert len(sm.children) == 3 + + @mock.patch('allura.app.Application.PostClass.query.get') + def test_handle_artifact_unicode(self, qg): + """ + Tests that app.handle_artifact_message can accept utf strings + """ + ticket = mock.MagicMock() + ticket.get_discussion_thread.return_value = (mock.MagicMock(), mock.MagicMock()) + post = mock.MagicMock() + qg.return_value = post + + a = app.Application(c.project, c.app.config) + + msg = dict(payload='foo ƒ†©¥˙¨ˆ'.encode(), message_id=1, headers={}) + a.handle_artifact_message(ticket, msg) + assert post.attach.call_args[0][1].getvalue() == 'foo ƒ†©¥˙¨ˆ'.encode() + + msg = dict(payload=b'foo', message_id=1, headers={}) + a.handle_artifact_message(ticket, msg) + assert post.attach.call_args[0][1].getvalue() == b'foo' + + msg = dict(payload="\x94my quote\x94".encode(), message_id=1, headers={}) + a.handle_artifact_message(ticket, msg) + assert post.attach.call_args[0][1].getvalue() == '\x94my quote\x94'.encode() + + # assert against prod example + msg_raw = dedent("""\ + Message-Id: <1502352031.3216858.1068961568.19ef4...@webmail.messagingengine.com> + From: foo <[email protected]> + To: "[forge:site-support]" <[email protected]> + MIME-Version: 1.0 + Content-Transfer-Encoding: 7bit + Content-Type: multipart/alternative; boundary="_----------=_150235203132168580" + Date: Thu, 10 Aug 2017 10:00:31 +0200 + Subject: Re: [forge:site-support] #15391 Unable to join (my own) mailing list + This is a multi-part message in MIME format. + --_----------=_150235203132168580 + Content-Transfer-Encoding: quoted-printable + Content-Type: text/plain; charset="utf-8" + Hi + --_----------=_150235203132168580 + Content-Transfer-Encoding: quoted-printable + Content-Type: text/html; charset="utf-8" + <!DOCTYPE html> + <html><body>Hi</body></html> + --_----------=_150235203132168580-- + """) + msg = mail_util.parse_message(msg_raw) + for p in [p for p in msg['parts'] if p['payload'] is not None]: + # filter here mimics logic in `route_email` + a.handle_artifact_message(ticket, p)
