aboutsummaryrefslogtreecommitdiff
path: root/patchwork/tests/api/test_project.py
diff options
context:
space:
mode:
Diffstat (limited to 'patchwork/tests/api/test_project.py')
-rw-r--r--patchwork/tests/api/test_project.py167
1 files changed, 167 insertions, 0 deletions
diff --git a/patchwork/tests/api/test_project.py b/patchwork/tests/api/test_project.py
new file mode 100644
index 0000000..a9e59aa
--- /dev/null
+++ b/patchwork/tests/api/test_project.py
@@ -0,0 +1,167 @@
+# Patchwork - automated patch tracking system
+# Copyright (C) 2016 Linaro Corporation
+#
+# This file is part of the Patchwork package.
+#
+# Patchwork is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# Patchwork is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Patchwork; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+import unittest
+
+from django.conf import settings
+
+from patchwork.compat import reverse
+from patchwork.models import Project
+from patchwork.tests.utils import create_maintainer
+from patchwork.tests.utils import create_project
+from patchwork.tests.utils import create_user
+
+if settings.ENABLE_REST_API:
+ from rest_framework import status
+ from rest_framework.test import APITestCase
+else:
+ # stub out APITestCase
+ from django.test import TestCase
+ APITestCase = TestCase # noqa
+
+
+@unittest.skipUnless(settings.ENABLE_REST_API, 'requires ENABLE_REST_API')
+class TestProjectAPI(APITestCase):
+
+ @staticmethod
+ def api_url(item=None):
+ if item is None:
+ return reverse('api-project-list')
+ return reverse('api-project-detail', args=[item])
+
+ def assertSerialized(self, project_obj, project_json):
+ self.assertEqual(project_obj.id, project_json['id'])
+ self.assertEqual(project_obj.name, project_json['name'])
+ self.assertEqual(project_obj.linkname, project_json['link_name'])
+ self.assertEqual(project_obj.listid, project_json['list_id'])
+
+ # nested fields
+
+ self.assertEqual(len(project_json['maintainers']),
+ project_obj.maintainer_project.all().count())
+
+ def test_list(self):
+ """Validate we can list the default test project."""
+ project = create_project()
+
+ # anonymous user
+ resp = self.client.get(self.api_url())
+ self.assertEqual(status.HTTP_200_OK, resp.status_code)
+ self.assertEqual(1, len(resp.data))
+ self.assertSerialized(project, resp.data[0])
+
+ # maintainer
+ user = create_maintainer(project)
+ self.client.force_authenticate(user=user)
+ resp = self.client.get(self.api_url())
+ self.assertEqual(status.HTTP_200_OK, resp.status_code)
+ self.assertEqual(1, len(resp.data))
+ self.assertSerialized(project, resp.data[0])
+
+ def test_detail(self):
+ """Validate we can get a specific project."""
+ project = create_project()
+
+ resp = self.client.get(self.api_url(project.id))
+ self.assertEqual(status.HTTP_200_OK, resp.status_code)
+ self.assertEqual(project.name, resp.data['name'])
+
+ # make sure we can look up by linkname
+ resp = self.client.get(self.api_url(resp.data['link_name']))
+ self.assertEqual(status.HTTP_200_OK, resp.status_code)
+ self.assertSerialized(project, resp.data)
+
+ def test_get_by_id(self):
+ """Validate that it's possible to filter by pk."""
+ project = create_project()
+
+ resp = self.client.get(self.api_url(project.pk))
+ self.assertEqual(status.HTTP_200_OK, resp.status_code)
+ self.assertSerialized(project, resp.data)
+
+ def test_get_by_linkname(self):
+ """Validate that it's possible to filter by linkname."""
+ project = create_project(linkname='project', name='Sample project')
+
+ resp = self.client.get(self.api_url('project'))
+ self.assertEqual(status.HTTP_200_OK, resp.status_code)
+ self.assertSerialized(project, resp.data)
+
+ def test_get_by_numeric_linkname(self):
+ """Validate we try to do the right thing for numeric linkname"""
+ project = create_project(linkname='12345')
+
+ resp = self.client.get(self.api_url('12345'))
+ self.assertEqual(status.HTTP_200_OK, resp.status_code)
+ self.assertSerialized(project, resp.data)
+
+ def test_create(self):
+ """Ensure creations are rejected."""
+ project = create_project()
+ data = {'linkname': 'l', 'name': 'n', 'listid': 'l', 'listemail': 'e'}
+
+ # an anonymous user
+ resp = self.client.post(self.api_url(), data)
+ self.assertEqual(status.HTTP_405_METHOD_NOT_ALLOWED, resp.status_code)
+
+ # a superuser
+ user = create_maintainer(project)
+ user.is_superuser = True
+ user.save()
+ self.client.force_authenticate(user=user)
+ resp = self.client.post(self.api_url(), data)
+ self.assertEqual(status.HTTP_405_METHOD_NOT_ALLOWED, resp.status_code)
+
+ def test_update(self):
+ """Ensure updates can be performed by maintainers."""
+ project = create_project()
+ data = {'linkname': 'TEST'}
+
+ # an anonymous user
+ resp = self.client.patch(self.api_url(project.id), data)
+ self.assertEqual(status.HTTP_403_FORBIDDEN, resp.status_code)
+
+ # a normal user
+ user = create_user()
+ self.client.force_authenticate(user=user)
+ resp = self.client.patch(self.api_url(project.id), data)
+ self.assertEqual(status.HTTP_403_FORBIDDEN, resp.status_code)
+
+ # a maintainer
+ user = create_maintainer(project)
+ self.client.force_authenticate(user=user)
+ resp = self.client.patch(self.api_url(project.id), data)
+ self.assertEqual(status.HTTP_200_OK, resp.status_code)
+
+ def test_delete(self):
+ """Ensure deletions are rejected."""
+ project = create_project()
+
+ # an anonymous user
+ resp = self.client.delete(self.api_url(project.id))
+ self.assertEqual(status.HTTP_405_METHOD_NOT_ALLOWED, resp.status_code)
+
+ # a super user
+ user = create_maintainer(project)
+ user.is_superuser = True
+ user.save()
+ self.client.force_authenticate(user=user)
+ resp = self.client.delete(self.api_url(project.id))
+ self.assertEqual(status.HTTP_405_METHOD_NOT_ALLOWED, resp.status_code)
+ self.assertEqual(1, Project.objects.all().count())