fix: Support metric currency as dict during import (#34080)

This commit is contained in:
Vitor Avila
2025-07-07 14:00:56 -03:00
committed by GitHub
parent f55476034b
commit 733f112142
7 changed files with 229 additions and 320 deletions

View File

@@ -14,39 +14,48 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# isort:skip_file
"""Unit tests for Superset"""
from contextlib import contextmanager
from datetime import datetime
from importlib.util import find_spec
from contextlib import contextmanager
from typing import Any, Union, Optional
from unittest.mock import Mock, patch, MagicMock
from io import BytesIO
from typing import Any, Optional, Union
from unittest.mock import MagicMock, Mock, patch
from zipfile import ZipFile
import pandas as pd
import prison
from flask import Response, g
import yaml
from flask import g, Response
from flask_appbuilder.security.sqla import models as ab_models
from flask_testing import TestCase
from sqlalchemy.dialects.mysql import dialect
from sqlalchemy.engine.interfaces import Dialect
from sqlalchemy.ext.declarative import DeclarativeMeta
from sqlalchemy.orm import Session # noqa: F401
from sqlalchemy.sql import func
from sqlalchemy.dialects.mysql import dialect
from tests.integration_tests.constants import ADMIN_USERNAME
from tests.integration_tests.test_app import app, login
from superset.sql.parse import CTASMethod
from superset import db, security_manager
from superset.connectors.sqla.models import BaseDatasource, SqlaTable
from superset.models import core as models
from superset.models.slice import Slice
from superset.models.core import Database
from superset.models.dashboard import Dashboard
from superset.utils.core import get_example_default_schema, shortid
from superset.models.slice import Slice
from superset.sql.parse import CTASMethod
from superset.utils import json
from superset.utils.core import get_example_default_schema, shortid
from superset.utils.database import get_example_database
from superset.views.base_api import BaseSupersetModelRestApi
from tests.integration_tests.constants import ADMIN_USERNAME
from tests.integration_tests.fixtures.importexport import (
chart_config,
dashboard_config,
database_config,
dataset_config,
metadata_files,
)
from tests.integration_tests.test_app import app, login
FAKE_DB_NAME = "fake_db_100"
DEFAULT_PASSWORD = "general" # noqa: S105
@@ -606,6 +615,48 @@ class SupersetTestCase(TestCase):
response = self.get_assert_metric(uri, "get_list")
return response
@staticmethod
def create_import_v1_zip_file(asset_type: str, **kwargs) -> BytesIO:
asset_configs = {
"databases": (kwargs.get("databases"), database_config, True),
"datasets": (
kwargs.get("datasets"),
dataset_config,
asset_type != "database",
),
"charts": (
kwargs.get("charts"),
chart_config,
asset_type in {"chart", "dashboard"},
),
"dashboards": (
kwargs.get("dashboards"),
dashboard_config,
asset_type == "dashboard",
),
}
buf = BytesIO()
with ZipFile(buf, "w") as bundle:
with bundle.open("export/metadata.yaml", "w") as fp:
fp.write(yaml.safe_dump(metadata_files[asset_type]).encode())
for folder, (
assets,
default_config,
should_have_default,
) in asset_configs.items():
if assets:
for i, asset in enumerate(assets):
with bundle.open(
f"export/{folder}/{asset_type}_{i + 1}.yaml", "w"
) as fp:
fp.write(yaml.safe_dump(asset).encode())
elif should_have_default:
with bundle.open(f"export/{folder}/{asset_type}.yaml", "w") as fp:
fp.write(yaml.safe_dump(default_config).encode())
buf.seek(0)
return buf
@contextmanager
def db_insert_temp_object(obj: DeclarativeMeta):