lootsa tests fixes
All checks were successful
Deploy to Web Server flyer-crawler.projectium.com / deploy (push) Successful in 4m31s

This commit is contained in:
2025-12-05 16:21:01 -08:00
parent 88b3b0fe95
commit 0a1cddd1f7
9 changed files with 31 additions and 9 deletions

View File

@@ -56,6 +56,8 @@ describe('App Component', () => {
// Default mocks for API calls
// Use mockImplementation to create a new Response object for each call,
// preventing "Body has already been read" errors.
// Use mockImplementation to create a new Response object for each call,
// preventing "Body has already been read" errors.
mockedApiClient.fetchFlyers.mockImplementation(() => Promise.resolve(new Response(JSON.stringify([]))));
mockedApiClient.fetchMasterItems.mockImplementation(() => Promise.resolve(new Response(JSON.stringify([]))));
mockedApiClient.fetchWatchedItems.mockImplementation(() => Promise.resolve(new Response(JSON.stringify([]))));

View File

@@ -268,9 +268,9 @@ describe('SystemCheck', () => {
await waitFor(() => {
// Instead of test-ids, we check for the result: the icon's color class.
// This is more robust as it doesn't depend on the icon component's internal props.
const passIcons = container.querySelectorAll('svg.text-green-500'); // Redis check is now passing
// All 8 checks should pass in this scenario, but one is mocked to fail.
expect(passIcons.length).toBe(7); // This was correct, the error was likely a red herring from other failing tests.
const passIcons = container.querySelectorAll('svg.text-green-500');
// All 8 checks run, but we've mocked one to fail, so we expect 7 to pass.
expect(passIcons.length).toBe(7);
// Check for the fail icon's color class
const failIcon = container.querySelector('svg.text-red-500');

View File

@@ -61,6 +61,7 @@ vi.mock('@bull-board/api', () => ({
}));
vi.mock('@bull-board/express', () => ({
// Mock the ExpressAdapter as a class since the code uses `new ExpressAdapter()`.
// This structure ensures that `new ExpressAdapter()` works correctly in the test environment.
ExpressAdapter: class MockExpressAdapter {
setBasePath() {}
getRouter() {

View File

@@ -1,5 +1,5 @@
// src/routes/ai.test.ts
import { describe, it, expect, vi, beforeEach, type Mocked } from 'vitest';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import supertest from 'supertest';
import express, { type Request, type Response, type NextFunction } from 'express';
import path from 'node:path';
@@ -12,8 +12,14 @@ import * as adminDb from '../services/db/admin.db';
vi.mock('../services/aiService.server');
// Mock the specific DB modules used by the AI router.
vi.mock('../services/db/flyer.db');
vi.mock('../services/db/admin.db');
vi.mock('../services/db/flyer.db', () => ({
findFlyerByChecksum: vi.fn(),
createFlyerAndItems: vi.fn(),
getFlyerById: vi.fn(), // Needed for cleanup worker
}));
vi.mock('../services/db/admin.db', () => ({
logActivity: vi.fn(),
}));
// Mock the logger to keep test output clean
vi.mock('../services/logger.server', () => ({

View File

@@ -1,5 +1,5 @@
// src/routes/auth.test.ts
import { describe, it, expect, vi, beforeEach, type Mocked } from 'vitest';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import supertest from 'supertest';
import express, { Request } from 'express';
import cookieParser from 'cookie-parser';

View File

@@ -15,6 +15,11 @@ vi.mock('../services/db/budget.db', () => ({
deleteBudget: vi.fn(),
getSpendingByCategory: vi.fn(),
}));
// Although not directly used by budget routes, the passport middleware is,
// and it depends on user.db. We must mock the functions it uses.
vi.mock('../services/db/user.db', () => ({
findUserProfileById: vi.fn(),
}));
// Mock the logger to keep test output clean
vi.mock('../services/logger.server', () => ({

View File

@@ -1,7 +1,6 @@
// src/routes/passport.test.ts
import { describe, it, expect, vi, beforeEach, type Mocked } from 'vitest';
import { Request, Response, NextFunction } from 'express';
import { Profile } from '../types';
// Define a type for the JWT verify callback function for type safety.
type VerifyCallback = (payload: { user_id: string }, done: (error: Error | null, user?: object | false) => void) => Promise<void>;
@@ -33,8 +32,15 @@ import { UserProfile } from '../types';
// Mock dependencies before importing the passport configuration
vi.mock('../services/db/index.db', () => ({
// Functions used by the LocalStrategy
findUserByEmail: vi.fn(),
incrementFailedLoginAttempts: vi.fn(),
resetFailedLoginAttempts: vi.fn(),
logActivity: vi.fn(),
// Function used by the JwtStrategy
findUserProfileById: vi.fn(),
}));
const mockedDb = db as Mocked<typeof db>;
vi.mock('../services/logger.server', () => ({

View File

@@ -19,6 +19,8 @@ vi.mock('child_process', () => {
});
return {
exec: execMock,
// Also provide a default export to prevent "No 'default' export" errors.
default: { exec: execMock },
};
});

View File

@@ -63,7 +63,7 @@ describe('Email Service (Server)', () => {
expect(mailOptions.to).toBe(to);
expect(mailOptions.subject).toBe('Your Password Reset Request');
expect(mailOptions.text).toContain(resetLink);
expect(mailOptions.html).toContain(`href="${resetLink}"`);
expect(mailOptions.html).toContain(resetLink);
});
});