Files
matrix-backend/tests/helpers/testSetup.ts
T

137 lines
4.2 KiB
TypeScript

import express, { Router } from "express";
import { vi, type Mocked } from "vitest";
import { UserService } from "../../src/services/db/UserService";
import { PasswordUtils } from "../../src/utils/passwordUtils";
export const defaultMockPayload = {
uuid: "test-user-uuid",
username: "testuser",
id: "test-user-id",
};
/**
* Definiert die Struktur des zurückgegebenen Test-Environments für Typsicherheit.
*/
export interface TestEnvironment {
app: express.Application;
mockUserService: ReturnType<typeof createMockUserService>;
mockPasswordUtils: Mocked<typeof PasswordUtils>;
}
/**
* Erstellt eine Express-App für Testzwecke.
* - Fügt JSON-Parsing-Middleware hinzu.
* - Fügt eine Mock-Authentifizierungs-Middleware hinzu, die eine Payload an die Anfrage anhängt.
* - Bindet den übergebenen Router an einen Basispfad.
* @param router Der zu testende Express-Router.
* @param basePath Der Basispfad, unter dem der Router erreichbar sein soll (z.B. "/user").
* @param payload Die zu simulierende Benutzer-Payload. Standardmäßig wird defaultMockPayload verwendet.
* @returns Eine konfigurierte Express-App-Instanz.
*/
export const createTestApp = (router: Router, basePath: string, payload: object = defaultMockPayload) => {
const app = express();
app.use(express.json());
app.use((req: any, res, next) => {
req.payload = payload;
next();
});
app.use(basePath, router);
return app;
};
/**
* Erstellt ein Mock-Objekt für den UserService mit allen Methoden als vi.fn().
* @returns Ein Mock-UserService-Objekt.
*/
export const createMockUserService = () => ({
getAllUsers: vi.fn(),
getUserByUUID: vi.fn(),
getUserById: vi.fn(),
updateUserById: vi.fn(),
getUserByName: vi.fn(),
getSpotifyConfigByUUID: vi.fn(),
clearSpotifyConfigByUUID: vi.fn(),
existsUserByName: vi.fn(),
createUser: vi.fn(),
getUserAuthByName: vi.fn(),
updateUserByUUID: vi.fn(),
});
/**
* Initialisiert die gesamte Testumgebung für einen Controller-Test.
* Erstellt Mocks, eine Test-App und verbindet alles miteinander.
* @param router Der spezifische Router, der getestet werden soll.
* @param basePath Der Basispfad für den Router (z.B. "/user").
* @returns Ein Objekt mit der konfigurierten App und allen Mock-Instanzen.
*/
export const setupTestEnvironment = (router: Router, basePath: string): TestEnvironment => {
const mockUserService = createMockUserService();
vi.mocked(UserService.create).mockResolvedValue(mockUserService);
const mockPasswordUtils = vi.mocked(PasswordUtils);
const app = createTestApp(router, basePath);
return { app, mockUserService, mockPasswordUtils };
};
/**
* Erstellt ein Mock-Objekt für den ExtendedWebSocketServer.
* @returns Ein Mock-WebSocketServer-Objekt.
*/
export const createMockWebSocketServer = () => ({
broadcast: vi.fn(),
sendMessageToUser: vi.fn(),
getConnectedClients: vi.fn(),
});
/**
* Erstellt eine "öffentliche" Express-App für Tests, ohne Mock-Authentifizierung.
* Ideal für Login-, Register- oder andere öffentliche Routen.
* @param router Der zu testende Router.
* @param basePath Der Basispfad für den Router.
* @returns Eine konfigurierte Express-App.
*/
export const createPublicTestApp = (router: Router, basePath: string) => {
const app = express();
app.use(express.json());
app.use(basePath, router);
return app;
};
/**
* Erstellt ein Mock-Objekt für den JwtAuthenticator.
*/
export const createMockJwtAuthenticator = () => ({
generateToken: vi.fn(),
verifyToken: vi.fn(),
});
/**
* Erstellt ein Mock-Objekt für den SpotifyTokenService.
*/
export const createMockSpotifyTokenService = () => ({
refreshToken: vi.fn(),
generateToken: vi.fn(),
});
export const createMockSpotifyApiService = () => ({
getCurrentlyPlaying: vi.fn(),
});
export const createMockSpotifyPollingService = () => ({
startPollingForUser: vi.fn(),
stopPollingForUser: vi.fn(),
});
export const createMockS3Service = () => ({
ensureBucketExists: vi.fn(),
uploadFile: vi.fn(),
listFilesForUser: vi.fn(),
deleteFile: vi.fn(),
getSignedDownloadUrl: vi.fn(),
isFileDuplicate: vi.fn(),
});