|
2 | 2 | # Copyright (C) 2018 Stephen Finucane <stephen@that.guru>
|
3 | 3 | #
|
4 | 4 | # SPDX-License-Identifier: GPL-2.0-or-later
|
| 5 | +import json |
5 | 6 |
|
6 | 7 | from django.test import override_settings
|
7 | 8 | from django.urls import NoReverseMatch
|
|
16 | 17 | from patchwork.tests.utils import create_project
|
17 | 18 | from patchwork.tests.utils import create_series
|
18 | 19 | from patchwork.tests.utils import create_user
|
| 20 | +from patchwork.models import Person |
19 | 21 |
|
20 | 22 |
|
21 | 23 | @override_settings(ENABLE_REST_API=True)
|
@@ -203,3 +205,75 @@ def test_create_update_delete(self):
|
203 | 205 |
|
204 | 206 | resp = self.client.delete(self.api_url(series.id))
|
205 | 207 | self.assertEqual(status.HTTP_405_METHOD_NOT_ALLOWED, resp.status_code)
|
| 208 | + |
| 209 | + def _generate_related_ids_payload(self, series, id): |
| 210 | + related_ids = series.related_series.all().values_list('id', flat=True) |
| 211 | + return list(related_ids) + [id] |
| 212 | + |
| 213 | + def test_series_linking(self): |
| 214 | + user = create_user() |
| 215 | + person = Person.objects.get(user=user) |
| 216 | + project_obj = create_project(linkname='myproject') |
| 217 | + series_a = create_series(project=project_obj, submitter=person) |
| 218 | + create_cover(series=series_a) |
| 219 | + create_patch(series=series_a) |
| 220 | + |
| 221 | + self.client.authenticate(user=user) |
| 222 | + url = reverse('api-series-detail', kwargs={'pk': series_a.id}) |
| 223 | + |
| 224 | + # Link to another series |
| 225 | + series_b = create_series( |
| 226 | + project=series_a.project, submitter=series_a.submitter |
| 227 | + ) |
| 228 | + |
| 229 | + resp = self.client.patch( |
| 230 | + url, |
| 231 | + data={ |
| 232 | + 'related_series': self._generate_related_ids_payload( |
| 233 | + series_a, series_b.id |
| 234 | + ) |
| 235 | + }, |
| 236 | + ) |
| 237 | + related_series = json.loads(resp.content).get('related_series') |
| 238 | + self.assertEqual(resp.status_code, status.HTTP_200_OK) |
| 239 | + self.assertEqual(len(related_series), 1) |
| 240 | + self.assertEqual( |
| 241 | + related_series[0]['web_url'], |
| 242 | + f'http://example.com/project/myproject/list/?series={series_b.id}', |
| 243 | + ) |
| 244 | + |
| 245 | + # Link to more than one series |
| 246 | + series_c = create_series( |
| 247 | + project=series_a.project, submitter=series_a.submitter |
| 248 | + ) |
| 249 | + resp = self.client.patch( |
| 250 | + url, |
| 251 | + data={ |
| 252 | + 'related_series': self._generate_related_ids_payload( |
| 253 | + series_a, series_c.id |
| 254 | + ) |
| 255 | + }, |
| 256 | + ) |
| 257 | + |
| 258 | + related_series = json.loads(resp.content).get('related_series') |
| 259 | + self.assertEqual(resp.status_code, status.HTTP_200_OK) |
| 260 | + self.assertEqual(len(related_series), 2) |
| 261 | + self.assertEqual( |
| 262 | + related_series[1]['web_url'], |
| 263 | + f'http://example.com/project/myproject/list/?series={series_c.id}', |
| 264 | + ) |
| 265 | + |
| 266 | + # Link to a series from a different project |
| 267 | + series_d = create_series(submitter=series_a.submitter) |
| 268 | + |
| 269 | + resp = self.client.patch( |
| 270 | + url, |
| 271 | + data={ |
| 272 | + 'related_series': self._generate_related_ids_payload( |
| 273 | + series_a, series_d.id |
| 274 | + ) |
| 275 | + }, |
| 276 | + ) |
| 277 | + |
| 278 | + related_series = json.loads(resp.content).get('related_series') |
| 279 | + self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST) |
0 commit comments