mirror of
https://github.com/apache/superset.git
synced 2026-04-20 16:44:46 +00:00
fix: Support metric currency as dict during import (#34080)
This commit is contained in:
@@ -22,11 +22,10 @@ from collections import defaultdict
|
||||
from io import BytesIO
|
||||
from unittest import mock
|
||||
from unittest.mock import patch, MagicMock
|
||||
from zipfile import is_zipfile, ZipFile
|
||||
from zipfile import is_zipfile
|
||||
|
||||
import prison
|
||||
import pytest
|
||||
import yaml
|
||||
|
||||
from unittest.mock import Mock
|
||||
|
||||
@@ -69,8 +68,6 @@ from tests.integration_tests.fixtures.world_bank_dashboard import (
|
||||
from tests.integration_tests.fixtures.importexport import (
|
||||
database_config,
|
||||
dataset_config,
|
||||
database_metadata_config,
|
||||
dataset_metadata_config,
|
||||
database_with_ssh_tunnel_config_password,
|
||||
database_with_ssh_tunnel_config_private_key,
|
||||
database_with_ssh_tunnel_config_mix_credentials,
|
||||
@@ -170,22 +167,6 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
db.session.commit()
|
||||
self._database = None
|
||||
|
||||
def create_database_import(self):
|
||||
buf = BytesIO()
|
||||
with ZipFile(buf, "w") as bundle:
|
||||
with bundle.open("database_export/metadata.yaml", "w") as fp:
|
||||
fp.write(yaml.safe_dump(database_metadata_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/databases/imported_database.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(database_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/datasets/imported_dataset.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(dataset_config).encode())
|
||||
buf.seek(0)
|
||||
return buf
|
||||
|
||||
def test_get_items(self):
|
||||
"""
|
||||
Database API: Test get items
|
||||
@@ -2552,7 +2533,7 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
self.login(ADMIN_USERNAME)
|
||||
uri = "api/v1/database/import/"
|
||||
|
||||
buf = self.create_database_import()
|
||||
buf = self.create_import_v1_zip_file("database", datasets=[dataset_config])
|
||||
form_data = {
|
||||
"formData": (buf, "database_export.zip"),
|
||||
}
|
||||
@@ -2585,7 +2566,7 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
self.login(ADMIN_USERNAME)
|
||||
uri = "api/v1/database/import/"
|
||||
|
||||
buf = self.create_database_import()
|
||||
buf = self.create_import_v1_zip_file("database", datasets=[dataset_config])
|
||||
form_data = {
|
||||
"formData": (buf, "database_export.zip"),
|
||||
}
|
||||
@@ -2596,7 +2577,7 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
assert response == {"message": "OK"}
|
||||
|
||||
# import again without overwrite flag
|
||||
buf = self.create_database_import()
|
||||
buf = self.create_import_v1_zip_file("database", datasets=[dataset_config])
|
||||
form_data = {
|
||||
"formData": (buf, "database_export.zip"),
|
||||
}
|
||||
@@ -2611,7 +2592,7 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
"error_type": "GENERIC_COMMAND_ERROR",
|
||||
"level": "warning",
|
||||
"extra": {
|
||||
"databases/imported_database.yaml": "Database already exists and `overwrite=true` was not passed", # noqa: E501
|
||||
"databases/database.yaml": "Database already exists and `overwrite=true` was not passed", # noqa: E501
|
||||
"issue_codes": [
|
||||
{
|
||||
"code": 1010,
|
||||
@@ -2627,7 +2608,7 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
}
|
||||
|
||||
# import with overwrite flag
|
||||
buf = self.create_database_import()
|
||||
buf = self.create_import_v1_zip_file("database", datasets=[dataset_config])
|
||||
form_data = {
|
||||
"formData": (buf, "database_export.zip"),
|
||||
"overwrite": "true",
|
||||
@@ -2656,20 +2637,7 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
self.login(ADMIN_USERNAME)
|
||||
uri = "api/v1/database/import/"
|
||||
|
||||
buf = BytesIO()
|
||||
with ZipFile(buf, "w") as bundle:
|
||||
with bundle.open("database_export/metadata.yaml", "w") as fp:
|
||||
fp.write(yaml.safe_dump(dataset_metadata_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/databases/imported_database.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(database_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/datasets/imported_dataset.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(dataset_config).encode())
|
||||
buf.seek(0)
|
||||
|
||||
buf = self.create_import_v1_zip_file("dataset")
|
||||
form_data = {
|
||||
"formData": (buf, "database_export.zip"),
|
||||
}
|
||||
@@ -2712,20 +2680,11 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
"postgresql://username:XXXXXXXXXX@host:12345/db"
|
||||
)
|
||||
|
||||
buf = BytesIO()
|
||||
with ZipFile(buf, "w") as bundle:
|
||||
with bundle.open("database_export/metadata.yaml", "w") as fp:
|
||||
fp.write(yaml.safe_dump(database_metadata_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/databases/imported_database.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(masked_database_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/datasets/imported_dataset.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(dataset_config).encode())
|
||||
buf.seek(0)
|
||||
|
||||
buf = self.create_import_v1_zip_file(
|
||||
"database",
|
||||
databases=[masked_database_config],
|
||||
datasets=[dataset_config],
|
||||
)
|
||||
form_data = {
|
||||
"formData": (buf, "database_export.zip"),
|
||||
}
|
||||
@@ -2740,7 +2699,7 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
"error_type": "GENERIC_COMMAND_ERROR",
|
||||
"level": "warning",
|
||||
"extra": {
|
||||
"databases/imported_database.yaml": {
|
||||
"databases/database_1.yaml": {
|
||||
"_schema": ["Must provide a password for the database"]
|
||||
},
|
||||
"issue_codes": [
|
||||
@@ -2770,19 +2729,14 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
"vertica+vertica_python://hackathon:XXXXXXXXXX@host:5433/dbname?ssl=1"
|
||||
)
|
||||
|
||||
buf = BytesIO()
|
||||
with ZipFile(buf, "w") as bundle:
|
||||
with bundle.open("database_export/metadata.yaml", "w") as fp:
|
||||
fp.write(yaml.safe_dump(database_metadata_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/databases/imported_database.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(masked_database_config).encode())
|
||||
buf.seek(0)
|
||||
|
||||
buf = self.create_import_v1_zip_file(
|
||||
"database",
|
||||
databases=[masked_database_config],
|
||||
datasets=[dataset_config],
|
||||
)
|
||||
form_data = {
|
||||
"formData": (buf, "database_export.zip"),
|
||||
"passwords": json.dumps({"databases/imported_database.yaml": "SECRET"}),
|
||||
"passwords": json.dumps({"databases/database_1.yaml": "SECRET"}),
|
||||
}
|
||||
rv = self.client.post(uri, data=form_data, content_type="multipart/form-data")
|
||||
response = json.loads(rv.data.decode("utf-8"))
|
||||
@@ -2818,21 +2772,11 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
mock_schema_is_feature_enabled.return_value = True
|
||||
|
||||
masked_database_config = database_with_ssh_tunnel_config_password.copy()
|
||||
|
||||
buf = BytesIO()
|
||||
with ZipFile(buf, "w") as bundle:
|
||||
with bundle.open("database_export/metadata.yaml", "w") as fp:
|
||||
fp.write(yaml.safe_dump(database_metadata_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/databases/imported_database.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(masked_database_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/datasets/imported_dataset.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(dataset_config).encode())
|
||||
buf.seek(0)
|
||||
|
||||
buf = self.create_import_v1_zip_file(
|
||||
"database",
|
||||
databases=[masked_database_config],
|
||||
datasets=[dataset_config],
|
||||
)
|
||||
form_data = {
|
||||
"formData": (buf, "database_export.zip"),
|
||||
}
|
||||
@@ -2847,7 +2791,7 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
"error_type": "GENERIC_COMMAND_ERROR",
|
||||
"level": "warning",
|
||||
"extra": {
|
||||
"databases/imported_database.yaml": {
|
||||
"databases/database_1.yaml": {
|
||||
"_schema": ["Must provide a password for the ssh tunnel"]
|
||||
},
|
||||
"issue_codes": [
|
||||
@@ -2880,21 +2824,14 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
|
||||
masked_database_config = database_with_ssh_tunnel_config_password.copy()
|
||||
|
||||
buf = BytesIO()
|
||||
with ZipFile(buf, "w") as bundle:
|
||||
with bundle.open("database_export/metadata.yaml", "w") as fp:
|
||||
fp.write(yaml.safe_dump(database_metadata_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/databases/imported_database.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(masked_database_config).encode())
|
||||
buf.seek(0)
|
||||
|
||||
buf = self.create_import_v1_zip_file(
|
||||
"database",
|
||||
databases=[masked_database_config],
|
||||
datasets=[dataset_config],
|
||||
)
|
||||
form_data = {
|
||||
"formData": (buf, "database_export.zip"),
|
||||
"ssh_tunnel_passwords": json.dumps(
|
||||
{"databases/imported_database.yaml": "TEST"}
|
||||
),
|
||||
"ssh_tunnel_passwords": json.dumps({"databases/database_1.yaml": "TEST"}),
|
||||
}
|
||||
rv = self.client.post(uri, data=form_data, content_type="multipart/form-data")
|
||||
response = json.loads(rv.data.decode("utf-8"))
|
||||
@@ -2930,21 +2867,11 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
mock_schema_is_feature_enabled.return_value = True
|
||||
|
||||
masked_database_config = database_with_ssh_tunnel_config_private_key.copy()
|
||||
|
||||
buf = BytesIO()
|
||||
with ZipFile(buf, "w") as bundle:
|
||||
with bundle.open("database_export/metadata.yaml", "w") as fp:
|
||||
fp.write(yaml.safe_dump(database_metadata_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/databases/imported_database.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(masked_database_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/datasets/imported_dataset.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(dataset_config).encode())
|
||||
buf.seek(0)
|
||||
|
||||
buf = self.create_import_v1_zip_file(
|
||||
"database",
|
||||
databases=[masked_database_config],
|
||||
datasets=[dataset_config],
|
||||
)
|
||||
form_data = {
|
||||
"formData": (buf, "database_export.zip"),
|
||||
}
|
||||
@@ -2959,7 +2886,7 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
"error_type": "GENERIC_COMMAND_ERROR",
|
||||
"level": "warning",
|
||||
"extra": {
|
||||
"databases/imported_database.yaml": {
|
||||
"databases/database_1.yaml": {
|
||||
"_schema": [
|
||||
"Must provide a private key for the ssh tunnel",
|
||||
"Must provide a private key password for the ssh tunnel", # noqa: E501
|
||||
@@ -2994,24 +2921,17 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
mock_schema_is_feature_enabled.return_value = True
|
||||
|
||||
masked_database_config = database_with_ssh_tunnel_config_private_key.copy()
|
||||
|
||||
buf = BytesIO()
|
||||
with ZipFile(buf, "w") as bundle:
|
||||
with bundle.open("database_export/metadata.yaml", "w") as fp:
|
||||
fp.write(yaml.safe_dump(database_metadata_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/databases/imported_database.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(masked_database_config).encode())
|
||||
buf.seek(0)
|
||||
|
||||
buf = self.create_import_v1_zip_file(
|
||||
"database",
|
||||
databases=[masked_database_config],
|
||||
)
|
||||
form_data = {
|
||||
"formData": (buf, "database_export.zip"),
|
||||
"ssh_tunnel_private_keys": json.dumps(
|
||||
{"databases/imported_database.yaml": "TestPrivateKey"}
|
||||
{"databases/database_1.yaml": "TestPrivateKey"}
|
||||
),
|
||||
"ssh_tunnel_private_key_passwords": json.dumps(
|
||||
{"databases/imported_database.yaml": "TEST"}
|
||||
{"databases/database_1.yaml": "TEST"}
|
||||
),
|
||||
}
|
||||
rv = self.client.post(uri, data=form_data, content_type="multipart/form-data")
|
||||
@@ -3047,21 +2967,11 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
uri = "api/v1/database/import/"
|
||||
|
||||
masked_database_config = database_with_ssh_tunnel_config_private_key.copy()
|
||||
|
||||
buf = BytesIO()
|
||||
with ZipFile(buf, "w") as bundle:
|
||||
with bundle.open("database_export/metadata.yaml", "w") as fp:
|
||||
fp.write(yaml.safe_dump(database_metadata_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/databases/imported_database.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(masked_database_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/datasets/imported_dataset.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(dataset_config).encode())
|
||||
buf.seek(0)
|
||||
|
||||
buf = self.create_import_v1_zip_file(
|
||||
"database",
|
||||
databases=[masked_database_config],
|
||||
datasets=[dataset_config],
|
||||
)
|
||||
form_data = {
|
||||
"formData": (buf, "database_export.zip"),
|
||||
}
|
||||
@@ -3106,20 +3016,11 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
|
||||
masked_database_config = database_with_ssh_tunnel_config_no_credentials.copy()
|
||||
|
||||
buf = BytesIO()
|
||||
with ZipFile(buf, "w") as bundle:
|
||||
with bundle.open("database_export/metadata.yaml", "w") as fp:
|
||||
fp.write(yaml.safe_dump(database_metadata_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/databases/imported_database.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(masked_database_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/datasets/imported_dataset.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(dataset_config).encode())
|
||||
buf.seek(0)
|
||||
|
||||
buf = self.create_import_v1_zip_file(
|
||||
"database",
|
||||
databases=[masked_database_config],
|
||||
datasets=[dataset_config],
|
||||
)
|
||||
form_data = {
|
||||
"formData": (buf, "database_export.zip"),
|
||||
}
|
||||
@@ -3164,20 +3065,11 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
|
||||
masked_database_config = database_with_ssh_tunnel_config_mix_credentials.copy()
|
||||
|
||||
buf = BytesIO()
|
||||
with ZipFile(buf, "w") as bundle:
|
||||
with bundle.open("database_export/metadata.yaml", "w") as fp:
|
||||
fp.write(yaml.safe_dump(database_metadata_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/databases/imported_database.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(masked_database_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/datasets/imported_dataset.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(dataset_config).encode())
|
||||
buf.seek(0)
|
||||
|
||||
buf = self.create_import_v1_zip_file(
|
||||
"database",
|
||||
databases=[masked_database_config],
|
||||
datasets=[dataset_config],
|
||||
)
|
||||
form_data = {
|
||||
"formData": (buf, "database_export.zip"),
|
||||
}
|
||||
@@ -3224,20 +3116,11 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
database_with_ssh_tunnel_config_private_pass_only.copy()
|
||||
)
|
||||
|
||||
buf = BytesIO()
|
||||
with ZipFile(buf, "w") as bundle:
|
||||
with bundle.open("database_export/metadata.yaml", "w") as fp:
|
||||
fp.write(yaml.safe_dump(database_metadata_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/databases/imported_database.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(masked_database_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/datasets/imported_dataset.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(dataset_config).encode())
|
||||
buf.seek(0)
|
||||
|
||||
buf = self.create_import_v1_zip_file(
|
||||
"database",
|
||||
databases=[masked_database_config],
|
||||
datasets=[dataset_config],
|
||||
)
|
||||
form_data = {
|
||||
"formData": (buf, "database_export.zip"),
|
||||
}
|
||||
@@ -3252,7 +3135,7 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
"error_type": "GENERIC_COMMAND_ERROR",
|
||||
"level": "warning",
|
||||
"extra": {
|
||||
"databases/imported_database.yaml": {
|
||||
"databases/database_1.yaml": {
|
||||
"_schema": [
|
||||
"Must provide a private key for the ssh tunnel",
|
||||
"Must provide a private key password for the ssh tunnel", # noqa: E501
|
||||
@@ -3296,22 +3179,10 @@ class TestDatabaseApi(SupersetTestCase):
|
||||
"uuid": "b8a1ccd3-779d-4ab7-8ad8-9ab119d7ff90",
|
||||
"version": "1.0.0",
|
||||
}
|
||||
|
||||
buf = BytesIO()
|
||||
with ZipFile(buf, "w") as bundle:
|
||||
with bundle.open("database_export/metadata.yaml", "w") as fp:
|
||||
fp.write(yaml.safe_dump(database_metadata_config).encode())
|
||||
with bundle.open(
|
||||
"database_export/databases/DB_with_expand_rows_enabled.yaml", "w"
|
||||
) as fp:
|
||||
fp.write(yaml.safe_dump(db_config).encode())
|
||||
buf.seek(0)
|
||||
|
||||
buf = self.create_import_v1_zip_file("database", databases=[db_config])
|
||||
form_data = {
|
||||
"formData": (buf, "database_export.zip"),
|
||||
"passwords": json.dumps(
|
||||
{"databases/DB_with_expand_rows_enabled.yaml": "SECRET"}
|
||||
),
|
||||
"passwords": json.dumps({"databases/database_1.yaml": "SECRET"}),
|
||||
}
|
||||
rv = self.client.post(uri, data=form_data, content_type="multipart/form-data")
|
||||
response = json.loads(rv.data.decode("utf-8"))
|
||||
|
||||
Reference in New Issue
Block a user