from unittest import mock import faker import pytest from anydi import Container from faker import Faker from pytest_mock import MockerFixture from ows_text_campaigns.artist.exceptions import ( ArtistSettingsNotFoundError, ) from ows_text_campaigns.artist.models import ArtistPhoneNumber, ArtistSettings from ows_text_campaigns.artist.services import ArtistSettingsService from ows_text_campaigns.assets.services import AssetService from ows_text_campaigns.assets.types import BinaryAsset from tests.unit.types import CreateModel class TestArtistSettingsService: @pytest.mark.db def test_get_settings( self, service: ArtistSettingsService, create_model: CreateModel, ) -> None: artist_settings = create_model(ArtistSettings) result = service.get_settings(artist_settings.global_participant_id) assert artist_settings == result @pytest.mark.db def test_get_settings_not_found( self, service: ArtistSettingsService, faker: Faker ) -> None: global_participant_id = faker.uuid4() with pytest.raises(ArtistSettingsNotFoundError): service.get_settings(global_participant_id) @pytest.mark.db def test_create_and_upload_vcard( self, container: Container, service: ArtistSettingsService, create_model: CreateModel, faker: faker.Faker, mocker: MockerFixture, ) -> None: global_participant_id = faker.uuid4() phone_number = ArtistPhoneNumber( global_participant_id=global_participant_id, phone_number="+1234567890", ) artist_settings = create_model( ArtistSettings, global_participant_id=global_participant_id, phone_numbers=[phone_number], ) mocker.patch( "ows_text_campaigns.assets.utils.unique_hash", return_value="abc123", ) asset_service_mock = mock.Mock(spec=AssetService) with container.override(AssetService, asset_service_mock): assets = service.create_and_upload_vcard(artist_settings) assert len(assets) == 1 asset = assets[0] assert asset.key == f"assets/artist/{global_participant_id}/vcard__abc123.vcf" assert asset.object_type == "artist" assert asset.object_id == global_participant_id assert asset.original_filename == "vcard.vcf" assert asset.content_type == "text/vcard" assert asset.extension == "vcf" assert phone_number.vcard_asset_id == asset.id asset_service_mock.upload_asset_to_s3.assert_called_once_with( BinaryAsset( data=mock.ANY, content_type=asset.content_type, extension=asset.extension, file_size=asset.file_size, filename=asset.original_filename, ), key=asset.key, original_filename=asset.original_filename, )