From 289bbd063f8e14fb6909e49d44fef387681b8ef5 Mon Sep 17 00:00:00 2001 From: tdruez Date: Fri, 12 Jul 2024 12:14:31 +0400 Subject: [PATCH] Refactor the Webhook.get_payload to use Serializers #1325 Signed-off-by: tdruez --- scanpipe/api/serializers.py | 1 + scanpipe/models.py | 29 ++++++++++------- scanpipe/tests/test_models.py | 61 ++++++++++++++++++++++++++++++++++- 3 files changed, 78 insertions(+), 13 deletions(-) diff --git a/scanpipe/api/serializers.py b/scanpipe/api/serializers.py index 2f579a57e..f17be5ce1 100644 --- a/scanpipe/api/serializers.py +++ b/scanpipe/api/serializers.py @@ -144,6 +144,7 @@ class Meta: class ProjectSerializer( ExcludeFromListViewMixin, + SerializerExcludeFieldsMixin, PipelineChoicesMixin, TaggitSerializer, serializers.ModelSerializer, diff --git a/scanpipe/models.py b/scanpipe/models.py index 940d168e8..dc6465500 100644 --- a/scanpipe/models.py +++ b/scanpipe/models.py @@ -3807,20 +3807,25 @@ def __str__(self): return str(self.uuid) def get_payload(self, pipeline_run): - return { - "project": { - "uuid": self.project.uuid, - "name": self.project.name, - "input_sources": self.project.get_inputs_with_source(), - }, - "run": { - "uuid": pipeline_run.uuid, - "pipeline_name": pipeline_run.pipeline_name, - "status": pipeline_run.status, - "scancodeio_version": pipeline_run.scancodeio_version, - }, + """Return the Webhook payload generated from project and pipeline_run data.""" + from scanpipe.api.serializers import ProjectSerializer + from scanpipe.api.serializers import RunSerializer + + project_serializer = ProjectSerializer( + instance=self.project, + exclude_fields=("url", "runs"), + ) + run_serializer = RunSerializer( + instance=pipeline_run, + exclude_fields=("url", "project"), + ) + payload = { + "project": project_serializer.data, + "run": run_serializer.data, } + return payload + def deliver(self, pipeline_run): """Deliver this Webhook by sending a POST request to the `target_url`.""" payload = self.get_payload(pipeline_run) diff --git a/scanpipe/tests/test_models.py b/scanpipe/tests/test_models.py index 101e10db7..2b2aa6b7a 100644 --- a/scanpipe/tests/test_models.py +++ b/scanpipe/tests/test_models.py @@ -1895,7 +1895,7 @@ def test_scanpipe_codebase_resource_model_walk_method_problematic_filenames(self self.assertEqual(expected_paths, result) @mock.patch("requests.post") - def test_scanpipe_webhook_subscription_deliver_method(self, mock_post): + def test_scanpipe_webhook_subscription_model_deliver_method(self, mock_post): webhook = self.project1.add_webhook_subscription("https://localhost") self.assertFalse(webhook.delivered) run1 = self.create_run() @@ -1922,6 +1922,65 @@ def test_scanpipe_webhook_subscription_deliver_method(self, mock_post): self.assertTrue(webhook.success) self.assertEqual("text", webhook.response_text) + def test_scanpipe_webhook_subscription_model_get_payload(self): + webhook = self.project1.add_webhook_subscription("https://localhost") + run1 = self.create_run() + payload = webhook.get_payload(run1) + + expected = { + "project": { + "name": "Analysis", + "uuid": str(self.project1.uuid), + "is_archived": False, + "notes": "", + "labels": [], + "settings": {}, + "input_sources": [], + "input_root": [], + "output_root": [], + "next_run": "pipeline", + "extra_data": {}, + "message_count": 0, + "resource_count": 0, + "package_count": 0, + "dependency_count": 0, + "relation_count": 0, + "codebase_resources_summary": {}, + "discovered_packages_summary": { + "total": 0, + "with_missing_resources": 0, + "with_modified_resources": 0, + }, + "discovered_dependencies_summary": { + "total": 0, + "is_runtime": 0, + "is_optional": 0, + "is_resolved": 0, + }, + "codebase_relations_summary": {}, + }, + "run": { + "pipeline_name": "pipeline", + "status": run1.status, + "description": "", + "selected_groups": None, + "selected_steps": None, + "uuid": str(run1.uuid), + "scancodeio_version": "", + "task_id": None, + "task_start_date": None, + "task_end_date": None, + "task_exitcode": None, + "task_output": "", + "log": "", + "execution_time": None, + }, + } + + del payload["project"]["created_date"] + del payload["run"]["created_date"] + self.assertDictEqual(expected, payload) + def test_scanpipe_discovered_package_model_extract_purl_data(self): package_data = {} expected = {