from datetime import datetime, timedelta, timezone import pytest from dapd_db_schema.schemas.workflow import Album, Artist, Track pytestmark = [pytest.mark.integration] @pytest.fixture def artist(db, data_source, ttl_priority) -> Artist: now = datetime.now(tz=timezone.utc) artist_item = Artist( id='ar.1', name='', label='', created_at=now, expired_at=now, ) artist_item.data_source = data_source artist_item.ttl_priority = ttl_priority db.workflow_session.add(artist_item) db.workflow_session.flush() db.workflow_session.expire_all() yield artist_item db.workflow_session.delete(artist_item) db.workflow_session.flush() def test_add_artist(db, seed, artist): results = db.workflow_session.query(Artist).all() assert len(results) == 1 def test_update_artist(db, seed, artist): now = datetime.now(tz=timezone.utc) updates = { 'name': 'Korn', 'label': 'Korn (feat Corey Taylor)', 'expired_at': now + timedelta(minutes=artist.ttl_priority.ttl.ttl), 'is_removed': True, 'is_removed_expired_at': now + timedelta(days=2), } artist = db.workflow_session.query(Artist).filter(Artist.id == 'ar.1').one() assert artist.is_removed is not updates['is_removed'] assert artist.is_removed_expired_at != updates['is_removed_expired_at'] artist.name = updates['name'] artist.label = updates['label'] artist.expired_at = updates['expired_at'] artist.is_removed = updates['is_removed'] artist.is_removed_expired_at = updates['is_removed_expired_at'] db.workflow_session.add(artist) db.workflow_session.flush() db.workflow_session.expire_all() results = db.workflow_session.query(Artist).all() assert len(results) == 1 assert results[0].name == updates['name'] assert results[0].label == updates['label'] assert results[0].expired_at == updates['expired_at'] assert results[0].is_removed is updates['is_removed'] assert results[0].is_removed_expired_at == updates['is_removed_expired_at'] def test_add_album_to_artist(db, seed, artist, data_source, ttl_priority): now = datetime.now(tz=timezone.utc) ttl = ttl_priority.ttl albums = [ Album( id='al.1', name='', label='', created_at=now, expired_at=now, data_source_id=data_source.id, ttl_id=ttl.id ), Album( id='al.2', name='', label='', created_at=now, expired_at=now, data_source_id=data_source.id, ttl_id=ttl.id ), Album( id='al.3', name='', label='', created_at=now, expired_at=now, data_source_id=data_source.id, ttl_id=ttl.id ), ] for album in albums: artist.albums.append(album) db.workflow_session.add(artist) db.workflow_session.flush() db.workflow_session.expire_all() found_artists = db.workflow_session.query(Artist).all() assert len(found_artists) == 1 db.workflow_session.expire_all() found_albums = db.workflow_session.query(Album).all() assert len(found_albums) == len(albums) db.workflow_session.expire_all() # find albums that belong to artist found_artist = db.workflow_session.query(Artist).filter(Artist.id == artist.id).one() assert len(found_artist.albums) == 3 # find artist by album found_album = db.workflow_session.query(Album).filter(Album.id == 'al.1').one() assert len(found_album.artists) == 1 def test_add_track_to_artist(db, seed, artist, data_source, ttl_priority): now = datetime.now(tz=timezone.utc) ttl_item = ttl_priority.ttl # create tracks tracks = [ Track( id='1', name='', label='', created_at=now, expired_at=now, data_source_id=data_source.id, ttl_id=ttl_item.id ), Track( id='2', name='', label='', created_at=now, expired_at=now, data_source=data_source, ttl=ttl_item ), Track( id='3', name='', label='', created_at=now, expired_at=now, data_source=data_source, ttl=ttl_item ), ] for track in tracks: db.workflow_session.add(track) db.workflow_session.flush() # bind track and playlist for track in tracks: artist.tracks.append(track) db.workflow_session.flush() db.workflow_session.expire_all() found_artist = db.workflow_session.query(Artist).all() assert len(found_artist) == 1 db.workflow_session.expire_all() found_tracks = db.workflow_session.query(Track).all() assert len(found_tracks) == len(tracks) db.workflow_session.expire_all() found_artist = db.workflow_session.query(Artist).filter(Artist.id == artist.id).one() assert len(found_artist.tracks) == 3 # find artist by its track found_track = db.workflow_session.query(Track).filter(Track.id == '1').one() assert len(found_track.artists) == 1