from datetime import datetime, timedelta, timezone import pytest from dapd_db_schema.schemas.workflow import Album, DataSource, Priority, Track, TTLPriority pytestmark = [pytest.mark.integration] @pytest.fixture def album(db) -> Album: now = datetime.now(tz=timezone.utc) data_source = db.workflow_session.query(DataSource) \ .filter(DataSource.name == 'spotify').one() ttl_priority_item = db.workflow_session.query(TTLPriority) \ .join(Priority, Priority.id == TTLPriority.priority_id) \ .filter(Priority.name == 'HIGH').one() ttl_item = ttl_priority_item.ttl album_item = Album( id='al.1', name='Black', label='Black', created_at=now, expired_at=now, ) album_item.data_source = data_source album_item.ttl = ttl_item db.workflow_session.add(album_item) db.workflow_session.flush() yield album_item db.workflow_session.delete(album_item) db.workflow_session.flush() def test_add_album(db, seed, album): results = db.workflow_session.query(Album).all() assert len(results) == 1 def test_update_album(db, seed, album): now = datetime.now(tz=timezone.utc) album = db.workflow_session.query(Album).filter(Album.id == album.id).one() updates = { 'name': 'White', 'label': 'White', 'expired_at': now + timedelta(minutes=album.ttl.ttl), 'is_removed': True, 'is_removed_expired_at': now + timedelta(days=2), } assert album.is_removed is not updates['is_removed'] assert album.is_removed_expired_at != updates['is_removed_expired_at'] album.name = updates['name'] album.label = updates['label'] album.expired_at = updates['expired_at'] album.is_removed = updates['is_removed'] album.is_removed_expired_at = updates['is_removed_expired_at'] db.workflow_session.add(album) db.workflow_session.flush() db.workflow_session.expire_all() results = db.workflow_session.query(Album).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_track_to_album(db, seed, album): now = datetime.now(tz=timezone.utc) data_source = db.workflow_session.query(DataSource) \ .filter(DataSource.name == 'spotify').one() ttl_priority_item = db.workflow_session.query(TTLPriority) \ .join(Priority, Priority.id == TTLPriority.priority_id) \ .filter(Priority.name == 'HIGH').one() ttl_item = ttl_priority_item.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: album.tracks.append(track) db.workflow_session.flush() db.workflow_session.add(album) db.workflow_session.flush() db.workflow_session.expire_all() found_albums = db.workflow_session.query(Album).all() assert len(found_albums) == 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_album = db.workflow_session.query(Album).filter(Album.id == album.id).one() assert len(found_album.tracks) == 3 # find playlist that have track found_track = db.workflow_session.query(Track).filter(Track.id == '1').one() assert len(found_track.albums) == 1