Skip to content

Commit

Permalink
fix(charts): Fix chart load task error handling (#24447)
Browse files Browse the repository at this point in the history
  • Loading branch information
giftig authored Jun 21, 2023
1 parent 6dba6e3 commit d5f88c1
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 4 deletions.
2 changes: 1 addition & 1 deletion superset/charts/data/commands/get_data_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import logging
from typing import Any

from flask_babel import lazy_gettext as _
from flask_babel import gettext as _

from superset.charts.commands.exceptions import (
ChartDataCacheLoadError,
Expand Down
2 changes: 1 addition & 1 deletion superset/common/query_context_processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

import numpy as np
import pandas as pd
from flask_babel import _
from flask_babel import gettext as _
from pandas import DateOffset
from typing_extensions import TypedDict

Expand Down
4 changes: 2 additions & 2 deletions superset/tasks/async_queries.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,10 +90,10 @@ def load_chart_data_into_cache(
raise ex
except Exception as ex:
# TODO: QueryContext should support SIP-40 style errors
error = (
error = str(
ex.message # pylint: disable=no-member
if hasattr(ex, "message")
else str(ex)
else ex
)
errors = [{"message": error}]
async_query_manager.update_job(
Expand Down
39 changes: 39 additions & 0 deletions tests/unit_tests/tasks/test_async_queries.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
from unittest import mock

import pytest
from flask_babel import lazy_gettext as _

from superset.charts.commands.exceptions import ChartDataQueryFailedError


@mock.patch("superset.tasks.async_queries.security_manager")
@mock.patch("superset.tasks.async_queries.async_query_manager")
@mock.patch("superset.tasks.async_queries.ChartDataQueryContextSchema")
def test_load_chart_data_into_cache_with_error(
mock_query_context_schema_cls, mock_async_query_manager, mock_security_manager
):
"""Test that the task is gracefully marked failed in event of error"""
from superset.tasks.async_queries import load_chart_data_into_cache

job_metadata = {"user_id": 1}
form_data = {}
err_message = "Something went wrong"
err = ChartDataQueryFailedError(_(err_message))

mock_user = mock.MagicMock()
mock_query_context_schema = mock.MagicMock()

mock_security_manager.get_user_by_id.return_value = mock_user
mock_async_query_manager.STATUS_ERROR = "error"
mock_query_context_schema_cls.return_value = mock_query_context_schema

mock_query_context_schema.load.side_effect = err

with pytest.raises(ChartDataQueryFailedError):
load_chart_data_into_cache(job_metadata, form_data)

expected_errors = [{"message": err_message}]

mock_async_query_manager.update_job.assert_called_once_with(
job_metadata, "error", errors=expected_errors
)

0 comments on commit d5f88c1

Please sign in to comment.