]> git.ipfire.org Git - thirdparty/patchwork.git/commitdiff
REST: Allow update of bundle without patches
authorStephen Finucane <stephen@that.guru>
Fri, 17 Apr 2020 22:07:27 +0000 (23:07 +0100)
committerStephen Finucane <stephen@that.guru>
Fri, 17 Apr 2020 23:07:15 +0000 (00:07 +0100)
Presently, when updating a patch we assume that patches are provided.
This isn't necessary - you might just want to make it public - and isn't
enforced by the API itself. However, because we make this assumption, we
see a HTTP 500. Resolve the issue and add tests to prevent a regression.

Signed-off-by: Stephen Finucane <stephen@that.guru>
Resolves: #357

patchwork/api/bundle.py
patchwork/tests/api/test_bundle.py
releasenotes/notes/issue-357-1bef23dbfda2722d.yaml [new file with mode: 0644]

index 54a9266e7d7318e5a1beec720d971359bb5e2a73..93e323166d9ef7eed5d7bd2a9bf28d6921accfa2 100644 (file)
@@ -80,10 +80,11 @@ class BundleSerializer(BaseHyperlinkedModelSerializer):
         return instance
 
     def update(self, instance, validated_data):
-        patches = validated_data.pop('patches')
+        patches = validated_data.pop('patches', None)
         instance = super(BundleSerializer, self).update(
             instance, validated_data)
-        instance.overwrite_patches(patches)
+        if patches:
+            instance.overwrite_patches(patches)
         return instance
 
     def validate_patches(self, value):
@@ -97,7 +98,8 @@ class BundleSerializer(BaseHyperlinkedModelSerializer):
         return value
 
     def validate(self, data):
-        data['project'] = data['patches'][0].project
+        if data.get('patches'):
+            data['project'] = data['patches'][0].project
 
         return super(BundleSerializer, self).validate(data)
 
index d03f26f15e42e377347817e0233523cf215e0176..799244861996595c4aa2246101b628a57059c6ef 100644 (file)
@@ -288,9 +288,34 @@ class TestBundleAPI(utils.APITestCase):
         self.assertEqual(status.HTTP_200_OK, resp.status_code)
         self.assertEqual(2, len(resp.data['patches']))
         self.assertEqual('hello-bundle', resp.data['name'])
+        self.assertFalse(resp.data['public'])
         self.assertEqual(1, Bundle.objects.all().count())
         self.assertEqual(2, len(Bundle.objects.first().patches.all()))
         self.assertEqual('hello-bundle', Bundle.objects.first().name)
+        self.assertFalse(Bundle.objects.first().public)
+
+    def test_update_no_patches(self):
+        """Validate we handle updating only the name."""
+        user, project, patch_a, patch_b = self._test_create_update()
+        bundle = create_bundle(owner=user, project=project)
+
+        bundle.append_patch(patch_a)
+        bundle.append_patch(patch_b)
+
+        self.assertEqual(1, Bundle.objects.all().count())
+        self.assertEqual(2, len(Bundle.objects.first().patches.all()))
+
+        resp = self.client.patch(self.api_url(bundle.id), {
+            'name': 'hello-bundle', 'public': True,
+        })
+        self.assertEqual(status.HTTP_200_OK, resp.status_code)
+        self.assertEqual(2, len(resp.data['patches']))
+        self.assertEqual('hello-bundle', resp.data['name'])
+        self.assertTrue(resp.data['public'])
+        self.assertEqual(1, Bundle.objects.all().count())
+        self.assertEqual(2, len(Bundle.objects.first().patches.all()))
+        self.assertEqual('hello-bundle', Bundle.objects.first().name)
+        self.assertTrue(Bundle.objects.first().public)
 
     @utils.store_samples('bundle-delete-not-found')
     def test_delete_anonymous(self):
diff --git a/releasenotes/notes/issue-357-1bef23dbfda2722d.yaml b/releasenotes/notes/issue-357-1bef23dbfda2722d.yaml
new file mode 100644 (file)
index 0000000..1f337c7
--- /dev/null
@@ -0,0 +1,6 @@
+---
+fixes:
+  - |
+    An issue that preventing updating bundles via the REST API without
+    updating the included patches has been resolved.
+    (`#357 <https://github.com/getpatchwork/patchwork/issues/357>`__)