fix tests + flyer upload (anon)

This commit is contained in:
2025-12-30 14:38:11 -08:00
parent 728b1a20d3
commit 1f1c0fa6f3
23 changed files with 1599 additions and 98 deletions

View File

@@ -6,6 +6,7 @@ import { logger } from '../../services/logger.server';
import { getPool } from '../../services/db/connection.db';
import type { UserProfile, MasterGroceryItem, ShoppingList } from '../../types';
import { createAndLoginUser, TEST_PASSWORD } from '../utils/testHelpers';
import { cleanupDb } from '../utils/cleanup';
/**
* @vitest-environment node
@@ -16,6 +17,7 @@ const request = supertest(app);
describe('User API Routes Integration Tests', () => {
let testUser: UserProfile;
let authToken: string;
const createdUserIds: string[] = [];
// Before any tests run, create a new user and log them in.
// The token will be used for all subsequent API calls in this test suite.
@@ -24,28 +26,13 @@ describe('User API Routes Integration Tests', () => {
const { user, token } = await createAndLoginUser({ email, fullName: 'Test User', request });
testUser = user;
authToken = token;
createdUserIds.push(user.user.user_id);
});
// After all tests, clean up by deleting the created user.
// This now cleans up ALL users created by this test suite to prevent pollution.
afterAll(async () => {
const pool = getPool();
try {
// Find all users created during this test run by their email pattern.
const res = await pool.query(
"SELECT user_id FROM public.users WHERE email LIKE 'user-test-%' OR email LIKE 'delete-me-%' OR email LIKE 'reset-me-%'",
);
if (res.rows.length > 0) {
const userIds = res.rows.map((r) => r.user_id);
logger.debug(
`[user.integration.test.ts afterAll] Cleaning up ${userIds.length} test users...`,
);
// Use a direct DB query for cleanup, which is faster and more reliable than API calls.
await pool.query('DELETE FROM public.users WHERE user_id = ANY($1::uuid[])', [userIds]);
}
} catch (error) {
logger.error({ error }, 'Failed to clean up test users from database.');
}
await cleanupDb({ userIds: createdUserIds });
});
it('should fetch the authenticated user profile via GET /api/users/profile', async () => {
@@ -130,7 +117,8 @@ describe('User API Routes Integration Tests', () => {
it('should allow a user to delete their own account and then fail to log in', async () => {
// Arrange: Create a new, separate user just for this deletion test.
const deletionEmail = `delete-me-${Date.now()}@example.com`;
const { token: deletionToken } = await createAndLoginUser({ email: deletionEmail, request });
const { user: deletionUser, token: deletionToken } = await createAndLoginUser({ email: deletionEmail, request });
createdUserIds.push(deletionUser.user.user_id);
// Act: Call the delete endpoint with the correct password and token.
const response = await request
@@ -156,6 +144,7 @@ describe('User API Routes Integration Tests', () => {
// Arrange: Create a new user for the password reset flow.
const resetEmail = `reset-me-${Date.now()}@example.com`;
const { user: resetUser } = await createAndLoginUser({ email: resetEmail, request });
createdUserIds.push(resetUser.user.user_id);
// Act 1: Request a password reset. In our test environment, the token is returned in the response.
const resetRequestRawResponse = await request