fix(api): ON DELETE CASCADE for todos
- Delete todos when the user associated with it are deleted - Updated tests to reflect new changes
This commit is contained in:
parent
4bafc48078
commit
fbba4d6d43
@ -56,7 +56,7 @@ def migrate() -> None:
|
||||
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
|
||||
complete BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
due TIMESTAMPTZ,
|
||||
member_id INT NOT NULL REFERENCES members(id),
|
||||
member_id INT NOT NULL REFERENCES members(id) ON DELETE CASCADE,
|
||||
task TEXT NOT NULL
|
||||
)"""
|
||||
)
|
||||
|
@ -29,7 +29,6 @@ def generate_test_data() -> None:
|
||||
dbname=dbname, user=user_name, password=password, host=host, port=port
|
||||
) as conn:
|
||||
with conn.cursor() as cur:
|
||||
# create the members table
|
||||
cur.execute(
|
||||
sql.SQL(
|
||||
"""
|
||||
@ -40,6 +39,16 @@ def generate_test_data() -> None:
|
||||
)
|
||||
)
|
||||
|
||||
cur.execute(
|
||||
sql.SQL(
|
||||
"""
|
||||
INSERT INTO members (email, password_hash)
|
||||
VALUES ('member1@todo.test',
|
||||
'$2b$14$6yXjNza30kPCg3LhzZJfqeCWOLM.zyTiQFD4rdWlFHBTfYzzKJMJe')
|
||||
"""
|
||||
)
|
||||
)
|
||||
|
||||
cur.execute(
|
||||
sql.SQL(
|
||||
"""
|
||||
@ -67,6 +76,23 @@ def generate_test_data() -> None:
|
||||
)
|
||||
)
|
||||
|
||||
cur.execute(
|
||||
sql.SQL(
|
||||
"""
|
||||
INSERT INTO todos (member_id, task)
|
||||
VALUES (2, 'Test Task 4')
|
||||
"""
|
||||
)
|
||||
)
|
||||
|
||||
cur.execute(
|
||||
sql.SQL(
|
||||
"""
|
||||
INSERT INTO todos (member_id, task)
|
||||
VALUES (2, 'Test Task 5')
|
||||
"""
|
||||
)
|
||||
)
|
||||
# Commit the changes
|
||||
conn.commit()
|
||||
|
||||
|
@ -137,3 +137,27 @@ async def update_member_email_verified(db: AsyncConnectionPool, id: int) -> bool
|
||||
)
|
||||
|
||||
return curr.rowcount > 0
|
||||
|
||||
|
||||
async def delete_member(db: AsyncConnectionPool, id: int) -> bool:
|
||||
"""
|
||||
Remove a member from the database
|
||||
Member's todos will also be deleted due to 'ON DELETE CASCADE' constraint
|
||||
|
||||
Return True if deletion was successful or False if not
|
||||
"""
|
||||
|
||||
async with db.connection() as conn:
|
||||
async with conn.cursor(row_factory=class_row(Member)) as curr:
|
||||
query = sql.SQL(
|
||||
"""
|
||||
DELETE FROM members
|
||||
WHERE id = (%s)
|
||||
"""
|
||||
)
|
||||
await curr.execute(
|
||||
query,
|
||||
(id,),
|
||||
)
|
||||
|
||||
return curr.rowcount > 0
|
||||
|
@ -2,6 +2,7 @@ import pytest
|
||||
from psycopg.errors import UniqueViolation
|
||||
|
||||
from src.neo_neo_todo.models.member import (
|
||||
delete_member,
|
||||
insert_member,
|
||||
select_member_by_email,
|
||||
select_member_by_id,
|
||||
@ -27,7 +28,7 @@ async def test_model_member_insert(db_pool):
|
||||
db_pool, "member_inserted@todo.test", "alkasdjfhasldkfjh12341238989"
|
||||
)
|
||||
assert member is not None
|
||||
assert member.id == 2
|
||||
assert member.id == 3
|
||||
assert member.email == "member_inserted@todo.test"
|
||||
assert member.password_hash == "alkasdjfhasldkfjh12341238989"
|
||||
|
||||
@ -63,3 +64,13 @@ async def test_model_member_email_verified(db_pool):
|
||||
)
|
||||
|
||||
assert update_member_email_verified_fail is False
|
||||
|
||||
|
||||
async def test_model_member_delete_member(db_pool):
|
||||
deletion_success = await delete_member(db_pool, id=2)
|
||||
|
||||
assert deletion_success
|
||||
|
||||
deletion_fail = await delete_member(db_pool, id=99)
|
||||
|
||||
assert not deletion_fail
|
||||
|
Loading…
x
Reference in New Issue
Block a user