Skip to content

Commit 96f080d

Browse files
andrepapotivictor-accarini
authored andcommitted
tests: Add tests for linking series feature
Closes getpatchwork#506 Signed-off-by: andrepapoti <[email protected]>
1 parent 40c5442 commit 96f080d

File tree

2 files changed

+207
-3
lines changed

2 files changed

+207
-3
lines changed

patchwork/tests/api/test_series.py

+64-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# Copyright (C) 2018 Stephen Finucane <[email protected]>
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)
@@ -152,7 +154,7 @@ def test_list_bug_335(self):
152154
create_cover(series=series_obj)
153155
create_patch(series=series_obj)
154156

155-
with self.assertNumQueries(6):
157+
with self.assertNumQueries(10):
156158
self.client.get(self.api_url())
157159

158160
@utils.store_samples('series-detail')
@@ -187,7 +189,10 @@ def test_detail_invalid(self):
187189
self.client.get(self.api_url('foo'))
188190

189191
def test_create_update_delete(self):
190-
"""Ensure creates, updates and deletes aren't allowed"""
192+
"""
193+
Ensure creates and deletes aren't allowed.
194+
Updates can be done only to specified fields
195+
"""
191196
user = create_maintainer()
192197
user.is_superuser = True
193198
user.save()
@@ -199,7 +204,63 @@ def test_create_update_delete(self):
199204
series = create_series()
200205

201206
resp = self.client.patch(self.api_url(series.id), {'name': 'Test'})
202-
self.assertEqual(status.HTTP_405_METHOD_NOT_ALLOWED, resp.status_code)
207+
self.assertEqual(status.HTTP_400_BAD_REQUEST, resp.status_code)
203208

204209
resp = self.client.delete(self.api_url(series.id))
205210
self.assertEqual(status.HTTP_405_METHOD_NOT_ALLOWED, resp.status_code)
211+
212+
def test_series_linking(self):
213+
user = create_user()
214+
person = Person.objects.get(user=user)
215+
project_obj = create_project(linkname='myproject')
216+
series_a = create_series(project=project_obj, submitter=person)
217+
create_cover(series=series_a)
218+
create_patch(series=series_a)
219+
220+
self.client.authenticate(user=user)
221+
url = reverse('api-series-detail', kwargs={'pk': series_a.id})
222+
223+
# Link to another series
224+
series_b = create_series(
225+
project=series_a.project, submitter=series_a.submitter
226+
)
227+
228+
resp = self.client.patch(
229+
url,
230+
data={'subsequent_series': [series_b.id]},
231+
)
232+
subsequent_series = json.loads(resp.content).get('subsequent_series')
233+
self.assertEqual(resp.status_code, status.HTTP_200_OK)
234+
self.assertEqual(len(subsequent_series), 1)
235+
self.assertEqual(
236+
subsequent_series[0]['web_url'],
237+
f'http://example.com/project/myproject/list/?series={series_b.id}',
238+
)
239+
240+
# Link to more than one series
241+
series_c = create_series(
242+
project=series_a.project, submitter=series_a.submitter
243+
)
244+
resp = self.client.patch(
245+
url,
246+
data={'previous_series': [series_b.id, series_c.id]},
247+
)
248+
249+
previous_series = json.loads(resp.content).get('previous_series')
250+
self.assertEqual(resp.status_code, status.HTTP_200_OK)
251+
self.assertEqual(len(previous_series), 2)
252+
self.assertEqual(
253+
previous_series[1]['web_url'],
254+
f'http://example.com/project/myproject/list/?series={series_c.id}',
255+
)
256+
257+
# Link to a series from a different project
258+
series_d = create_series(submitter=series_a.submitter)
259+
260+
resp = self.client.patch(
261+
url,
262+
data={'previous_series': [series_d.id]},
263+
)
264+
265+
previous_series = json.loads(resp.content).get('previous_series')
266+
self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST)

patchwork/tests/test_series.py

+143
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@
88
import unittest
99

1010
from django.test import TestCase
11+
from rest_framework.request import HttpRequest
12+
from rest_framework.exceptions import ValidationError
1113

1214
from patchwork import models
1315
from patchwork import parser
1416
from patchwork.tests import utils
1517
from patchwork.views.utils import patch_to_mbox
18+
from patchwork.api.series import SeriesSerializer
1619

1720

1821
TEST_SERIES_DIR = os.path.join(os.path.dirname(__file__), 'series')
@@ -804,3 +807,143 @@ def test_custom_name(self):
804807
self.assertEqual(series.name, series_name)
805808

806809
mbox.close()
810+
811+
812+
class SeriesModelRelatedSeriesTest(TestCase):
813+
def setUp(self):
814+
self.series_a = utils.create_series()
815+
self.project = self.series_a.project
816+
self.submitter = self.series_a.submitter
817+
self.series_b = utils.create_series(project=self.project)
818+
self.series_c = utils.create_series(project=self.project)
819+
self.series_d = utils.create_series()
820+
821+
def test_add_previous_and_subsequent_series(self):
822+
self.series_c.add_previous_series(self.series_b)
823+
824+
self.assertIn(self.series_b, self.series_c.previous_series.all())
825+
self.assertIn(self.series_c, self.series_b.subsequent_series.all())
826+
827+
self.series_a.add_subsequent_series(self.series_b)
828+
829+
self.assertIn(self.series_a, self.series_b.previous_series.all())
830+
self.assertIn(self.series_b, self.series_a.subsequent_series.all())
831+
832+
self.assertIn(self.series_b, self.series_a.subsequent_series.all())
833+
self.assertIn(self.series_c, self.series_b.subsequent_series.all())
834+
835+
with self.assertRaises(ValueError) as context_1:
836+
self.series_c.add_previous_series(self.series_c)
837+
self.assertIn(
838+
'A series cannot be linked to itself.', str(context_1.exception)
839+
)
840+
841+
with self.assertRaises(ValueError) as context_2:
842+
self.series_c.add_previous_series(self.series_d)
843+
self.assertIn(
844+
'Previous series must belong to the same project.',
845+
str(context_2.exception),
846+
)
847+
848+
849+
class SeriesSerializerTestCase(TestCase):
850+
def _mock_request(self):
851+
mock_request = HttpRequest()
852+
mock_request.version = '1.4'
853+
mock_request.META['SERVER_NAME'] = 'example.com'
854+
mock_request.META['SERVER_PORT'] = '8000'
855+
856+
return mock_request
857+
858+
def setUp(self):
859+
self.request = self._mock_request()
860+
self.series_a = utils.create_series()
861+
self.project = self.series_a.project
862+
self.submitter = self.series_a.submitter
863+
self.series_b = utils.create_series(project=self.project)
864+
self.series_c = utils.create_series()
865+
866+
def test_serializer_serialization(self):
867+
# Test serialization
868+
serializer = SeriesSerializer(
869+
instance=self.series_a, context={'request': self.request}
870+
)
871+
872+
expected_data = {
873+
'id': self.series_a.id,
874+
'url': f'http://example.com:8000/api/series/{self.series_a.id}/',
875+
'web_url': f'http://example.com:8000{self.series_a.get_absolute_url()}',
876+
'project': {
877+
'id': self.project.id,
878+
'url': f'http://example.com:8000/api/projects/{self.project.id}/',
879+
'name': 'Test Project 0',
880+
'link_name': 'test-project-0',
881+
'list_id': 'test0.example.com',
882+
'list_email': '[email protected]',
883+
'web_url': '',
884+
'scm_url': '',
885+
'webscm_url': '',
886+
'list_archive_url': 'https://lists.example.com/',
887+
'list_archive_url_format': 'https://lists.example.com/mail/{}',
888+
'commit_url_format': '',
889+
},
890+
'name': self.series_a.name,
891+
'date': self.series_a.date.isoformat(),
892+
'submitter': {
893+
'id': self.submitter.id,
894+
'url': f'http://example.com:8000/api/people/{self.submitter.id}/',
895+
'name': 'test_person_0',
896+
'email': '[email protected]',
897+
},
898+
'version': 1,
899+
'previous_series': [],
900+
'subsequent_series': [],
901+
'required_series': [],
902+
'required_by_series': [],
903+
'total': 1,
904+
'received_total': 0,
905+
'received_all': False,
906+
'mbox': f'http://example.com:8000{self.series_a.get_mbox_url()}',
907+
'cover_letter': None,
908+
'patches': [],
909+
}
910+
self.assertEqual(serializer.data, expected_data)
911+
912+
def test_self_link_validation(self):
913+
serializer = SeriesSerializer(
914+
instance=self.series_a,
915+
context={'request': self.request},
916+
data={'previous_series': [self.series_a.id]},
917+
)
918+
919+
with self.assertRaises(ValidationError) as context:
920+
serializer.is_valid(raise_exception=True)
921+
self.assertIn(
922+
'A series cannot be linked to itself.', str(context.exception)
923+
)
924+
925+
def test_cross_project_validation(self):
926+
serializer = SeriesSerializer(
927+
instance=self.series_a,
928+
context={'request': self.request},
929+
data={'previous_series': [self.series_c.id]},
930+
)
931+
932+
with self.assertRaises(ValidationError) as context:
933+
serializer.is_valid(raise_exception=True)
934+
self.assertIn(
935+
'Series must belong to the same project.', str(context.exception)
936+
)
937+
938+
def test_linking(self):
939+
serializer = SeriesSerializer(
940+
instance=self.series_a,
941+
context={'request': self.request},
942+
data={'previous_series': [self.series_b.id]},
943+
)
944+
945+
serializer.is_valid(raise_exception=True)
946+
serializer.save()
947+
948+
previous_series_urls = serializer.data['previous_series']
949+
self.assertEqual(len(previous_series_urls), 1)

0 commit comments

Comments
 (0)