mirror of
https://github.com/apache/superset.git
synced 2026-04-19 08:04:53 +00:00
feat: enable metadata sync for virtual tables (#10645)
* feat: enable metadata sync for virtual tables * add migration and check for empty schema name * simplify request * truncate trailing column attributes for MySQL * add unit test * use db_engine_spec func to truncate collation and charset * Remove redundant migration * add more tests * address review comments and apply templating to query * add todo for refactoring * remove schema from tests * check column datatype
This commit is contained in:
@@ -18,27 +18,82 @@
|
||||
import json
|
||||
from copy import deepcopy
|
||||
|
||||
from superset import db
|
||||
from superset.connectors.sqla.models import SqlaTable
|
||||
from superset.utils.core import get_example_database
|
||||
|
||||
from .base_tests import SupersetTestCase
|
||||
from .fixtures.datasource import datasource_post
|
||||
|
||||
|
||||
class TestDatasource(SupersetTestCase):
|
||||
def test_external_metadata(self):
|
||||
def test_external_metadata_for_physical_table(self):
|
||||
self.login(username="admin")
|
||||
tbl = self.get_table_by_name("birth_names")
|
||||
schema = tbl.schema or ""
|
||||
url = (
|
||||
f"/datasource/external_metadata/table/{tbl.id}/?"
|
||||
f"db_id={tbl.database.id}&"
|
||||
f"table_name={tbl.table_name}&"
|
||||
f"schema={schema}&"
|
||||
)
|
||||
url = f"/datasource/external_metadata/table/{tbl.id}/"
|
||||
resp = self.get_json_resp(url)
|
||||
col_names = {o.get("name") for o in resp}
|
||||
self.assertEqual(
|
||||
col_names, {"sum_boys", "num", "gender", "name", "ds", "state", "sum_girls"}
|
||||
)
|
||||
|
||||
def test_external_metadata_for_virtual_table(self):
|
||||
self.login(username="admin")
|
||||
session = db.session
|
||||
table = SqlaTable(
|
||||
table_name="dummy_sql_table",
|
||||
database=get_example_database(),
|
||||
sql="select 123 as intcol, 'abc' as strcol",
|
||||
)
|
||||
session.add(table)
|
||||
session.commit()
|
||||
|
||||
table = self.get_table_by_name("dummy_sql_table")
|
||||
url = f"/datasource/external_metadata/table/{table.id}/"
|
||||
resp = self.get_json_resp(url)
|
||||
assert {o.get("name") for o in resp} == {"intcol", "strcol"}
|
||||
session.delete(table)
|
||||
session.commit()
|
||||
|
||||
def test_external_metadata_for_malicious_virtual_table(self):
|
||||
self.login(username="admin")
|
||||
session = db.session
|
||||
table = SqlaTable(
|
||||
table_name="malicious_sql_table",
|
||||
database=get_example_database(),
|
||||
sql="delete table birth_names",
|
||||
)
|
||||
session.add(table)
|
||||
session.commit()
|
||||
|
||||
table = self.get_table_by_name("malicious_sql_table")
|
||||
url = f"/datasource/external_metadata/table/{table.id}/"
|
||||
resp = self.get_json_resp(url)
|
||||
assert "error" in resp
|
||||
|
||||
session.delete(table)
|
||||
session.commit()
|
||||
|
||||
def test_external_metadata_for_mutistatement_virtual_table(self):
|
||||
self.login(username="admin")
|
||||
session = db.session
|
||||
table = SqlaTable(
|
||||
table_name="multistatement_sql_table",
|
||||
database=get_example_database(),
|
||||
sql="select 123 as intcol, 'abc' as strcol;"
|
||||
"select 123 as intcol, 'abc' as strcol",
|
||||
)
|
||||
session.add(table)
|
||||
session.commit()
|
||||
|
||||
table = self.get_table_by_name("multistatement_sql_table")
|
||||
url = f"/datasource/external_metadata/table/{table.id}/"
|
||||
resp = self.get_json_resp(url)
|
||||
assert "error" in resp
|
||||
|
||||
session.delete(table)
|
||||
session.commit()
|
||||
|
||||
def compare_lists(self, l1, l2, key):
|
||||
l2_lookup = {o.get(key): o for o in l2}
|
||||
for obj1 in l1:
|
||||
|
||||
Reference in New Issue
Block a user