from __future__ import annotations from fastapi.testclient import TestClient def test_groups_lifecycle_and_members(test_client: TestClient): # 1. List groups list_res = test_client.get("/api/v1/groups") assert list_res.status_code == 200 groups = list_res.json() assert len(groups) > 0 # 2. Create group res = test_client.post("/api/v1/groups", json={"name": "Family & Home"}) assert res.status_code == 201 group = res.json() group_id = group["id"] assert group["name"] == "Family & Home" assert "alex@example.com" in group["memberEmails"] # 3. Get group get_res = test_client.get(f"/api/v1/groups/{group_id}") assert get_res.status_code == 200 assert get_res.json()["name"] == "Family & Home" # 4. Add member member_res = test_client.post( f"/api/v1/groups/{group_id}/members", json={"email": "jordan@example.com"}, ) assert member_res.status_code == 200 assert "jordan@example.com" in member_res.json()["memberEmails"] # 5. Remove member rem_res = test_client.delete(f"/api/v1/groups/{group_id}/members/jordan@example.com") assert rem_res.status_code == 200 assert "jordan@example.com" not in rem_res.json()["memberEmails"] # 6. Delete group del_res = test_client.delete(f"/api/v1/groups/{group_id}") assert del_res.status_code == 204 # 7. Check not found assert test_client.get(f"/api/v1/groups/{group_id}").status_code == 404 def test_owner_cannot_leave_group(test_client: TestClient): # user_alex is owner of group_home res = test_client.post("/api/v1/groups/group_home/leave") assert res.status_code == 400 assert "error" in res.json() def test_groups_not_found_errors(test_client: TestClient): assert test_client.get("/api/v1/groups/unknown-id").status_code == 404 assert test_client.delete("/api/v1/groups/unknown-id").status_code == 404 assert test_client.post("/api/v1/groups/unknown-id/members", json={"email": "a@b.com"}).status_code == 404 assert test_client.delete("/api/v1/groups/unknown-id/members/a@b.com").status_code == 404 assert test_client.post("/api/v1/groups/unknown-id/leave").status_code == 404