refactor: Enhance test setup and cleanup for file access control

- Introduced modelsToCleanup array to track models added during tests for proper cleanup.
- Updated afterAll hooks in test files to ensure all collections are cleared and only added models are deleted.
- Improved consistency in model initialization across test files.
- Added comments for clarity on cleanup processes and test data management.
This commit is contained in:
Danny Avila 2025-07-14 22:00:11 -04:00
parent 35c66b39c8
commit 2cf910351a
No known key found for this signature in database
GPG key ID: BF31EEB2C5CA0956
3 changed files with 67 additions and 12 deletions

View file

@ -12,6 +12,7 @@ let Agent;
let AclEntry; let AclEntry;
let User; let User;
let AccessRole; let AccessRole;
let modelsToCleanup = [];
describe('File Access Control', () => { describe('File Access Control', () => {
let mongoServer; let mongoServer;
@ -22,23 +23,39 @@ describe('File Access Control', () => {
await mongoose.connect(mongoUri); await mongoose.connect(mongoUri);
// Initialize all models // Initialize all models
createModels(mongoose); const models = createModels(mongoose);
// Track which models we're adding
modelsToCleanup = Object.keys(models);
// Register models on mongoose.models so methods can access them // Register models on mongoose.models so methods can access them
const models = require('~/db/models'); const dbModels = require('~/db/models');
Object.assign(mongoose.models, models); Object.assign(mongoose.models, dbModels);
File = models.File; File = dbModels.File;
Agent = models.Agent; Agent = dbModels.Agent;
AclEntry = models.AclEntry; AclEntry = dbModels.AclEntry;
User = models.User; User = dbModels.User;
AccessRole = models.AccessRole; AccessRole = dbModels.AccessRole;
// Seed default roles // Seed default roles
await seedDefaultRoles(); await seedDefaultRoles();
}); });
afterAll(async () => { afterAll(async () => {
// Clean up all collections before disconnecting
const collections = mongoose.connection.collections;
for (const key in collections) {
await collections[key].deleteMany({});
}
// Clear only the models we added
for (const modelName of modelsToCleanup) {
if (mongoose.models[modelName]) {
delete mongoose.models[modelName];
}
}
await mongoose.disconnect(); await mongoose.disconnect();
await mongoServer.stop(); await mongoServer.stop();
}); });
@ -48,6 +65,7 @@ describe('File Access Control', () => {
await Agent.deleteMany({}); await Agent.deleteMany({});
await AclEntry.deleteMany({}); await AclEntry.deleteMany({});
await User.deleteMany({}); await User.deleteMany({});
// Don't delete AccessRole as they are seeded defaults needed for tests
}); });
describe('hasAccessToFilesViaAgent', () => { describe('hasAccessToFilesViaAgent', () => {

View file

@ -2,8 +2,9 @@ const express = require('express');
const request = require('supertest'); const request = require('supertest');
const mongoose = require('mongoose'); const mongoose = require('mongoose');
const { v4: uuidv4 } = require('uuid'); const { v4: uuidv4 } = require('uuid');
const { createMethods } = require('@librechat/data-schemas'); const { PERMISSION_BITS } = require('librechat-data-provider');
const { MongoMemoryServer } = require('mongodb-memory-server'); const { MongoMemoryServer } = require('mongodb-memory-server');
const { createMethods } = require('@librechat/data-schemas');
const { createAgent } = require('~/models/Agent'); const { createAgent } = require('~/models/Agent');
const { createFile } = require('~/models/File'); const { createFile } = require('~/models/File');
@ -46,6 +47,7 @@ describe('File Routes - Agent Files Endpoint', () => {
let AclEntry; let AclEntry;
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
let AccessRole; let AccessRole;
let modelsToCleanup = [];
beforeAll(async () => { beforeAll(async () => {
mongoServer = await MongoMemoryServer.create(); mongoServer = await MongoMemoryServer.create();
@ -56,6 +58,9 @@ describe('File Routes - Agent Files Endpoint', () => {
const { createModels } = require('@librechat/data-schemas'); const { createModels } = require('@librechat/data-schemas');
const models = createModels(mongoose); const models = createModels(mongoose);
// Track which models we're adding
modelsToCleanup = Object.keys(models);
// Register models on mongoose.models so methods can access them // Register models on mongoose.models so methods can access them
Object.assign(mongoose.models, models); Object.assign(mongoose.models, models);
@ -86,15 +91,30 @@ describe('File Routes - Agent Files Endpoint', () => {
}); });
afterAll(async () => { afterAll(async () => {
// Clean up all collections before disconnecting
const collections = mongoose.connection.collections;
for (const key in collections) {
await collections[key].deleteMany({});
}
// Clear only the models we added
for (const modelName of modelsToCleanup) {
if (mongoose.models[modelName]) {
delete mongoose.models[modelName];
}
}
await mongoose.disconnect(); await mongoose.disconnect();
await mongoServer.stop(); await mongoServer.stop();
}); });
beforeEach(async () => { beforeEach(async () => {
// Clean up all test data
await File.deleteMany({}); await File.deleteMany({});
await Agent.deleteMany({}); await Agent.deleteMany({});
await User.deleteMany({}); await User.deleteMany({});
await AclEntry.deleteMany({}); await AclEntry.deleteMany({});
// Don't delete AccessRole as they are seeded defaults needed for tests
// Create test users // Create test users
authorId = new mongoose.Types.ObjectId(); authorId = new mongoose.Types.ObjectId();

View file

@ -61,11 +61,11 @@ describe('File Routes - Delete with Agent Access', () => {
let Agent; let Agent;
let AclEntry; let AclEntry;
let User; let User;
let AccessRole;
let methods; let methods;
let modelsToCleanup = [];
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
let agentId; let agentId;
// eslint-disable-next-line no-unused-vars
let AccessRole;
beforeAll(async () => { beforeAll(async () => {
mongoServer = await MongoMemoryServer.create(); mongoServer = await MongoMemoryServer.create();
@ -76,6 +76,9 @@ describe('File Routes - Delete with Agent Access', () => {
const { createModels } = require('@librechat/data-schemas'); const { createModels } = require('@librechat/data-schemas');
const models = createModels(mongoose); const models = createModels(mongoose);
// Track which models we're adding
modelsToCleanup = Object.keys(models);
// Register models on mongoose.models so methods can access them // Register models on mongoose.models so methods can access them
Object.assign(mongoose.models, models); Object.assign(mongoose.models, models);
@ -106,6 +109,19 @@ describe('File Routes - Delete with Agent Access', () => {
}); });
afterAll(async () => { afterAll(async () => {
// Clean up all collections before disconnecting
const collections = mongoose.connection.collections;
for (const key in collections) {
await collections[key].deleteMany({});
}
// Clear only the models we added
for (const modelName of modelsToCleanup) {
if (mongoose.models[modelName]) {
delete mongoose.models[modelName];
}
}
await mongoose.disconnect(); await mongoose.disconnect();
await mongoServer.stop(); await mongoServer.stop();
}); });
@ -113,11 +129,12 @@ describe('File Routes - Delete with Agent Access', () => {
beforeEach(async () => { beforeEach(async () => {
jest.clearAllMocks(); jest.clearAllMocks();
// Clear database // Clear database - clean up all test data
await File.deleteMany({}); await File.deleteMany({});
await Agent.deleteMany({}); await Agent.deleteMany({});
await User.deleteMany({}); await User.deleteMany({});
await AclEntry.deleteMany({}); await AclEntry.deleteMany({});
// Don't delete AccessRole as they are seeded defaults needed for tests
// Create test data // Create test data
authorId = new mongoose.Types.ObjectId(); authorId = new mongoose.Types.ObjectId();