Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(charts): Fix chart load task error handling #24447

Merged
merged 1 commit into from
Jun 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
)