mirror of https://github.com/apache/superset.git
tests: added fixture with energy usage instead of example (#11308)
* Added energy usage fixture. Updated dashboard utils and unicode fixture with new method parameters. * Add energy fixture to tests/access_tests.py * Add energy fixture to tests/core_tests.py * Add energy fixture to tests/dashboard_tests.py * Add energy fixture to tests/datasets/api_tests.py * Add energy fixture to tests/db_engine_specs/base_engine_spec_tests.py * Add energy fixture to tests/import_export_tests.py * Add energy fixture to tests/model_tests.py * Add energy fixture to tests/query_context_tests.py * Add energy fixture to tests/security_tests.py * Add energy fixture to tests/charts/api_tests.py * Changed formatting of slices' parameters in energy usage fixture * Removed loading energy udage data from test conf file * Add energy fixture to tests/databases/api_tests.py * Fixes after review: removed isort:skip, load_charts->load_energy_charts, removed unused import. * Added energy fixture to tests/charts/commands_tests.py and retrieving proper Slice by name * Fixed charts/api_tests.py to use energy_usage from fixtures * Fixed datasets/commands_tests.py to retrieve dataset by name and use energy_usage fixture * Changed energy usage data to generated data and fixed chart tests which was checking energy usage data
This commit is contained in:
parent
6270fa2026
commit
4da47f1635
|
@ -20,6 +20,9 @@ import json
|
||||||
import unittest
|
import unittest
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from tests.fixtures.energy_dashboard import load_energy_table_with_slice
|
||||||
from tests.test_app import app # isort:skip
|
from tests.test_app import app # isort:skip
|
||||||
from superset import db, security_manager
|
from superset import db, security_manager
|
||||||
from superset.connectors.connector_registry import ConnectorRegistry
|
from superset.connectors.connector_registry import ConnectorRegistry
|
||||||
|
@ -184,6 +187,7 @@ class TestRequestAccess(SupersetTestCase):
|
||||||
)
|
)
|
||||||
self.assertEqual(3, len(perms))
|
self.assertEqual(3, len(perms))
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||||
def test_override_role_permissions_drops_absent_perms(self):
|
def test_override_role_permissions_drops_absent_perms(self):
|
||||||
override_me = security_manager.find_role("override_me")
|
override_me = security_manager.find_role("override_me")
|
||||||
override_me.permissions.append(
|
override_me.permissions.append(
|
||||||
|
@ -272,6 +276,7 @@ class TestRequestAccess(SupersetTestCase):
|
||||||
gamma_user.roles.remove(security_manager.find_role("Alpha"))
|
gamma_user.roles.remove(security_manager.find_role("Alpha"))
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||||
def test_clean_requests_after_db_grant(self):
|
def test_clean_requests_after_db_grant(self):
|
||||||
session = db.session
|
session = db.session
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,8 @@ from sqlalchemy.sql import func
|
||||||
from tests.test_app import app
|
from tests.test_app import app
|
||||||
from superset.connectors.sqla.models import SqlaTable
|
from superset.connectors.sqla.models import SqlaTable
|
||||||
from superset.utils.core import AnnotationType, get_example_database
|
from superset.utils.core import AnnotationType, get_example_database
|
||||||
|
from tests.fixtures.energy_dashboard import load_energy_table_with_slice
|
||||||
|
from tests.fixtures.unicode_dashboard import load_unicode_dashboard_with_slice
|
||||||
from superset.connectors.connector_registry import ConnectorRegistry
|
from superset.connectors.connector_registry import ConnectorRegistry
|
||||||
from superset.extensions import db, security_manager
|
from superset.extensions import db, security_manager
|
||||||
from superset.models.annotations import AnnotationLayer
|
from superset.models.annotations import AnnotationLayer
|
||||||
|
@ -709,6 +711,7 @@ class TestChartApi(SupersetTestCase, ApiOwnersTestCaseMixin):
|
||||||
self.assertEqual(rv.status_code, 404)
|
self.assertEqual(rv.status_code, 404)
|
||||||
|
|
||||||
@pytest.mark.usefixtures("load_unicode_dashboard_with_slice")
|
@pytest.mark.usefixtures("load_unicode_dashboard_with_slice")
|
||||||
|
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||||
def test_get_charts(self):
|
def test_get_charts(self):
|
||||||
"""
|
"""
|
||||||
Chart API: Test get charts
|
Chart API: Test get charts
|
||||||
|
@ -761,7 +764,7 @@ class TestChartApi(SupersetTestCase, ApiOwnersTestCaseMixin):
|
||||||
self.assertEqual(data["count"], 5)
|
self.assertEqual(data["count"], 5)
|
||||||
|
|
||||||
@pytest.fixture()
|
@pytest.fixture()
|
||||||
def load_charts(self):
|
def load_energy_charts(self):
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
admin = self.get_user("admin")
|
admin = self.get_user("admin")
|
||||||
energy_table = (
|
energy_table = (
|
||||||
|
@ -797,7 +800,7 @@ class TestChartApi(SupersetTestCase, ApiOwnersTestCaseMixin):
|
||||||
db.session.delete(chart5)
|
db.session.delete(chart5)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
@pytest.mark.usefixtures("load_charts")
|
@pytest.mark.usefixtures("load_energy_charts")
|
||||||
def test_get_charts_custom_filter(self):
|
def test_get_charts_custom_filter(self):
|
||||||
"""
|
"""
|
||||||
Chart API: Test get charts custom filter
|
Chart API: Test get charts custom filter
|
||||||
|
@ -830,7 +833,7 @@ class TestChartApi(SupersetTestCase, ApiOwnersTestCaseMixin):
|
||||||
self.assertEqual(item["slice_name"], expected_response[index]["slice_name"])
|
self.assertEqual(item["slice_name"], expected_response[index]["slice_name"])
|
||||||
self.assertEqual(item["viz_type"], expected_response[index]["viz_type"])
|
self.assertEqual(item["viz_type"], expected_response[index]["viz_type"])
|
||||||
|
|
||||||
@pytest.mark.usefixtures("load_charts")
|
@pytest.mark.usefixtures("load_energy_table_with_slice", "load_energy_charts")
|
||||||
def test_admin_gets_filtered_energy_slices(self):
|
def test_admin_gets_filtered_energy_slices(self):
|
||||||
# test filtering on datasource_name
|
# test filtering on datasource_name
|
||||||
arguments = {
|
arguments = {
|
||||||
|
@ -848,7 +851,7 @@ class TestChartApi(SupersetTestCase, ApiOwnersTestCaseMixin):
|
||||||
data = json.loads(rv.data.decode("utf-8"))
|
data = json.loads(rv.data.decode("utf-8"))
|
||||||
self.assertEqual(data["count"], 8)
|
self.assertEqual(data["count"], 8)
|
||||||
|
|
||||||
@pytest.mark.usefixtures("load_charts")
|
@pytest.mark.usefixtures("load_energy_charts")
|
||||||
def test_user_gets_none_filtered_energy_slices(self):
|
def test_user_gets_none_filtered_energy_slices(self):
|
||||||
# test filtering on datasource_name
|
# test filtering on datasource_name
|
||||||
arguments = {
|
arguments = {
|
||||||
|
@ -942,7 +945,9 @@ class TestChartApi(SupersetTestCase, ApiOwnersTestCaseMixin):
|
||||||
if res["id"] in users_favorite_ids:
|
if res["id"] in users_favorite_ids:
|
||||||
assert res["value"]
|
assert res["value"]
|
||||||
|
|
||||||
@pytest.mark.usefixtures("load_unicode_dashboard_with_slice")
|
@pytest.mark.usefixtures(
|
||||||
|
"load_unicode_dashboard_with_slice", "load_energy_table_with_slice"
|
||||||
|
)
|
||||||
def test_get_charts_page(self):
|
def test_get_charts_page(self):
|
||||||
"""
|
"""
|
||||||
Chart API: Test get charts filter
|
Chart API: Test get charts filter
|
||||||
|
|
|
@ -32,6 +32,7 @@ from superset.connectors.sqla.models import SqlaTable
|
||||||
from superset.models.core import Database
|
from superset.models.core import Database
|
||||||
from superset.models.slice import Slice
|
from superset.models.slice import Slice
|
||||||
from tests.base_tests import SupersetTestCase
|
from tests.base_tests import SupersetTestCase
|
||||||
|
from tests.fixtures.energy_dashboard import load_energy_table_with_slice
|
||||||
from tests.fixtures.importexport import (
|
from tests.fixtures.importexport import (
|
||||||
chart_config,
|
chart_config,
|
||||||
chart_metadata_config,
|
chart_metadata_config,
|
||||||
|
@ -43,10 +44,13 @@ from tests.fixtures.importexport import (
|
||||||
|
|
||||||
class TestExportChartsCommand(SupersetTestCase):
|
class TestExportChartsCommand(SupersetTestCase):
|
||||||
@patch("superset.security.manager.g")
|
@patch("superset.security.manager.g")
|
||||||
|
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||||
def test_export_chart_command(self, mock_g):
|
def test_export_chart_command(self, mock_g):
|
||||||
mock_g.user = security_manager.find_user("admin")
|
mock_g.user = security_manager.find_user("admin")
|
||||||
|
|
||||||
example_chart = db.session.query(Slice).all()[0]
|
example_chart = (
|
||||||
|
db.session.query(Slice).filter_by(slice_name="Energy Sankey").one_or_none()
|
||||||
|
)
|
||||||
command = ExportChartsCommand([example_chart.id])
|
command = ExportChartsCommand([example_chart.id])
|
||||||
contents = dict(command.run())
|
contents = dict(command.run())
|
||||||
|
|
||||||
|
@ -97,11 +101,14 @@ class TestExportChartsCommand(SupersetTestCase):
|
||||||
next(contents)
|
next(contents)
|
||||||
|
|
||||||
@patch("superset.security.manager.g")
|
@patch("superset.security.manager.g")
|
||||||
|
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||||
def test_export_chart_command_key_order(self, mock_g):
|
def test_export_chart_command_key_order(self, mock_g):
|
||||||
"""Test that they keys in the YAML have the same order as export_fields"""
|
"""Test that they keys in the YAML have the same order as export_fields"""
|
||||||
mock_g.user = security_manager.find_user("admin")
|
mock_g.user = security_manager.find_user("admin")
|
||||||
|
|
||||||
example_chart = db.session.query(Slice).all()[0]
|
example_chart = (
|
||||||
|
db.session.query(Slice).filter_by(slice_name="Energy Sankey").one_or_none()
|
||||||
|
)
|
||||||
command = ExportChartsCommand([example_chart.id])
|
command = ExportChartsCommand([example_chart.id])
|
||||||
contents = dict(command.run())
|
contents = dict(command.run())
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,6 @@ def setup_sample_data() -> Any:
|
||||||
from superset import examples
|
from superset import examples
|
||||||
|
|
||||||
examples.load_css_templates()
|
examples.load_css_templates()
|
||||||
examples.load_energy(sample=True)
|
|
||||||
examples.load_world_bank_health_n_pop(sample=True)
|
examples.load_world_bank_health_n_pop(sample=True)
|
||||||
examples.load_birth_names(sample=True)
|
examples.load_birth_names(sample=True)
|
||||||
|
|
||||||
|
@ -50,7 +49,6 @@ def setup_sample_data() -> Any:
|
||||||
|
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
engine = get_example_database().get_sqla_engine()
|
engine = get_example_database().get_sqla_engine()
|
||||||
engine.execute("DROP TABLE energy_usage")
|
|
||||||
engine.execute("DROP TABLE wb_health_population")
|
engine.execute("DROP TABLE wb_health_population")
|
||||||
engine.execute("DROP TABLE birth_names")
|
engine.execute("DROP TABLE birth_names")
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@ import logging
|
||||||
from typing import Dict, List
|
from typing import Dict, List
|
||||||
from urllib.parse import quote
|
from urllib.parse import quote
|
||||||
|
|
||||||
|
import pytest
|
||||||
import pytz
|
import pytz
|
||||||
import random
|
import random
|
||||||
import re
|
import re
|
||||||
|
@ -37,7 +38,8 @@ import sqlalchemy as sqla
|
||||||
|
|
||||||
from superset.models.cache import CacheKey
|
from superset.models.cache import CacheKey
|
||||||
from superset.utils.core import get_example_database
|
from superset.utils.core import get_example_database
|
||||||
from tests.test_app import app # isort:skip
|
from tests.fixtures.energy_dashboard import load_energy_table_with_slice
|
||||||
|
from tests.test_app import app
|
||||||
import superset.views.utils
|
import superset.views.utils
|
||||||
from superset import (
|
from superset import (
|
||||||
dataframe,
|
dataframe,
|
||||||
|
@ -236,6 +238,7 @@ class TestCore(SupersetTestCase):
|
||||||
assert_admin_view_menus_in("Alpha", self.assertNotIn)
|
assert_admin_view_menus_in("Alpha", self.assertNotIn)
|
||||||
assert_admin_view_menus_in("Gamma", self.assertNotIn)
|
assert_admin_view_menus_in("Gamma", self.assertNotIn)
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||||
def test_save_slice(self):
|
def test_save_slice(self):
|
||||||
self.login(username="admin")
|
self.login(username="admin")
|
||||||
slice_name = f"Energy Sankey"
|
slice_name = f"Energy Sankey"
|
||||||
|
@ -302,6 +305,7 @@ class TestCore(SupersetTestCase):
|
||||||
db.session.delete(slc)
|
db.session.delete(slc)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||||
def test_filter_endpoint(self):
|
def test_filter_endpoint(self):
|
||||||
self.login(username="admin")
|
self.login(username="admin")
|
||||||
slice_name = "Energy Sankey"
|
slice_name = "Energy Sankey"
|
||||||
|
@ -320,7 +324,7 @@ class TestCore(SupersetTestCase):
|
||||||
# Changing name
|
# Changing name
|
||||||
resp = self.get_resp(url.format(tbl_id, slice_id))
|
resp = self.get_resp(url.format(tbl_id, slice_id))
|
||||||
assert len(resp) > 0
|
assert len(resp) > 0
|
||||||
assert "Carbon Dioxide" in resp
|
assert "energy_target0" in resp
|
||||||
|
|
||||||
def test_slice_data(self):
|
def test_slice_data(self):
|
||||||
# slice data should have some required attributes
|
# slice data should have some required attributes
|
||||||
|
@ -333,6 +337,7 @@ class TestCore(SupersetTestCase):
|
||||||
assert "modified" in slc_data_attributes
|
assert "modified" in slc_data_attributes
|
||||||
assert "owners" in slc_data_attributes
|
assert "owners" in slc_data_attributes
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||||
def test_slices(self):
|
def test_slices(self):
|
||||||
# Testing by hitting the two supported end points for all slices
|
# Testing by hitting the two supported end points for all slices
|
||||||
self.login(username="admin")
|
self.login(username="admin")
|
||||||
|
@ -409,6 +414,7 @@ class TestCore(SupersetTestCase):
|
||||||
resp = self.client.get(url)
|
resp = self.client.get(url)
|
||||||
self.assertEqual(resp.status_code, 200)
|
self.assertEqual(resp.status_code, 200)
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||||
def test_slices_V2(self):
|
def test_slices_V2(self):
|
||||||
# Add explore-v2-beta role to admin user
|
# Add explore-v2-beta role to admin user
|
||||||
# Test all slice urls as user with with explore-v2-beta role
|
# Test all slice urls as user with with explore-v2-beta role
|
||||||
|
@ -570,6 +576,7 @@ class TestCore(SupersetTestCase):
|
||||||
database.allow_run_async = False
|
database.allow_run_async = False
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||||
def test_warm_up_cache(self):
|
def test_warm_up_cache(self):
|
||||||
self.login()
|
self.login()
|
||||||
slc = self.get_slice("Girls", db.session)
|
slc = self.get_slice("Girls", db.session)
|
||||||
|
|
|
@ -32,6 +32,7 @@ from superset.connectors.sqla.models import SqlaTable
|
||||||
from superset.models import core as models
|
from superset.models import core as models
|
||||||
from superset.models.dashboard import Dashboard
|
from superset.models.dashboard import Dashboard
|
||||||
from superset.models.slice import Slice
|
from superset.models.slice import Slice
|
||||||
|
from tests.fixtures.energy_dashboard import load_energy_table_with_slice
|
||||||
|
|
||||||
from .base_tests import SupersetTestCase
|
from .base_tests import SupersetTestCase
|
||||||
|
|
||||||
|
@ -302,6 +303,7 @@ class TestDashboard(SupersetTestCase):
|
||||||
if key not in ["modified", "changed_on", "changed_on_humanized"]:
|
if key not in ["modified", "changed_on", "changed_on_humanized"]:
|
||||||
self.assertEqual(slc[key], resp["slices"][index][key])
|
self.assertEqual(slc[key], resp["slices"][index][key])
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||||
def test_add_slices(self, username="admin"):
|
def test_add_slices(self, username="admin"):
|
||||||
self.login(username=username)
|
self.login(username=username)
|
||||||
dash = db.session.query(Dashboard).filter_by(slug="births").first()
|
dash = db.session.query(Dashboard).filter_by(slug="births").first()
|
||||||
|
@ -453,7 +455,7 @@ class TestDashboard(SupersetTestCase):
|
||||||
resp = self.get_resp("/api/v1/dashboard/")
|
resp = self.get_resp("/api/v1/dashboard/")
|
||||||
self.assertNotIn("/superset/dashboard/empty_dashboard/", resp)
|
self.assertNotIn("/superset/dashboard/empty_dashboard/", resp)
|
||||||
|
|
||||||
@pytest.mark.usefixtures("load_dashboard")
|
@pytest.mark.usefixtures("load_energy_table_with_slice", "load_dashboard")
|
||||||
def test_users_can_view_published_dashboard(self):
|
def test_users_can_view_published_dashboard(self):
|
||||||
resp = self.get_resp("/api/v1/dashboard/")
|
resp = self.get_resp("/api/v1/dashboard/")
|
||||||
self.assertNotIn(f"/superset/dashboard/{pytest.hidden_dash_slug}/", resp)
|
self.assertNotIn(f"/superset/dashboard/{pytest.hidden_dash_slug}/", resp)
|
||||||
|
|
|
@ -29,7 +29,11 @@ from superset.models.slice import Slice
|
||||||
|
|
||||||
|
|
||||||
def create_table_for_dashboard(
|
def create_table_for_dashboard(
|
||||||
df: DataFrame, table_name: str, database: Database, dtype: Dict[str, Any]
|
df: DataFrame,
|
||||||
|
table_name: str,
|
||||||
|
database: Database,
|
||||||
|
dtype: Dict[str, Any],
|
||||||
|
table_description: str = "",
|
||||||
) -> SqlaTable:
|
) -> SqlaTable:
|
||||||
df.to_sql(
|
df.to_sql(
|
||||||
table_name,
|
table_name,
|
||||||
|
@ -48,6 +52,7 @@ def create_table_for_dashboard(
|
||||||
if not table:
|
if not table:
|
||||||
table = table_source(table_name=table_name)
|
table = table_source(table_name=table_name)
|
||||||
table.database = database
|
table.database = database
|
||||||
|
table.description = table_description
|
||||||
db.session.merge(table)
|
db.session.merge(table)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
|
|
@ -34,13 +34,13 @@ from superset.models.reports import ReportSchedule, ReportScheduleType
|
||||||
from superset.utils.core import get_example_database, get_main_database
|
from superset.utils.core import get_example_database, get_main_database
|
||||||
from tests.base_tests import SupersetTestCase
|
from tests.base_tests import SupersetTestCase
|
||||||
from tests.fixtures.certificates import ssl_certificate
|
from tests.fixtures.certificates import ssl_certificate
|
||||||
|
from tests.fixtures.energy_dashboard import load_energy_table_with_slice
|
||||||
from tests.fixtures.importexport import (
|
from tests.fixtures.importexport import (
|
||||||
database_config,
|
database_config,
|
||||||
dataset_config,
|
dataset_config,
|
||||||
database_metadata_config,
|
database_metadata_config,
|
||||||
dataset_metadata_config,
|
dataset_metadata_config,
|
||||||
)
|
)
|
||||||
|
|
||||||
from tests.fixtures.unicode_dashboard import load_unicode_dashboard_with_position
|
from tests.fixtures.unicode_dashboard import load_unicode_dashboard_with_position
|
||||||
from tests.test_app import app
|
from tests.test_app import app
|
||||||
|
|
||||||
|
@ -800,7 +800,9 @@ class TestDatabaseApi(SupersetTestCase):
|
||||||
}
|
}
|
||||||
self.assertEqual(response, expected_response)
|
self.assertEqual(response, expected_response)
|
||||||
|
|
||||||
@pytest.mark.usefixtures("load_unicode_dashboard_with_position")
|
@pytest.mark.usefixtures(
|
||||||
|
"load_unicode_dashboard_with_position", "load_energy_table_with_slice"
|
||||||
|
)
|
||||||
def test_get_database_related_objects(self):
|
def test_get_database_related_objects(self):
|
||||||
"""
|
"""
|
||||||
Database API: Test get chart and dashboard count related to a database
|
Database API: Test get chart and dashboard count related to a database
|
||||||
|
|
|
@ -39,6 +39,7 @@ from superset.utils.core import backend, get_example_database, get_main_database
|
||||||
from superset.utils.dict_import_export import export_to_dict
|
from superset.utils.dict_import_export import export_to_dict
|
||||||
from tests.base_tests import SupersetTestCase
|
from tests.base_tests import SupersetTestCase
|
||||||
from tests.conftest import CTAS_SCHEMA_NAME
|
from tests.conftest import CTAS_SCHEMA_NAME
|
||||||
|
from tests.fixtures.energy_dashboard import load_energy_table_with_slice
|
||||||
from tests.fixtures.importexport import (
|
from tests.fixtures.importexport import (
|
||||||
database_config,
|
database_config,
|
||||||
database_metadata_config,
|
database_metadata_config,
|
||||||
|
@ -196,6 +197,7 @@ class TestDatasetApi(SupersetTestCase):
|
||||||
assert response["count"] == 0
|
assert response["count"] == 0
|
||||||
assert response["result"] == []
|
assert response["result"] == []
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||||
def test_get_dataset_item(self):
|
def test_get_dataset_item(self):
|
||||||
"""
|
"""
|
||||||
Dataset API: Test get dataset item
|
Dataset API: Test get dataset item
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
# pylint: disable=no-self-use, invalid-name, line-too-long
|
# pylint: disable=no-self-use, invalid-name, line-too-long
|
||||||
|
|
||||||
from operator import itemgetter
|
from operator import itemgetter
|
||||||
|
from typing import Any, List
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -33,6 +34,7 @@ from superset.datasets.commands.importers import v0, v1
|
||||||
from superset.models.core import Database
|
from superset.models.core import Database
|
||||||
from superset.utils.core import get_example_database
|
from superset.utils.core import get_example_database
|
||||||
from tests.base_tests import SupersetTestCase
|
from tests.base_tests import SupersetTestCase
|
||||||
|
from tests.fixtures.energy_dashboard import load_energy_table_with_slice
|
||||||
from tests.fixtures.importexport import (
|
from tests.fixtures.importexport import (
|
||||||
database_config,
|
database_config,
|
||||||
database_metadata_config,
|
database_metadata_config,
|
||||||
|
@ -45,11 +47,14 @@ from tests.fixtures.importexport import (
|
||||||
|
|
||||||
class TestExportDatasetsCommand(SupersetTestCase):
|
class TestExportDatasetsCommand(SupersetTestCase):
|
||||||
@patch("superset.security.manager.g")
|
@patch("superset.security.manager.g")
|
||||||
|
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||||
def test_export_dataset_command(self, mock_g):
|
def test_export_dataset_command(self, mock_g):
|
||||||
mock_g.user = security_manager.find_user("admin")
|
mock_g.user = security_manager.find_user("admin")
|
||||||
|
|
||||||
example_db = get_example_database()
|
example_db = get_example_database()
|
||||||
example_dataset = example_db.tables[0]
|
example_dataset = _get_table_from_list_by_name(
|
||||||
|
"energy_usage", example_db.tables
|
||||||
|
)
|
||||||
command = ExportDatasetsCommand([example_dataset.id])
|
command = ExportDatasetsCommand([example_dataset.id])
|
||||||
contents = dict(command.run())
|
contents = dict(command.run())
|
||||||
|
|
||||||
|
@ -76,7 +81,7 @@ class TestExportDatasetsCommand(SupersetTestCase):
|
||||||
{
|
{
|
||||||
"column_name": "source",
|
"column_name": "source",
|
||||||
"description": None,
|
"description": None,
|
||||||
"expression": None,
|
"expression": "",
|
||||||
"filterable": True,
|
"filterable": True,
|
||||||
"groupby": True,
|
"groupby": True,
|
||||||
"is_active": True,
|
"is_active": True,
|
||||||
|
@ -88,7 +93,7 @@ class TestExportDatasetsCommand(SupersetTestCase):
|
||||||
{
|
{
|
||||||
"column_name": "target",
|
"column_name": "target",
|
||||||
"description": None,
|
"description": None,
|
||||||
"expression": None,
|
"expression": "",
|
||||||
"filterable": True,
|
"filterable": True,
|
||||||
"groupby": True,
|
"groupby": True,
|
||||||
"is_active": True,
|
"is_active": True,
|
||||||
|
@ -100,7 +105,7 @@ class TestExportDatasetsCommand(SupersetTestCase):
|
||||||
{
|
{
|
||||||
"column_name": "value",
|
"column_name": "value",
|
||||||
"description": None,
|
"description": None,
|
||||||
"expression": None,
|
"expression": "",
|
||||||
"filterable": True,
|
"filterable": True,
|
||||||
"groupby": True,
|
"groupby": True,
|
||||||
"is_active": True,
|
"is_active": True,
|
||||||
|
@ -171,12 +176,15 @@ class TestExportDatasetsCommand(SupersetTestCase):
|
||||||
next(contents)
|
next(contents)
|
||||||
|
|
||||||
@patch("superset.security.manager.g")
|
@patch("superset.security.manager.g")
|
||||||
|
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||||
def test_export_dataset_command_key_order(self, mock_g):
|
def test_export_dataset_command_key_order(self, mock_g):
|
||||||
"""Test that they keys in the YAML have the same order as export_fields"""
|
"""Test that they keys in the YAML have the same order as export_fields"""
|
||||||
mock_g.user = security_manager.find_user("admin")
|
mock_g.user = security_manager.find_user("admin")
|
||||||
|
|
||||||
example_db = get_example_database()
|
example_db = get_example_database()
|
||||||
example_dataset = example_db.tables[0]
|
example_dataset = _get_table_from_list_by_name(
|
||||||
|
"energy_usage", example_db.tables
|
||||||
|
)
|
||||||
command = ExportDatasetsCommand([example_dataset.id])
|
command = ExportDatasetsCommand([example_dataset.id])
|
||||||
contents = dict(command.run())
|
contents = dict(command.run())
|
||||||
|
|
||||||
|
@ -454,3 +462,10 @@ class TestImportDatasetsCommand(SupersetTestCase):
|
||||||
db.session.delete(database.tables[0])
|
db.session.delete(database.tables[0])
|
||||||
db.session.delete(database)
|
db.session.delete(database)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
|
||||||
|
def _get_table_from_list_by_name(name: str, tables: List[Any]):
|
||||||
|
for table in tables:
|
||||||
|
if table.table_name == name:
|
||||||
|
return table
|
||||||
|
raise ValueError(f"Table {name} does not exists in database")
|
||||||
|
|
|
@ -17,17 +17,19 @@
|
||||||
import datetime
|
import datetime
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
from superset.db_engine_specs import engines
|
from superset.db_engine_specs import engines
|
||||||
from superset.db_engine_specs.base import BaseEngineSpec, builtin_time_grains
|
from superset.db_engine_specs.base import BaseEngineSpec, builtin_time_grains
|
||||||
from superset.db_engine_specs.sqlite import SqliteEngineSpec
|
from superset.db_engine_specs.sqlite import SqliteEngineSpec
|
||||||
from superset.sql_parse import ParsedQuery
|
from superset.sql_parse import ParsedQuery
|
||||||
from superset.utils.core import get_example_database
|
from superset.utils.core import get_example_database
|
||||||
from tests.db_engine_specs.base_tests import TestDbEngineSpec
|
from tests.db_engine_specs.base_tests import TestDbEngineSpec
|
||||||
|
from tests.test_app import app
|
||||||
|
|
||||||
|
from ..fixtures.energy_dashboard import load_energy_table_with_slice
|
||||||
from ..fixtures.pyodbcRow import Row
|
from ..fixtures.pyodbcRow import Row
|
||||||
|
|
||||||
from tests.test_app import app # isort:skip
|
|
||||||
|
|
||||||
|
|
||||||
class TestDbEngineSpecs(TestDbEngineSpec):
|
class TestDbEngineSpecs(TestDbEngineSpec):
|
||||||
def test_extract_limit_from_query(self, engine_spec_class=BaseEngineSpec):
|
def test_extract_limit_from_query(self, engine_spec_class=BaseEngineSpec):
|
||||||
|
@ -194,6 +196,7 @@ class TestDbEngineSpecs(TestDbEngineSpec):
|
||||||
)
|
)
|
||||||
self.assertListEqual(base_result_expected, base_result)
|
self.assertListEqual(base_result_expected, base_result)
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||||
def test_column_datatype_to_string(self):
|
def test_column_datatype_to_string(self):
|
||||||
example_db = get_example_database()
|
example_db = get_example_database()
|
||||||
sqla_table = example_db.get_table("energy_usage")
|
sqla_table = example_db.get_table("energy_usage")
|
||||||
|
|
|
@ -0,0 +1,173 @@
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
# or more contributor license agreements. See the NOTICE file
|
||||||
|
# distributed with this work for additional information
|
||||||
|
# regarding copyright ownership. The ASF licenses this file
|
||||||
|
# to you under the Apache License, Version 2.0 (the
|
||||||
|
# "License"); you may not use this file except in compliance
|
||||||
|
# with the License. You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing,
|
||||||
|
# software distributed under the License is distributed on an
|
||||||
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
# KIND, either express or implied. See the License for the
|
||||||
|
# specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
import random
|
||||||
|
import textwrap
|
||||||
|
from typing import Dict, Set
|
||||||
|
|
||||||
|
import pandas as pd
|
||||||
|
import pytest
|
||||||
|
from pandas import DataFrame
|
||||||
|
from sqlalchemy import column, Float, String
|
||||||
|
|
||||||
|
from superset import db
|
||||||
|
from superset.connectors.sqla.models import SqlaTable, SqlMetric
|
||||||
|
from superset.models.dashboard import Dashboard
|
||||||
|
from superset.models.slice import Slice
|
||||||
|
from superset.utils.core import get_example_database
|
||||||
|
from tests.dashboard_utils import create_slice, create_table_for_dashboard
|
||||||
|
from tests.test_app import app
|
||||||
|
|
||||||
|
misc_dash_slices: Set[str] = set()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture()
|
||||||
|
def load_energy_table_with_slice():
|
||||||
|
table_name = "energy_usage"
|
||||||
|
df = _get_dataframe()
|
||||||
|
with app.app_context():
|
||||||
|
_create_energy_table(df, table_name)
|
||||||
|
yield
|
||||||
|
_cleanup()
|
||||||
|
|
||||||
|
|
||||||
|
def _get_dataframe():
|
||||||
|
data = _get_energy_data()
|
||||||
|
return pd.DataFrame.from_dict(data)
|
||||||
|
|
||||||
|
|
||||||
|
def _create_energy_table(df: DataFrame, table_name: str):
|
||||||
|
database = get_example_database()
|
||||||
|
|
||||||
|
table_description = "Energy consumption"
|
||||||
|
schema = {"source": String(255), "target": String(255), "value": Float()}
|
||||||
|
table = create_table_for_dashboard(
|
||||||
|
df, table_name, database, schema, table_description
|
||||||
|
)
|
||||||
|
table.fetch_metadata()
|
||||||
|
|
||||||
|
if not any(col.metric_name == "sum__value" for col in table.metrics):
|
||||||
|
col = str(column("value").compile(db.engine))
|
||||||
|
table.metrics.append(
|
||||||
|
SqlMetric(metric_name="sum__value", expression=f"SUM({col})")
|
||||||
|
)
|
||||||
|
|
||||||
|
db.session.merge(table)
|
||||||
|
db.session.commit()
|
||||||
|
table.fetch_metadata()
|
||||||
|
|
||||||
|
for slice_data in _get_energy_slices():
|
||||||
|
_create_and_commit_energy_slice(
|
||||||
|
table,
|
||||||
|
slice_data["slice_title"],
|
||||||
|
slice_data["viz_type"],
|
||||||
|
slice_data["params"],
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _create_and_commit_energy_slice(
|
||||||
|
table: SqlaTable, title: str, viz_type: str, param: Dict[str, str]
|
||||||
|
):
|
||||||
|
slice = create_slice(title, viz_type, table, param)
|
||||||
|
existing_slice = (
|
||||||
|
db.session.query(Slice).filter_by(slice_name=slice.slice_name).first()
|
||||||
|
)
|
||||||
|
if existing_slice:
|
||||||
|
db.session.delete(existing_slice)
|
||||||
|
db.session.add(slice)
|
||||||
|
db.session.commit()
|
||||||
|
return slice
|
||||||
|
|
||||||
|
|
||||||
|
def _cleanup() -> None:
|
||||||
|
engine = get_example_database().get_sqla_engine()
|
||||||
|
engine.execute("DROP TABLE IF EXISTS energy_usage")
|
||||||
|
for slice_data in _get_energy_slices():
|
||||||
|
slice = (
|
||||||
|
db.session.query(Slice)
|
||||||
|
.filter_by(slice_name=slice_data["slice_title"])
|
||||||
|
.first()
|
||||||
|
)
|
||||||
|
db.session.delete(slice)
|
||||||
|
|
||||||
|
metric = (
|
||||||
|
db.session.query(SqlMetric).filter_by(metric_name="sum__value").one_or_none()
|
||||||
|
)
|
||||||
|
if metric:
|
||||||
|
db.session.delete(metric)
|
||||||
|
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
|
||||||
|
def _get_energy_data():
|
||||||
|
data = []
|
||||||
|
for i in range(85):
|
||||||
|
data.append(
|
||||||
|
{
|
||||||
|
"source": f"energy_source{i}",
|
||||||
|
"target": f"energy_target{i}",
|
||||||
|
"value": random.uniform(0.1, 11.0),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
def _get_energy_slices():
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
"slice_title": "Energy Sankey",
|
||||||
|
"viz_type": "sankey",
|
||||||
|
"params": {
|
||||||
|
"collapsed_fieldsets": "",
|
||||||
|
"groupby": ["source", "target"],
|
||||||
|
"metric": "sum__value",
|
||||||
|
"row_limit": "5000",
|
||||||
|
"slice_name": "Energy Sankey",
|
||||||
|
"viz_type": "sankey",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slice_title": "Energy Force Layout",
|
||||||
|
"viz_type": "directed_force",
|
||||||
|
"params": {
|
||||||
|
"charge": "-500",
|
||||||
|
"collapsed_fieldsets": "",
|
||||||
|
"groupby": ["source", "target"],
|
||||||
|
"link_length": "200",
|
||||||
|
"metric": "sum__value",
|
||||||
|
"row_limit": "5000",
|
||||||
|
"slice_name": "Force",
|
||||||
|
"viz_type": "directed_force",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slice_title": "Heatmap",
|
||||||
|
"viz_type": "heatmap",
|
||||||
|
"params": {
|
||||||
|
"all_columns_x": "source",
|
||||||
|
"all_columns_y": "target",
|
||||||
|
"canvas_image_rendering": "pixelated",
|
||||||
|
"collapsed_fieldsets": "",
|
||||||
|
"linear_color_scheme": "blue_white_yellow",
|
||||||
|
"metric": "sum__value",
|
||||||
|
"normalize_across": "heatmap",
|
||||||
|
"slice_name": "Heatmap",
|
||||||
|
"viz_type": "heatmap",
|
||||||
|
"xscale_interval": "1",
|
||||||
|
"yscale_interval": "1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
|
@ -19,9 +19,11 @@
|
||||||
import json
|
import json
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
|
import pytest
|
||||||
from flask import g
|
from flask import g
|
||||||
from sqlalchemy.orm.session import make_transient
|
from sqlalchemy.orm.session import make_transient
|
||||||
|
|
||||||
|
from tests.fixtures.energy_dashboard import load_energy_table_with_slice
|
||||||
from tests.test_app import app
|
from tests.test_app import app
|
||||||
from superset.dashboards.commands.importers.v0 import decode_dashboards
|
from superset.dashboards.commands.importers.v0 import decode_dashboards
|
||||||
from superset import db, security_manager
|
from superset import db, security_manager
|
||||||
|
@ -399,6 +401,7 @@ class TestImportExport(SupersetTestCase):
|
||||||
meta["chartId"] = imported_dash.slices[0].id
|
meta["chartId"] = imported_dash.slices[0].id
|
||||||
self.assertEqual(expected_position, imported_dash.position)
|
self.assertEqual(expected_position, imported_dash.position)
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||||
def test_import_dashboard_2_slices(self):
|
def test_import_dashboard_2_slices(self):
|
||||||
e_slc = self.create_slice("e_slc", id=10007, table_name="energy_usage")
|
e_slc = self.create_slice("e_slc", id=10007, table_name="energy_usage")
|
||||||
b_slc = self.create_slice("b_slc", id=10008, table_name="birth_names")
|
b_slc = self.create_slice("b_slc", id=10008, table_name="birth_names")
|
||||||
|
@ -450,6 +453,7 @@ class TestImportExport(SupersetTestCase):
|
||||||
expected_json_metadata, json.loads(imported_dash.json_metadata)
|
expected_json_metadata, json.loads(imported_dash.json_metadata)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||||
def test_import_override_dashboard_2_slices(self):
|
def test_import_override_dashboard_2_slices(self):
|
||||||
e_slc = self.create_slice("e_slc", id=10009, table_name="energy_usage")
|
e_slc = self.create_slice("e_slc", id=10009, table_name="energy_usage")
|
||||||
b_slc = self.create_slice("b_slc", id=10010, table_name="birth_names")
|
b_slc = self.create_slice("b_slc", id=10010, table_name="birth_names")
|
||||||
|
|
|
@ -19,6 +19,7 @@ import textwrap
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
import pandas
|
import pandas
|
||||||
|
import pytest
|
||||||
from sqlalchemy.engine.url import make_url
|
from sqlalchemy.engine.url import make_url
|
||||||
|
|
||||||
import tests.test_app
|
import tests.test_app
|
||||||
|
@ -28,6 +29,7 @@ from superset.models.slice import Slice
|
||||||
from superset.utils.core import get_example_database, QueryStatus
|
from superset.utils.core import get_example_database, QueryStatus
|
||||||
|
|
||||||
from .base_tests import SupersetTestCase
|
from .base_tests import SupersetTestCase
|
||||||
|
from .fixtures.energy_dashboard import load_energy_table_with_slice
|
||||||
|
|
||||||
|
|
||||||
class TestDatabaseModel(SupersetTestCase):
|
class TestDatabaseModel(SupersetTestCase):
|
||||||
|
@ -107,6 +109,7 @@ class TestDatabaseModel(SupersetTestCase):
|
||||||
user_name = make_url(model.get_sqla_engine(user_name=example_user).url).username
|
user_name = make_url(model.get_sqla_engine(user_name=example_user).url).username
|
||||||
self.assertNotEqual(example_user, user_name)
|
self.assertNotEqual(example_user, user_name)
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||||
def test_select_star(self):
|
def test_select_star(self):
|
||||||
db = get_example_database()
|
db = get_example_database()
|
||||||
table_name = "energy_usage"
|
table_name = "energy_usage"
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
# KIND, either express or implied. See the License for the
|
# KIND, either express or implied. See the License for the
|
||||||
# specific language governing permissions and limitations
|
# specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
import pytest
|
||||||
|
|
||||||
import tests.test_app
|
import tests.test_app
|
||||||
from superset import db
|
from superset import db
|
||||||
from superset.charts.schemas import ChartDataQueryContextSchema
|
from superset.charts.schemas import ChartDataQueryContextSchema
|
||||||
|
@ -27,6 +29,7 @@ from superset.utils.core import (
|
||||||
TimeRangeEndpoint,
|
TimeRangeEndpoint,
|
||||||
)
|
)
|
||||||
from tests.base_tests import SupersetTestCase
|
from tests.base_tests import SupersetTestCase
|
||||||
|
from tests.fixtures.energy_dashboard import load_energy_table_with_slice
|
||||||
from tests.fixtures.query_context import get_query_context
|
from tests.fixtures.query_context import get_query_context
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,7 @@ from .dashboard_utils import (
|
||||||
create_slice,
|
create_slice,
|
||||||
create_dashboard,
|
create_dashboard,
|
||||||
)
|
)
|
||||||
|
from .fixtures.energy_dashboard import load_energy_table_with_slice
|
||||||
from .fixtures.unicode_dashboard import load_unicode_dashboard_with_slice
|
from .fixtures.unicode_dashboard import load_unicode_dashboard_with_slice
|
||||||
|
|
||||||
NEW_SECURITY_CONVERGE_VIEWS = ("CssTemplate", "SavedQuery")
|
NEW_SECURITY_CONVERGE_VIEWS = ("CssTemplate", "SavedQuery")
|
||||||
|
@ -1128,6 +1129,7 @@ class TestRowLevelSecurity(SupersetTestCase):
|
||||||
session.delete(self.get_user("NoRlsRoleUser"))
|
session.delete(self.get_user("NoRlsRoleUser"))
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||||
def test_rls_filter_alters_energy_query(self):
|
def test_rls_filter_alters_energy_query(self):
|
||||||
g.user = self.get_user(username="alpha")
|
g.user = self.get_user(username="alpha")
|
||||||
tbl = self.get_table_by_name("energy_usage")
|
tbl = self.get_table_by_name("energy_usage")
|
||||||
|
@ -1135,6 +1137,7 @@ class TestRowLevelSecurity(SupersetTestCase):
|
||||||
assert tbl.get_extra_cache_keys(self.query_obj) == [1]
|
assert tbl.get_extra_cache_keys(self.query_obj) == [1]
|
||||||
assert "value > 1" in sql
|
assert "value > 1" in sql
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||||
def test_rls_filter_doesnt_alter_energy_query(self):
|
def test_rls_filter_doesnt_alter_energy_query(self):
|
||||||
g.user = self.get_user(
|
g.user = self.get_user(
|
||||||
username="admin"
|
username="admin"
|
||||||
|
|
Loading…
Reference in New Issue