superset/tests/unit_tests/dao/tag_test.py

172 lines
6.1 KiB
Python

# 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.
from collections.abc import Iterator
import pytest
from sqlalchemy.orm.session import Session
def test_user_favorite_tag(mocker):
from superset.daos.tag import TagDAO
# Mock the behavior of TagDAO and g
mock_session = mocker.patch("superset.daos.tag.db.session")
mock_TagDAO = mocker.patch(
"superset.daos.tag.TagDAO"
) # Replace with the actual path to TagDAO
mock_TagDAO.find_by_id.return_value = mocker.MagicMock(users_favorited=[])
mock_g = mocker.patch("superset.daos.tag.g") # Replace with the actual path to g
mock_g.user = mocker.MagicMock()
# Call the function with a test tag_id
TagDAO.favorite_tag_by_id_for_current_user(123)
# Check that find_by_id was called with the right argument
mock_TagDAO.find_by_id.assert_called_once_with(123)
# Check that users_favorited was updated correctly
assert mock_TagDAO.find_by_id().users_favorited == [mock_g.user]
mock_session.commit.assert_called_once()
def test_remove_user_favorite_tag(mocker):
from superset.daos.tag import TagDAO
# Mock the behavior of TagDAO and g
mock_session = mocker.patch("superset.daos.tag.db.session")
mock_TagDAO = mocker.patch("superset.daos.tag.TagDAO")
mock_tag = mocker.MagicMock(users_favorited=[])
mock_TagDAO.find_by_id.return_value = mock_tag
mock_g = mocker.patch("superset.daos.tag.g") # Replace with the actual path to g
mock_user = mocker.MagicMock()
mock_g.user = mock_user
# Append the mock user to the tag's list of favorited users
mock_tag.users_favorited.append(mock_user)
# Call the function with a test tag_id
TagDAO.remove_user_favorite_tag(123)
# Check that find_by_id was called with the right argument
mock_TagDAO.find_by_id.assert_called_once_with(123)
# Check that users_favorited no longer contains the user
assert mock_user not in mock_tag.users_favorited
# Check that the db.session.was committed
mock_session.commit.assert_called_once()
def test_remove_user_favorite_tag_no_user(mocker):
from superset.daos.tag import TagDAO
from superset.exceptions import MissingUserContextException
# Mock the behavior of TagDAO and g
mock_session = mocker.patch("superset.daos.tag.db.session")
mock_TagDAO = mocker.patch("superset.daos.tag.TagDAO")
mock_tag = mocker.MagicMock(users_favorited=[])
mock_TagDAO.find_by_id.return_value = mock_tag
mock_g = mocker.patch("superset.daos.tag.g") # Replace with the actual path to g
# Test with no user
mock_g.user = None
with pytest.raises(MissingUserContextException):
TagDAO.remove_user_favorite_tag(1)
def test_remove_user_favorite_tag_exc_raise(mocker):
from superset.daos.tag import TagDAO
from superset.exceptions import MissingUserContextException
# Mock the behavior of TagDAO and g
mock_session = mocker.patch("superset.daos.tag.db.session")
mock_TagDAO = mocker.patch("superset.daos.tag.TagDAO")
mock_tag = mocker.MagicMock(users_favorited=[])
mock_TagDAO.find_by_id.return_value = mock_tag
mock_g = mocker.patch("superset.daos.tag.g") # Replace with the actual path to g
# Test that exception is raised when commit fails
mock_session.commit.side_effect = Exception("DB Error")
with pytest.raises(Exception):
TagDAO.remove_user_favorite_tag(1)
def test_user_favorite_tag_no_user(mocker):
from superset.daos.tag import TagDAO
from superset.exceptions import MissingUserContextException
# Mock the behavior of TagDAO and g
mock_session = mocker.patch("superset.daos.tag.db.session")
mock_TagDAO = mocker.patch("superset.daos.tag.TagDAO")
mock_tag = mocker.MagicMock(users_favorited=[])
mock_TagDAO.find_by_id.return_value = mock_tag
mock_g = mocker.patch("superset.daos.tag.g") # Replace with the actual path to g
# Test with no user
mock_g.user = None
with pytest.raises(MissingUserContextException):
TagDAO.favorite_tag_by_id_for_current_user(1)
def test_user_favorite_tag_exc_raise(mocker):
from superset.daos.tag import TagDAO
from superset.exceptions import MissingUserContextException
# Mock the behavior of TagDAO and g
mock_session = mocker.patch("superset.daos.tag.db.session")
mock_TagDAO = mocker.patch("superset.daos.tag.TagDAO")
mock_tag = mocker.MagicMock(users_favorited=[])
mock_TagDAO.find_by_id.return_value = mock_tag
mock_g = mocker.patch("superset.daos.tag.g") # Replace with the actual path to g
# Test that exception is raised when commit fails
mock_session.commit.side_effect = Exception("DB Error")
with pytest.raises(Exception):
TagDAO.remove_user_favorite_tag(1)
def test_create_tag_relationship(mocker):
from superset.daos.tag import TagDAO
from superset.tags.models import ( # Assuming these are defined in the same module
ObjectType,
TaggedObject,
)
mock_session = mocker.patch("superset.daos.tag.db.session")
# Define a list of objects to tag
objects_to_tag = [
(ObjectType.query, 1),
(ObjectType.chart, 2),
(ObjectType.dashboard, 3),
]
# Call the function
tag = TagDAO.get_by_name("test_tag")
TagDAO.create_tag_relationship(objects_to_tag, tag)
# Verify that the correct number of TaggedObjects are added to the session
assert mock_session.add_all.call_count == 1
assert len(mock_session.add_all.call_args[0][0]) == len(objects_to_tag)