@jam_owner_only
 def delete(jamid):
     # Delete a jam, redirect to the jams list
+
+    # First delete all events
+    events = db.query("SELECT * FROM jam_events WHERE jamid = ?", [jamid])
+    for event in events:
+        events_delete(jamid, event["eventid"])
+
     row = db.query(
             "DELETE FROM jams WHERE jamid = ? RETURNING *",
             [jamid], expect_one=True)
 @jam_owner_only
 def events_delete(jamid, eventid):
     # Delete an event, redirect to list of all events
+    db.query("UPDATE songs SET eventid = NULL WHERE eventid = ?", [eventid])
     db.query(
             """
             DELETE FROM jam_events
             WHERE eventid = ? AND jamid = ?
             RETURNING *
             """, [eventid, jamid], expect_one=True)
+    db.commit()
     return redirect(url_for("jams.jam", jamid=jamid))
 
 
 
     response = client.get(f"/jams/{jam}")
     assert response.status_code == 404
 
+def test_delete_jam_with_event_and_song(client, user, jam, event):
+    client.post(
+            f"/jams/{jam}/events/{event}/update",
+            data=_get_event_data(startdate=yesterday, enddate=tomorrow))
+    upload_song(client, b"Success", eventid=event)
+
+    response = client.get(f"/jams/{jam}/delete", follow_redirects=True)
+    assert response.request.path == f"/jams"
+    assert b"New Jam" not in response.data
+    assert b"Event Title" not in response.data
+    assert b"[Upcoming Event]" not in response.data
+
 def test_delete_jam_not_logged_in(client):
     response = client.get("/jams/1/delete", follow_redirects=True)
     assert response.request.path == "/login"
     response = client.get(f"/jams/{jam}/events/{event}/delete", follow_redirects=True)
     assert response.request.path == f"/jams/{jam}"
     assert b"Event Title" not in response.data
+    assert b"[Upcoming Event]" not in response.data
+
+def test_delete_event_with_song(client, user, jam, event):
+    client.post(
+            f"/jams/{jam}/events/{event}/update",
+            data=_get_event_data(startdate=yesterday, enddate=tomorrow))
+    upload_song(client, b"Success", eventid=event)
+
+    response = client.get(f"/jams/{jam}/events/{event}/delete", follow_redirects=True)
+    assert response.request.path == f"/jams/{jam}"
+    assert b"Event Title" not in response.data
+    assert b"[Upcoming Event]" not in response.data
 
 def test_delete_event_not_logged_in(client, user, jam, event):
     client.get("/logout")