blob: 72ba577d9ffc0fd1f481f5a98080e248725e005e [file] [log] [blame]
# 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 pytest
from superset.connectors.sqla.models import SqlaTable
from superset.extensions import db
from superset.models.core import FavStar
from superset.models.dashboard import Dashboard
from superset.models.slice import Slice
from superset.models.sql_lab import SavedQuery
from superset.tags.models import TaggedObject
from superset.utils.core import DatasourceType
from superset.utils.database import get_main_database
from tests.integration_tests.base_tests import SupersetTestCase
from tests.integration_tests.conftest import with_feature_flags
from tests.integration_tests.fixtures.tags import with_tagging_system_feature
class TestTagging(SupersetTestCase):
def query_tagged_object_table(self):
query = db.session.query(TaggedObject).all()
return query
def clear_tagged_object_table(self):
db.session.query(TaggedObject).delete()
db.session.commit()
@pytest.mark.usefixtures("with_tagging_system_feature")
def test_dataset_tagging(self):
"""
Test to make sure that when a new dataset is created,
a corresponding tag in the tagged_objects table
is created
"""
# Remove all existing rows in the tagged_object table
self.clear_tagged_object_table()
# Test to make sure nothing is in the tagged_object table
self.assertEqual([], self.query_tagged_object_table())
# Create a dataset and add it to the db
test_dataset = SqlaTable(
table_name="foo",
schema=None,
owners=[],
database=get_main_database(),
sql=None,
extra='{"certification": 1}',
)
db.session.add(test_dataset)
db.session.commit()
# Test to make sure that a dataset tag was added to the tagged_object table
tags = self.query_tagged_object_table()
self.assertEqual(1, len(tags))
self.assertEqual("ObjectTypes.dataset", str(tags[0].object_type))
self.assertEqual(test_dataset.id, tags[0].object_id)
# Cleanup the db
db.session.delete(test_dataset)
db.session.commit()
# Test to make sure the tag is deleted when the associated object is deleted
self.assertEqual([], self.query_tagged_object_table())
@pytest.mark.usefixtures("with_tagging_system_feature")
def test_chart_tagging(self):
"""
Test to make sure that when a new chart is created,
a corresponding tag in the tagged_objects table
is created
"""
# Remove all existing rows in the tagged_object table
self.clear_tagged_object_table()
# Test to make sure nothing is in the tagged_object table
self.assertEqual([], self.query_tagged_object_table())
# Create a chart and add it to the db
test_chart = Slice(
slice_name="test_chart",
datasource_type=DatasourceType.TABLE,
viz_type="bubble",
datasource_id=1,
id=1,
)
db.session.add(test_chart)
db.session.commit()
# Test to make sure that a chart tag was added to the tagged_object table
tags = self.query_tagged_object_table()
self.assertEqual(1, len(tags))
self.assertEqual("ObjectTypes.chart", str(tags[0].object_type))
self.assertEqual(test_chart.id, tags[0].object_id)
# Cleanup the db
db.session.delete(test_chart)
db.session.commit()
# Test to make sure the tag is deleted when the associated object is deleted
self.assertEqual([], self.query_tagged_object_table())
@pytest.mark.usefixtures("with_tagging_system_feature")
def test_dashboard_tagging(self):
"""
Test to make sure that when a new dashboard is created,
a corresponding tag in the tagged_objects table
is created
"""
# Remove all existing rows in the tagged_object table
self.clear_tagged_object_table()
# Test to make sure nothing is in the tagged_object table
self.assertEqual([], self.query_tagged_object_table())
# Create a dashboard and add it to the db
test_dashboard = Dashboard()
test_dashboard.dashboard_title = "test_dashboard"
test_dashboard.slug = "test_slug"
test_dashboard.slices = []
test_dashboard.published = True
db.session.add(test_dashboard)
db.session.commit()
# Test to make sure that a dashboard tag was added to the tagged_object table
tags = self.query_tagged_object_table()
self.assertEqual(1, len(tags))
self.assertEqual("ObjectTypes.dashboard", str(tags[0].object_type))
self.assertEqual(test_dashboard.id, tags[0].object_id)
# Cleanup the db
db.session.delete(test_dashboard)
db.session.commit()
# Test to make sure the tag is deleted when the associated object is deleted
self.assertEqual([], self.query_tagged_object_table())
@pytest.mark.usefixtures("with_tagging_system_feature")
def test_saved_query_tagging(self):
"""
Test to make sure that when a new saved query is
created, a corresponding tag in the tagged_objects
table is created
"""
# Remove all existing rows in the tagged_object table
self.clear_tagged_object_table()
# Test to make sure nothing is in the tagged_object table
self.assertEqual([], self.query_tagged_object_table())
# Create a saved query and add it to the db
test_saved_query = SavedQuery(id=1, label="test saved query")
db.session.add(test_saved_query)
db.session.commit()
# Test to make sure that a saved query tag was added to the tagged_object table
tags = self.query_tagged_object_table()
self.assertEqual(2, len(tags))
self.assertEqual("ObjectTypes.query", str(tags[0].object_type))
self.assertEqual("owner:None", str(tags[0].tag.name))
self.assertEqual("TagTypes.owner", str(tags[0].tag.type))
self.assertEqual(test_saved_query.id, tags[0].object_id)
self.assertEqual("ObjectTypes.query", str(tags[1].object_type))
self.assertEqual("type:query", str(tags[1].tag.name))
self.assertEqual("TagTypes.type", str(tags[1].tag.type))
self.assertEqual(test_saved_query.id, tags[1].object_id)
# Cleanup the db
db.session.delete(test_saved_query)
db.session.commit()
# Test to make sure the tag is deleted when the associated object is deleted
self.assertEqual([], self.query_tagged_object_table())
@pytest.mark.usefixtures("with_tagging_system_feature")
def test_favorite_tagging(self):
"""
Test to make sure that when a new favorite object is
created, a corresponding tag in the tagged_objects
table is created
"""
# Remove all existing rows in the tagged_object table
self.clear_tagged_object_table()
# Test to make sure nothing is in the tagged_object table
self.assertEqual([], self.query_tagged_object_table())
# Create a favorited object and add it to the db
test_saved_query = FavStar(user_id=1, class_name="slice", obj_id=1)
db.session.add(test_saved_query)
db.session.commit()
# Test to make sure that a favorited object tag was added to the tagged_object table
tags = self.query_tagged_object_table()
self.assertEqual(1, len(tags))
self.assertEqual("ObjectTypes.chart", str(tags[0].object_type))
self.assertEqual(test_saved_query.obj_id, tags[0].object_id)
# Cleanup the db
db.session.delete(test_saved_query)
db.session.commit()
# Test to make sure the tag is deleted when the associated object is deleted
self.assertEqual([], self.query_tagged_object_table())
@with_feature_flags(TAGGING_SYSTEM=False)
def test_tagging_system(self):
"""
Test to make sure that when the TAGGING_SYSTEM
feature flag is false, that no tags are created
"""
# Remove all existing rows in the tagged_object table
self.clear_tagged_object_table()
# Test to make sure nothing is in the tagged_object table
self.assertEqual([], self.query_tagged_object_table())
# Create a dataset and add it to the db
test_dataset = SqlaTable(
table_name="foo",
schema=None,
owners=[],
database=get_main_database(),
sql=None,
extra='{"certification": 1}',
)
# Create a chart and add it to the db
test_chart = Slice(
slice_name="test_chart",
datasource_type=DatasourceType.TABLE,
viz_type="bubble",
datasource_id=1,
id=1,
)
# Create a dashboard and add it to the db
test_dashboard = Dashboard()
test_dashboard.dashboard_title = "test_dashboard"
test_dashboard.slug = "test_slug"
test_dashboard.slices = []
test_dashboard.published = True
# Create a saved query and add it to the db
test_saved_query = SavedQuery(id=1, label="test saved query")
# Create a favorited object and add it to the db
test_favorited_object = FavStar(user_id=1, class_name="slice", obj_id=1)
db.session.add(test_dataset)
db.session.add(test_chart)
db.session.add(test_dashboard)
db.session.add(test_saved_query)
db.session.add(test_favorited_object)
db.session.commit()
# Test to make sure that no tags were added to the tagged_object table
tags = self.query_tagged_object_table()
self.assertEqual(0, len(tags))
# Cleanup the db
db.session.delete(test_dataset)
db.session.delete(test_chart)
db.session.delete(test_dashboard)
db.session.delete(test_saved_query)
db.session.delete(test_favorited_object)
db.session.commit()
# Test to make sure all the tags are deleted when the associated objects are deleted
self.assertEqual([], self.query_tagged_object_table())