mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-19 09:50:15 +01:00
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:
parent
35c66b39c8
commit
2cf910351a
3 changed files with 67 additions and 12 deletions
|
|
@ -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', () => {
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue