| # 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. |
| # isort:skip_file |
| """Unit tests for Superset""" |
| |
| import unittest |
| from typing import Optional |
| |
| import pytest |
| from flask.ctx import AppContext |
| from pytest_mock import MockerFixture |
| from sqlalchemy import inspect # noqa: F401 |
| |
| from tests.integration_tests.fixtures.birth_names_dashboard import ( |
| load_birth_names_dashboard_with_slices, # noqa: F401 |
| load_birth_names_data, # noqa: F401 |
| ) |
| from tests.integration_tests.fixtures.world_bank_dashboard import ( |
| load_world_bank_dashboard_with_slices, # noqa: F401 |
| load_world_bank_data, # noqa: F401 |
| ) |
| from tests.integration_tests.fixtures.energy_dashboard import ( |
| load_energy_table_with_slice, # noqa: F401 |
| load_energy_table_data, # noqa: F401 |
| ) |
| from superset import security_manager |
| from superset.connectors.sqla.models import SqlaTable # noqa: F401 |
| from superset.models import core as models # noqa: F401 |
| from superset.utils.core import get_user_id, get_username, override_user |
| from superset.utils.database import get_example_database # noqa: F401 |
| |
| |
| ROLE_TABLES_PERM_DATA = { |
| "role_name": "override_me", |
| "database": [ |
| { |
| "datasource_type": "table", |
| "name": "examples", |
| "schema": [{"name": "", "datasources": ["birth_names"]}], |
| } |
| ], |
| } |
| |
| ROLE_ALL_PERM_DATA = { |
| "role_name": "override_me", |
| "database": [ |
| { |
| "datasource_type": "table", |
| "name": "examples", |
| "schema": [{"name": "", "datasources": ["birth_names"]}], |
| }, |
| ], |
| } |
| |
| EXTEND_ROLE_REQUEST = ( |
| "/superset/approve?datasource_type={}&datasource_id={}&" |
| "created_by={}&role_to_extend={}" |
| ) |
| GRANT_ROLE_REQUEST = ( |
| "/superset/approve?datasource_type={}&datasource_id={}&" |
| "created_by={}&role_to_grant={}" |
| ) |
| TEST_ROLE_1 = "test_role1" |
| TEST_ROLE_2 = "test_role2" |
| DB_ACCESS_ROLE = "db_access_role" |
| SCHEMA_ACCESS_ROLE = "schema_access_role" |
| |
| |
| @pytest.mark.parametrize( |
| "username,user_id", |
| [ |
| (None, None), |
| ("alpha", 5), |
| ("gamma", 2), |
| ], |
| ) |
| def test_get_user_id( |
| app_context: AppContext, |
| mocker: MockerFixture, |
| username: Optional[str], |
| user_id: Optional[int], |
| ) -> None: |
| mock_g = mocker.patch("superset.utils.core.g", spec={}) |
| mock_g.user = security_manager.find_user(username) |
| assert get_user_id() == user_id |
| |
| |
| @pytest.mark.parametrize( |
| "username", |
| [ |
| None, |
| "alpha", |
| "gamma", |
| ], |
| ) |
| def test_get_username( |
| app_context: AppContext, |
| mocker: MockerFixture, |
| username: Optional[str], |
| ) -> None: |
| mock_g = mocker.patch("superset.utils.core.g", spec={}) |
| mock_g.user = security_manager.find_user(username) |
| assert get_username() == username |
| |
| |
| @pytest.mark.parametrize("username", [None, "alpha", "gamma"]) |
| @pytest.mark.parametrize("force", [False, True]) |
| def test_override_user( |
| app_context: AppContext, |
| mocker: MockerFixture, |
| username: str, |
| force: bool, |
| ) -> None: |
| mock_g = mocker.patch("superset.utils.core.g", spec={}) |
| admin = security_manager.find_user(username="admin") |
| user = security_manager.find_user(username) |
| |
| with override_user(user, force): |
| assert mock_g.user == user |
| |
| assert not hasattr(mock_g, "user") |
| |
| mock_g.user = None |
| |
| with override_user(user, force): |
| assert mock_g.user == user |
| |
| assert mock_g.user is None |
| |
| mock_g.user = admin |
| |
| with override_user(user, force): |
| assert mock_g.user == user if force else admin |
| |
| assert mock_g.user == admin |
| |
| |
| if __name__ == "__main__": |
| unittest.main() |