"""Tests for VendContact model.""" from unittest import mock import pytest from permissions.constants import constants from permissions.models import ( contact as contact_model, subaccount as subaccount_model, vend_contact, vendor as vendor_model, ) from permissions.types import Tenant, TenantType @pytest.fixture() def contact(): """Return an instance of Contact.""" return contact_model.Contact(contact_id=33333, contact_first_name='a', contact_last_name='b') def test_get_by_id(): """Test get_by_id.""" session_mock = mock.Mock() vend_contact_id = 12345 expected_result = mock.Mock() session_mock.query.return_value.get.return_value = expected_result result = vend_contact.VendContact.get_by_id(session_mock, vend_contact_id) assert result == expected_result session_mock.query.assert_called_once_with(vend_contact.VendContact) session_mock.query.return_value.get.assert_called_once_with(vend_contact_id) @mock.patch('permissions.models.vend_contact.generate_vend_contact_login') def test_create(generate_login_mock: mock.MagicMock, contact: contact_model.Contact): """Test the behavior of create.""" vendor_id = 22222 subaccount_id = 11111 email = 'kat@dachshund.long' login_value = 'some-uuid_22222_11111_kat@dachshund.long' generate_login_mock.return_value = login_value auth0_user_id = '6eafd6e8879' result = vend_contact.VendContact.create( contact=contact, vendor_id=vendor_id, subaccount_id=subaccount_id, email=email, auth0_user_id=auth0_user_id, master=vend_contact.YNEnum.N, ) assert isinstance(result, vend_contact.VendContact) assert result.contact == contact assert result.vendor_id == vendor_id assert result.subaccount_id == subaccount_id assert result.master == vend_contact.YNEnum.N assert result.login == login_value assert result.auth0_user_id == auth0_user_id generate_login_mock.assert_called_with( email=email, vendor_id=vendor_id, subaccount_id=subaccount_id, ) def test_update_existing_master_contact(): """Test the update_existing_master_contact call.""" mock_session = mock.Mock() mock_query = mock_session.query.return_value vendor_id = 22222 vend_contact.VendContact.update_existing_master_contact(tx=mock_session, vendor_id=vendor_id) mock_session.query.assert_called_once_with(vend_contact.VendContact) mock_query.filter.assert_called_once() # Verify update was called mock_query.filter().update.assert_called_once_with( {'master': vend_contact.YNEnum.N}, synchronize_session=False ) @mock.patch('uuid.uuid4') def test_generate_vend_contact_login_no_subaccount_id(uuid_mock): """Test generate_vend_contact_login when there is no subaccount id.""" email = 'e@ma.il' uuid = '051f8fd0-222c-4d28-9e7e-c3eaa3348bdc' vendor_id = 131 uuid_mock.return_value = uuid result = vend_contact.generate_vend_contact_login( email=email, vendor_id=vendor_id, subaccount_id=None ) assert result == f'{uuid}_{vendor_id}_{email}' @mock.patch('uuid.uuid4') def test_generate_vend_contact_login_with_subaccount_id(uuid_mock): """Test generate_vend_contact_login when there is a subaccount id.""" email = 'e@ma.il' uuid = '051f8fd0-222c-4d28-9e7e-c3eaa3348bdc' vendor_id = 131 subaccount_id = 2 uuid_mock.return_value = uuid result = vend_contact.generate_vend_contact_login( email=email, vendor_id=vendor_id, subaccount_id=subaccount_id ) assert result == f'{uuid}_{vendor_id}_{subaccount_id}_{email}' def test_deactivate_by_vendor_uuid_for_identity(): """Test deactivate Vend Contact by vendor_uuid for user.""" session_mock = mock.MagicMock() auth0_user_id = 'auth0_id' identity_id = 'id-id-id' identity_mock = mock.MagicMock(auth0_user_id=auth0_user_id, id=identity_id) vendor_uuid = 'vendor_uuid' query = mock.MagicMock() session_mock.query.return_value = query vend_contact.VendContact.deactivate_by_vendor_uuid_for_identity( session_mock, identity_mock, vendor_uuid, ) filter_call_args = query.filter.call_args.args filter_expected_call_args = [ vend_contact.VendContact.active == vend_contact.YNEnum.Y, vend_contact.VendContact.auth0_user_id.in_([auth0_user_id, identity_id]), vend_contact.VendContact.vendor_id == vendor_model.Vendor.vendor_id, vendor_model.Vendor.vendor_uuid == vendor_uuid, ] for call_arg, exp_call_arg in zip(filter_call_args, filter_expected_call_args): assert call_arg.compare(exp_call_arg) query.filter.return_value.update.assert_called_with( {'active': vend_contact.YNEnum.N}, synchronize_session=False, ) def test_deactivate_by_subaccount_uuid_for_identity(): """Test deactivate Vend Contact by subaccount_uuid for user.""" session_mock = mock.MagicMock() auth0_user_id = 'auth0_id' identity_id = 'id-id-id' identity_mock = mock.MagicMock(auth0_user_id=auth0_user_id, id=identity_id) subaccount_uuid = 'subaccount_uuid' query = mock.MagicMock() session_mock.query.return_value = query vend_contact.VendContact.deactivate_by_subaccount_uuid_for_identity( session_mock, identity_mock, subaccount_uuid, ) filter_call_args = query.filter.call_args.args filter_expected_call_args = [ vend_contact.VendContact.active == vend_contact.YNEnum.Y, vend_contact.VendContact.auth0_user_id.in_([auth0_user_id, identity_id]), vend_contact.VendContact.subaccount_id == subaccount_model.Subaccount.subaccount_id, subaccount_model.Subaccount.subaccount_uuid == subaccount_uuid, ] # need for compare sqlalchemy binary_expressions for call_arg, exp_call_arg in zip(filter_call_args, filter_expected_call_args): assert call_arg.compare(exp_call_arg) query.filter.return_value.update.assert_called_with( {'active': vend_contact.YNEnum.N}, synchronize_session=False, ) @pytest.mark.parametrize( 'tenant_mock', [ Tenant(tenant_uuid='abc-123', tenant_type=TenantType.ACCOUNT), Tenant(tenant_uuid='abc-123', tenant_type=TenantType.SUBACCOUNT), ], ) @mock.patch( 'permissions.models.vend_contact.VendContact.deactivate_by_subaccount_uuid_for_identity' ) @mock.patch('permissions.models.vend_contact.VendContact.deactivate_by_vendor_uuid_for_identity') def test_deactivate_by_tenant_for_identity(_, __, tenant_mock): """Test deactivate Vend Contact by tenant for user.""" session_mock = mock.MagicMock() identity = mock.MagicMock() tenant_uuid = tenant_mock.tenant_uuid tenant_type = tenant_mock.tenant_type vend_contact.deactivate_by_tenant_for_identity( tx=session_mock, identity=identity, tenant=tenant_mock, ) if tenant_type == constants.ACCOUNT_TENANT_TYPE: vend_contact.VendContact.deactivate_by_vendor_uuid_for_identity.assert_called_with( session_mock, identity, tenant_uuid, ) vend_contact.VendContact.deactivate_by_subaccount_uuid_for_identity.assert_not_called() elif tenant_type == constants.SUBACCOUNT_TENANT_TYPE: vend_contact.VendContact.deactivate_by_vendor_uuid_for_identity.assert_not_called() vend_contact.VendContact.deactivate_by_subaccount_uuid_for_identity.assert_called_with( session_mock, identity, tenant_uuid, ) def test_get_next_active_for_identity_or_none(): """Test VendContact.get_next_active_for_identity_or_none when there is a next active.""" session_mock = mock.Mock() auth0_user_id = 'hexvalue' identity_id = 'u-u-i-d' identity_mock = mock.Mock(auth0_user_id=auth0_user_id, id=identity_id) result_mock = mock.Mock() session_mock.query.return_value.filter.return_value.first.return_value = result_mock result = vend_contact.VendContact.get_next_active_for_identity_or_none( session=session_mock, identity=identity_mock ) assert result == result_mock session_mock.query.assert_called_with(vend_contact.VendContact) filter_call_args = session_mock.query.return_value.filter.call_args.args assert filter_call_args[0].compare(vend_contact.VendContact.active == vend_contact.YNEnum.Y) assert filter_call_args[1].compare( vend_contact.VendContact.auth0_user_id.in_([auth0_user_id, identity_id]) ) session_mock.query.return_value.filter.return_value.first.assert_called()