"""Integration tests for song and version endpoints.""" import pytest from tests.factories import create_audio_version, create_band, create_member, create_song @pytest.mark.asyncio @pytest.mark.integration async def test_create_song(client, db_session, auth_headers_for, current_member): band = await create_band(db_session, creator_id=current_member.id) await db_session.commit() headers = await auth_headers_for(current_member) resp = await client.post( f"/api/v1/bands/{band.id}/songs", json={"title": "New Song", "status": "jam"}, headers=headers, ) assert resp.status_code == 201, resp.text data = resp.json() assert data["title"] == "New Song" assert data["status"] == "jam" assert data["band_id"] == str(band.id) @pytest.mark.asyncio @pytest.mark.integration async def test_list_songs(client, db_session, auth_headers_for, current_member): band = await create_band(db_session, creator_id=current_member.id) await create_song(db_session, band_id=band.id, title="Song 1") await create_song(db_session, band_id=band.id, title="Song 2") await db_session.commit() headers = await auth_headers_for(current_member) resp = await client.get(f"/api/v1/bands/{band.id}/songs", headers=headers) assert resp.status_code == 200 data = resp.json() assert len(data) == 2 titles = {s["title"] for s in data} assert "Song 1" in titles assert "Song 2" in titles @pytest.mark.asyncio @pytest.mark.integration async def test_create_version_increments_version_number(client, db_session, auth_headers_for, current_member): band = await create_band(db_session, creator_id=current_member.id) song = await create_song(db_session, band_id=band.id, creator_id=current_member.id) await db_session.commit() headers = await auth_headers_for(current_member) resp1 = await client.post( f"/api/v1/songs/{song.id}/versions", json={"nc_file_path": "/bands/test/songs/song/v1.wav", "nc_file_etag": "etag1"}, headers=headers, ) assert resp1.status_code == 201 assert resp1.json()["version_number"] == 1 resp2 = await client.post( f"/api/v1/songs/{song.id}/versions", json={"nc_file_path": "/bands/test/songs/song/v2.wav", "nc_file_etag": "etag2"}, headers=headers, ) assert resp2.status_code == 201 assert resp2.json()["version_number"] == 2 @pytest.mark.asyncio @pytest.mark.integration async def test_list_versions(client, db_session, auth_headers_for, current_member): band = await create_band(db_session, creator_id=current_member.id) song = await create_song(db_session, band_id=band.id, creator_id=current_member.id) await create_audio_version(db_session, song_id=song.id, version_number=1) await create_audio_version(db_session, song_id=song.id, version_number=2) await db_session.commit() headers = await auth_headers_for(current_member) resp = await client.get(f"/api/v1/songs/{song.id}/versions", headers=headers) assert resp.status_code == 200 data = resp.json() assert len(data) == 2 @pytest.mark.asyncio @pytest.mark.integration async def test_non_member_cannot_create_song(client, db_session, auth_headers_for, current_member): other = await create_member(db_session, email="other2@test.com") band = await create_band(db_session, creator_id=other.id) await db_session.commit() headers = await auth_headers_for(current_member) resp = await client.post( f"/api/v1/bands/{band.id}/songs", json={"title": "Intruder Song", "status": "jam"}, headers=headers, ) assert resp.status_code == 403