|
8 | 8 | import unittest
|
9 | 9 |
|
10 | 10 | from django.test import TestCase
|
| 11 | +from rest_framework.request import HttpRequest |
| 12 | +from rest_framework.exceptions import ValidationError |
11 | 13 |
|
12 | 14 | from patchwork import models
|
13 | 15 | from patchwork import parser
|
14 | 16 | from patchwork.tests import utils
|
15 | 17 | from patchwork.views.utils import patch_to_mbox
|
| 18 | +from patchwork.api.series import SeriesSerializer |
16 | 19 |
|
17 | 20 |
|
18 | 21 | TEST_SERIES_DIR = os.path.join(os.path.dirname(__file__), 'series')
|
@@ -804,3 +807,143 @@ def test_custom_name(self):
|
804 | 807 | self.assertEqual(series.name, series_name)
|
805 | 808 |
|
806 | 809 | 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 | + |
| 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