Skip to content

Commit 2ea356c

Browse files
committed
tests: Add tests for linking series feature
Closes getpatchwork#506 Signed-off-by: andrepapoti <andrepapoti@gmail.com>
1 parent e9c5545 commit 2ea356c

File tree

2 files changed

+122
-0
lines changed

2 files changed

+122
-0
lines changed

patchwork/tests/api/test_series.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# Copyright (C) 2018 Stephen Finucane <stephen@that.guru>
33
#
44
# SPDX-License-Identifier: GPL-2.0-or-later
5+
import json
56

67
from django.test import override_settings
78
from django.urls import NoReverseMatch
@@ -16,6 +17,7 @@
1617
from patchwork.tests.utils import create_project
1718
from patchwork.tests.utils import create_series
1819
from patchwork.tests.utils import create_user
20+
from patchwork.models import Person
1921

2022

2123
@override_settings(ENABLE_REST_API=True)
@@ -203,3 +205,75 @@ def test_create_update_delete(self):
203205

204206
resp = self.client.delete(self.api_url(series.id))
205207
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)

patchwork/tests/test_series.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88
import unittest
99

1010
from django.test import TestCase
11+
from rest_framework.request import HttpRequest
1112

1213
from patchwork import models
1314
from patchwork import parser
1415
from patchwork.tests import utils
1516
from patchwork.views.utils import patch_to_mbox
17+
from patchwork.api.series import SeriesSerializer
1618

1719

1820
TEST_SERIES_DIR = os.path.join(os.path.dirname(__file__), 'series')
@@ -804,3 +806,49 @@ def test_custom_name(self):
804806
self.assertEqual(series.name, series_name)
805807

806808
mbox.close()
809+
810+
811+
class SeriesSerializerTestCase(TestCase):
812+
def _mock_request(self):
813+
mock_request = HttpRequest()
814+
mock_request.version = '1.4'
815+
mock_request.META['SERVER_NAME'] = 'example.com'
816+
mock_request.META['SERVER_PORT'] = '8000'
817+
818+
return mock_request
819+
820+
def _create_serializer(self, series, related_series, mock_request):
821+
related_ids = list(
822+
series.related_series.all().values_list('id', flat=True)
823+
) + [related_series.pk]
824+
825+
return SeriesSerializer(
826+
series,
827+
context={'request': mock_request},
828+
data={'related_series': related_ids},
829+
partial=True,
830+
)
831+
832+
def test_related_series_validation_equal_project_id(self):
833+
series_a = utils.create_series()
834+
series_b = utils.create_series(project=series_a.project)
835+
836+
mock_request = self._mock_request()
837+
serializer = self._create_serializer(series_a, series_b, mock_request)
838+
serializer.is_valid()
839+
serializer.save()
840+
841+
related_series_urls = serializer.data['related_series']
842+
self.assertEqual(len(related_series_urls), 1)
843+
self.assertEqual(
844+
f'series={series_b.id}' in related_series_urls[0]['web_url'], True
845+
)
846+
847+
def test_related_series_validation_different_project_id(self):
848+
series_a = utils.create_series()
849+
series_b = utils.create_series()
850+
851+
mock_request = self._mock_request()
852+
serializer = self._create_serializer(series_a, series_b, mock_request)
853+
is_valid = serializer.is_valid()
854+
self.assertFalse(is_valid)

0 commit comments

Comments
 (0)