You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by vi...@apache.org on 2020/05/11 11:10:43 UTC

[incubator-superset] branch master updated: Add QueryContext deserialization test (#9778)

This is an automated email from the ASF dual-hosted git repository.

villebro pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git


The following commit(s) were added to refs/heads/master by this push:
     new 42b10ae  Add QueryContext deserialization test (#9778)
42b10ae is described below

commit 42b10aecaeff21b870c1f825b9c6e5c9dc5f95a3
Author: Ville Brofeldt <33...@users.noreply.github.com>
AuthorDate: Mon May 11 14:10:14 2020 +0300

    Add QueryContext deserialization test (#9778)
    
    * Add QueryContext deserialization test
    
    * deserialize using marshmallow and assert error dict
---
 superset/charts/schemas.py   |  4 ++--
 tests/query_context_tests.py | 41 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/superset/charts/schemas.py b/superset/charts/schemas.py
index 59635ad..91b71a3 100644
--- a/superset/charts/schemas.py
+++ b/superset/charts/schemas.py
@@ -490,6 +490,7 @@ class ChartDataPostProcessingOperationSchema(Schema):
         validate=validate.OneOf(
             choices=(
                 "aggregate",
+                "cum",
                 "geodetic_parse",
                 "geohash_decode",
                 "geohash_encode",
@@ -501,8 +502,7 @@ class ChartDataPostProcessingOperationSchema(Schema):
         ),
         example="aggregate",
     )
-    options = fields.Nested(
-        ChartDataPostProcessingOperationOptionsSchema,
+    options = fields.Dict(
         description="Options specifying how to perform the operation. Please refer "
         "to the respective post processing operation option schemas. "
         "For example, `ChartDataPostProcessingOperationOptions` specifies "
diff --git a/tests/query_context_tests.py b/tests/query_context_tests.py
index 2d378ba..84f54da 100644
--- a/tests/query_context_tests.py
+++ b/tests/query_context_tests.py
@@ -17,6 +17,7 @@
 from typing import Any, Dict, List, Optional
 
 from superset import db
+from superset.charts.schemas import ChartDataQueryContextSchema
 from superset.common.query_context import QueryContext
 from superset.connectors.connector_registry import ConnectorRegistry
 from superset.utils.core import TimeRangeEndpoint
@@ -26,6 +27,46 @@ from tests.test_app import app
 
 
 class QueryContextTests(SupersetTestCase):
+    def test_schema_deserialization(self):
+        """
+        Ensure that the deserialized QueryContext contains all required fields.
+        """
+
+        table_name = "birth_names"
+        table = self.get_table_by_name(table_name)
+        payload = get_query_context(
+            table.name, table.id, table.type, add_postprocessing_operations=True
+        )
+        query_context, errors = ChartDataQueryContextSchema().load(payload)
+        self.assertDictEqual(errors, {})
+        self.assertEqual(len(query_context.queries), len(payload["queries"]))
+        for query_idx, query in enumerate(query_context.queries):
+            payload_query = payload["queries"][query_idx]
+
+            # check basic properies
+            self.assertEqual(query.extras, payload_query["extras"])
+            self.assertEqual(query.filter, payload_query["filters"])
+            self.assertEqual(query.groupby, payload_query["groupby"])
+
+            # metrics are mutated during creation
+            for metric_idx, metric in enumerate(query.metrics):
+                payload_metric = payload_query["metrics"][metric_idx]
+                payload_metric = (
+                    payload_metric
+                    if "expressionType" in payload_metric
+                    else payload_metric["label"]
+                )
+                self.assertEqual(metric, payload_metric)
+
+            self.assertEqual(query.orderby, payload_query["orderby"])
+            self.assertEqual(query.time_range, payload_query["time_range"])
+
+            # check post processing operation properties
+            for post_proc_idx, post_proc in enumerate(query.post_processing):
+                payload_post_proc = payload_query["post_processing"][post_proc_idx]
+                self.assertEqual(post_proc["operation"], payload_post_proc["operation"])
+                self.assertEqual(post_proc["options"], payload_post_proc["options"])
+
     def test_cache_key_changes_when_datasource_is_updated(self):
         self.login(username="admin")
         table_name = "birth_names"