| # 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""" |
| from typing import Dict, Any |
| |
| from tests.test_app import app # noqa |
| |
| from superset.extensions import cache_manager, db |
| from superset.models.cache import CacheKey |
| from 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" |
| ) |
| |
| |
| def test_invalidate_cache(logged_in_admin): |
| rv = invalidate({"datasource_uids": ["3__table"]}) |
| assert rv.status_code == 201 |
| |
| |
| def test_invalidate_existing_cache(logged_in_admin): |
| db.session.add(CacheKey(cache_key="cache_key", datasource_uid="3__table")) |
| db.session.commit() |
| cache_manager.cache.set("cache_key", "value") |
| |
| rv = invalidate({"datasource_uids": ["3__table"]}) |
| |
| assert rv.status_code == 201 |
| assert cache_manager.cache.get("cache_key") == None |
| assert ( |
| not db.session.query(CacheKey).filter(CacheKey.cache_key == "cache_key").first() |
| ) |
| |
| |
| def test_invalidate_cache_empty_input(logged_in_admin): |
| rv = invalidate({"datasource_uids": []}) |
| assert rv.status_code == 201 |
| |
| rv = invalidate({"datasources": []}) |
| assert rv.status_code == 201 |
| |
| rv = invalidate({"datasource_uids": [], "datasources": []}) |
| assert rv.status_code == 201 |
| |
| |
| def test_invalidate_cache_bad_request(logged_in_admin): |
| rv = invalidate( |
| { |
| "datasource_uids": [], |
| "datasources": [{"datasource_name": "", "datasource_type": None}], |
| } |
| ) |
| assert rv.status_code == 400 |
| |
| rv = invalidate( |
| { |
| "datasource_uids": [], |
| "datasources": [{"datasource_name": "", "datasource_type": "bla"}], |
| } |
| ) |
| assert rv.status_code == 400 |
| |
| rv = invalidate( |
| { |
| "datasource_uids": "datasource", |
| "datasources": [{"datasource_name": "", "datasource_type": "bla"}], |
| } |
| ) |
| assert rv.status_code == 400 |
| |
| |
| def test_invalidate_existing_caches(logged_in_admin): |
| bn = SupersetTestCase.get_birth_names_dataset() |
| |
| db.session.add(CacheKey(cache_key="cache_key1", datasource_uid="3__druid")) |
| db.session.add(CacheKey(cache_key="cache_key2", datasource_uid="3__druid")) |
| db.session.add(CacheKey(cache_key="cache_key4", datasource_uid=f"{bn.id}__table")) |
| db.session.add(CacheKey(cache_key="cache_keyX", datasource_uid="X__table")) |
| db.session.commit() |
| |
| cache_manager.cache.set("cache_key1", "value") |
| cache_manager.cache.set("cache_key2", "value") |
| cache_manager.cache.set("cache_key4", "value") |
| cache_manager.cache.set("cache_keyX", "value") |
| |
| rv = invalidate( |
| { |
| "datasource_uids": ["3__druid", "4__druid"], |
| "datasources": [ |
| { |
| "datasource_name": "birth_names", |
| "database_name": "examples", |
| "schema": "", |
| "datasource_type": "table", |
| }, |
| { # table exists, no cache to invalidate |
| "datasource_name": "energy_usage", |
| "database_name": "examples", |
| "schema": "", |
| "datasource_type": "table", |
| }, |
| { # table doesn't exist |
| "datasource_name": "does_not_exist", |
| "database_name": "examples", |
| "schema": "", |
| "datasource_type": "table", |
| }, |
| { # database doesn't exist |
| "datasource_name": "birth_names", |
| "database_name": "does_not_exist", |
| "schema": "", |
| "datasource_type": "table", |
| }, |
| { # database doesn't exist |
| "datasource_name": "birth_names", |
| "database_name": "examples", |
| "schema": "does_not_exist", |
| "datasource_type": "table", |
| }, |
| ], |
| } |
| ) |
| |
| assert rv.status_code == 201 |
| assert cache_manager.cache.get("cache_key1") is None |
| assert cache_manager.cache.get("cache_key2") is None |
| assert cache_manager.cache.get("cache_key4") is None |
| assert cache_manager.cache.get("cache_keyX") == "value" |
| assert ( |
| not db.session.query(CacheKey) |
| .filter(CacheKey.cache_key.in_({"cache_key1", "cache_key2", "cache_key4"})) |
| .first() |
| ) |
| assert ( |
| db.session.query(CacheKey) |
| .filter(CacheKey.cache_key == "cache_keyX") |
| .first() |
| .datasource_uid |
| == "X__table" |
| ) |