TODO-app/tests/test_app.py
2025-12-16 20:02:55 +01:00

172 lines
5.2 KiB
Python

import os
import sys
import sqlite3
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
from app import create_app
# =====================================================
# Helpers
# =====================================================
def fetch_one(db_path: str, sql: str, params=()):
con = sqlite3.connect(db_path)
try:
return con.execute(sql, params).fetchone()
finally:
con.close()
def fetch_all(db_path: str, sql: str, params=()):
con = sqlite3.connect(db_path)
try:
return con.execute(sql, params).fetchall()
finally:
con.close()
# =====================================================
# Tests
# =====================================================
def test_dashboard_loads(tmp_path):
db_path = tmp_path / "test.db"
app = create_app({"TESTING": True, "DB_PATH": str(db_path)})
client = app.test_client()
resp = client.get("/dashboard")
assert resp.status_code == 200
def test_create_todo_inserts_row(tmp_path):
db_path = tmp_path / "test.db"
app = create_app({"TESTING": True, "DB_PATH": str(db_path)})
client = app.test_client()
resp = client.post(
"/todo/create",
data={"title": "Test", "description": "Desc", "status": "not-started"},
follow_redirects=True,
)
assert resp.status_code == 200
row = fetch_one(str(db_path), "SELECT title, description, status FROM todo")
assert row == ("Test", "Desc", "not-started")
def test_create_requires_fields(tmp_path):
db_path = tmp_path / "test.db"
app = create_app({"TESTING": True, "DB_PATH": str(db_path)})
client = app.test_client()
resp = client.post(
"/todo/create",
data={"title": "", "description": "", "status": "not-started"},
follow_redirects=True,
)
assert resp.status_code == 200
row = fetch_one(str(db_path), "SELECT COUNT(*) FROM todo")
assert row[0] == 0
def test_invalid_status_is_rejected_on_update(tmp_path):
db_path = tmp_path / "test.db"
app = create_app({"TESTING": True, "DB_PATH": str(db_path)})
client = app.test_client()
# skapa en todo
client.post("/todo/create", data={"title": "A", "description": "B", "status": "not-started"})
todo_id = fetch_one(str(db_path), "SELECT id FROM todo")[0]
resp = client.post(
f"/todo/{todo_id}/status",
data={"status": "hax-status"},
follow_redirects=True,
)
assert resp.status_code == 200
# status ska vara kvar som innan
status = fetch_one(str(db_path), "SELECT status FROM todo WHERE id=?", (todo_id,))[0]
assert status == "not-started"
def test_update_status_to_done(tmp_path):
db_path = tmp_path / "test.db"
app = create_app({"TESTING": True, "DB_PATH": str(db_path)})
client = app.test_client()
client.post("/todo/create", data={"title": "A", "description": "B", "status": "not-started"})
todo_id = fetch_one(str(db_path), "SELECT id FROM todo")[0]
resp = client.post(
f"/todo/{todo_id}/status",
data={"status": "done"},
follow_redirects=True,
)
assert resp.status_code == 200
status, edited = fetch_one(str(db_path), "SELECT status, edited FROM todo WHERE id=?", (todo_id,))
assert status == "done"
assert edited is not None
def test_delete_todo(tmp_path):
db_path = tmp_path / "test.db"
app = create_app({"TESTING": True, "DB_PATH": str(db_path)})
client = app.test_client()
client.post("/todo/create", data={"title": "A", "description": "B", "status": "not-started"})
todo_id = fetch_one(str(db_path), "SELECT id FROM todo")[0]
resp = client.post(
f"/todo/{todo_id}/delete",
follow_redirects=True,
)
assert resp.status_code == 200
row = fetch_one(str(db_path), "SELECT COUNT(*) FROM todo")
assert row[0] == 0
def test_dashboard_lists_created_todo(tmp_path):
db_path = tmp_path / "test.db"
app = create_app({"TESTING": True, "DB_PATH": str(db_path)})
client = app.test_client()
client.post("/todo/create", data={"title": "X", "description": "Y", "status": "not-started"})
resp = client.get("/dashboard")
assert resp.status_code == 200
assert b"X" in resp.data
assert b"Y" in resp.data
def test_create_invalid_status_defaults_to_not_started(tmp_path):
db_path = tmp_path / "test.db"
app = create_app({"TESTING": True, "DB_PATH": str(db_path)})
client = app.test_client()
client.post("/todo/create", data={"title": "T", "description": "D", "status": "weird"})
row = fetch_one(str(db_path), "SELECT status FROM todo")
assert row[0] == "not-started"
def test_delete_nonexistent_does_not_crash(tmp_path):
db_path = tmp_path / "test.db"
app = create_app({"TESTING": True, "DB_PATH": str(db_path)})
client = app.test_client()
resp = client.post("/todo/999/delete", follow_redirects=True)
assert resp.status_code == 200
def test_update_nonexistent_does_not_crash(tmp_path):
db_path = tmp_path / "test.db"
app = create_app({"TESTING": True, "DB_PATH": str(db_path)})
client = app.test_client()
resp = client.post("/todo/999/status", data={"status": "done"}, follow_redirects=True)
assert resp.status_code == 200