feat: add account deletion feature (#85)
* feat: add account deletion feature - Add DELETE /auth/me endpoint to delete user account and all data - Add deleteAccount() method to AuthContext - Add Delete Account button with confirmation modal in UserProfile - Add danger zone styling (.btn-danger, .profile-danger-zone) - Add i18n translations for EN and DE - Add backend tests for account deletion endpoint - Add timeout settings to frontend vitest.config.ts - Reduce CI timeout for frontend tests (10min -> 5min) * fix: improve delete account section layout - Make profile modal scrollable with max-height - Add proper horizontal margin to danger zone - Align delete section with form content * fix: use ConfirmModal component for delete account dialog - Replace inline modal with existing ConfirmModal component - Ensures consistent button styling across all modals - Add UI consistency rule to AGENTS.md and copilot-instructions.md * fix: consistent styling for delete account section - Remove warning text (users know what delete means) - Remove border-bottom from danger zone title (section has border-top) - Update copilot-instructions and AGENTS.md with stricter UI consistency rules - Remove unused deleteAccountHint i18n keys * chore: remove pre-push test hook (CI handles tests) Tests were running twice - in pre-push hook and GitHub CI. Removing local pre-push tests since CI provides authoritative test results. Use 'npm test' manually before pushing if you want local feedback.
This commit is contained in:
@@ -682,4 +682,62 @@ describe("Auth Routes (AUTH_ENABLED=true)", () => {
|
||||
expect(response.statusCode).toBe(401);
|
||||
});
|
||||
});
|
||||
|
||||
describe("DELETE /auth/me - Delete Account", () => {
|
||||
it("should delete user account and all data", async () => {
|
||||
// Register and login
|
||||
await app.inject({
|
||||
method: "POST",
|
||||
url: "/auth/register",
|
||||
payload: {
|
||||
username: "deleteuser",
|
||||
password: "TestPassword123",
|
||||
},
|
||||
});
|
||||
|
||||
const login = await app.inject({
|
||||
method: "POST",
|
||||
url: "/auth/login",
|
||||
payload: {
|
||||
username: "deleteuser",
|
||||
password: "TestPassword123",
|
||||
},
|
||||
});
|
||||
|
||||
const accessToken = login.cookies.find((c: any) => c.name === "access_token");
|
||||
|
||||
// Delete account
|
||||
const response = await app.inject({
|
||||
method: "DELETE",
|
||||
url: "/auth/me",
|
||||
cookies: {
|
||||
access_token: accessToken?.value ?? "",
|
||||
},
|
||||
});
|
||||
|
||||
expect(response.statusCode).toBe(200);
|
||||
expect(response.json().ok).toBe(true);
|
||||
|
||||
// Verify can't login anymore
|
||||
const loginAgain = await app.inject({
|
||||
method: "POST",
|
||||
url: "/auth/login",
|
||||
payload: {
|
||||
username: "deleteuser",
|
||||
password: "TestPassword123",
|
||||
},
|
||||
});
|
||||
|
||||
expect(loginAgain.statusCode).toBe(401);
|
||||
});
|
||||
|
||||
it("should reject delete without auth", async () => {
|
||||
const response = await app.inject({
|
||||
method: "DELETE",
|
||||
url: "/auth/me",
|
||||
});
|
||||
|
||||
expect(response.statusCode).toBe(401);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user