"""Test update_vendor schema.""" import uuid import pytest from account.validation.schemas.update_vendor import ( UpdateVendorCountryIdSchema, UpdateVendorExternalIdentifier1Schema, UpdateVendorInfoSchema, UpdateVendorInternalStaffSchema, UpdateVendorSchema, UpdateVendorServiceTierSchema, ) @pytest.mark.parametrize( ('payload', 'expected_errors'), [ # no errors ( { 'vendor_id': 1345, 'service_tier_uuid': '5f2bd4fc-df94-4f35-97d3-ef23f8573279', 'country_id': 1, 'owner': 'AWAL Core Accounts', 'assigned_to_id': '2903', 'assigned_reviewer_id': '2901', 'priority': 3, 'primary_genre_id': '20', 'contact_email': 'test2903@test.com', 'label_identifier': 'Frontline', 'product_manager_id': '1', 'quarterback_label_manager_id': '12', 'show_release_builder': 'N', 'support_contact_email': 'test_support2903@test.com', 'contact_name': 'test', 'company_brand_uuid': '31f4f0f0-cbb4-4a2c-9eb0-d7288c5a2588', 'name': 'Blacktop 2', 'label_summary': 'optional summary', 'wel_email_sender': 1234, 'wel_email_send_date': '2023-07-23 12:55:15', }, {}, ), ( { 'vendor_id': 1345, 'service_tier_uuid': '5f2bd4fc-df94-4f35-97d3-ef23f8573279', 'country_id': 1, 'owner': 'AWAL Core Accounts', 'assigned_to_id': '2903', 'assigned_reviewer_id': '2901', 'priority': 3, 'primary_genre_id': '20', 'contact_email': 'test2903@test.com', 'label_identifier': 'Frontline', 'product_manager_id': '1', 'quarterback_label_manager_id': None, 'show_release_builder': 'N', 'support_contact_email': 'test_support2903@test.com', 'contact_name': 'test', 'company_brand_uuid': '31f4f0f0-cbb4-4a2c-9eb0-d7288c5a2588', 'name': 'Blacktop 2', }, {}, ), ( { 'vendor_id': 1345, 'service_tier_uuid': '5f2bd4fc-df94-4f35-97d3-ef23f8573279', 'country_id': 1, 'owner': 'AWAL Core Accounts', 'assigned_to_id': '2903', 'assigned_reviewer_id': '2901', 'priority': 3, 'primary_genre_id': '20', 'contact_email': 'test2903@test.com', 'label_identifier': 'Frontline', 'product_manager_id': '1', 'quarterback_label_manager_id': '12', 'show_release_builder': 'N', 'support_contact_email': 'test_support2903@test.com', 'contact_name': 'test', 'company_brand_uuid': '31f4f0f0-cbb4-4a2c-9eb0-d7288c5a2588', 'name': 'Blacktop 2', }, {}, ), # invalid types ( {'source': 'event.gdaApproval'}, { 'vendor_id': ['Missing data for required field.'], }, ), ( { 'vendor_id': 1345, 'service_tier': '5f2bd4fc-df94-4f35-97d3-ef23f8573279', 'service_tier_uuid': '5f2bd4fc-df94-4f35-97d3-ef23f8573279', 'country_id': 1, 'owner': 'AWAL Core Accounts', 'assigned_to_id': '2903', 'assigned_reviewer_id': '2901', 'priority': 3, 'primary_genre_id': '20', 'contact_email': 'test2903@test.com', 'label_identifier': 'Frontline', 'product_manager_id': '1', 'quarterback_label_manager_id': '12', 'show_release_builder': 'N', 'support_contact_email': 'test_support2903@test.com', 'contact_name': 'test', 'company_brand_uuid': '31f4f0f0-cbb4-4a2c-9eb0-d7288c5a2588', 'name': 'Blacktop 2', }, { 'service_tier': ['Unknown field.'], }, ), ( { 'vendor_id': 1345, 'service_tier_uuid': 'diy-tier-1', 'country_id': 1, 'owner': 'AWAL Core Accounts', 'assigned_to_id': '2903', 'assigned_reviewer_id': '2901', 'priority': 3, 'primary_genre_id': '20', 'contact_email': 'test2903@test.com', 'label_identifier': 'Frontline', 'product_manager_id': '1', 'quarterback_label_manager_id': '12', 'show_release_builder': 'N', 'support_contact_email': 'test_support2903@test.com', 'contact_name': 'test', 'company_brand_uuid': '31f4f0f0-cbb4-4a2c-9eb0-d7288c5a2588', 'name': 'Blacktop 2', }, { 'service_tier_uuid': [ 'Must be one of: 5f2bd4fc-df94-4f35-97d3-ef23f8573279, ' '7410e51c-90da-4092-99da-b5489f364fa8, 9363881e-1120-4495-ae09-657e13609e11, ' '1dd92c83-25a3-4034-9a3d-f7c3f434f4ce, 2304f272-7a12-40fc-ba48-959fff435223, ' '1ed7aac0-ceb6-4c09-9166-afda8f349316, c069ab15-9370-4bd6-8ad1-895a64ae2ad8.' ] }, ), ( {'vendor_id': 1345, 'sc_usa': '123456789'}, {'sc_usa': ['Longer than maximum length 4.']}, ), ], ) def test_validate_vendor_update_schema(payload, expected_errors): """Test UpdateVendorSchema.""" identity_schema = UpdateVendorSchema() errors = identity_schema.validate(payload) assert errors == expected_errors @pytest.mark.parametrize( 'data, expected_errors', [ pytest.param( { 'vendor_uuid': uuid.uuid4(), 'external_identifier_1': 'sme parent rep owner identifier', }, {}, id='happy path', ), pytest.param( { 'external_identifier_1': 'sme parent rep owner identifier', }, {'vendor_uuid': ['Missing data for required field.']}, id='missing vendor_uuid', ), pytest.param( { 'vendor_uuid': 'not an integer', 'external_identifier_1': 'sme parent rep owner identifier', }, {'vendor_uuid': ['Not a valid UUID.']}, id='vendor_uuid must be UUID', ), pytest.param( { 'vendor_uuid': uuid.uuid4(), }, {'external_identifier_1': ['Missing data for required field.']}, id='missing external_identifier_1', ), pytest.param( {}, { 'external_identifier_1': ['Missing data for required field.'], 'vendor_uuid': ['Missing data for required field.'], }, id='missing everything', ), ], ) def test_vendor_update_external_identifier_1_schema(data, expected_errors) -> None: """Test UpdateVendorExternalIdentifier1Schema.""" schema = UpdateVendorExternalIdentifier1Schema() errors = schema.validate(data) assert errors == expected_errors @pytest.mark.parametrize( 'data, expected_errors', [ pytest.param( { 'vendor_uuid': uuid.uuid4(), 'country_id': 10, }, {}, id='happy path', ), pytest.param( { 'vendor_uuid': uuid.uuid4(), 'country_id': 'not an integer', }, {'country_id': ['Not a valid integer.']}, id='country id must be integer', ), pytest.param( { 'country_id': 9, }, {'vendor_uuid': ['Missing data for required field.']}, id='missing vendor_uuid', ), pytest.param( { 'vendor_uuid': 'not an integer', 'country_id': 8, }, {'vendor_uuid': ['Not a valid UUID.']}, id='vendor_uuid must be UUID', ), pytest.param( { 'vendor_uuid': uuid.uuid4(), }, {'country_id': ['Missing data for required field.']}, id='missing country_id', ), pytest.param( {}, { 'vendor_uuid': ['Missing data for required field.'], 'country_id': ['Missing data for required field.'], }, id='missing everything', ), ], ) def test_vendor_update_country_id_schema(data, expected_errors) -> None: """Test UpdateVendorCountryIdSchema.""" schema = UpdateVendorCountryIdSchema() errors = schema.validate(data) assert errors == expected_errors @pytest.mark.parametrize( ('data', 'expected_errors'), [ pytest.param( { 'vendor_uuid': '436ba196-8de7-4011-8cae-9f714df5133e', 'assigned_to': 10, }, {}, id='single field set', ), pytest.param( { 'vendor_uuid': '436ba196-8de7-4011-8cae-9f714df5133e', 'assigned_to': 10, 'assigned_reviewer': 20, 'quarterback_label_manager': 30, 'wel_email_sender': 40, 'product_manager': 50, }, {}, id='all fields set', ), pytest.param( { 'vendor_uuid': '436ba196-8de7-4011-8cae-9f714df5133e', 'product_manager': 50, }, {}, id='only product_manager set', ), pytest.param( {'vendor_uuid': '436ba196-8de7-4011-8cae-9f714df5133e'}, { '_schema': [ 'At least one of assigned_to, assigned_reviewer, ' 'quarterback_label_manager, wel_email_sender, ' 'product_manager must be provided.' ], }, id='no staff fields', ), pytest.param( { 'vendor_uuid': '436ba196-8de7-4011-8cae-9f714df5133e', 'assigned_to': None, 'assigned_reviewer': None, 'quarterback_label_manager': None, 'wel_email_sender': None, }, {}, id='nullable staff fields can be unset via null', ), pytest.param( { 'vendor_uuid': '436ba196-8de7-4011-8cae-9f714df5133e', 'product_manager': None, }, {'product_manager': ['Field may not be null.']}, id='product_manager rejects null', ), pytest.param( { 'vendor_uuid': '436ba196-8de7-4011-8cae-9f714df5133e', 'quarterback_label_manager': None, }, {}, id='only quarterback unset', ), ], ) def test_vendor_update_internal_staff_schema(data, expected_errors) -> None: """Test UpdateVendorInternalStaffSchema requires at least one staff field.""" schema = UpdateVendorInternalStaffSchema() errors = schema.validate(data) assert errors == expected_errors @pytest.mark.parametrize( ('data', 'expected_errors'), [ pytest.param( { 'vendor_uuid': '436ba196-8de7-4011-8cae-9f714df5133e', 'service_tier_uuid': '5f2bd4fc-df94-4f35-97d3-ef23f8573279', }, {}, id='happy path', ), pytest.param( {'vendor_uuid': '436ba196-8de7-4011-8cae-9f714df5133e'}, {'service_tier_uuid': ['Missing data for required field.']}, id='missing service_tier_uuid', ), pytest.param( { 'vendor_uuid': '436ba196-8de7-4011-8cae-9f714df5133e', 'service_tier_uuid': None, }, {'service_tier_uuid': ['Field may not be null.']}, id='null service_tier_uuid rejected', ), ], ) def test_vendor_update_service_tier_schema(data, expected_errors) -> None: """Test UpdateVendorServiceTierSchema.""" schema = UpdateVendorServiceTierSchema() errors = schema.validate(data) assert errors == expected_errors def test_vendor_update_service_tier_schema_unknown_uuid_rejected() -> None: """Service tier UUIDs not in SERVICE_TIER_UUIDS are rejected.""" schema = UpdateVendorServiceTierSchema() errors = schema.validate( { 'vendor_uuid': '436ba196-8de7-4011-8cae-9f714df5133e', 'service_tier_uuid': '00000000-0000-0000-0000-000000000000', } ) assert 'service_tier_uuid' in errors @pytest.mark.parametrize( ('data', 'expected_errors'), [ pytest.param( { 'vendor_uuid': '436ba196-8de7-4011-8cae-9f714df5133e', 'name': 'New Name', 'support_contact_email': 'help@theorchard.com', }, {}, id='partial set', ), pytest.param( { 'vendor_uuid': '436ba196-8de7-4011-8cae-9f714df5133e', 'owner': None, 'support_contact_email': None, 'company': None, }, {}, id='nullable fields can be cleared', ), pytest.param( { 'vendor_uuid': '436ba196-8de7-4011-8cae-9f714df5133e', 'name': None, 'newsletter': None, 'label_identifier': None, }, { 'name': ['Field may not be null.'], 'newsletter': ['Field may not be null.'], 'label_identifier': ['Field may not be null.'], }, id='non-nullable fields reject null', ), pytest.param( { 'vendor_uuid': '436ba196-8de7-4011-8cae-9f714df5133e', 'newsletter': 'maybe', }, {'newsletter': ['Must be one of: Y, N.']}, id='newsletter enum enforced', ), pytest.param( { 'vendor_uuid': '436ba196-8de7-4011-8cae-9f714df5133e', 'label_identifier': 'NotARealLabel', }, { 'label_identifier': [ 'Must be one of: Frontline, Client Services, Catalog, ' 'D3, Film, TV, Test, Accounting Only.' ], }, id='label_identifier enum enforced', ), pytest.param( {'vendor_uuid': '436ba196-8de7-4011-8cae-9f714df5133e'}, { '_schema': [ 'At least one of name, owner, company, support_contact_email, ' 'label_identifier, contact_email, label_summary, ' 'relationship_notes, newsletter, website, priority, ' 'primary_genre, date_signed, status must be provided.' ], }, id='no metadata fields', ), pytest.param( { 'vendor_uuid': '436ba196-8de7-4011-8cae-9f714df5133e', 'priority': 5, 'primary_genre': 12, 'date_signed': '2026-01-15', 'status': 'signed', }, {}, id='new optional fields accepted', ), pytest.param( { 'vendor_uuid': '436ba196-8de7-4011-8cae-9f714df5133e', 'status': 'bogus', }, { 'status': [ 'Must be one of: pitched, pending, verbal, signed, passed, ' 'inactive, deletion, waiting_for_approval, approved.' ], }, id='status enum enforced', ), pytest.param( { 'vendor_uuid': '436ba196-8de7-4011-8cae-9f714df5133e', 'priority': None, }, {'priority': ['Field may not be null.']}, id='new fields reject null', ), ], ) def test_vendor_update_info_schema(data, expected_errors) -> None: """Test UpdateVendorInfoSchema.""" schema = UpdateVendorInfoSchema() errors = schema.validate(data) assert errors == expected_errors