"""Tests for participation role logic layer.""" from unittest.mock import MagicMock from uuid import UUID import pytest from pytest_mock import MockerFixture from contributor.constants.features import ( FEATURE_FLAG_CCM_CONTRIBUTOR_ROLES_ART_RELATIONS, ) from contributor.logic.participation_roles import ( get_role_by_uuid, get_role_categories, get_roles_by_category_uuid, get_roles_by_category_uuids, ) @pytest.fixture def identity_id() -> UUID: return UUID("10436b38-5e11-472d-b6a4-bf1ee2b1b438") @pytest.fixture def role_uuid() -> UUID: return UUID("1f8c7569-5a91-4c67-afd4-14b736afd4a8") @pytest.fixture def mysql_session() -> MagicMock: return MagicMock() @pytest.fixture def neo4j_session() -> MagicMock: return MagicMock() def _mock_feature( mocker: MockerFixture, *, enabled: bool, ) -> tuple[MagicMock, MagicMock, MagicMock]: split_client = mocker.MagicMock() get_splitio_client_mock = mocker.patch( "contributor.logic.participation_roles.datasources.get_splitio_client", return_value=split_client, ) feature = mocker.MagicMock() feature.is_on_for_identity.return_value = enabled boolean_feature_mock = mocker.patch( "contributor.logic.participation_roles.BooleanFeature", return_value=feature, ) return get_splitio_client_mock, boolean_feature_mock, feature def test_get_role_categories_feature_on_uses_mysql( mocker: MockerFixture, mysql_session: MagicMock, neo4j_session: MagicMock, identity_id: UUID, ) -> None: categories = [{"uuid": "a", "name": "Performer"}] _get_splitio_client_mock, boolean_feature_mock, feature = _mock_feature( mocker, enabled=True ) mysql_get_role_categories_mock = mocker.patch( "contributor.logic.participation_roles.queries.get_role_categories", return_value=categories, ) neo4j_get_role_categories_mock = mocker.patch( "contributor.logic.participation_roles.neo4j_queries.get_role_categories" ) result = get_role_categories( session=mysql_session, neo4j_session=neo4j_session, identity_id=identity_id, ) boolean_feature_mock.assert_called_once_with( client=mocker.ANY, feature_name=FEATURE_FLAG_CCM_CONTRIBUTOR_ROLES_ART_RELATIONS, ) feature.is_on_for_identity.assert_called_once_with(str(identity_id)) mysql_get_role_categories_mock.assert_called_once_with(mysql_session) neo4j_get_role_categories_mock.assert_not_called() assert result == categories def test_get_role_categories_feature_off_uses_neo4j( mocker: MockerFixture, mysql_session: MagicMock, neo4j_session: MagicMock, identity_id: UUID, ) -> None: categories = [{"uuid": "b", "name": "Producer"}] _mock_feature(mocker, enabled=False) mysql_get_role_categories_mock = mocker.patch( "contributor.logic.participation_roles.queries.get_role_categories" ) neo4j_get_role_categories_mock = mocker.patch( "contributor.logic.participation_roles.neo4j_queries.get_role_categories", return_value=categories, ) result = get_role_categories( session=mysql_session, neo4j_session=neo4j_session, identity_id=identity_id, ) mysql_get_role_categories_mock.assert_not_called() neo4j_get_role_categories_mock.assert_called_once_with(neo4j_session) assert result == categories def test_get_role_by_uuid_feature_on_uses_mysql( mocker: MockerFixture, mysql_session: MagicMock, neo4j_session: MagicMock, role_uuid: UUID, identity_id: UUID, ) -> None: role = {"uuid": str(role_uuid), "name": "Composer"} _mock_feature(mocker, enabled=True) mysql_get_role_by_uuid_mock = mocker.patch( "contributor.logic.participation_roles.queries.get_role_by_uuid", return_value=role, ) neo4j_get_role_by_uuid_mock = mocker.patch( "contributor.logic.participation_roles.neo4j_queries.get_role_by_uuid" ) result = get_role_by_uuid( session=mysql_session, neo4j_session=neo4j_session, uuid=role_uuid, identity_id=identity_id, ) mysql_get_role_by_uuid_mock.assert_called_once_with(mysql_session, str(role_uuid)) neo4j_get_role_by_uuid_mock.assert_not_called() assert result == role def test_get_role_by_uuid_feature_off_uses_neo4j( mocker: MockerFixture, mysql_session: MagicMock, neo4j_session: MagicMock, role_uuid: UUID, identity_id: UUID, ) -> None: role = {"uuid": str(role_uuid), "name": "Composer"} _mock_feature(mocker, enabled=False) mysql_get_role_by_uuid_mock = mocker.patch( "contributor.logic.participation_roles.queries.get_role_by_uuid" ) neo4j_get_role_by_uuid_mock = mocker.patch( "contributor.logic.participation_roles.neo4j_queries.get_role_by_uuid", return_value=role, ) result = get_role_by_uuid( session=mysql_session, neo4j_session=neo4j_session, uuid=role_uuid, identity_id=identity_id, ) mysql_get_role_by_uuid_mock.assert_not_called() neo4j_get_role_by_uuid_mock.assert_called_once_with(neo4j_session, role_uuid) assert result == role def test_get_roles_by_category_uuid_feature_on_uses_mysql( mocker: MockerFixture, mysql_session: MagicMock, neo4j_session: MagicMock, role_uuid: UUID, identity_id: UUID, ) -> None: roles = [{"uuid": "abc", "name": "Lyricist"}] _mock_feature(mocker, enabled=True) mysql_get_roles_by_category_uuid_mock = mocker.patch( "contributor.logic.participation_roles.queries.get_roles_by_category_uuid", return_value=roles, ) helper_mock = mocker.patch( "contributor.logic.participation_roles.get_roles_by_category_uuids" ) result = get_roles_by_category_uuid( session=mysql_session, neo4j_session=neo4j_session, uuid=role_uuid, identity_id=identity_id, ) mysql_get_roles_by_category_uuid_mock.assert_called_once_with( mysql_session, str(role_uuid) ) helper_mock.assert_not_called() assert result == roles def test_get_roles_by_category_uuid_feature_off_uses_helper( mocker: MockerFixture, mysql_session: MagicMock, neo4j_session: MagicMock, role_uuid: UUID, identity_id: UUID, ) -> None: roles = [{"uuid": "abc", "name": "Lyricist"}] _mock_feature(mocker, enabled=False) mysql_get_roles_by_category_uuid_mock = mocker.patch( "contributor.logic.participation_roles.queries.get_roles_by_category_uuid" ) helper_mock = mocker.patch( "contributor.logic.participation_roles.get_roles_by_category_uuids", return_value=[{"category_uuid": str(role_uuid), "roles": roles}], ) result = get_roles_by_category_uuid( session=mysql_session, neo4j_session=neo4j_session, uuid=role_uuid, identity_id=identity_id, ) mysql_get_roles_by_category_uuid_mock.assert_not_called() helper_mock.assert_called_once_with( session=mysql_session, neo4j_session=neo4j_session, uuids=[str(role_uuid)], identity_id=identity_id, ) assert result == roles def test_get_roles_by_category_uuid_feature_off_returns_empty_list( mocker: MockerFixture, mysql_session: MagicMock, neo4j_session: MagicMock, role_uuid: UUID, identity_id: UUID, ) -> None: _mock_feature(mocker, enabled=False) helper_mock = mocker.patch( "contributor.logic.participation_roles.get_roles_by_category_uuids", return_value=[], ) result = get_roles_by_category_uuid( session=mysql_session, neo4j_session=neo4j_session, uuid=role_uuid, identity_id=identity_id, ) helper_mock.assert_called_once_with( session=mysql_session, neo4j_session=neo4j_session, uuids=[str(role_uuid)], identity_id=identity_id, ) assert result == [] def test_get_roles_by_category_uuids_feature_on_uses_mysql( mocker: MockerFixture, mysql_session: MagicMock, neo4j_session: MagicMock, identity_id: UUID, ) -> None: uuids = ["cat-1", "cat-2"] results = [{"category_uuid": "cat-1", "roles": []}] _mock_feature(mocker, enabled=True) mysql_get_roles_by_category_uuids_mock = mocker.patch( "contributor.logic.participation_roles.queries.get_roles_by_category_uuids", return_value=results, ) neo4j_get_roles_by_category_uuids_mock = mocker.patch( "contributor.logic.participation_roles.neo4j_queries.get_roles_by_category_uuids" ) result = get_roles_by_category_uuids( session=mysql_session, neo4j_session=neo4j_session, uuids=uuids, identity_id=identity_id, ) mysql_get_roles_by_category_uuids_mock.assert_called_once_with(mysql_session, uuids) neo4j_get_roles_by_category_uuids_mock.assert_not_called() assert result == results def test_get_roles_by_category_uuids_feature_off_uses_neo4j( mocker: MockerFixture, mysql_session: MagicMock, neo4j_session: MagicMock, identity_id: UUID, ) -> None: uuids = ["cat-1", "cat-2"] results = [{"category_uuid": "cat-1", "roles": []}] _mock_feature(mocker, enabled=False) mysql_get_roles_by_category_uuids_mock = mocker.patch( "contributor.logic.participation_roles.queries.get_roles_by_category_uuids" ) neo4j_get_roles_by_category_uuids_mock = mocker.patch( "contributor.logic.participation_roles.neo4j_queries.get_roles_by_category_uuids", return_value=results, ) result = get_roles_by_category_uuids( session=mysql_session, neo4j_session=neo4j_session, uuids=uuids, identity_id=identity_id, ) mysql_get_roles_by_category_uuids_mock.assert_not_called() neo4j_get_roles_by_category_uuids_mock.assert_called_once_with(neo4j_session, uuids) assert result == results