You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by jo...@apache.org on 2013/11/01 21:11:01 UTC
[4/4] git commit: [#6804] Moved endpoint to new
ProjectAdminRestController and split and improved tests
[#6804] Moved endpoint to new ProjectAdminRestController and split and improved tests
Signed-off-by: Cory Johns <cj...@slashdotmedia.com>
Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/573d35ee
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/573d35ee
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/573d35ee
Branch: refs/heads/master
Commit: 573d35eecab2d2f558663a866b8293e1f65a313f
Parents: 6278af0
Author: Cory Johns <cj...@slashdotmedia.com>
Authored: Fri Nov 1 19:51:07 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Fri Nov 1 19:54:34 2013 +0000
----------------------------------------------------------------------
Allura/allura/controllers/rest.py | 62 ---------------
Allura/allura/ext/admin/admin_main.py | 58 ++++++++++++++
Allura/allura/tests/functional/test_admin.py | 97 +++++++++++++++++++++++
Allura/allura/tests/functional/test_rest.py | 67 ----------------
4 files changed, 155 insertions(+), 129 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/573d35ee/Allura/allura/controllers/rest.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/rest.py b/Allura/allura/controllers/rest.py
index 20f6634..5c223f5 100644
--- a/Allura/allura/controllers/rest.py
+++ b/Allura/allura/controllers/rest.py
@@ -34,9 +34,6 @@ from allura.lib import helpers as h
from allura.lib import security
from allura.lib import plugin
from allura.lib.exceptions import Invalid
-from allura.ext.admin.admin_main import ProjectAdminController, AdminApp
-from allura.lib.security import require_access
-from allura.lib.decorators import require_post
log = logging.getLogger(__name__)
action_logger = h.log_action(log, 'API:')
@@ -298,62 +295,3 @@ class ProjectRestController(object):
@expose('json:')
def index(self, **kw):
return c.project.__json__()
-
- @expose('json:')
- @require_post()
- def install_tool(self, tool=None, mount_point=None, mount_label=None, **kw):
- """API for installing tools in current project.
-
- Requires a valid tool, mount point and mount label names.
- (All arguments are required.)
-
- Usage example::
- POST to:
- /rest/p/testproject/install_tool/
-
- with params:
- {
- 'tool': 'tickets',
- 'mount_point': 'mountpoint',
- 'mount_label': 'mountlabel'
- }
-
- Example output (in successful case)::
-
- {
- "info": "Tool tickets with mount_point mountpoint and mount_label mountlabel was created.",
- "success": true
- }
-
- """
- require_access(c.project, 'admin')
- controller = ProjectAdminController()
-
- if not tool or not mount_point or not mount_label:
- return {'success': False,
- 'info': 'All arguments required.'
- }
-
- installable_tools = AdminApp.installable_tools_for(c.project)
- tools_names = [t['name'] for t in installable_tools]
- if not tool in tools_names:
- return {'success': False,
- 'info': 'Incorrect tool name.'
- }
- if not h.re_tool_mount_point.match(mount_point) or c.project.app_instance(mount_point) is not None:
- return {'success': False,
- 'info': 'Incorrect mount point name, or mount point already exists.'
- }
-
- data = {
- 'install': 'install',
- 'ep_name': tool,
- 'ordinal': '1',
- 'mount_point': mount_point,
- 'mount_label': mount_label
- }
- controller._update_mounts(new=data)
- return {'success': True,
- 'info': 'Tool %s with mount_point %s and mount_label %s was created.'
- % (tool, mount_point, mount_label)
- }
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/573d35ee/Allura/allura/ext/admin/admin_main.py
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/admin_main.py b/Allura/allura/ext/admin/admin_main.py
index a19242b..8d38bfe 100644
--- a/Allura/allura/ext/admin/admin_main.py
+++ b/Allura/allura/ext/admin/admin_main.py
@@ -722,6 +722,64 @@ class ProjectAdminRestController(BaseController):
status = c.project.bulk_export_status()
return {'status': status or 'ready'}
+ @expose('json:')
+ @require_post()
+ def install_tool(self, tool=None, mount_point=None, mount_label=None, **kw):
+ """API for installing tools in current project.
+
+ Requires a valid tool, mount point and mount label names.
+ (All arguments are required.)
+
+ Usage example::
+ POST to:
+ /rest/p/testproject/admin/install_tool/
+
+ with params:
+ {
+ 'tool': 'tickets',
+ 'mount_point': 'mountpoint',
+ 'mount_label': 'mountlabel'
+ }
+
+ Example output (in successful case)::
+
+ {
+ "info": "Tool tickets with mount_point mountpoint and mount_label mountlabel was created.",
+ "success": true
+ }
+
+ """
+ controller = ProjectAdminController()
+
+ if not tool or not mount_point or not mount_label:
+ return {'success': False,
+ 'info': 'All arguments required.'
+ }
+
+ installable_tools = AdminApp.installable_tools_for(c.project)
+ tools_names = [t['name'] for t in installable_tools]
+ if not tool in tools_names:
+ return {'success': False,
+ 'info': 'Incorrect tool name.'
+ }
+ if not h.re_tool_mount_point.match(mount_point) or c.project.app_instance(mount_point) is not None:
+ return {'success': False,
+ 'info': 'Incorrect mount point name, or mount point already exists.'
+ }
+
+ data = {
+ 'install': 'install',
+ 'ep_name': tool,
+ 'ordinal': len(installable_tools) + len(c.project.direct_subprojects),
+ 'mount_point': mount_point,
+ 'mount_label': mount_label
+ }
+ controller._update_mounts(new=data)
+ return {'success': True,
+ 'info': 'Tool %s with mount_point %s and mount_label %s was created.'
+ % (tool, mount_point, mount_label)
+ }
+
class PermissionsController(BaseController):
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/573d35ee/Allura/allura/tests/functional/test_admin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_admin.py b/Allura/allura/tests/functional/test_admin.py
index 49992fd..4f63723 100644
--- a/Allura/allura/tests/functional/test_admin.py
+++ b/Allura/allura/tests/functional/test_admin.py
@@ -30,6 +30,8 @@ from tg import expose
from pylons import tmpl_context as c, app_globals as g
import mock
from BeautifulSoup import BeautifulSoup
+from webtest.app import AppError
+
try:
import sfx
@@ -1026,3 +1028,98 @@ class TestRestExport(TestRestApiBase):
'status': 'in progress',
})
bulk_export.post.assert_called_once_with(['tickets', 'discussion'], 'test.zip', send_email=False)
+
+
+class TestRestInstallTool(TestRestApiBase):
+ def test_missing_mount_info(self):
+ r = self.api_get('/rest/p/test/')
+ tools_names = [t['name'] for t in r.json['tools']]
+ assert 'tickets' not in tools_names
+
+ data = {
+ 'tool': 'tickets'
+ }
+ r = self.api_post('/rest/p/test/admin/install_tool/', **data)
+ assert_equals(r.json['success'], False)
+ assert_equals(r.json['info'], 'All arguments required.')
+
+ def test_invalid_tool(self):
+ r = self.api_get('/rest/p/test/')
+ tools_names = [t['name'] for t in r.json['tools']]
+ assert 'tickets' not in tools_names
+
+ data = {
+ 'tool': 'something',
+ 'mount_point': 'ticketsmount1',
+ 'mount_label': 'tickets_label1'
+ }
+ r = self.api_post('/rest/p/test/admin/install_tool/', **data)
+ assert_equals(r.json['success'], False)
+ assert_equals(r.json['info'], 'Incorrect tool name.')
+
+ def test_bad_mount(self):
+ r = self.api_get('/rest/p/test/')
+ tools_names = [t['name'] for t in r.json['tools']]
+ assert 'tickets' not in tools_names
+
+ data = {
+ 'tool': 'tickets',
+ 'mount_point': 'tickets_mount1',
+ 'mount_label': 'tickets_label1'
+ }
+ r = self.api_post('/rest/p/test/admin/install_tool/', **data)
+ assert_equals(r.json['success'], False)
+ assert_equals(r.json['info'], 'Incorrect mount point name, or mount point already exists.')
+
+ def test_install_tool_ok(self):
+ r = self.api_get('/rest/p/test/')
+ tools_names = [t['name'] for t in r.json['tools']]
+ assert 'tickets' not in tools_names
+
+ data = {
+ 'tool': 'tickets',
+ 'mount_point': 'ticketsmount1',
+ 'mount_label': 'tickets_label1'
+ }
+ r = self.api_post('/rest/p/test/admin/install_tool/', **data)
+ assert_equals(r.json['success'], True)
+ assert_equals(r.json['info'],
+ 'Tool %s with mount_point %s and mount_label %s was created.'
+ % ('tickets', 'ticketsmount1', 'tickets_label1'))
+
+ project = M.Project.query.get(shortname='test')
+ assert_equals(project.ordered_mounts()[-1]['ac'].options.mount_point, 'ticketsmount1')
+ audit_log = M.AuditLog.query.find({'project_id': project._id}).sort({'_id': -1}).first()
+ assert_equals(audit_log.message, 'install tool ticketsmount1')
+
+ def test_tool_exists(self):
+ r = self.api_get('/rest/p/test/')
+ tools_names = [t['name'] for t in r.json['tools']]
+ assert 'tickets' not in tools_names
+
+ data = {
+ 'tool': 'tickets',
+ 'mount_point': 'ticketsmount1',
+ 'mount_label': 'tickets_label1'
+ }
+ c.project.install_app('tickets', mount_point=data['mount_point'])
+ r = self.api_post('/rest/p/test/admin/install_tool/', **data)
+ assert_equals(r.json['success'], False)
+ assert_equals(r.json['info'], 'Incorrect mount point name, or mount point already exists.')
+
+ def test_unauthorized(self):
+ r = self.api_get('/rest/p/test/')
+ tools_names = [t['name'] for t in r.json['tools']]
+ assert 'tickets' not in tools_names
+
+ data = {
+ 'tool': 'wiki',
+ 'mount_point': 'wikimount1',
+ 'mount_label': 'wiki_label1'
+ }
+ r = self.app.post('/rest/p/test/admin/install_tool/',
+ extra_environ={'username': '*anonymous'},
+ status=401,
+ params=data)
+ assert_equals(r.status, '401 Unauthorized')
+
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/573d35ee/Allura/allura/tests/functional/test_rest.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_rest.py b/Allura/allura/tests/functional/test_rest.py
index 3137fe9..ea4b769 100644
--- a/Allura/allura/tests/functional/test_rest.py
+++ b/Allura/allura/tests/functional/test_rest.py
@@ -30,7 +30,6 @@ from alluratest.controller import TestRestApiBase
from allura.lib import helpers as h
from allura.lib.exceptions import Invalid
from allura import model as M
-from webtest.app import AppError
class TestRestHome(TestRestApiBase):
@@ -219,69 +218,3 @@ class TestRestHome(TestRestApiBase):
Provider.get().shortname_validator.to_python.side_effect = Invalid('name', 'value', {})
r = self.api_get('/rest/p/test/')
assert r.status_int == 404
-
- def test_install_tool(self):
- r = self.api_get('/rest/p/test/')
- tools_names = [t['name'] for t in r.json['tools']]
- assert 'tickets' not in tools_names
-
- data = {
- 'tool': 'tickets'
- }
- r = self.api_post('/rest/p/test/install_tool/', **data)
- assert_equal(r.json['success'], False)
- assert_equal(r.json['info'], 'All arguments required.')
-
- # check incorrect tool name
- data = {
- 'tool': 'something',
- 'mount_point': 'ticketsmount1',
- 'mount_label': 'tickets_label1'
- }
- r = self.api_post('/rest/p/test/install_tool/', **data)
- assert_equal(r.json['success'], False)
- assert_equal(r.json['info'], 'Incorrect tool name.')
-
- # check incorrect mount_point name
- data = {
- 'tool': 'tickets',
- 'mount_point': 'tickets_mount1',
- 'mount_label': 'tickets_label1'
- }
- r = self.api_post('/rest/p/test/install_tool/', **data)
- assert_equal(r.json['success'], False)
- assert_equal(r.json['info'], 'Incorrect mount point name, or mount point already exists.')
-
- # check that tool was installed
- data = {
- 'tool': 'tickets',
- 'mount_point': 'ticketsmount1',
- 'mount_label': 'tickets_label1'
- }
- r = self.api_post('/rest/p/test/install_tool/', **data)
- assert_equal(r.json['success'], True)
- assert_equal(r.json['info'],
- 'Tool %s with mount_point %s and mount_label %s was created.'
- % ('tickets', 'ticketsmount1', 'tickets_label1'))
-
- r = self.api_get('/rest/p/test/')
- tools_names = [t['name'] for t in r.json['tools']]
- assert 'tickets' in tools_names
-
- # check that tool already exists
- r = self.api_post('/rest/p/test/install_tool/', **data)
- assert_equal(r.json['success'], False)
- assert_equal(r.json['info'], 'Incorrect mount point name, or mount point already exists.')
-
- # test that unauthorized can't install tool
- data = {
- 'tool': 'wiki',
- 'mount_point': 'wikimount1',
- 'mount_label': 'wiki_label1'
- }
- r = self.app.post('/rest/p/test/install_tool/',
- extra_environ={'username': '*anonymous'},
- status=401,
- params=data)
- assert_equal(r.status, '401 Unauthorized')
-