"""Test add_resource_to_profile endpoint.""" import json from unittest.mock import patch import pytest from owsresponse import response from permissions import handlers # noqa (handlers are imported for test client) from permissions.constants import constants @pytest.mark.parametrize( ( 'profile_type', 'profile_id', 'resource_type', 'resource_id', 'roles', 'status_code', 'expected', 'expected_args', ), [ # all valid values ( 'ArtistProfile', '2582459', 'ArtistInfo', '29245', ['analytics', 'catalog'], 200, {'foo': 'bar'}, [ { 'profile_id': 2582459, 'profile_type': 'ArtistProfile', 'resource_id': 29245, 'resource_type': 'ArtistInfo', 'roles': ['analytics', 'catalog'], }, None, ], ), ( 'InsightsProfile', '1234', 'Vendor', '*', ['analytics'], 200, {'foo': 'bar'}, [ { 'profile_id': 1234, 'profile_type': 'InsightsProfile', 'resource_id': '*', 'resource_type': 'Vendor', 'roles': ['analytics'], }, None, ], ), ( 'InsightsProfile', '1234', 'SubAccount', '5566', [], 200, {'foo': 'bar'}, [ { 'profile_id': 1234, 'profile_type': 'InsightsProfile', 'resource_id': 5566, 'resource_type': 'SubAccount', 'roles': [], }, None, ], ), # empty roles are ok as this might be the case for Podcast app. ( 'ArtistProfile', '2582459', 'ArtistInfo', '29245', [], 200, {'foo': 'bar'}, [ { 'profile_id': 2582459, 'profile_type': 'ArtistProfile', 'resource_id': 29245, 'resource_type': 'ArtistInfo', 'roles': [], }, None, ], ), # invalid role, it has to be list. ( 'ArtistProfile', '2582459', 'ArtistInfo', '29245', 'analytics', 400, {'code': 'validation_error', 'message': {'roles': ['Not a valid list.']}}, None, ), # invalid profile or resource types. ( 'artistprofile', '2582459', 'ArtistInfo', '29245', ['analytics', 'catalog'], 400, { 'code': 'validation_error', 'message': { 'profile_type': [f'Must be one of: {", ".join(constants.PROFILE_TYPES)}.'] }, # noqa }, None, ), ( 'dummyprofile', '2582459', 'ArtistInfo', '29245', ['analytics'], 400, { 'code': 'validation_error', 'message': { 'profile_type': [f'Must be one of: {", ".join(constants.PROFILE_TYPES)}.'] }, # noqa }, None, ), ( 'ArtistProfile', '2582459', 'dummy', '29245', ['analytics'], 400, { 'code': 'validation_error', 'message': { 'resource_type': [ 'Must be one of: ArtistInfo, Vendor, Subaccount, Label, SubAccount, LabelParticipant, Collaborator.' ] }, # noqa }, None, ), ( 'newProfile', '2582459', 'newResource', '29245', ['analytics'], 400, { 'code': 'validation_error', 'message': { 'profile_type': [f'Must be one of: {", ".join(constants.PROFILE_TYPES)}.'], # noqa 'resource_type': [ 'Must be one of: ArtistInfo, Vendor, Subaccount, Label, SubAccount, LabelParticipant, Collaborator.' ], # noqa }, }, None, ), # invalid profile or resource id values will be blocked by flask. ('ArtistProfile', 'foo', 'ArtistInfo', '', ['analytics'], 404, None, None), ], ) @patch( 'permissions.handlers.handlers.resource.add_resource_to_profile', return_value=response.Response({'foo': 'bar'}), ) def test_add_resource_to_profile_validations( mock_logic, fixture_client, profile_type, profile_id, resource_type, resource_id, roles, status_code, expected, expected_args, ): """Test add_resource_to_profile validations.""" url = f'/ows/profile/{profile_type}/{profile_id}/has-access-to/resource/{resource_type}/{resource_id}' # noqa data = {'roles': roles} result = fixture_client.post(url, json=data) assert result.status_code == status_code if status_code != 404: json_result = json.loads(result.data.decode('utf-8')) assert json_result == expected if status_code == 200: mock_logic.assert_called_once_with(*expected_args) else: mock_logic.assert_not_called()