Initial Commit

slip slop
This commit is contained in:
Ian Keane 2026-06-09 15:07:08 -04:00
commit 064e672ab7
61 changed files with 3504 additions and 0 deletions

133
tests/test_sub.py Normal file
View file

@ -0,0 +1,133 @@
"""Tests for notes, references, and musicians sub-resource endpoints."""
from tests.conftest import AUTH
def make_tune(client):
r = client.post("/tunes/", json={"name": "Sub Test Tune", "key": "G"}, headers=AUTH)
assert r.status_code == 201
return r.get_json()
def make_musician(client, name="Doc Watson"):
r = client.post("/musicians/", json={"name": name}, headers=AUTH)
assert r.status_code == 201
return r.get_json()
# ── Notes ──────────────────────────────────────────────────────
class TestNotes:
def test_add_note(self, client):
tune = make_tune(client)
r = client.post(f'/tunes/{tune["id"]}/notes',
json={"note": "remember the B part"}, headers=AUTH)
assert r.status_code == 201
assert r.get_json()["note"] == "remember the B part"
def test_list_notes(self, client):
tune = make_tune(client)
client.post(f'/tunes/{tune["id"]}/notes', json={"note": "note 1"}, headers=AUTH)
client.post(f'/tunes/{tune["id"]}/notes', json={"note": "note 2"}, headers=AUTH)
r = client.get(f'/tunes/{tune["id"]}/notes', headers=AUTH)
assert len(r.get_json()) == 2
def test_update_note(self, client):
tune = make_tune(client)
note = client.post(f'/tunes/{tune["id"]}/notes',
json={"note": "old"}, headers=AUTH).get_json()
r = client.patch(f'/tunes/{tune["id"]}/notes/{note["id"]}',
json={"note": "new"}, headers=AUTH)
assert r.get_json()["note"] == "new"
def test_delete_note(self, client):
tune = make_tune(client)
note = client.post(f'/tunes/{tune["id"]}/notes',
json={"note": "to delete"}, headers=AUTH).get_json()
r = client.delete(f'/tunes/{tune["id"]}/notes/{note["id"]}', headers=AUTH)
assert r.status_code == 200
def test_note_on_missing_tune_returns_404(self, client):
r = client.post("/tunes/99999/notes", json={"note": "x"}, headers=AUTH)
assert r.status_code == 404
# ── References ────────────────────────────────────────────────
class TestReferences:
def test_add_reference(self, client):
tune = make_tune(client)
r = client.post(f'/tunes/{tune["id"]}/references',
json={"link": "https://youtube.com/abc", "site": "YouTube"},
headers=AUTH)
assert r.status_code == 201
assert r.get_json()["musicians"] == []
def test_add_reference_with_musicians(self, client):
tune = make_tune(client)
m1 = make_musician(client, "Doc Watson")
m2 = make_musician(client, "Merle Watson")
r = client.post(f'/tunes/{tune["id"]}/references',
json={"link": "https://example.com", "site": "YouTube",
"musicians": [{"id": m1["id"]}, {"id": m2["id"]}]},
headers=AUTH)
assert r.status_code == 201
names = [m["name"] for m in r.get_json()["musicians"]]
assert "Doc Watson" in names
assert "Merle Watson" in names
def test_list_references(self, client):
tune = make_tune(client)
client.post(f'/tunes/{tune["id"]}/references',
json={"link": "https://a.com"}, headers=AUTH)
client.post(f'/tunes/{tune["id"]}/references',
json={"link": "https://b.com"}, headers=AUTH)
r = client.get(f'/tunes/{tune["id"]}/references', headers=AUTH)
assert len(r.get_json()) == 2
def test_update_reference(self, client):
tune = make_tune(client)
ref = client.post(f'/tunes/{tune["id"]}/references',
json={"link": "https://old.com", "site": "Old"},
headers=AUTH).get_json()
r = client.patch(f'/tunes/{tune["id"]}/references/{ref["id"]}',
json={"site": "New"}, headers=AUTH)
assert r.get_json()["site"] == "New"
def test_delete_reference(self, client):
tune = make_tune(client)
ref = client.post(f'/tunes/{tune["id"]}/references',
json={"link": "https://del.com"}, headers=AUTH).get_json()
r = client.delete(f'/tunes/{tune["id"]}/references/{ref["id"]}', headers=AUTH)
assert r.status_code == 200
# ── Musicians on references ───────────────────────────────────
class TestReferenceMusicians:
def _make_ref(self, client, tune_id):
r = client.post(f'/tunes/{tune_id}/references',
json={"link": "https://example.com"}, headers=AUTH)
return r.get_json()
def test_add_musician_to_reference(self, client):
tune = make_tune(client)
ref = self._make_ref(client, tune["id"])
m = make_musician(client, "Tony Rice")
r = client.post(f'/tunes/{tune["id"]}/references/{ref["id"]}/musicians',
json={"musician_id": m["id"]}, headers=AUTH)
assert r.status_code == 200
names = [x["name"] for x in r.get_json()["musicians"]]
assert "Tony Rice" in names
def test_remove_musician_from_reference(self, client):
tune = make_tune(client)
m = make_musician(client, "Tony Rice")
ref = self._make_ref(client, tune["id"])
# add musician via the join endpoint
client.post(f'/tunes/{tune["id"]}/references/{ref["id"]}/musicians',
json={"musician_id": m["id"]}, headers=AUTH)
r = client.delete(
f'/tunes/{tune["id"]}/references/{ref["id"]}/musicians/{m["id"]}',
headers=AUTH)
assert r.status_code == 200
assert r.get_json()["musicians"] == []