fix: dashboard, chart and dataset import validation (#32500)

This commit is contained in:
Daniel Vaz Gaspar
2025-03-05 08:47:49 +00:00
committed by GitHub
parent d8686c2d12
commit fc844d3dfd
6 changed files with 171 additions and 7 deletions

View File

@@ -24,6 +24,7 @@ from unittest.mock import Mock, patch
import pytest
from flask import current_app
from flask_appbuilder.security.sqla.models import Role, User
from pytest_mock import MockerFixture
from sqlalchemy.orm.session import Session
@@ -32,7 +33,9 @@ from superset.commands.dataset.exceptions import (
DatasetForbiddenDataURI,
)
from superset.commands.dataset.importers.v1.utils import validate_data_uri
from superset.commands.exceptions import ImportFailedError
from superset.utils import json
from superset.utils.core import override_user
def test_import_dataset(mocker: MockerFixture, session: Session) -> None:
@@ -536,6 +539,55 @@ def test_import_dataset_managed_externally(
assert sqla_table.external_url == "https://example.org/my_table"
def test_import_dataset_without_owner_permission(
mocker: MockerFixture,
session: Session,
) -> None:
"""
Test importing a dataset that is managed externally.
"""
from superset import security_manager
from superset.commands.dataset.importers.v1.utils import import_dataset
from superset.connectors.sqla.models import SqlaTable
from superset.models.core import Database
from tests.integration_tests.fixtures.importexport import dataset_config
mock_can_access = mocker.patch.object(
security_manager, "can_access", return_value=True
)
engine = db.session.get_bind()
SqlaTable.metadata.create_all(engine) # pylint: disable=no-member
database = Database(database_name="my_database", sqlalchemy_uri="sqlite://")
db.session.add(database)
db.session.flush()
config = copy.deepcopy(dataset_config)
config["database_id"] = database.id
import_dataset(config)
user = User(
first_name="Alice",
last_name="Doe",
email="adoe@example.org",
username="admin",
roles=[Role(name="Gamma")],
)
with override_user(user):
with pytest.raises(ImportFailedError) as excinfo:
import_dataset(config, overwrite=True)
assert (
str(excinfo.value)
== "A dataset already exists and user doesn't have permissions to overwrite it" # noqa: E501
)
# Assert that the can write to chart was checked
mock_can_access.assert_called_with("can_write", "Dataset")
@pytest.mark.parametrize(
"allowed_urls, data_uri, expected, exception_class",
[