Skip to content

Commit 98ac7c2

Browse files
committed
REST: Add missing tests for '/series'
I'm not sure how these were missed but they're definitely needed as we continue adding functionality here. Signed-off-by: Stephen Finucane <stephen@that.guru> Reviewed-by: Daniel Axtens <dja@axtens.net>
1 parent 24c4bef commit 98ac7c2

File tree

1 file changed

+148
-0
lines changed

1 file changed

+148
-0
lines changed

patchwork/tests/api/test_series.py

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
# Patchwork - automated patch tracking system
2+
# Copyright (C) 2018 Stephen Finucane <stephen@that.guru>
3+
#
4+
# This file is part of the Patchwork package.
5+
#
6+
# Patchwork is free software; you can redistribute it and/or modify
7+
# it under the terms of the GNU General Public License as published by
8+
# the Free Software Foundation; either version 2 of the License, or
9+
# (at your option) any later version.
10+
#
11+
# Patchwork is distributed in the hope that it will be useful,
12+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
# GNU General Public License for more details.
15+
#
16+
# You should have received a copy of the GNU General Public License
17+
# along with Patchwork; if not, write to the Free Software
18+
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19+
20+
import unittest
21+
22+
from django.conf import settings
23+
24+
from patchwork.compat import reverse
25+
from patchwork.tests.utils import create_cover
26+
from patchwork.tests.utils import create_maintainer
27+
from patchwork.tests.utils import create_project
28+
from patchwork.tests.utils import create_person
29+
from patchwork.tests.utils import create_series
30+
from patchwork.tests.utils import create_series_patch
31+
from patchwork.tests.utils import create_user
32+
33+
if settings.ENABLE_REST_API:
34+
from rest_framework import status
35+
from rest_framework.test import APITestCase
36+
else:
37+
# stub out APITestCase
38+
from django.test import TestCase
39+
APITestCase = TestCase # noqa
40+
41+
42+
@unittest.skipUnless(settings.ENABLE_REST_API, 'requires ENABLE_REST_API')
43+
class TestSeriesAPI(APITestCase):
44+
fixtures = ['default_tags']
45+
46+
@staticmethod
47+
def api_url(item=None, version=None):
48+
kwargs = {}
49+
if version:
50+
kwargs['version'] = version
51+
52+
if item is None:
53+
return reverse('api-series-list', kwargs=kwargs)
54+
kwargs['pk'] = item
55+
return reverse('api-series-detail', kwargs=kwargs)
56+
57+
def assertSerialized(self, series_obj, series_json):
58+
self.assertEqual(series_obj.id, series_json['id'])
59+
self.assertEqual(series_obj.name, series_json['name'])
60+
self.assertEqual(series_obj.version, series_json['version'])
61+
self.assertEqual(series_obj.total, series_json['total'])
62+
self.assertEqual(series_obj.received_total,
63+
series_json['received_total'])
64+
self.assertIn(series_obj.get_mbox_url(), series_json['mbox'])
65+
66+
# nested fields
67+
68+
self.assertEqual(series_obj.project.id,
69+
series_json['project']['id'])
70+
self.assertEqual(series_obj.submitter.id,
71+
series_json['submitter']['id'])
72+
self.assertEqual(series_obj.cover_letter.id,
73+
series_json['cover_letter']['id'])
74+
self.assertEqual(series_obj.patches.count(),
75+
len(series_json['patches']))
76+
77+
def test_list(self):
78+
"""Validate we can list series."""
79+
resp = self.client.get(self.api_url())
80+
self.assertEqual(status.HTTP_200_OK, resp.status_code)
81+
self.assertEqual(0, len(resp.data))
82+
83+
project_obj = create_project(linkname='myproject')
84+
person_obj = create_person(email='test@example.com')
85+
cover_obj = create_cover()
86+
series_obj = create_series(project=project_obj, submitter=person_obj)
87+
series_obj.add_cover_letter(cover_obj)
88+
create_series_patch(series=series_obj)
89+
90+
# anonymous users
91+
resp = self.client.get(self.api_url())
92+
self.assertEqual(status.HTTP_200_OK, resp.status_code)
93+
self.assertEqual(1, len(resp.data))
94+
series_rsp = resp.data[0]
95+
self.assertSerialized(series_obj, series_rsp)
96+
97+
# authenticated user
98+
user = create_user()
99+
self.client.force_authenticate(user=user)
100+
resp = self.client.get(self.api_url())
101+
self.assertEqual(status.HTTP_200_OK, resp.status_code)
102+
self.assertEqual(1, len(resp.data))
103+
series_rsp = resp.data[0]
104+
self.assertSerialized(series_obj, series_rsp)
105+
106+
# test filtering by project
107+
resp = self.client.get(self.api_url(), {'project': 'myproject'})
108+
self.assertEqual([series_obj.id], [x['id'] for x in resp.data])
109+
resp = self.client.get(self.api_url(), {'project': 'invalidproject'})
110+
self.assertEqual(0, len(resp.data))
111+
112+
# test filtering by owner, both ID and email
113+
resp = self.client.get(self.api_url(), {'submitter': person_obj.id})
114+
self.assertEqual([series_obj.id], [x['id'] for x in resp.data])
115+
resp = self.client.get(self.api_url(), {
116+
'submitter': 'test@example.com'})
117+
self.assertEqual([series_obj.id], [x['id'] for x in resp.data])
118+
resp = self.client.get(self.api_url(), {
119+
'submitter': 'test@example.org'})
120+
self.assertEqual(0, len(resp.data))
121+
122+
def test_detail(self):
123+
"""Validate we can get a specific series."""
124+
cover = create_cover()
125+
series = create_series()
126+
series.add_cover_letter(cover)
127+
128+
resp = self.client.get(self.api_url(series.id))
129+
self.assertEqual(status.HTTP_200_OK, resp.status_code)
130+
self.assertSerialized(series, resp.data)
131+
132+
def test_create_update_delete(self):
133+
"""Ensure creates, updates and deletes aren't allowed"""
134+
user = create_maintainer()
135+
user.is_superuser = True
136+
user.save()
137+
self.client.force_authenticate(user=user)
138+
139+
resp = self.client.post(self.api_url(), {'name': 'Test'})
140+
self.assertEqual(status.HTTP_405_METHOD_NOT_ALLOWED, resp.status_code)
141+
142+
series = create_series()
143+
144+
resp = self.client.patch(self.api_url(series.id), {'name': 'Test'})
145+
self.assertEqual(status.HTTP_405_METHOD_NOT_ALLOWED, resp.status_code)
146+
147+
resp = self.client.delete(self.api_url(series.id))
148+
self.assertEqual(status.HTTP_405_METHOD_NOT_ALLOWED, resp.status_code)

0 commit comments

Comments
 (0)