You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by be...@apache.org on 2023/07/06 23:47:31 UTC

[superset] 01/01: fix(report): edit without custom width

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

beto pushed a commit to branch fix-custom-width
in repository https://gitbox.apache.org/repos/asf/superset.git

commit ffbc14a1bc0b711978dff350fa97cc4155afb26b
Author: Beto Dealmeida <ro...@dealmeida.net>
AuthorDate: Thu Jul 6 15:30:36 2023 -0700

    fix(report): edit without custom width
---
 superset/reports/schemas.py              | 16 +++++--
 tests/unit_tests/reports/__init__.py     | 16 +++++++
 tests/unit_tests/reports/schemas_test.py | 75 ++++++++++++++++++++++++++++++++
 3 files changed, 104 insertions(+), 3 deletions(-)

diff --git a/superset/reports/schemas.py b/superset/reports/schemas.py
index 7bdbf34f12..11ae5ebc89 100644
--- a/superset/reports/schemas.py
+++ b/superset/reports/schemas.py
@@ -14,7 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-from typing import Any, Union
+from typing import Any, Optional, Union
 
 from croniter import croniter
 from flask import current_app
@@ -220,7 +220,12 @@ class ReportSchedulePostSchema(Schema):
     )
 
     @validates("custom_width")
-    def validate_custom_width(self, value: int) -> None:  # pylint: disable=no-self-use
+    def validate_custom_width(
+        self, value: Optional[int]
+    ) -> None:  # pylint: disable=no-self-use
+        if value is None:
+            return
+
         min_width = current_app.config["ALERT_REPORTS_MIN_CUSTOM_SCREENSHOT_WIDTH"]
         max_width = current_app.config["ALERT_REPORTS_MAX_CUSTOM_SCREENSHOT_WIDTH"]
         if not min_width <= value <= max_width:
@@ -344,7 +349,12 @@ class ReportSchedulePutSchema(Schema):
     )
 
     @validates("custom_width")
-    def validate_custom_width(self, value: int) -> None:  # pylint: disable=no-self-use
+    def validate_custom_width(
+        self, value: Optional[int]
+    ) -> None:  # pylint: disable=no-self-use
+        if value is None:
+            return
+
         min_width = current_app.config["ALERT_REPORTS_MIN_CUSTOM_SCREENSHOT_WIDTH"]
         max_width = current_app.config["ALERT_REPORTS_MAX_CUSTOM_SCREENSHOT_WIDTH"]
         if not min_width <= value <= max_width:
diff --git a/tests/unit_tests/reports/__init__.py b/tests/unit_tests/reports/__init__.py
new file mode 100644
index 0000000000..13a83393a9
--- /dev/null
+++ b/tests/unit_tests/reports/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
diff --git a/tests/unit_tests/reports/schemas_test.py b/tests/unit_tests/reports/schemas_test.py
new file mode 100644
index 0000000000..0fab6d11b9
--- /dev/null
+++ b/tests/unit_tests/reports/schemas_test.py
@@ -0,0 +1,75 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+import pytest
+from marshmallow import ValidationError
+from pytest_mock import MockFixture
+
+from superset.reports.schemas import ReportSchedulePostSchema, ReportSchedulePutSchema
+
+
+def test_report_post_schema_custom_width_validation(mocker: MockFixture) -> None:
+    """
+    Test the custom width validation.
+    """
+    current_app = mocker.patch("superset.reports.schemas.current_app")
+    current_app.config = {
+        "ALERT_REPORTS_MIN_CUSTOM_SCREENSHOT_WIDTH": 100,
+        "ALERT_REPORTS_MAX_CUSTOM_SCREENSHOT_WIDTH": 200,
+    }
+
+    schema = ReportSchedulePostSchema()
+
+    schema.load(
+        {
+            "type": "Report",
+            "name": "A report",
+            "description": "My report",
+            "active": True,
+            "crontab": "* * * * *",
+            "timezone": "America/Los_Angeles",
+            "custom_width": 100,
+        }
+    )
+
+    # not required
+    schema.load(
+        {
+            "type": "Report",
+            "name": "A report",
+            "description": "My report",
+            "active": True,
+            "crontab": "* * * * *",
+            "timezone": "America/Los_Angeles",
+        }
+    )
+
+    with pytest.raises(ValidationError) as excinfo:
+        schema.load(
+            {
+                "type": "Report",
+                "name": "A report",
+                "description": "My report",
+                "active": True,
+                "crontab": "* * * * *",
+                "timezone": "America/Los_Angeles",
+                "custom_width": 1000,
+            }
+        )
+    assert excinfo.value.messages == {
+        "custom_width": ["Screenshot width must be between 100px and 200px"]
+    }