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 98462a4435f0f58717a1e42eadce2079403d9e94 Author: Dillon Walls <[email protected]> AuthorDate: Fri Sep 30 00:36:09 2022 +0000 fixup! fixup! fixup! fixup! [#8455] remove @with_setup --- Allura/allura/tests/model/test_project.py | 325 +++++++++++++++--------------- 1 file changed, 157 insertions(+), 168 deletions(-) diff --git a/Allura/allura/tests/model/test_project.py b/Allura/allura/tests/model/test_project.py index 524754bc3..6a1d44a8a 100644 --- a/Allura/allura/tests/model/test_project.py +++ b/Allura/allura/tests/model/test_project.py @@ -31,172 +31,161 @@ from allura.lib.exceptions import ToolError, Invalid from mock import MagicMock, patch -def setup_method(): - setup_basic_test() - setup_with_tools() - - [email protected]_wiki -def setup_with_tools(): - setup_global_objects() - - -@with_setup(setup_method) -def test_project(): - assert type(c.project.sidebar_menu()) == list - assert c.project.script_name in c.project.url() - old_proj = c.project - h.set_context('test/sub1', neighborhood='Projects') - assert type(c.project.sidebar_menu()) == list - assert type(c.project.sitemap()) == list - assert c.project.sitemap()[1].label == 'Admin' - assert old_proj in list(c.project.parent_iter()) - h.set_context('test', 'wiki', neighborhood='Projects') - adobe_nbhd = M.Neighborhood.query.get(name='Adobe') - p = M.Project.query.get( - shortname='adobe-1', neighborhood_id=adobe_nbhd._id) - # assert 'http' in p.url() # We moved adobe into /adobe/, not - # http://adobe.... - assert p.script_name in p.url() - assert c.project.shortname == 'test' - assert '<p>' in c.project.description_html - c.project.uninstall_app('hello-test-mount-point') - ThreadLocalORMSession.flush_all() - - c.project.install_app('Wiki', 'hello-test-mount-point') - c.project.support_page = 'hello-test-mount-point' - assert c.project.app_config('wiki').tool_name == 'wiki' - ThreadLocalORMSession.flush_all() - with td.raises(ToolError): - # already installed +class TestProjectModel: + + def setup_method(self): + setup_basic_test() + self.setup_with_tools() + + @td.with_wiki + def setup_with_tools(self): + setup_global_objects() + + def test_project(self): + assert type(c.project.sidebar_menu()) == list + assert c.project.script_name in c.project.url() + old_proj = c.project + h.set_context('test/sub1', neighborhood='Projects') + assert type(c.project.sidebar_menu()) == list + assert type(c.project.sitemap()) == list + assert c.project.sitemap()[1].label == 'Admin' + assert old_proj in list(c.project.parent_iter()) + h.set_context('test', 'wiki', neighborhood='Projects') + adobe_nbhd = M.Neighborhood.query.get(name='Adobe') + p = M.Project.query.get( + shortname='adobe-1', neighborhood_id=adobe_nbhd._id) + # assert 'http' in p.url() # We moved adobe into /adobe/, not + # http://adobe.... + assert p.script_name in p.url() + assert c.project.shortname == 'test' + assert '<p>' in c.project.description_html + c.project.uninstall_app('hello-test-mount-point') + ThreadLocalORMSession.flush_all() + c.project.install_app('Wiki', 'hello-test-mount-point') - ThreadLocalORMSession.flush_all() - c.project.uninstall_app('hello-test-mount-point') - ThreadLocalORMSession.flush_all() - with td.raises(ToolError): - # mount point reserved - c.project.install_app('Wiki', 'feed') - with td.raises(ToolError): - # mount point too long - c.project.install_app('Wiki', 'a' * 64) - with td.raises(ToolError): - # mount point must begin with letter - c.project.install_app('Wiki', '1') - # single letter mount points are allowed - c.project.install_app('Wiki', 'a') - # Make sure the project support page is reset if the tool it was pointing - # to is uninstalled. - assert c.project.support_page == '' - app_config = c.project.app_config('hello') - app_inst = c.project.app_instance(app_config) - app_inst = c.project.app_instance('hello') - app_inst = c.project.app_instance('hello2123') - c.project.breadcrumbs() - c.app.config.breadcrumbs() - - -@with_setup(setup_method) -def test_install_app_validates_options(): - from forgetracker.tracker_main import ForgeTrackerApp - name = 'TicketMonitoringEmail' - opt = [o for o in ForgeTrackerApp.config_options if o.name == name][0] - opt.validator = fev.Email(not_empty=True) - with patch.object(ForgeTrackerApp, 'config_on_install', new=[opt.name]): - for v in [None, '', 'bad@email']: - with td.raises(ToolError): - c.project.install_app('Tickets', 'test-tickets', **{name: v}) - assert c.project.app_instance('test-tickets') == None - c.project.install_app('Tickets', 'test-tickets', **{name: '[email protected]'}) - app = c.project.app_instance('test-tickets') - assert app.config.options[name] == '[email protected]' - - -def test_project_index(): - project, idx = c.project, c.project.index() - assert 'id' in idx - assert idx['id'] == project.index_id() - assert 'title' in idx - assert 'type_s' in idx - assert 'deleted_b' in idx - assert 'private_b' in idx - assert 'neighborhood_id_s' in idx - assert 'short_description_t' in idx - assert 'url_s' in idx - - -def test_subproject(): - project = M.Project.query.get(shortname='test') - with td.raises(ToolError): - with patch('allura.lib.plugin.ProjectRegistrationProvider') as Provider: - Provider.get().shortname_validator.to_python.side_effect = Invalid( - 'name', 'value', {}) - # name doesn't validate - sp = project.new_subproject('test-proj-nose') - sp = project.new_subproject('test-proj-nose') - spp = sp.new_subproject('spp') - ThreadLocalORMSession.flush_all() - sp.delete() - ThreadLocalORMSession.flush_all() - - [email protected]_wiki -def test_anchored_tools(): - c.project.neighborhood.anchored_tools = 'wiki:Wiki, tickets:Ticket' - c.project.install_app = MagicMock() - assert c.project.sitemap()[0].label == 'Wiki' - assert c.project.install_app.call_args[0][0] == 'tickets' - assert c.project.ordered_mounts()[0]['ac'].tool_name == 'wiki' - - -def test_set_ordinal_to_admin_tool(): - with h.push_config(c, - user=M.User.by_username('test-admin'), - project=M.Project.query.get(shortname='test')): - sm = c.project.sitemap() - assert sm[-1].tool_name == 'admin' - - -@with_setup(setup_method) -def test_users_and_roles(): - p = M.Project.query.get(shortname='test') - sub = p.direct_subprojects[0] - u = M.User.by_username('test-admin') - assert p.users_with_role('Admin') == [u] - assert p.users_with_role('Admin') == sub.users_with_role('Admin') - assert p.users_with_role('Admin') == p.admins() - - user = p.admins()[0] - user.disabled = True - ThreadLocalORMSession.flush_all() - assert p.users_with_role('Admin') == [] - assert p.users_with_role('Admin') == p.admins() - - -@with_setup(setup_method) -def test_project_disabled_users(): - p = M.Project.query.get(shortname='test') - users = p.users() - assert users[0].username == 'test-admin' - user = M.User.by_username('test-admin') - user.disabled = True - ThreadLocalORMSession.flush_all() - users = p.users() - assert users == [] - -def test_screenshot_unicode_serialization(): - p = M.Project.query.get(shortname='test') - screenshot_unicode = M.ProjectFile(project_id=p._id, category='screenshot', caption="ConSelección", filename='ConSelección.jpg') - screenshot_ascii = M.ProjectFile(project_id=p._id, category='screenshot', caption='test-screenshot', filename='test_file.jpg') - ThreadLocalORMSession.flush_all() - - serialized = p.__json__() - screenshots = sorted(serialized['screenshots'], key=lambda k: k['caption']) - - assert len(screenshots) == 2 - assert screenshots[0]['url'] == 'http://localhost/p/test/screenshot/ConSelecci%C3%B3n.jpg' - assert screenshots[0]['caption'] == "ConSelección" - assert screenshots[0]['thumbnail_url'] == 'http://localhost/p/test/screenshot/ConSelecci%C3%B3n.jpg/thumb' - - assert screenshots[1]['url'] == 'http://localhost/p/test/screenshot/test_file.jpg' - assert screenshots[1]['caption'] == 'test-screenshot' - assert screenshots[1]['thumbnail_url'] == 'http://localhost/p/test/screenshot/test_file.jpg/thumb' + c.project.support_page = 'hello-test-mount-point' + assert c.project.app_config('wiki').tool_name == 'wiki' + ThreadLocalORMSession.flush_all() + with td.raises(ToolError): + # already installed + c.project.install_app('Wiki', 'hello-test-mount-point') + ThreadLocalORMSession.flush_all() + c.project.uninstall_app('hello-test-mount-point') + ThreadLocalORMSession.flush_all() + with td.raises(ToolError): + # mount point reserved + c.project.install_app('Wiki', 'feed') + with td.raises(ToolError): + # mount point too long + c.project.install_app('Wiki', 'a' * 64) + with td.raises(ToolError): + # mount point must begin with letter + c.project.install_app('Wiki', '1') + # single letter mount points are allowed + c.project.install_app('Wiki', 'a') + # Make sure the project support page is reset if the tool it was pointing + # to is uninstalled. + assert c.project.support_page == '' + app_config = c.project.app_config('hello') + app_inst = c.project.app_instance(app_config) + app_inst = c.project.app_instance('hello') + app_inst = c.project.app_instance('hello2123') + c.project.breadcrumbs() + c.app.config.breadcrumbs() + + def test_install_app_validates_options(self): + from forgetracker.tracker_main import ForgeTrackerApp + name = 'TicketMonitoringEmail' + opt = [o for o in ForgeTrackerApp.config_options if o.name == name][0] + opt.validator = fev.Email(not_empty=True) + with patch.object(ForgeTrackerApp, 'config_on_install', new=[opt.name]): + for v in [None, '', 'bad@email']: + with td.raises(ToolError): + c.project.install_app('Tickets', 'test-tickets', **{name: v}) + assert c.project.app_instance('test-tickets') == None + c.project.install_app('Tickets', 'test-tickets', **{name: '[email protected]'}) + app = c.project.app_instance('test-tickets') + assert app.config.options[name] == '[email protected]' + + def test_project_index(self): + project, idx = c.project, c.project.index() + assert 'id' in idx + assert idx['id'] == project.index_id() + assert 'title' in idx + assert 'type_s' in idx + assert 'deleted_b' in idx + assert 'private_b' in idx + assert 'neighborhood_id_s' in idx + assert 'short_description_t' in idx + assert 'url_s' in idx + + def test_subproject(self): + project = M.Project.query.get(shortname='test') + with td.raises(ToolError): + with patch('allura.lib.plugin.ProjectRegistrationProvider') as Provider: + Provider.get().shortname_validator.to_python.side_effect = Invalid( + 'name', 'value', {}) + # name doesn't validate + sp = project.new_subproject('test-proj-nose') + sp = project.new_subproject('test-proj-nose') + spp = sp.new_subproject('spp') + ThreadLocalORMSession.flush_all() + sp.delete() + ThreadLocalORMSession.flush_all() + + @td.with_wiki + def test_anchored_tools(self): + c.project.neighborhood.anchored_tools = 'wiki:Wiki, tickets:Ticket' + c.project.install_app = MagicMock() + assert c.project.sitemap()[0].label == 'Wiki' + assert c.project.install_app.call_args[0][0] == 'tickets' + assert c.project.ordered_mounts()[0]['ac'].tool_name == 'wiki' + + def test_set_ordinal_to_admin_tool(self): + with h.push_config(c, + user=M.User.by_username('test-admin'), + project=M.Project.query.get(shortname='test')): + sm = c.project.sitemap() + assert sm[-1].tool_name == 'admin' + + def test_users_and_roles(self): + p = M.Project.query.get(shortname='test') + sub = p.direct_subprojects[0] + u = M.User.by_username('test-admin') + assert p.users_with_role('Admin') == [u] + assert p.users_with_role('Admin') == sub.users_with_role('Admin') + assert p.users_with_role('Admin') == p.admins() + + user = p.admins()[0] + user.disabled = True + ThreadLocalORMSession.flush_all() + assert p.users_with_role('Admin') == [] + assert p.users_with_role('Admin') == p.admins() + + def test_project_disabled_users(self): + p = M.Project.query.get(shortname='test') + users = p.users() + assert users[0].username == 'test-admin' + user = M.User.by_username('test-admin') + user.disabled = True + ThreadLocalORMSession.flush_all() + users = p.users() + assert users == [] + + def test_screenshot_unicode_serialization(self): + p = M.Project.query.get(shortname='test') + screenshot_unicode = M.ProjectFile(project_id=p._id, category='screenshot', caption="ConSelección", filename='ConSelección.jpg') + screenshot_ascii = M.ProjectFile(project_id=p._id, category='screenshot', caption='test-screenshot', filename='test_file.jpg') + ThreadLocalORMSession.flush_all() + + serialized = p.__json__() + screenshots = sorted(serialized['screenshots'], key=lambda k: k['caption']) + + assert len(screenshots) == 2 + assert screenshots[0]['url'] == 'http://localhost/p/test/screenshot/ConSelecci%C3%B3n.jpg' + assert screenshots[0]['caption'] == "ConSelección" + assert screenshots[0]['thumbnail_url'] == 'http://localhost/p/test/screenshot/ConSelecci%C3%B3n.jpg/thumb' + + assert screenshots[1]['url'] == 'http://localhost/p/test/screenshot/test_file.jpg' + assert screenshots[1]['caption'] == 'test-screenshot' + assert screenshots[1]['thumbnail_url'] == 'http://localhost/p/test/screenshot/test_file.jpg/thumb'
