]> littlesong.place Git - littlesongplace.git/commitdiff
Implement jam delete
authorChris Fulljames <christianfulljames@gmail.com>
Sat, 12 Apr 2025 12:19:48 +0000 (08:19 -0400)
committerChris Fulljames <christianfulljames@gmail.com>
Sat, 12 Apr 2025 12:19:48 +0000 (08:19 -0400)
src/littlesongplace/db.py
src/littlesongplace/jams.py
test/test_jams.py

index d4e1fb164455c14d6375c95841cf4639ad294a1c..ec1ebad111f272904489cee6cbd7e021efaed155 100644 (file)
@@ -2,7 +2,7 @@ import sqlite3
 from pathlib import Path
 
 import click
-from flask import g, current_app
+from flask import abort, g, current_app
 
 from . import datadir
 
@@ -31,11 +31,14 @@ def close(exception):
     if db is not None:
         db.close()
 
-def query(query, args=(), one=False):
+def query(query, args=(), one=False, expect_one=False):
     cur = get().execute(query, args)
     rv = cur.fetchall()
     cur.close()
-    return (rv[0] if rv else None) if one else rv
+    if expect_one and not rv:
+        abort(404)  # Not found
+
+    return (rv[0] if rv else None) if (one or expect_one) else rv
 
 def commit():
     get().commit()
index dd03ab762f909e2c652d96f83a251fa7ffead86f..71cbc42d697d21e0b4db4e68bc1e8e8912d06585 100644 (file)
@@ -1,7 +1,7 @@
 from dataclasses import dataclass
 from datetime import datetime, timezone
 
-from flask import Blueprint, g, redirect, render_template, request, url_for
+from flask import abort, Blueprint, g, redirect, render_template, request, url_for
 
 from . import auth, db
 from .sanitize import sanitize_user_text
@@ -26,7 +26,7 @@ def create():
             """, [g.userid, timestamp, f"New Jam"], one=True)
     db.commit()
     jamid = row["jamid"]
-    return redirect(url_for('jams.jam', jamid=jamid))
+    return redirect(url_for("jams.jam", jamid=jamid))
 
 @bp.get("/<int:jamid>")
 def jam(jamid):
@@ -35,8 +35,8 @@ def jam(jamid):
             SELECT * FROM jams
             INNER JOIN users ON jams.ownerid = users.userid
             WHERE jamid = ?
-            """, [jamid], one=True)
-    print(type(jamid), row)
+            """, [jamid], expect_one=True)
+
     jam = Jam.from_row(row)
     # Show the main jam page
     return render_template("jam.html", jam=jam)
@@ -47,20 +47,27 @@ def update(jamid):
     # Update a jam with the new form data, redirect to view page
     title = request.form["title"]
     description = request.form["description"]
-    db.query(
+    row = db.query(
             """
             UPDATE jams
             SET title = ?, description = ?
             WHERE jamid = ?
-            """, [title, description, jamid])
+            RETURNING *
+            """, [title, description, jamid], expect_one=True)
+
     db.commit()
-    return redirect(url_for('jams.jam', jamid=jamid))
+    return redirect(url_for("jams.jam", jamid=jamid))
 
 @bp.get("/<int:jamid>/delete")
 @auth.requires_login
 def delete(jamid):
     # Delete a jam, redirect to the jams list
-    ...
+    row = db.query(
+            "DELETE FROM jams WHERE jamid = ? RETURNING *",
+            [jamid], expect_one=True)
+
+    db.commit()
+    return redirect(url_for("jams.jams"))
 
 @bp.get("/<int:jamid>/events")
 def events(jamid):
index 6d361ef937373516ca6a9c534175250f9ef71471..cda7c96c6a1fffc119871433416b5c2987559ddb 100644 (file)
@@ -12,6 +12,10 @@ def jam(client):
     client.get("/jams/create")
     return 1
 
+def test_view_invalid_jam(client):
+    response = client.get("/jams/1")
+    assert response.status_code == 404
+
 def test_create_jam(client, user):
     response = client.get("/jams/create", follow_redirects=True)
     assert response.status_code == 200
@@ -29,3 +33,20 @@ def test_update_jam(client, user, jam):
     assert b"Coolest Jam" in response.data
     assert b"pb and jam" in response.data
 
+def test_update_invalid_jam(client, user):
+    response = client.post(
+            "/jams/1/update",
+            data={"title": "Coolest Jam", "description": "pb and jam"})
+    assert response.status_code == 404
+
+def test_delete_jam(client, user, jam):
+    response = client.get(f"/jams/{jam}/delete", follow_redirects=True)
+    assert response.request.path == "/jams/"
+    assert b"New Jam" not in response.data
+
+    response = client.get(f"/jams/{jam}")
+    assert response.status_code == 404
+
+def test_delete_invalid_jam(client, user):
+    response = client.get("/jams/1/delete")
+    assert response.status_code == 404