This is an automated email from the ASF dual-hosted git repository.
yjc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new 2cb4fd31f1 refactor(test): add login_as_admin in global conftest
(#20703)
2cb4fd31f1 is described below
commit 2cb4fd31f1c350d200e64bd17a651f32eb1e809b
Author: Jesse Yang <[email protected]>
AuthorDate: Thu Jul 14 18:10:31 2022 -0700
refactor(test): add login_as_admin in global conftest (#20703)
---
superset/examples/birth_names.py | 3 +
superset/views/core.py | 2 +
.../advanced_data_type/api_tests.py | 18 +-
tests/integration_tests/base_tests.py | 17 +-
tests/integration_tests/cachekeys/api_tests.py | 28 +--
tests/integration_tests/celery_tests.py | 87 ++++----
tests/integration_tests/charts/api_tests.py | 20 +-
tests/integration_tests/conftest.py | 34 ++-
tests/integration_tests/core_tests.py | 12 +-
tests/integration_tests/csv_upload_tests.py | 52 +++--
tests/integration_tests/dashboard_tests.py | 23 ++-
.../dashboards/filter_sets/create_api_tests.py | 9 +-
.../dashboards/filter_sets/delete_api_tests.py | 2 +-
.../dashboards/filter_sets/get_api_tests.py | 2 +-
.../dashboards/filter_sets/update_api_tests.py | 2 +-
.../dashboards/filter_state/api_tests.py | 227 +++++++++++----------
.../dashboards/permalink/api_tests.py | 36 ++--
.../db_engine_specs/base_engine_spec_tests.py | 8 +-
.../db_engine_specs/bigquery_tests.py | 4 +-
tests/integration_tests/explore/api_tests.py | 53 +++--
.../explore/form_data/api_tests.py | 174 ++++++++--------
.../explore/permalink/api_tests.py | 45 ++--
.../fixtures/birth_names_dashboard.py | 30 +--
tests/integration_tests/import_export_tests.py | 46 ++---
tests/integration_tests/query_context_tests.py | 2 +-
tests/integration_tests/sqllab_tests.py | 1 +
tests/integration_tests/test_app.py | 17 +-
27 files changed, 497 insertions(+), 457 deletions(-)
diff --git a/superset/examples/birth_names.py b/superset/examples/birth_names.py
index 6b37fe9d08..b86f7a25c6 100644
--- a/superset/examples/birth_names.py
+++ b/superset/examples/birth_names.py
@@ -160,6 +160,9 @@ def _add_table_metrics(datasource: SqlaTable) -> None:
col.is_dttm = True
break
+ datasource.columns = columns
+ datasource.metrics = metrics
+
def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice],
List[Slice]]:
metrics = [
diff --git a/superset/views/core.py b/superset/views/core.py
index 2985350110..0598c72446 100755
--- a/superset/views/core.py
+++ b/superset/views/core.py
@@ -1979,6 +1979,8 @@ class Superset(BaseSupersetView): # pylint:
disable=too-many-public-methods
return self.render_template(
"superset/spa.html",
entry="spa",
+ # dashboard title is always visible
+ title=dashboard.dashboard_title,
bootstrap_data=json.dumps(
bootstrap_data, default=utils.pessimistic_json_iso_dttm_ser
),
diff --git a/tests/integration_tests/advanced_data_type/api_tests.py
b/tests/integration_tests/advanced_data_type/api_tests.py
index 7daa5f0067..5bfe308e16 100644
--- a/tests/integration_tests/advanced_data_type/api_tests.py
+++ b/tests/integration_tests/advanced_data_type/api_tests.py
@@ -18,17 +18,9 @@
"""Unit tests for Superset"""
import json
import prison
-from sqlalchemy import null
-from superset.connectors.sqla.models import SqlaTable
from superset.utils.core import get_example_default_schema
-from tests.integration_tests.base_tests import (
- SupersetTestCase,
- logged_in_admin,
- test_client,
-)
-from tests.integration_tests.test_app import app
from tests.integration_tests.utils.get_dashboards import get_dashboards_ids
from unittest import mock
from sqlalchemy import Column
@@ -80,7 +72,7 @@ CHARTS_FIXTURE_COUNT = 10
"superset.advanced_data_type.api.ADVANCED_DATA_TYPES",
{"type": 1},
)
-def test_types_type_request(logged_in_admin):
+def test_types_type_request(test_client, login_as_admin):
"""
Advanced Data Type API: Test to see if the API call returns all the valid
advanced data types
"""
@@ -91,7 +83,7 @@ def test_types_type_request(logged_in_admin):
assert data == {"result": ["type"]}
-def test_types_convert_bad_request_no_vals(logged_in_admin):
+def test_types_convert_bad_request_no_vals(test_client, login_as_admin):
"""
Advanced Data Type API: Test request to see if it behaves as expected when
no values are passed
"""
@@ -101,7 +93,7 @@ def test_types_convert_bad_request_no_vals(logged_in_admin):
assert response_value.status_code == 400
-def test_types_convert_bad_request_no_type(logged_in_admin):
+def test_types_convert_bad_request_no_type(test_client, login_as_admin):
"""
Advanced Data Type API: Test request to see if it behaves as expected when
no type is passed
"""
@@ -115,7 +107,7 @@ def test_types_convert_bad_request_no_type(logged_in_admin):
"superset.advanced_data_type.api.ADVANCED_DATA_TYPES",
{"type": 1},
)
-def test_types_convert_bad_request_type_not_found(logged_in_admin):
+def test_types_convert_bad_request_type_not_found(test_client, login_as_admin):
"""
Advanced Data Type API: Test request to see if it behaves as expected when
passed in type is
not found/not valid
@@ -130,7 +122,7 @@ def
test_types_convert_bad_request_type_not_found(logged_in_admin):
"superset.advanced_data_type.api.ADVANCED_DATA_TYPES",
{"type": test_type},
)
-def test_types_convert_request(logged_in_admin):
+def test_types_convert_request(test_client, login_as_admin):
"""
Advanced Data Type API: Test request to see if it behaves as expected when
a valid type
and valid values are passed in
diff --git a/tests/integration_tests/base_tests.py
b/tests/integration_tests/base_tests.py
index 280d58774a..ee9eee299a 100644
--- a/tests/integration_tests/base_tests.py
+++ b/tests/integration_tests/base_tests.py
@@ -24,7 +24,6 @@ from typing import Any, Dict, Union, List, Optional
from unittest.mock import Mock, patch, MagicMock
import pandas as pd
-import pytest
from flask import Response
from flask_appbuilder.security.sqla import models as ab_models
from flask_testing import TestCase
@@ -34,7 +33,7 @@ from sqlalchemy.orm import Session
from sqlalchemy.sql import func
from sqlalchemy.dialects.mysql import dialect
-from tests.integration_tests.test_app import app
+from tests.integration_tests.test_app import app, login
from superset.sql_parse import CtasMethod
from superset import db, security_manager
from superset.connectors.base.models import BaseDatasource
@@ -52,11 +51,6 @@ FAKE_DB_NAME = "fake_db_100"
test_client = app.test_client()
-def login(client: Any, username: str = "admin", password: str = "general"):
- resp = get_resp(client, "/login/", data=dict(username=username,
password=password))
- assert "User confirmation needed" not in resp
-
-
def get_resp(
client: Any,
url: str,
@@ -101,15 +95,6 @@ def post_assert_metric(
return rv
[email protected]
-def logged_in_admin():
- """Fixture with app context and logged in admin user."""
- with app.app_context():
- login(test_client, username="admin")
- yield
- test_client.get("/logout/", follow_redirects=True)
-
-
class SupersetTestCase(TestCase):
default_schema_backend_map = {
"sqlite": "main",
diff --git a/tests/integration_tests/cachekeys/api_tests.py
b/tests/integration_tests/cachekeys/api_tests.py
index e994380e9d..d3552bfc8d 100644
--- a/tests/integration_tests/cachekeys/api_tests.py
+++ b/tests/integration_tests/cachekeys/api_tests.py
@@ -18,7 +18,7 @@
"""Unit tests for Superset"""
from typing import Dict, Any
-from tests.integration_tests.test_app import app # noqa
+import pytest
from superset.extensions import cache_manager, db
from superset.models.cache import CacheKey
@@ -26,23 +26,25 @@ from superset.utils.core import get_example_default_schema
from tests.integration_tests.base_tests import (
SupersetTestCase,
post_assert_metric,
- test_client,
- logged_in_admin,
-) # noqa
+)
-def invalidate(params: Dict[str, Any]):
- return post_assert_metric(
- test_client, "api/v1/cachekey/invalidate", params, "invalidate"
- )
[email protected]
+def invalidate(test_client, login_as_admin):
+ def _invalidate(params: Dict[str, Any]):
+ return post_assert_metric(
+ test_client, "api/v1/cachekey/invalidate", params, "invalidate"
+ )
+
+ return _invalidate
-def test_invalidate_cache(logged_in_admin):
+def test_invalidate_cache(invalidate):
rv = invalidate({"datasource_uids": ["3__table"]})
assert rv.status_code == 201
-def test_invalidate_existing_cache(logged_in_admin):
+def test_invalidate_existing_cache(invalidate):
db.session.add(CacheKey(cache_key="cache_key", datasource_uid="3__table"))
db.session.commit()
cache_manager.cache.set("cache_key", "value")
@@ -56,7 +58,7 @@ def test_invalidate_existing_cache(logged_in_admin):
)
-def test_invalidate_cache_empty_input(logged_in_admin):
+def test_invalidate_cache_empty_input(invalidate):
rv = invalidate({"datasource_uids": []})
assert rv.status_code == 201
@@ -67,7 +69,7 @@ def test_invalidate_cache_empty_input(logged_in_admin):
assert rv.status_code == 201
-def test_invalidate_cache_bad_request(logged_in_admin):
+def test_invalidate_cache_bad_request(invalidate):
rv = invalidate(
{
"datasource_uids": [],
@@ -93,7 +95,7 @@ def test_invalidate_cache_bad_request(logged_in_admin):
assert rv.status_code == 400
-def test_invalidate_existing_caches(logged_in_admin):
+def test_invalidate_existing_caches(invalidate):
schema = get_example_default_schema() or ""
bn = SupersetTestCase.get_birth_names_dataset()
diff --git a/tests/integration_tests/celery_tests.py
b/tests/integration_tests/celery_tests.py
index 9a9447640f..f057d3128e 100644
--- a/tests/integration_tests/celery_tests.py
+++ b/tests/integration_tests/celery_tests.py
@@ -17,7 +17,6 @@
# isort:skip_file
"""Unit tests for Superset Celery worker"""
import datetime
-import json
import random
import string
import time
@@ -33,9 +32,6 @@ import pytest
import flask
from flask import current_app
-from tests.integration_tests.base_tests import login
-from tests.integration_tests.conftest import CTAS_SCHEMA_NAME
-from tests.integration_tests.test_app import app
from superset import db, sql_lab
from superset.common.db_query_status import QueryStatus
from superset.result_set import SupersetResultSet
@@ -46,6 +42,8 @@ from superset.models.sql_lab import Query
from superset.sql_parse import ParsedQuery, CtasMethod
from superset.utils.core import backend
from superset.utils.database import get_example_database
+from tests.integration_tests.conftest import CTAS_SCHEMA_NAME
+from tests.integration_tests.test_app import app
CELERY_SLEEP_TIME = 6
QUERY = "SELECT name FROM birth_names LIMIT 1"
@@ -63,9 +61,6 @@ TMP_TABLES = [
]
-test_client = app.test_client()
-
-
def get_query_by_id(id: int):
db.session.commit()
query = db.session.query(Query).filter_by(id=id).first()
@@ -74,10 +69,10 @@ def get_query_by_id(id: int):
@pytest.fixture(autouse=True, scope="module")
def setup_sqllab():
-
+ yield
+ # clean up after all tests are done
+ # use a new app context
with app.app_context():
- yield
-
db.session.query(Query).delete()
db.session.commit()
for tbl in TMP_TABLES:
@@ -92,11 +87,15 @@ def setup_sqllab():
def run_sql(
- sql, cta=False, ctas_method=CtasMethod.TABLE, tmp_table="tmp", async_=False
+ test_client,
+ sql,
+ cta=False,
+ ctas_method=CtasMethod.TABLE,
+ tmp_table="tmp",
+ async_=False,
):
- login(test_client, username="admin")
db_id = get_example_database().id
- resp = test_client.post(
+ return test_client.post(
"/superset/sql_json/",
json=dict(
database_id=db_id,
@@ -107,9 +106,7 @@ def run_sql(
client_id="".join(random.choice(string.ascii_lowercase) for i in
range(5)),
ctas_method=ctas_method,
),
- )
- test_client.get("/logout/", follow_redirects=True)
- return json.loads(resp.data)
+ ).json
def drop_table_if_exists(table_name: str, table_type: CtasMethod) -> None:
@@ -144,12 +141,13 @@ def get_select_star(table: str, limit: int, schema:
Optional[str] = None):
return f"SELECT *\nFROM {table}\nLIMIT {limit}"
[email protected]("login_as_admin")
@pytest.mark.parametrize("ctas_method", [CtasMethod.TABLE, CtasMethod.VIEW])
-def test_run_sync_query_dont_exist(setup_sqllab, ctas_method):
+def test_run_sync_query_dont_exist(test_client, ctas_method):
examples_db = get_example_database()
engine_name = examples_db.db_engine_spec.engine_name
sql_dont_exist = "SELECT name FROM table_dont_exist"
- result = run_sql(sql_dont_exist, cta=True, ctas_method=ctas_method)
+ result = run_sql(test_client, sql_dont_exist, cta=True,
ctas_method=ctas_method)
if backend() == "sqlite" and ctas_method == CtasMethod.VIEW:
assert QueryStatus.SUCCESS == result["status"], result
elif backend() == "presto":
@@ -188,27 +186,29 @@ def test_run_sync_query_dont_exist(setup_sqllab,
ctas_method):
}
[email protected]("load_birth_names_dashboard_with_slices")
[email protected]("load_birth_names_dashboard_with_slices",
"login_as_admin")
@pytest.mark.parametrize("ctas_method", [CtasMethod.TABLE, CtasMethod.VIEW])
-def test_run_sync_query_cta(setup_sqllab, ctas_method):
+def test_run_sync_query_cta(test_client, ctas_method):
tmp_table_name = f"{TEST_SYNC}_{ctas_method.lower()}"
- result = run_sql(QUERY, tmp_table=tmp_table_name, cta=True,
ctas_method=ctas_method)
+ result = run_sql(
+ test_client, QUERY, tmp_table=tmp_table_name, cta=True,
ctas_method=ctas_method
+ )
assert QueryStatus.SUCCESS == result["query"]["state"], result
assert cta_result(ctas_method) == (result["data"], result["columns"])
# Check the data in the tmp table.
select_query = get_query_by_id(result["query"]["serverId"])
- results = run_sql(select_query.select_sql)
+ results = run_sql(test_client, select_query.select_sql)
assert QueryStatus.SUCCESS == results["status"], results
assert len(results["data"]) > 0
delete_tmp_view_or_table(tmp_table_name, ctas_method)
[email protected]("load_birth_names_dashboard_with_slices")
-def test_run_sync_query_cta_no_data(setup_sqllab):
[email protected]("load_birth_names_dashboard_with_slices",
"login_as_admin")
+def test_run_sync_query_cta_no_data(test_client):
sql_empty_result = "SELECT * FROM birth_names WHERE name='random'"
- result = run_sql(sql_empty_result)
+ result = run_sql(test_client, sql_empty_result)
assert QueryStatus.SUCCESS == result["query"]["state"]
assert ([], []) == (result["data"], result["columns"])
@@ -216,18 +216,20 @@ def test_run_sync_query_cta_no_data(setup_sqllab):
assert QueryStatus.SUCCESS == query.status
[email protected]("load_birth_names_dashboard_with_slices")
[email protected]("load_birth_names_dashboard_with_slices",
"login_as_admin")
@pytest.mark.parametrize("ctas_method", [CtasMethod.TABLE, CtasMethod.VIEW])
@mock.patch(
"superset.sqllab.sqllab_execution_context.get_cta_schema_name",
lambda d, u, s, sql: CTAS_SCHEMA_NAME,
)
-def test_run_sync_query_cta_config(setup_sqllab, ctas_method):
+def test_run_sync_query_cta_config(test_client, ctas_method):
if backend() == "sqlite":
# sqlite doesn't support schemas
return
tmp_table_name = f"{TEST_SYNC_CTA}_{ctas_method.lower()}"
- result = run_sql(QUERY, cta=True, ctas_method=ctas_method,
tmp_table=tmp_table_name)
+ result = run_sql(
+ test_client, QUERY, cta=True, ctas_method=ctas_method,
tmp_table=tmp_table_name
+ )
assert QueryStatus.SUCCESS == result["query"]["state"], result
assert cta_result(ctas_method) == (result["data"], result["columns"])
@@ -239,24 +241,25 @@ def test_run_sync_query_cta_config(setup_sqllab,
ctas_method):
assert query.select_sql == get_select_star(
tmp_table_name, limit=query.limit, schema=CTAS_SCHEMA_NAME
)
- results = run_sql(query.select_sql)
+ results = run_sql(test_client, query.select_sql)
assert QueryStatus.SUCCESS == results["status"], result
delete_tmp_view_or_table(f"{CTAS_SCHEMA_NAME}.{tmp_table_name}",
ctas_method)
[email protected]("load_birth_names_dashboard_with_slices")
[email protected]("load_birth_names_dashboard_with_slices",
"login_as_admin")
@pytest.mark.parametrize("ctas_method", [CtasMethod.TABLE, CtasMethod.VIEW])
@mock.patch(
"superset.sqllab.sqllab_execution_context.get_cta_schema_name",
lambda d, u, s, sql: CTAS_SCHEMA_NAME,
)
-def test_run_async_query_cta_config(setup_sqllab, ctas_method):
+def test_run_async_query_cta_config(test_client, ctas_method):
if backend() in {"sqlite", "mysql"}:
# sqlite doesn't support schemas, mysql is flaky
return
tmp_table_name = f"{TEST_ASYNC_CTA_CONFIG}_{ctas_method.lower()}"
result = run_sql(
+ test_client,
QUERY,
cta=True,
ctas_method=ctas_method,
@@ -279,16 +282,21 @@ def test_run_async_query_cta_config(setup_sqllab,
ctas_method):
delete_tmp_view_or_table(f"{CTAS_SCHEMA_NAME}.{tmp_table_name}",
ctas_method)
[email protected]("load_birth_names_dashboard_with_slices")
[email protected]("load_birth_names_dashboard_with_slices",
"login_as_admin")
@pytest.mark.parametrize("ctas_method", [CtasMethod.TABLE, CtasMethod.VIEW])
-def test_run_async_cta_query(setup_sqllab, ctas_method):
+def test_run_async_cta_query(test_client, ctas_method):
if backend() == "mysql":
# failing
return
table_name = f"{TEST_ASYNC_CTA}_{ctas_method.lower()}"
result = run_sql(
- QUERY, cta=True, ctas_method=ctas_method, async_=True,
tmp_table=table_name
+ test_client,
+ QUERY,
+ cta=True,
+ ctas_method=ctas_method,
+ async_=True,
+ tmp_table=table_name,
)
query = wait_for_success(result)
@@ -305,16 +313,21 @@ def test_run_async_cta_query(setup_sqllab, ctas_method):
delete_tmp_view_or_table(table_name, ctas_method)
[email protected]("load_birth_names_dashboard_with_slices")
[email protected]("load_birth_names_dashboard_with_slices",
"login_as_admin")
@pytest.mark.parametrize("ctas_method", [CtasMethod.TABLE, CtasMethod.VIEW])
-def test_run_async_cta_query_with_lower_limit(setup_sqllab, ctas_method):
+def test_run_async_cta_query_with_lower_limit(test_client, ctas_method):
if backend() == "mysql":
# failing
return
tmp_table = f"{TEST_ASYNC_LOWER_LIMIT}_{ctas_method.lower()}"
result = run_sql(
- QUERY, cta=True, ctas_method=ctas_method, async_=True,
tmp_table=tmp_table
+ test_client,
+ QUERY,
+ cta=True,
+ ctas_method=ctas_method,
+ async_=True,
+ tmp_table=tmp_table,
)
query = wait_for_success(result)
assert QueryStatus.SUCCESS == query.status
diff --git a/tests/integration_tests/charts/api_tests.py
b/tests/integration_tests/charts/api_tests.py
index a37acf6eaf..b935579a00 100644
--- a/tests/integration_tests/charts/api_tests.py
+++ b/tests/integration_tests/charts/api_tests.py
@@ -933,15 +933,27 @@ class TestChartApi(SupersetTestCase,
ApiOwnersTestCaseMixin, InsertChartMixin):
}
],
"keys": ["none"],
- "columns": ["slice_name"],
+ "columns": ["slice_name", "description", "table.table_name"],
}
self.login(username="admin")
uri = f"api/v1/chart/?q={prison.dumps(arguments)}"
rv = self.get_assert_metric(uri, "get_list")
- self.assertEqual(rv.status_code, 200)
- data = json.loads(rv.data.decode("utf-8"))
- self.assertEqual(data["count"], 8)
+ data = rv.json
+ assert rv.status_code == 200
+ assert data["count"] > 0
+ for chart in data["result"]:
+ print(chart)
+ assert (
+ "energy"
+ in " ".join(
+ [
+ chart["slice_name"] or "",
+ chart["description"] or "",
+ chart["table"]["table_name"] or "",
+ ]
+ ).lower()
+ )
@pytest.mark.usefixtures("create_certified_charts")
def test_gets_certified_charts_filter(self):
diff --git a/tests/integration_tests/conftest.py
b/tests/integration_tests/conftest.py
index fee13c8950..ea46039d84 100644
--- a/tests/integration_tests/conftest.py
+++ b/tests/integration_tests/conftest.py
@@ -17,19 +17,22 @@
from __future__ import annotations
import functools
-from typing import Any, Callable, Generator, Optional, TYPE_CHECKING
+from typing import Any, Callable, Optional, TYPE_CHECKING
from unittest.mock import patch
import pytest
+from flask.ctx import AppContext
from sqlalchemy.engine import Engine
from superset import db
from superset.extensions import feature_flag_manager
from superset.utils.core import json_dumps_w_dates
from superset.utils.database import get_example_database, remove_database
-from tests.integration_tests.test_app import app
+from tests.integration_tests.test_app import app, login
if TYPE_CHECKING:
+ from flask.testing import FlaskClient
+
from superset.connectors.sqla.models import Database
CTAS_SCHEMA_NAME = "sqllab_test_db"
@@ -38,8 +41,31 @@ ADMIN_SCHEMA_NAME = "admin_database"
@pytest.fixture
def app_context():
- with app.app_context():
- yield
+ with app.app_context() as ctx:
+ yield ctx
+
+
[email protected]
+def test_client(app_context: AppContext):
+ with app.test_client() as client:
+ yield client
+
+
[email protected]
+def login_as(test_client: "FlaskClient[Any]"):
+ """Fixture with app context and logged in admin user."""
+
+ def _login_as(username: str, password: str = "general"):
+ login(test_client, username=username, password=password)
+
+ yield _login_as
+ # no need to log out as both app_context and test_client are
+ # function level fixtures anyway
+
+
[email protected]
+def login_as_admin(login_as: Callable[..., None]):
+ yield login_as("admin")
@pytest.fixture(autouse=True, scope="session")
diff --git a/tests/integration_tests/core_tests.py
b/tests/integration_tests/core_tests.py
index 276231f1ff..86f6df7b15 100644
--- a/tests/integration_tests/core_tests.py
+++ b/tests/integration_tests/core_tests.py
@@ -83,11 +83,17 @@ from tests.integration_tests.fixtures.world_bank_dashboard
import (
logger = logging.getLogger(__name__)
[email protected](scope="module")
+def cleanup():
+ db.session.query(Query).delete()
+ db.session.query(DatasourceAccessRequest).delete()
+ db.session.query(models.Log).delete()
+ db.session.commit()
+ yield
+
+
class TestCore(SupersetTestCase):
def setUp(self):
- db.session.query(Query).delete()
- db.session.query(DatasourceAccessRequest).delete()
- db.session.query(models.Log).delete()
self.table_ids = {
tbl.table_name: tbl.id for tbl in
(db.session.query(SqlaTable).all())
}
diff --git a/tests/integration_tests/csv_upload_tests.py
b/tests/integration_tests/csv_upload_tests.py
index c9bc11db98..6cd228b9cb 100644
--- a/tests/integration_tests/csv_upload_tests.py
+++ b/tests/integration_tests/csv_upload_tests.py
@@ -29,13 +29,12 @@ import pytest
import superset.utils.database
from superset.sql_parse import Table
-from superset import security_manager
-from tests.integration_tests.conftest import ADMIN_SCHEMA_NAME
-from tests.integration_tests.test_app import app # isort:skip
from superset import db
from superset.models.core import Database
from superset.utils import core as utils
-from tests.integration_tests.base_tests import get_resp, login,
SupersetTestCase
+from tests.integration_tests.test_app import app, login
+from tests.integration_tests.base_tests import get_resp
+
logger = logging.getLogger(__name__)
@@ -59,30 +58,27 @@ CSV_UPLOAD_TABLE_W_EXPLORE = "csv_upload_w_explore"
@pytest.fixture(scope="module")
-def setup_csv_upload():
- with app.app_context():
- login(test_client, username="admin")
-
- upload_db = superset.utils.database.get_or_create_db(
- CSV_UPLOAD_DATABASE, app.config["SQLALCHEMY_EXAMPLES_URI"]
- )
- extra = upload_db.get_extra()
- extra["explore_database_id"] =
superset.utils.database.get_example_database().id
- upload_db.extra = json.dumps(extra)
- upload_db.allow_file_upload = True
- db.session.commit()
-
- yield
-
- upload_db = get_upload_db()
- engine = upload_db.get_sqla_engine()
- engine.execute(f"DROP TABLE IF EXISTS {EXCEL_UPLOAD_TABLE}")
- engine.execute(f"DROP TABLE IF EXISTS {CSV_UPLOAD_TABLE}")
- engine.execute(f"DROP TABLE IF EXISTS {PARQUET_UPLOAD_TABLE}")
- engine.execute(f"DROP TABLE IF EXISTS {CSV_UPLOAD_TABLE_W_SCHEMA}")
- engine.execute(f"DROP TABLE IF EXISTS {CSV_UPLOAD_TABLE_W_EXPLORE}")
- db.session.delete(upload_db)
- db.session.commit()
+def setup_csv_upload(login_as_admin):
+ upload_db = superset.utils.database.get_or_create_db(
+ CSV_UPLOAD_DATABASE, app.config["SQLALCHEMY_EXAMPLES_URI"]
+ )
+ extra = upload_db.get_extra()
+ extra["explore_database_id"] =
superset.utils.database.get_example_database().id
+ upload_db.extra = json.dumps(extra)
+ upload_db.allow_file_upload = True
+ db.session.commit()
+
+ yield
+
+ upload_db = get_upload_db()
+ engine = upload_db.get_sqla_engine()
+ engine.execute(f"DROP TABLE IF EXISTS {EXCEL_UPLOAD_TABLE}")
+ engine.execute(f"DROP TABLE IF EXISTS {CSV_UPLOAD_TABLE}")
+ engine.execute(f"DROP TABLE IF EXISTS {PARQUET_UPLOAD_TABLE}")
+ engine.execute(f"DROP TABLE IF EXISTS {CSV_UPLOAD_TABLE_W_SCHEMA}")
+ engine.execute(f"DROP TABLE IF EXISTS {CSV_UPLOAD_TABLE_W_EXPLORE}")
+ db.session.delete(upload_db)
+ db.session.commit()
@pytest.fixture(scope="module")
diff --git a/tests/integration_tests/dashboard_tests.py
b/tests/integration_tests/dashboard_tests.py
index 3ad9b07e29..3432b0fc16 100644
--- a/tests/integration_tests/dashboard_tests.py
+++ b/tests/integration_tests/dashboard_tests.py
@@ -23,7 +23,7 @@ import unittest
from random import random
import pytest
-from flask import escape, url_for
+from flask import Response, escape, url_for
from sqlalchemy import func
from tests.integration_tests.test_app import app
@@ -125,13 +125,12 @@ class TestDashboard(SupersetTestCase):
positions[id] = d
return positions
- def test_dashboard(self):
+ def test_get_dashboard(self):
self.login(username="admin")
- urls = {}
- for dash in db.session.query(Dashboard).all():
- urls[dash.dashboard_title] = dash.url
- for title, url in urls.items():
- assert escape(title) in self.client.get(url).data.decode("utf-8")
+ for dash in db.session.query(Dashboard):
+ assert escape(dash.dashboard_title) in
self.client.get(dash.url).get_data(
+ as_text=True
+ )
def test_superset_dashboard_url(self):
url_for("Superset.dashboard", dashboard_id_or_slug=1)
@@ -424,8 +423,9 @@ class TestDashboard(SupersetTestCase):
# Cleanup
self.revoke_public_access_to_table(table)
- @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices")
- @pytest.mark.usefixtures("public_role_like_gamma")
+ @pytest.mark.usefixtures(
+ "load_birth_names_dashboard_with_slices", "public_role_like_gamma"
+ )
def test_dashboard_with_created_by_can_be_accessed_by_public_users(self):
self.logout()
table =
db.session.query(SqlaTable).filter_by(table_name="birth_names").one()
@@ -437,8 +437,9 @@ class TestDashboard(SupersetTestCase):
db.session.merge(dash)
db.session.commit()
- # this asserts a non-4xx response
- self.get_resp("/superset/dashboard/births/")
+ res: Response = self.client.get("/superset/dashboard/births/")
+ assert res.status_code == 200
+
# Cleanup
self.revoke_public_access_to_table(table)
diff --git a/tests/integration_tests/dashboards/filter_sets/create_api_tests.py
b/tests/integration_tests/dashboards/filter_sets/create_api_tests.py
index fcd2923fb8..b5d1919dd4 100644
--- a/tests/integration_tests/dashboards/filter_sets/create_api_tests.py
+++ b/tests/integration_tests/dashboards/filter_sets/create_api_tests.py
@@ -16,7 +16,9 @@
# under the License.
from __future__ import annotations
-from typing import Any, Dict, TYPE_CHECKING
+from typing import Any, Dict
+
+from flask.testing import FlaskClient
from superset.dashboards.filter_sets.consts import (
DASHBOARD_OWNER_TYPE,
@@ -27,7 +29,6 @@ from superset.dashboards.filter_sets.consts import (
OWNER_TYPE_FIELD,
USER_OWNER_TYPE,
)
-from tests.integration_tests.base_tests import login
from tests.integration_tests.dashboards.filter_sets.consts import (
ADMIN_USERNAME_FOR_TEST,
DASHBOARD_OWNER_USERNAME,
@@ -38,9 +39,7 @@ from tests.integration_tests.dashboards.filter_sets.utils
import (
get_filter_set_by_dashboard_id,
get_filter_set_by_name,
)
-
-if TYPE_CHECKING:
- from flask.testing import FlaskClient
+from tests.integration_tests.test_app import login
def assert_filterset_was_not_created(filter_set_data: Dict[str, Any]) -> None:
diff --git a/tests/integration_tests/dashboards/filter_sets/delete_api_tests.py
b/tests/integration_tests/dashboards/filter_sets/delete_api_tests.py
index 8e7e0bcb60..7011cb5781 100644
--- a/tests/integration_tests/dashboards/filter_sets/delete_api_tests.py
+++ b/tests/integration_tests/dashboards/filter_sets/delete_api_tests.py
@@ -18,7 +18,6 @@ from __future__ import annotations
from typing import Any, Dict, List, TYPE_CHECKING
-from tests.integration_tests.base_tests import login
from tests.integration_tests.dashboards.filter_sets.consts import (
DASHBOARD_OWNER_USERNAME,
FILTER_SET_OWNER_USERNAME,
@@ -29,6 +28,7 @@ from tests.integration_tests.dashboards.filter_sets.utils
import (
collect_all_ids,
get_filter_set_by_name,
)
+from tests.integration_tests.test_app import login
if TYPE_CHECKING:
from flask.testing import FlaskClient
diff --git a/tests/integration_tests/dashboards/filter_sets/get_api_tests.py
b/tests/integration_tests/dashboards/filter_sets/get_api_tests.py
index 7be6f367dd..ad40d0e33c 100644
--- a/tests/integration_tests/dashboards/filter_sets/get_api_tests.py
+++ b/tests/integration_tests/dashboards/filter_sets/get_api_tests.py
@@ -18,7 +18,6 @@ from __future__ import annotations
from typing import Any, Dict, List, Set, TYPE_CHECKING
-from tests.integration_tests.base_tests import login
from tests.integration_tests.dashboards.filter_sets.consts import (
DASHBOARD_OWNER_USERNAME,
FILTER_SET_OWNER_USERNAME,
@@ -28,6 +27,7 @@ from tests.integration_tests.dashboards.filter_sets.utils
import (
call_get_filter_sets,
collect_all_ids,
)
+from tests.integration_tests.test_app import login
if TYPE_CHECKING:
from flask.testing import FlaskClient
diff --git a/tests/integration_tests/dashboards/filter_sets/update_api_tests.py
b/tests/integration_tests/dashboards/filter_sets/update_api_tests.py
index 4096e10099..07db98f617 100644
--- a/tests/integration_tests/dashboards/filter_sets/update_api_tests.py
+++ b/tests/integration_tests/dashboards/filter_sets/update_api_tests.py
@@ -26,7 +26,6 @@ from superset.dashboards.filter_sets.consts import (
OWNER_TYPE_FIELD,
PARAMS_PROPERTY,
)
-from tests.integration_tests.base_tests import login
from tests.integration_tests.dashboards.filter_sets.consts import (
DASHBOARD_OWNER_USERNAME,
FILTER_SET_OWNER_USERNAME,
@@ -37,6 +36,7 @@ from tests.integration_tests.dashboards.filter_sets.utils
import (
collect_all_ids,
get_filter_set_by_name,
)
+from tests.integration_tests.test_app import login
if TYPE_CHECKING:
from flask.testing import FlaskClient
diff --git a/tests/integration_tests/dashboards/filter_state/api_tests.py
b/tests/integration_tests/dashboards/filter_state/api_tests.py
index ea00f2e671..1df752b230 100644
--- a/tests/integration_tests/dashboards/filter_state/api_tests.py
+++ b/tests/integration_tests/dashboards/filter_state/api_tests.py
@@ -18,6 +18,7 @@ import json
from unittest.mock import patch
import pytest
+from flask.ctx import AppContext
from flask_appbuilder.security.sqla.models import User
from sqlalchemy.orm import Session
@@ -26,8 +27,6 @@ from superset.extensions import cache_manager
from superset.models.dashboard import Dashboard
from superset.temporary_cache.commands.entry import Entry
from superset.temporary_cache.utils import cache_key
-from tests.integration_tests.base_tests import login
-from tests.integration_tests.fixtures.client import client
from tests.integration_tests.fixtures.world_bank_dashboard import (
load_world_bank_dashboard_with_slices,
load_world_bank_data,
@@ -40,19 +39,17 @@ UPDATED_VALUE = json.dumps({"test": "updated value"})
@pytest.fixture
-def dashboard_id(load_world_bank_dashboard_with_slices) -> int:
- with app.app_context() as ctx:
- session: Session = ctx.app.appbuilder.get_session
- dashboard =
session.query(Dashboard).filter_by(slug="world_health").one()
- return dashboard.id
+def dashboard_id(app_context: AppContext,
load_world_bank_dashboard_with_slices) -> int:
+ session: Session = app_context.app.appbuilder.get_session
+ dashboard = session.query(Dashboard).filter_by(slug="world_health").one()
+ return dashboard.id
@pytest.fixture
-def admin_id() -> int:
- with app.app_context() as ctx:
- session: Session = ctx.app.appbuilder.get_session
- admin = session.query(User).filter_by(username="admin").one_or_none()
- return admin.id
+def admin_id(app_context: AppContext) -> int:
+ session: Session = app_context.app.appbuilder.get_session
+ admin = session.query(User).filter_by(username="admin").one_or_none()
+ return admin.id
@pytest.fixture(autouse=True)
@@ -61,55 +58,62 @@ def cache(dashboard_id, admin_id):
cache_manager.filter_state_cache.set(cache_key(dashboard_id, KEY), entry)
-def test_post(client, dashboard_id: int):
- login(client, "admin")
- payload = {
- "value": INITIAL_VALUE,
- }
- resp = client.post(f"api/v1/dashboard/{dashboard_id}/filter_state",
json=payload)
+def test_post(test_client, login_as_admin, dashboard_id: int):
+ resp = test_client.post(
+ f"api/v1/dashboard/{dashboard_id}/filter_state",
+ json={
+ "value": INITIAL_VALUE,
+ },
+ )
assert resp.status_code == 201
-def test_post_bad_request_non_string(client, dashboard_id: int):
- login(client, "admin")
- payload = {
- "value": 1234,
- }
- resp = client.post(f"api/v1/dashboard/{dashboard_id}/filter_state",
json=payload)
+def test_post_bad_request_non_string(test_client, login_as_admin,
dashboard_id: int):
+ resp = test_client.post(
+ f"api/v1/dashboard/{dashboard_id}/filter_state",
+ json={
+ "value": 1234,
+ },
+ )
assert resp.status_code == 400
-def test_post_bad_request_non_json_string(client, dashboard_id: int):
- login(client, "admin")
+def test_post_bad_request_non_json_string(
+ test_client, login_as_admin, dashboard_id: int
+):
payload = {
"value": "foo",
}
- resp = client.post(f"api/v1/dashboard/{dashboard_id}/filter_state",
json=payload)
+ resp = test_client.post(
+ f"api/v1/dashboard/{dashboard_id}/filter_state", json=payload
+ )
assert resp.status_code == 400
@patch("superset.security.SupersetSecurityManager.raise_for_dashboard_access")
-def test_post_access_denied(mock_raise_for_dashboard_access, client,
dashboard_id: int):
- login(client, "admin")
+def test_post_access_denied(
+ mock_raise_for_dashboard_access, test_client, login_as_admin,
dashboard_id: int
+):
mock_raise_for_dashboard_access.side_effect = DashboardAccessDeniedError()
payload = {
"value": INITIAL_VALUE,
}
- resp = client.post(f"api/v1/dashboard/{dashboard_id}/filter_state",
json=payload)
+ resp = test_client.post(
+ f"api/v1/dashboard/{dashboard_id}/filter_state", json=payload
+ )
assert resp.status_code == 403
-def test_post_same_key_for_same_tab_id(client, dashboard_id: int):
- login(client, "admin")
+def test_post_same_key_for_same_tab_id(test_client, login_as_admin,
dashboard_id: int):
payload = {
"value": INITIAL_VALUE,
}
- resp = client.post(
+ resp = test_client.post(
f"api/v1/dashboard/{dashboard_id}/filter_state?tab_id=1", json=payload
)
data = json.loads(resp.data.decode("utf-8"))
first_key = data.get("key")
- resp = client.post(
+ resp = test_client.post(
f"api/v1/dashboard/{dashboard_id}/filter_state?tab_id=1", json=payload
)
data = json.loads(resp.data.decode("utf-8"))
@@ -117,17 +121,18 @@ def test_post_same_key_for_same_tab_id(client,
dashboard_id: int):
assert first_key == second_key
-def test_post_different_key_for_different_tab_id(client, dashboard_id: int):
- login(client, "admin")
+def test_post_different_key_for_different_tab_id(
+ test_client, login_as_admin, dashboard_id: int
+):
payload = {
"value": INITIAL_VALUE,
}
- resp = client.post(
+ resp = test_client.post(
f"api/v1/dashboard/{dashboard_id}/filter_state?tab_id=1", json=payload
)
data = json.loads(resp.data.decode("utf-8"))
first_key = data.get("key")
- resp = client.post(
+ resp = test_client.post(
f"api/v1/dashboard/{dashboard_id}/filter_state?tab_id=2", json=payload
)
data = json.loads(resp.data.decode("utf-8"))
@@ -135,42 +140,45 @@ def test_post_different_key_for_different_tab_id(client,
dashboard_id: int):
assert first_key != second_key
-def test_post_different_key_for_no_tab_id(client, dashboard_id: int):
- login(client, "admin")
+def test_post_different_key_for_no_tab_id(
+ test_client, login_as_admin, dashboard_id: int
+):
payload = {
"value": INITIAL_VALUE,
}
- resp = client.post(f"api/v1/dashboard/{dashboard_id}/filter_state",
json=payload)
+ resp = test_client.post(
+ f"api/v1/dashboard/{dashboard_id}/filter_state", json=payload
+ )
data = json.loads(resp.data.decode("utf-8"))
first_key = data.get("key")
- resp = client.post(f"api/v1/dashboard/{dashboard_id}/filter_state",
json=payload)
+ resp = test_client.post(
+ f"api/v1/dashboard/{dashboard_id}/filter_state", json=payload
+ )
data = json.loads(resp.data.decode("utf-8"))
second_key = data.get("key")
assert first_key != second_key
-def test_put(client, dashboard_id: int):
- login(client, "admin")
- payload = {
- "value": UPDATED_VALUE,
- }
- resp = client.put(
- f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}", json=payload
+def test_put(test_client, login_as_admin, dashboard_id: int):
+ resp = test_client.put(
+ f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}",
+ json={
+ "value": UPDATED_VALUE,
+ },
)
assert resp.status_code == 200
-def test_put_same_key_for_same_tab_id(client, dashboard_id: int):
- login(client, "admin")
+def test_put_same_key_for_same_tab_id(test_client, login_as_admin,
dashboard_id: int):
payload = {
"value": INITIAL_VALUE,
}
- resp = client.put(
+ resp = test_client.put(
f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}?tab_id=1",
json=payload
)
data = json.loads(resp.data.decode("utf-8"))
first_key = data.get("key")
- resp = client.put(
+ resp = test_client.put(
f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}?tab_id=1",
json=payload
)
data = json.loads(resp.data.decode("utf-8"))
@@ -178,17 +186,18 @@ def test_put_same_key_for_same_tab_id(client,
dashboard_id: int):
assert first_key == second_key
-def test_put_different_key_for_different_tab_id(client, dashboard_id: int):
- login(client, "admin")
+def test_put_different_key_for_different_tab_id(
+ test_client, login_as_admin, dashboard_id: int
+):
payload = {
"value": INITIAL_VALUE,
}
- resp = client.put(
+ resp = test_client.put(
f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}?tab_id=1",
json=payload
)
data = json.loads(resp.data.decode("utf-8"))
first_key = data.get("key")
- resp = client.put(
+ resp = test_client.put(
f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}?tab_id=2",
json=payload
)
data = json.loads(resp.data.decode("utf-8"))
@@ -196,17 +205,18 @@ def test_put_different_key_for_different_tab_id(client,
dashboard_id: int):
assert first_key != second_key
-def test_put_different_key_for_no_tab_id(client, dashboard_id: int):
- login(client, "admin")
+def test_put_different_key_for_no_tab_id(
+ test_client, login_as_admin, dashboard_id: int
+):
payload = {
"value": INITIAL_VALUE,
}
- resp = client.put(
+ resp = test_client.put(
f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}", json=payload
)
data = json.loads(resp.data.decode("utf-8"))
first_key = data.get("key")
- resp = client.put(
+ resp = test_client.put(
f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}", json=payload
)
data = json.loads(resp.data.decode("utf-8"))
@@ -214,97 +224,94 @@ def test_put_different_key_for_no_tab_id(client,
dashboard_id: int):
assert first_key != second_key
-def test_put_bad_request_non_string(client, dashboard_id: int):
- login(client, "admin")
- payload = {
- "value": 1234,
- }
- resp = client.put(
- f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}", json=payload
+def test_put_bad_request_non_string(test_client, login_as_admin, dashboard_id:
int):
+ resp = test_client.put(
+ f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}",
+ json={
+ "value": 1234,
+ },
)
assert resp.status_code == 400
-def test_put_bad_request_non_json_string(client, dashboard_id: int):
- login(client, "admin")
- payload = {
- "value": "foo",
- }
- resp = client.put(
- f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}", json=payload
+def test_put_bad_request_non_json_string(
+ test_client, login_as_admin, dashboard_id: int
+):
+ resp = test_client.put(
+ f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}",
+ json={
+ "value": "foo",
+ },
)
assert resp.status_code == 400
@patch("superset.security.SupersetSecurityManager.raise_for_dashboard_access")
-def test_put_access_denied(mock_raise_for_dashboard_access, client,
dashboard_id: int):
- login(client, "admin")
+def test_put_access_denied(
+ mock_raise_for_dashboard_access, test_client, login_as_admin,
dashboard_id: int
+):
mock_raise_for_dashboard_access.side_effect = DashboardAccessDeniedError()
- payload = {
- "value": UPDATED_VALUE,
- }
- resp = client.put(
- f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}", json=payload
+ resp = test_client.put(
+ f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}",
+ json={
+ "value": UPDATED_VALUE,
+ },
)
assert resp.status_code == 403
-def test_put_not_owner(client, dashboard_id: int):
- login(client, "gamma")
- payload = {
- "value": UPDATED_VALUE,
- }
- resp = client.put(
- f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}", json=payload
+def test_put_not_owner(test_client, login_as, dashboard_id: int):
+ login_as("gamma")
+ resp = test_client.put(
+ f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}",
+ json={
+ "value": UPDATED_VALUE,
+ },
)
assert resp.status_code == 403
-def test_get_key_not_found(client, dashboard_id: int):
- login(client, "admin")
- resp =
client.get(f"api/v1/dashboard/{dashboard_id}/filter_state/unknown-key/")
+def test_get_key_not_found(test_client, login_as_admin, dashboard_id: int):
+ resp =
test_client.get(f"api/v1/dashboard/{dashboard_id}/filter_state/unknown-key/")
assert resp.status_code == 404
-def test_get_dashboard_not_found(client):
- login(client, "admin")
- resp = client.get(f"api/v1/dashboard/{-1}/filter_state/{KEY}")
+def test_get_dashboard_not_found(test_client, login_as_admin):
+ resp = test_client.get(f"api/v1/dashboard/{-1}/filter_state/{KEY}")
assert resp.status_code == 404
-def test_get(client, dashboard_id: int):
- login(client, "admin")
- resp = client.get(f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}")
+def test_get_dashboard_filter_state(test_client, login_as_admin, dashboard_id:
int):
+ resp =
test_client.get(f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}")
assert resp.status_code == 200
data = json.loads(resp.data.decode("utf-8"))
assert INITIAL_VALUE == data.get("value")
@patch("superset.security.SupersetSecurityManager.raise_for_dashboard_access")
-def test_get_access_denied(mock_raise_for_dashboard_access, client,
dashboard_id):
- login(client, "admin")
+def test_get_access_denied(
+ mock_raise_for_dashboard_access, test_client, login_as_admin, dashboard_id
+):
mock_raise_for_dashboard_access.side_effect = DashboardAccessDeniedError()
- resp = client.get(f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}")
+ resp =
test_client.get(f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}")
assert resp.status_code == 403
-def test_delete(client, dashboard_id: int):
- login(client, "admin")
- resp = client.delete(f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}")
+def test_delete(test_client, login_as_admin, dashboard_id: int):
+ resp =
test_client.delete(f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}")
assert resp.status_code == 200
@patch("superset.security.SupersetSecurityManager.raise_for_dashboard_access")
def test_delete_access_denied(
- mock_raise_for_dashboard_access, client, dashboard_id: int
+ mock_raise_for_dashboard_access, test_client, login_as_admin,
dashboard_id: int
):
- login(client, "admin")
mock_raise_for_dashboard_access.side_effect = DashboardAccessDeniedError()
- resp = client.delete(f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}")
+ resp =
test_client.delete(f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}")
assert resp.status_code == 403
-def test_delete_not_owner(client, dashboard_id: int):
- login(client, "gamma")
- resp = client.delete(f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}")
+def test_delete_not_owner(test_client, login_as, dashboard_id: int):
+ login_as("gamma")
+ resp =
test_client.delete(f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}")
assert resp.status_code == 403
diff --git a/tests/integration_tests/dashboards/permalink/api_tests.py
b/tests/integration_tests/dashboards/permalink/api_tests.py
index 036b42857a..018e06cd49 100644
--- a/tests/integration_tests/dashboards/permalink/api_tests.py
+++ b/tests/integration_tests/dashboards/permalink/api_tests.py
@@ -29,8 +29,6 @@ from superset.key_value.models import KeyValueEntry
from superset.key_value.types import KeyValueResource
from superset.key_value.utils import decode_permalink_id
from superset.models.dashboard import Dashboard
-from tests.integration_tests.base_tests import login
-from tests.integration_tests.fixtures.client import client
from tests.integration_tests.fixtures.world_bank_dashboard import (
load_world_bank_dashboard_with_slices,
load_world_bank_data,
@@ -67,9 +65,10 @@ def permalink_salt() -> Iterator[str]:
db.session.commit()
-def test_post(client, dashboard_id: int, permalink_salt: str) -> None:
- login(client, "admin")
- resp = client.post(f"api/v1/dashboard/{dashboard_id}/permalink",
json=STATE)
+def test_post(
+ test_client, login_as_admin, dashboard_id: int, permalink_salt: str
+) -> None:
+ resp = test_client.post(f"api/v1/dashboard/{dashboard_id}/permalink",
json=STATE)
assert resp.status_code == 201
data = resp.json
key = data["key"]
@@ -79,7 +78,9 @@ def test_post(client, dashboard_id: int, permalink_salt: str)
-> None:
assert (
data
- == client.post(f"api/v1/dashboard/{dashboard_id}/permalink",
json=STATE).json
+ == test_client.post(
+ f"api/v1/dashboard/{dashboard_id}/permalink", json=STATE
+ ).json
), "Should always return the same permalink key for the same payload"
db.session.query(KeyValueEntry).filter_by(id=id_).delete()
@@ -87,27 +88,26 @@ def test_post(client, dashboard_id: int, permalink_salt:
str) -> None:
@patch("superset.security.SupersetSecurityManager.raise_for_dashboard_access")
-def test_post_access_denied(mock_raise_for_dashboard_access, client,
dashboard_id: int):
- login(client, "admin")
+def test_post_access_denied(
+ mock_raise_for_dashboard_access, test_client, login_as_admin,
dashboard_id: int
+):
mock_raise_for_dashboard_access.side_effect = DashboardAccessDeniedError()
- resp = client.post(f"api/v1/dashboard/{dashboard_id}/permalink",
json=STATE)
+ resp = test_client.post(f"api/v1/dashboard/{dashboard_id}/permalink",
json=STATE)
assert resp.status_code == 403
-def test_post_invalid_schema(client, dashboard_id: int):
- login(client, "admin")
- resp = client.post(
+def test_post_invalid_schema(test_client, login_as_admin, dashboard_id: int):
+ resp = test_client.post(
f"api/v1/dashboard/{dashboard_id}/permalink", json={"foo": "bar"}
)
assert resp.status_code == 400
-def test_get(client, dashboard_id: int, permalink_salt: str):
- login(client, "admin")
- key = client.post(f"api/v1/dashboard/{dashboard_id}/permalink",
json=STATE).json[
- "key"
- ]
- resp = client.get(f"api/v1/dashboard/permalink/{key}")
+def test_get(test_client, login_as_admin, dashboard_id: int, permalink_salt:
str):
+ key = test_client.post(
+ f"api/v1/dashboard/{dashboard_id}/permalink", json=STATE
+ ).json["key"]
+ resp = test_client.get(f"api/v1/dashboard/permalink/{key}")
assert resp.status_code == 200
result = resp.json
assert result["dashboardId"] == str(dashboard_id)
diff --git a/tests/integration_tests/db_engine_specs/base_engine_spec_tests.py
b/tests/integration_tests/db_engine_specs/base_engine_spec_tests.py
index c4432e3ad1..07f9bfcf31 100644
--- a/tests/integration_tests/db_engine_specs/base_engine_spec_tests.py
+++ b/tests/integration_tests/db_engine_specs/base_engine_spec_tests.py
@@ -293,8 +293,8 @@ class TestDbEngineSpecs(TestDbEngineSpec):
table=table,
expression="""
case
- when gender=true then "male"
- else "female"
+ when gender='boy' then 'male'
+ else 'female'
end
""",
)
@@ -309,8 +309,8 @@ class TestDbEngineSpecs(TestDbEngineSpec):
sql = table.get_query_str(query_obj)
assert (
"""ORDER BY case
- when gender=true then "male"
- else "female"
+ when gender='boy' then 'male'
+ else 'female'
end ASC;"""
in sql
)
diff --git a/tests/integration_tests/db_engine_specs/bigquery_tests.py
b/tests/integration_tests/db_engine_specs/bigquery_tests.py
index 549b110952..2241f74f00 100644
--- a/tests/integration_tests/db_engine_specs/bigquery_tests.py
+++ b/tests/integration_tests/db_engine_specs/bigquery_tests.py
@@ -362,8 +362,8 @@ class TestBigQueryDbEngineSpec(TestDbEngineSpec):
table=table,
expression="""
case
- when gender=true then "male"
- else "female"
+ when gender='boy' then 'male'
+ else 'female'
end
""",
)
diff --git a/tests/integration_tests/explore/api_tests.py
b/tests/integration_tests/explore/api_tests.py
index abc85737b5..8fb642286a 100644
--- a/tests/integration_tests/explore/api_tests.py
+++ b/tests/integration_tests/explore/api_tests.py
@@ -26,8 +26,6 @@ from superset.explore.exceptions import
DatasetAccessDeniedError
from superset.explore.form_data.commands.state import TemporaryExploreState
from superset.extensions import cache_manager
from superset.models.slice import Slice
-from tests.integration_tests.base_tests import login
-from tests.integration_tests.fixtures.client import client
from tests.integration_tests.fixtures.world_bank_dashboard import (
load_world_bank_dashboard_with_slices,
load_world_bank_data,
@@ -101,9 +99,8 @@ def assert_slice(result, chart_id, dataset_id):
assert slice["form_data"]["viz_type"] == "big_number"
-def test_no_params_provided(client):
- login(client, "admin")
- resp = client.get(f"api/v1/explore/")
+def test_no_params_provided(test_client, login_as_admin):
+ resp = test_client.get(f"api/v1/explore/")
assert resp.status_code == 200
data = json.loads(resp.data.decode("utf-8"))
result = data.get("result")
@@ -113,9 +110,8 @@ def test_no_params_provided(client):
assert result["slice"] == None
-def test_get_from_cache(client, dataset):
- login(client, "admin")
- resp = client.get(
+def test_get_from_cache(test_client, login_as_admin, dataset):
+ resp = test_client.get(
f"api/v1/explore/?form_data_key={FORM_DATA_KEY}&dataset_id={dataset.id}&dataset_type={dataset.type}"
)
assert resp.status_code == 200
@@ -128,10 +124,11 @@ def test_get_from_cache(client, dataset):
assert result["slice"] == None
-def test_get_from_cache_unknown_key_chart_id(client, chart_id, dataset):
- login(client, "admin")
+def test_get_from_cache_unknown_key_chart_id(
+ test_client, login_as_admin, chart_id, dataset
+):
unknown_key = "unknown_key"
- resp = client.get(
+ resp = test_client.get(
f"api/v1/explore/?form_data_key={unknown_key}&slice_id={chart_id}"
)
assert resp.status_code == 200
@@ -146,10 +143,9 @@ def test_get_from_cache_unknown_key_chart_id(client,
chart_id, dataset):
)
-def test_get_from_cache_unknown_key_dataset(client, dataset):
- login(client, "admin")
+def test_get_from_cache_unknown_key_dataset(test_client, login_as_admin,
dataset):
unknown_key = "unknown_key"
- resp = client.get(
+ resp = test_client.get(
f"api/v1/explore/?form_data_key={unknown_key}&dataset_id={dataset.id}&dataset_type={dataset.type}"
)
assert resp.status_code == 200
@@ -164,10 +160,9 @@ def test_get_from_cache_unknown_key_dataset(client,
dataset):
assert result["slice"] == None
-def test_get_from_cache_unknown_key_no_extra_parameters(client):
- login(client, "admin")
+def test_get_from_cache_unknown_key_no_extra_parameters(test_client,
login_as_admin):
unknown_key = "unknown_key"
- resp = client.get(f"api/v1/explore/?form_data_key={unknown_key}")
+ resp = test_client.get(f"api/v1/explore/?form_data_key={unknown_key}")
assert resp.status_code == 200
data = json.loads(resp.data.decode("utf-8"))
result = data.get("result")
@@ -177,17 +172,16 @@ def
test_get_from_cache_unknown_key_no_extra_parameters(client):
assert result["slice"] == None
-def test_get_from_permalink(client, chart_id, dataset):
- login(client, "admin")
+def test_get_from_permalink(test_client, login_as_admin, chart_id, dataset):
form_data = {
"chart_id": chart_id,
"datasource": f"{dataset.id}__{dataset.type}",
**FORM_DATA,
}
- resp = client.post(f"api/v1/explore/permalink", json={"formData":
form_data})
+ resp = test_client.post(f"api/v1/explore/permalink", json={"formData":
form_data})
data = json.loads(resp.data.decode("utf-8"))
permalink_key = data["key"]
- resp = client.get(f"api/v1/explore/?permalink_key={permalink_key}")
+ resp = test_client.get(f"api/v1/explore/?permalink_key={permalink_key}")
assert resp.status_code == 200
data = json.loads(resp.data.decode("utf-8"))
result = data.get("result")
@@ -198,21 +192,21 @@ def test_get_from_permalink(client, chart_id, dataset):
assert result["slice"] == None
-def test_get_from_permalink_unknown_key(client):
- login(client, "admin")
+def test_get_from_permalink_unknown_key(test_client, login_as_admin):
unknown_key = "unknown_key"
- resp = client.get(f"api/v1/explore/?permalink_key={unknown_key}")
+ resp = test_client.get(f"api/v1/explore/?permalink_key={unknown_key}")
assert resp.status_code == 404
@patch("superset.security.SupersetSecurityManager.can_access_datasource")
-def test_get_dataset_access_denied(mock_can_access_datasource, client,
dataset):
+def test_get_dataset_access_denied(
+ mock_can_access_datasource, test_client, login_as_admin, dataset
+):
message = "Dataset access denied"
mock_can_access_datasource.side_effect = DatasetAccessDeniedError(
message=message, dataset_id=dataset.id, dataset_type=dataset.type
)
- login(client, "admin")
- resp = client.get(
+ resp = test_client.get(
f"api/v1/explore/?form_data_key={FORM_DATA_KEY}&dataset_id={dataset.id}&dataset_type={dataset.type}"
)
data = json.loads(resp.data.decode("utf-8"))
@@ -223,11 +217,10 @@ def
test_get_dataset_access_denied(mock_can_access_datasource, client, dataset):
@patch("superset.datasource.dao.DatasourceDAO.get_datasource")
-def test_wrong_endpoint(mock_get_datasource, client, dataset):
+def test_wrong_endpoint(mock_get_datasource, test_client, login_as_admin,
dataset):
dataset.default_endpoint = "another_endpoint"
mock_get_datasource.return_value = dataset
- login(client, "admin")
- resp = client.get(
+ resp = test_client.get(
f"api/v1/explore/?dataset_id={dataset.id}&dataset_type={dataset.type}"
)
data = json.loads(resp.data.decode("utf-8"))
diff --git a/tests/integration_tests/explore/form_data/api_tests.py
b/tests/integration_tests/explore/form_data/api_tests.py
index dae713ff70..fe8425e282 100644
--- a/tests/integration_tests/explore/form_data/api_tests.py
+++ b/tests/integration_tests/explore/form_data/api_tests.py
@@ -27,8 +27,6 @@ from superset.explore.form_data.commands.state import
TemporaryExploreState
from superset.extensions import cache_manager
from superset.models.slice import Slice
from superset.utils.core import DatasourceType
-from tests.integration_tests.base_tests import login
-from tests.integration_tests.fixtures.client import client
from tests.integration_tests.fixtures.world_bank_dashboard import (
load_world_bank_dashboard_with_slices,
load_world_bank_data,
@@ -80,82 +78,85 @@ def cache(chart_id, admin_id, datasource):
cache_manager.explore_form_data_cache.set(KEY, entry)
-def test_post(client, chart_id: int, datasource: SqlaTable):
- login(client, "admin")
+def test_post(test_client, login_as_admin, chart_id: int, datasource:
SqlaTable):
payload = {
"datasource_id": datasource.id,
"datasource_type": datasource.type,
"chart_id": chart_id,
"form_data": INITIAL_FORM_DATA,
}
- resp = client.post("api/v1/explore/form_data", json=payload)
+ resp = test_client.post("api/v1/explore/form_data", json=payload)
assert resp.status_code == 201
-def test_post_bad_request_non_string(client, chart_id: int, datasource:
SqlaTable):
- login(client, "admin")
+def test_post_bad_request_non_string(
+ test_client, login_as_admin, chart_id: int, datasource: SqlaTable
+):
payload = {
"datasource_id": datasource.id,
"datasource_type": datasource.type,
"chart_id": chart_id,
"form_data": 1234,
}
- resp = client.post("api/v1/explore/form_data", json=payload)
+ resp = test_client.post("api/v1/explore/form_data", json=payload)
assert resp.status_code == 400
-def test_post_bad_request_non_json_string(client, chart_id: int, datasource:
SqlaTable):
- login(client, "admin")
+def test_post_bad_request_non_json_string(
+ test_client, login_as_admin, chart_id: int, datasource: SqlaTable
+):
payload = {
"datasource_id": datasource.id,
"datasource_type": datasource.type,
"chart_id": chart_id,
"form_data": "foo",
}
- resp = client.post("api/v1/explore/form_data", json=payload)
+ resp = test_client.post("api/v1/explore/form_data", json=payload)
assert resp.status_code == 400
-def test_post_access_denied(client, chart_id: int, datasource: SqlaTable):
- login(client, "gamma")
+def test_post_access_denied(
+ test_client, login_as, chart_id: int, datasource: SqlaTable
+):
+ login_as("gamma")
payload = {
"datasource_id": datasource.id,
"datasource_type": datasource.type,
"chart_id": chart_id,
"form_data": INITIAL_FORM_DATA,
}
- resp = client.post("api/v1/explore/form_data", json=payload)
+ resp = test_client.post("api/v1/explore/form_data", json=payload)
assert resp.status_code == 404
-def test_post_same_key_for_same_context(client, chart_id: int, datasource:
SqlaTable):
- login(client, "admin")
+def test_post_same_key_for_same_context(
+ test_client, login_as_admin, chart_id: int, datasource: SqlaTable
+):
payload = {
"datasource_id": datasource.id,
"datasource_type": datasource.type,
"chart_id": chart_id,
"form_data": UPDATED_FORM_DATA,
}
- resp = client.post("api/v1/explore/form_data?tab_id=1", json=payload)
+ resp = test_client.post("api/v1/explore/form_data?tab_id=1", json=payload)
data = json.loads(resp.data.decode("utf-8"))
first_key = data.get("key")
- resp = client.post("api/v1/explore/form_data?tab_id=1", json=payload)
+ resp = test_client.post("api/v1/explore/form_data?tab_id=1", json=payload)
data = json.loads(resp.data.decode("utf-8"))
second_key = data.get("key")
assert first_key == second_key
def test_post_different_key_for_different_context(
- client, chart_id: int, datasource: SqlaTable
+ test_client, login_as_admin, chart_id: int, datasource: SqlaTable
):
- login(client, "admin")
payload = {
"datasource_id": datasource.id,
"datasource_type": datasource.type,
"chart_id": chart_id,
"form_data": UPDATED_FORM_DATA,
}
- resp = client.post("api/v1/explore/form_data?tab_id=1", json=payload)
+ resp = test_client.post("api/v1/explore/form_data?tab_id=1", json=payload)
data = json.loads(resp.data.decode("utf-8"))
first_key = data.get("key")
payload = {
@@ -163,231 +164,235 @@ def test_post_different_key_for_different_context(
"datasource_type": datasource.type,
"form_data": json.dumps({"test": "initial value"}),
}
- resp = client.post("api/v1/explore/form_data?tab_id=1", json=payload)
+ resp = test_client.post("api/v1/explore/form_data?tab_id=1", json=payload)
data = json.loads(resp.data.decode("utf-8"))
second_key = data.get("key")
assert first_key != second_key
-def test_post_same_key_for_same_tab_id(client, chart_id: int, datasource:
SqlaTable):
- login(client, "admin")
+def test_post_same_key_for_same_tab_id(
+ test_client, login_as_admin, chart_id: int, datasource: SqlaTable
+):
payload = {
"datasource_id": datasource.id,
"datasource_type": datasource.type,
"chart_id": chart_id,
"form_data": json.dumps({"test": "initial value"}),
}
- resp = client.post("api/v1/explore/form_data?tab_id=1", json=payload)
+ resp = test_client.post("api/v1/explore/form_data?tab_id=1", json=payload)
data = json.loads(resp.data.decode("utf-8"))
first_key = data.get("key")
- resp = client.post("api/v1/explore/form_data?tab_id=1", json=payload)
+ resp = test_client.post("api/v1/explore/form_data?tab_id=1", json=payload)
data = json.loads(resp.data.decode("utf-8"))
second_key = data.get("key")
assert first_key == second_key
def test_post_different_key_for_different_tab_id(
- client, chart_id: int, datasource: SqlaTable
+ test_client, login_as_admin, chart_id: int, datasource: SqlaTable
):
- login(client, "admin")
payload = {
"datasource_id": datasource.id,
"datasource_type": datasource.type,
"chart_id": chart_id,
"form_data": json.dumps({"test": "initial value"}),
}
- resp = client.post("api/v1/explore/form_data?tab_id=1", json=payload)
+ resp = test_client.post("api/v1/explore/form_data?tab_id=1", json=payload)
data = json.loads(resp.data.decode("utf-8"))
first_key = data.get("key")
- resp = client.post("api/v1/explore/form_data?tab_id=2", json=payload)
+ resp = test_client.post("api/v1/explore/form_data?tab_id=2", json=payload)
data = json.loads(resp.data.decode("utf-8"))
second_key = data.get("key")
assert first_key != second_key
-def test_post_different_key_for_no_tab_id(client, chart_id: int, datasource:
SqlaTable):
- login(client, "admin")
+def test_post_different_key_for_no_tab_id(
+ test_client, login_as_admin, chart_id: int, datasource: SqlaTable
+):
payload = {
"datasource_id": datasource.id,
"datasource_type": datasource.type,
"chart_id": chart_id,
"form_data": INITIAL_FORM_DATA,
}
- resp = client.post("api/v1/explore/form_data", json=payload)
+ resp = test_client.post("api/v1/explore/form_data", json=payload)
data = json.loads(resp.data.decode("utf-8"))
first_key = data.get("key")
- resp = client.post("api/v1/explore/form_data", json=payload)
+ resp = test_client.post("api/v1/explore/form_data", json=payload)
data = json.loads(resp.data.decode("utf-8"))
second_key = data.get("key")
assert first_key != second_key
-def test_put(client, chart_id: int, datasource: SqlaTable):
- login(client, "admin")
+def test_put(test_client, login_as_admin, chart_id: int, datasource:
SqlaTable):
payload = {
"datasource_id": datasource.id,
"datasource_type": datasource.type,
"chart_id": chart_id,
"form_data": UPDATED_FORM_DATA,
}
- resp = client.put(f"api/v1/explore/form_data/{KEY}", json=payload)
+ resp = test_client.put(f"api/v1/explore/form_data/{KEY}", json=payload)
assert resp.status_code == 200
-def test_put_same_key_for_same_tab_id(client, chart_id: int, datasource:
SqlaTable):
- login(client, "admin")
+def test_put_same_key_for_same_tab_id(
+ test_client, login_as_admin, chart_id: int, datasource: SqlaTable
+):
payload = {
"datasource_id": datasource.id,
"datasource_type": datasource.type,
"chart_id": chart_id,
"form_data": UPDATED_FORM_DATA,
}
- resp = client.put(f"api/v1/explore/form_data/{KEY}?tab_id=1", json=payload)
+ resp = test_client.put(f"api/v1/explore/form_data/{KEY}?tab_id=1",
json=payload)
data = json.loads(resp.data.decode("utf-8"))
first_key = data.get("key")
- resp = client.put(f"api/v1/explore/form_data/{KEY}?tab_id=1", json=payload)
+ resp = test_client.put(f"api/v1/explore/form_data/{KEY}?tab_id=1",
json=payload)
data = json.loads(resp.data.decode("utf-8"))
second_key = data.get("key")
assert first_key == second_key
def test_put_different_key_for_different_tab_id(
- client, chart_id: int, datasource: SqlaTable
+ test_client, login_as_admin, chart_id: int, datasource: SqlaTable
):
- login(client, "admin")
payload = {
"datasource_id": datasource.id,
"datasource_type": datasource.type,
"chart_id": chart_id,
"form_data": UPDATED_FORM_DATA,
}
- resp = client.put(f"api/v1/explore/form_data/{KEY}?tab_id=1", json=payload)
+ resp = test_client.put(f"api/v1/explore/form_data/{KEY}?tab_id=1",
json=payload)
data = json.loads(resp.data.decode("utf-8"))
first_key = data.get("key")
- resp = client.put(f"api/v1/explore/form_data/{KEY}?tab_id=2", json=payload)
+ resp = test_client.put(f"api/v1/explore/form_data/{KEY}?tab_id=2",
json=payload)
data = json.loads(resp.data.decode("utf-8"))
second_key = data.get("key")
assert first_key != second_key
-def test_put_different_key_for_no_tab_id(client, chart_id: int, datasource:
SqlaTable):
- login(client, "admin")
+def test_put_different_key_for_no_tab_id(
+ test_client, login_as_admin, chart_id: int, datasource: SqlaTable
+):
payload = {
"datasource_id": datasource.id,
"datasource_type": datasource.type,
"chart_id": chart_id,
"form_data": UPDATED_FORM_DATA,
}
- resp = client.put(f"api/v1/explore/form_data/{KEY}", json=payload)
+ resp = test_client.put(f"api/v1/explore/form_data/{KEY}", json=payload)
data = json.loads(resp.data.decode("utf-8"))
first_key = data.get("key")
- resp = client.put(f"api/v1/explore/form_data/{KEY}", json=payload)
+ resp = test_client.put(f"api/v1/explore/form_data/{KEY}", json=payload)
data = json.loads(resp.data.decode("utf-8"))
second_key = data.get("key")
assert first_key != second_key
-def test_put_bad_request(client, chart_id: int, datasource: SqlaTable):
- login(client, "admin")
+def test_put_bad_request(
+ test_client, login_as_admin, chart_id: int, datasource: SqlaTable
+):
payload = {
"datasource_id": datasource.id,
"datasource_type": datasource.type,
"chart_id": chart_id,
"form_data": 1234,
}
- resp = client.put(f"api/v1/explore/form_data/{KEY}", json=payload)
+ resp = test_client.put(f"api/v1/explore/form_data/{KEY}", json=payload)
assert resp.status_code == 400
-def test_put_bad_request_non_string(client, chart_id: int, datasource:
SqlaTable):
- login(client, "admin")
+def test_put_bad_request_non_string(
+ test_client, login_as_admin, chart_id: int, datasource: SqlaTable
+):
payload = {
"datasource_id": datasource.id,
"datasource_type": datasource.type,
"chart_id": chart_id,
"form_data": 1234,
}
- resp = client.put(f"api/v1/explore/form_data/{KEY}", json=payload)
+ resp = test_client.put(f"api/v1/explore/form_data/{KEY}", json=payload)
assert resp.status_code == 400
-def test_put_bad_request_non_json_string(client, chart_id: int, datasource:
SqlaTable):
- login(client, "admin")
+def test_put_bad_request_non_json_string(
+ test_client, login_as_admin, chart_id: int, datasource: SqlaTable
+):
payload = {
"datasource_id": datasource.id,
"datasource_type": datasource.type,
"chart_id": chart_id,
"form_data": "foo",
}
- resp = client.put(f"api/v1/explore/form_data/{KEY}", json=payload)
+ resp = test_client.put(f"api/v1/explore/form_data/{KEY}", json=payload)
assert resp.status_code == 400
-def test_put_access_denied(client, chart_id: int, datasource: SqlaTable):
- login(client, "gamma")
+def test_put_access_denied(test_client, login_as, chart_id: int, datasource:
SqlaTable):
+ login_as("gamma")
payload = {
"datasource_id": datasource.id,
"datasource_type": datasource.type,
"chart_id": chart_id,
"form_data": UPDATED_FORM_DATA,
}
- resp = client.put(f"api/v1/explore/form_data/{KEY}", json=payload)
+ resp = test_client.put(f"api/v1/explore/form_data/{KEY}", json=payload)
assert resp.status_code == 404
-def test_put_not_owner(client, chart_id: int, datasource: SqlaTable):
- login(client, "gamma")
+def test_put_not_owner(test_client, login_as, chart_id: int, datasource:
SqlaTable):
+ login_as("gamma")
payload = {
"datasource_id": datasource.id,
"datasource_type": datasource.type,
"chart_id": chart_id,
"form_data": UPDATED_FORM_DATA,
}
- resp = client.put(f"api/v1/explore/form_data/{KEY}", json=payload)
+ resp = test_client.put(f"api/v1/explore/form_data/{KEY}", json=payload)
assert resp.status_code == 404
-def test_get_key_not_found(client):
- login(client, "admin")
- resp = client.get(f"api/v1/explore/form_data/unknown-key")
+def test_get_key_not_found(test_client, login_as_admin):
+ resp = test_client.get(f"api/v1/explore/form_data/unknown-key")
assert resp.status_code == 404
-def test_get(client):
- login(client, "admin")
- resp = client.get(f"api/v1/explore/form_data/{KEY}")
+def test_get(test_client, login_as_admin):
+ resp = test_client.get(f"api/v1/explore/form_data/{KEY}")
assert resp.status_code == 200
data = json.loads(resp.data.decode("utf-8"))
assert INITIAL_FORM_DATA == data.get("form_data")
-def test_get_access_denied(client):
- login(client, "gamma")
- resp = client.get(f"api/v1/explore/form_data/{KEY}")
+def test_get_access_denied(test_client, login_as):
+ login_as("gamma")
+ resp = test_client.get(f"api/v1/explore/form_data/{KEY}")
assert resp.status_code == 404
@patch("superset.security.SupersetSecurityManager.can_access_datasource")
-def test_get_dataset_access_denied(mock_can_access_datasource, client):
+def test_get_dataset_access_denied(
+ mock_can_access_datasource, test_client, login_as_admin
+):
mock_can_access_datasource.side_effect = DatasetAccessDeniedError()
- login(client, "admin")
- resp = client.get(f"api/v1/explore/form_data/{KEY}")
+ resp = test_client.get(f"api/v1/explore/form_data/{KEY}")
assert resp.status_code == 403
-def test_delete(client):
- login(client, "admin")
- resp = client.delete(f"api/v1/explore/form_data/{KEY}")
+def test_delete(test_client, login_as_admin):
+ resp = test_client.delete(f"api/v1/explore/form_data/{KEY}")
assert resp.status_code == 200
-def test_delete_access_denied(client):
- login(client, "gamma")
- resp = client.delete(f"api/v1/explore/form_data/{KEY}")
+def test_delete_access_denied(test_client, login_as):
+ login_as("gamma")
+ resp = test_client.delete(f"api/v1/explore/form_data/{KEY}")
assert resp.status_code == 404
-def test_delete_not_owner(client, chart_id: int, datasource: SqlaTable,
admin_id: int):
+def test_delete_not_owner(
+ test_client, login_as_admin, chart_id: int, datasource: SqlaTable,
admin_id: int
+):
another_key = "another_key"
another_owner = admin_id + 1
entry: TemporaryExploreState = {
@@ -398,6 +403,5 @@ def test_delete_not_owner(client, chart_id: int,
datasource: SqlaTable, admin_id
"form_data": INITIAL_FORM_DATA,
}
cache_manager.explore_form_data_cache.set(another_key, entry)
- login(client, "admin")
- resp = client.delete(f"api/v1/explore/form_data/{another_key}")
+ resp = test_client.delete(f"api/v1/explore/form_data/{another_key}")
assert resp.status_code == 403
diff --git a/tests/integration_tests/explore/permalink/api_tests.py
b/tests/integration_tests/explore/permalink/api_tests.py
index b5228ab301..a808f0111e 100644
--- a/tests/integration_tests/explore/permalink/api_tests.py
+++ b/tests/integration_tests/explore/permalink/api_tests.py
@@ -28,8 +28,6 @@ from superset.key_value.types import KeyValueResource
from superset.key_value.utils import decode_permalink_id, encode_permalink_key
from superset.models.slice import Slice
from superset.utils.core import DatasourceType
-from tests.integration_tests.base_tests import login
-from tests.integration_tests.fixtures.client import client
from tests.integration_tests.fixtures.world_bank_dashboard import (
load_world_bank_dashboard_with_slices,
load_world_bank_data,
@@ -38,11 +36,10 @@ from tests.integration_tests.test_app import app
@pytest.fixture
-def chart(load_world_bank_dashboard_with_slices) -> Slice:
- with app.app_context() as ctx:
- session: Session = ctx.app.appbuilder.get_session
- chart = session.query(Slice).filter_by(slice_name="World's
Population").one()
- return chart
+def chart(app_context, load_world_bank_dashboard_with_slices) -> Slice:
+ session: Session = app_context.app.appbuilder.get_session
+ chart = session.query(Slice).filter_by(slice_name="World's
Population").one()
+ return chart
@pytest.fixture
@@ -70,9 +67,10 @@ def permalink_salt() -> Iterator[str]:
db.session.commit()
-def test_post(client, form_data: Dict[str, Any], permalink_salt: str):
- login(client, "admin")
- resp = client.post(f"api/v1/explore/permalink", json={"formData":
form_data})
+def test_post(
+ test_client, login_as_admin, form_data: Dict[str, Any], permalink_salt: str
+):
+ resp = test_client.post(f"api/v1/explore/permalink", json={"formData":
form_data})
assert resp.status_code == 201
data = json.loads(resp.data.decode("utf-8"))
key = data["key"]
@@ -83,13 +81,15 @@ def test_post(client, form_data: Dict[str, Any],
permalink_salt: str):
db.session.commit()
-def test_post_access_denied(client, form_data):
- login(client, "gamma")
- resp = client.post(f"api/v1/explore/permalink", json={"formData":
form_data})
+def test_post_access_denied(test_client, login_as, form_data):
+ login_as("gamma")
+ resp = test_client.post(f"api/v1/explore/permalink", json={"formData":
form_data})
assert resp.status_code == 404
-def test_get_missing_chart(client, chart, permalink_salt: str) -> None:
+def test_get_missing_chart(
+ test_client, login_as_admin, chart, permalink_salt: str
+) -> None:
from superset.key_value.models import KeyValueEntry
chart_id = 1234
@@ -110,25 +110,24 @@ def test_get_missing_chart(client, chart, permalink_salt:
str) -> None:
db.session.add(entry)
db.session.commit()
key = encode_permalink_key(entry.id, permalink_salt)
- login(client, "admin")
- resp = client.get(f"api/v1/explore/permalink/{key}")
+ resp = test_client.get(f"api/v1/explore/permalink/{key}")
assert resp.status_code == 404
db.session.delete(entry)
db.session.commit()
-def test_post_invalid_schema(client) -> None:
- login(client, "admin")
- resp = client.post(f"api/v1/explore/permalink", json={"abc": 123})
+def test_post_invalid_schema(test_client, login_as_admin) -> None:
+ resp = test_client.post(f"api/v1/explore/permalink", json={"abc": 123})
assert resp.status_code == 400
-def test_get(client, form_data: Dict[str, Any], permalink_salt: str) -> None:
- login(client, "admin")
- resp = client.post(f"api/v1/explore/permalink", json={"formData":
form_data})
+def test_get(
+ test_client, login_as_admin, form_data: Dict[str, Any], permalink_salt: str
+) -> None:
+ resp = test_client.post(f"api/v1/explore/permalink", json={"formData":
form_data})
data = json.loads(resp.data.decode("utf-8"))
key = data["key"]
- resp = client.get(f"api/v1/explore/permalink/{key}")
+ resp = test_client.get(f"api/v1/explore/permalink/{key}")
assert resp.status_code == 200
result = json.loads(resp.data.decode("utf-8"))
assert result["state"]["formData"] == form_data
diff --git a/tests/integration_tests/fixtures/birth_names_dashboard.py
b/tests/integration_tests/fixtures/birth_names_dashboard.py
index 0434e22295..41fcd47919 100644
--- a/tests/integration_tests/fixtures/birth_names_dashboard.py
+++ b/tests/integration_tests/fixtures/birth_names_dashboard.py
@@ -93,24 +93,16 @@ def _create_table(
return table
-def _cleanup(dash_id: int, slices_ids: List[int]) -> None:
+def _cleanup(dash_id: int, slice_ids: List[int]) -> None:
schema = get_example_default_schema()
- datasource = (
- db.session.query(SqlaTable)
- .filter_by(table_name="birth_names", schema=schema)
- .one()
- )
- columns = [column for column in datasource.columns]
- metrics = [metric for metric in datasource.metrics]
-
- for column in columns:
- db.session.delete(column)
- for metric in metrics:
- db.session.delete(metric)
-
- dash = db.session.query(Dashboard).filter_by(id=dash_id).first()
-
- db.session.delete(dash)
- for slice_id in slices_ids:
- db.session.query(Slice).filter_by(id=slice_id).delete()
+ for datasource in db.session.query(SqlaTable).filter_by(
+ table_name="birth_names", schema=schema
+ ):
+ for col in datasource.columns + datasource.metrics:
+ db.session.delete(col)
+
+ for dash in db.session.query(Dashboard).filter_by(id=dash_id):
+ db.session.delete(dash)
+ for slc in db.session.query(Slice).filter(Slice.id.in_(slice_ids)):
+ db.session.delete(slc)
db.session.commit()
diff --git a/tests/integration_tests/import_export_tests.py
b/tests/integration_tests/import_export_tests.py
index 81acda8018..5bbc985a36 100644
--- a/tests/integration_tests/import_export_tests.py
+++ b/tests/integration_tests/import_export_tests.py
@@ -50,33 +50,31 @@ from tests.integration_tests.fixtures.world_bank_dashboard
import (
from .base_tests import SupersetTestCase
+def delete_imports():
+ with app.app_context():
+ # Imported data clean up
+ session = db.session
+ for slc in session.query(Slice):
+ if "remote_id" in slc.params_dict:
+ session.delete(slc)
+ for dash in session.query(Dashboard):
+ if "remote_id" in dash.params_dict:
+ session.delete(dash)
+ for table in session.query(SqlaTable):
+ if "remote_id" in table.params_dict:
+ session.delete(table)
+ session.commit()
+
+
[email protected](autouse=True, scope="module")
+def clean_imports():
+ yield
+ delete_imports()
+
+
class TestImportExport(SupersetTestCase):
"""Testing export import functionality for dashboards"""
- @classmethod
- def delete_imports(cls):
- with app.app_context():
- # Imported data clean up
- session = db.session
- for slc in session.query(Slice):
- if "remote_id" in slc.params_dict:
- session.delete(slc)
- for dash in session.query(Dashboard):
- if "remote_id" in dash.params_dict:
- session.delete(dash)
- for table in session.query(SqlaTable):
- if "remote_id" in table.params_dict:
- session.delete(table)
- session.commit()
-
- @classmethod
- def setUpClass(cls):
- cls.delete_imports()
-
- @classmethod
- def tearDownClass(cls):
- cls.delete_imports()
-
def create_slice(
self,
name,
diff --git a/tests/integration_tests/query_context_tests.py
b/tests/integration_tests/query_context_tests.py
index 5b811cfd15..abd5d2be8b 100644
--- a/tests/integration_tests/query_context_tests.py
+++ b/tests/integration_tests/query_context_tests.py
@@ -293,7 +293,7 @@ class TestQueryContext(SupersetTestCase):
payload = get_query_context("birth_names")
payload["result_format"] = ChartDataResultFormat.CSV.value
payload["queries"][0]["row_limit"] = 10
- query_context = ChartDataQueryContextSchema().load(payload)
+ query_context: QueryContext =
ChartDataQueryContextSchema().load(payload)
responses = query_context.get_payload()
self.assertEqual(len(responses), 1)
data = responses["queries"][0]["data"]
diff --git a/tests/integration_tests/sqllab_tests.py
b/tests/integration_tests/sqllab_tests.py
index 7ded842ef7..7bfb2ffafd 100644
--- a/tests/integration_tests/sqllab_tests.py
+++ b/tests/integration_tests/sqllab_tests.py
@@ -65,6 +65,7 @@ QUERY_3 = "SELECT * FROM birth_names LIMIT 10"
class TestSqlLab(SupersetTestCase):
"""Testings for Sql Lab"""
+ @pytest.mark.usefixtures("load_birth_names_data")
def run_some_queries(self):
db.session.query(Query).delete()
db.session.commit()
diff --git a/tests/integration_tests/test_app.py
b/tests/integration_tests/test_app.py
index 798f3e9cda..c64076ec36 100644
--- a/tests/integration_tests/test_app.py
+++ b/tests/integration_tests/test_app.py
@@ -14,11 +14,20 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
+from typing import TYPE_CHECKING
-"""
-Here is where we create the app which ends up being shared across all
tests.integration_tests. A future
-optimization will be to create a separate app instance for each test class.
-"""
from superset.app import create_app
+if TYPE_CHECKING:
+ from typing import Any
+
+ from flask.testing import FlaskClient
+
app = create_app()
+
+
+def login(
+ client: "FlaskClient[Any]", username: str = "admin", password: str =
"general"
+):
+ resp = client.post("/login/", data=dict(username=username,
password=password))
+ assert "User confirmation needed" not in resp