mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-17 08:50:15 +01:00
🏗️ refactor: Extract DB layers to data-schemas for shared use (#7650)
* refactor: move model definitions and database-related methods to packages/data-schemas * ci: update tests due to new DB structure fix: disable mocking `librechat-data-provider` feat: Add schema exports to data-schemas package - Introduced a new schema module that exports various schemas including action, agent, and user schemas. - Updated index.ts to include the new schema exports for better modularity and organization. ci: fix appleStrategy tests fix: Agent.spec.js ci: refactor handleTools tests to use MongoMemoryServer for in-memory database fix: getLogStores imports ci: update banViolation tests to use MongoMemoryServer and improve session mocking test: refactor samlStrategy tests to improve mock configurations and user handling ci: fix crypto mock in handleText tests for improved accuracy ci: refactor spendTokens tests to improve model imports and setup ci: refactor Message model tests to use MongoMemoryServer and improve database interactions * refactor: streamline IMessage interface and move feedback properties to types/message.ts * refactor: use exported initializeRoles from `data-schemas`, remove api workspace version (this serves as an example of future migrations that still need to happen) * refactor: update model imports to use destructuring from `~/db/models` for consistency and clarity * refactor: remove unused mongoose imports from model files for cleaner code * refactor: remove unused mongoose imports from Share, Prompt, and Transaction model files for cleaner code * refactor: remove unused import in Transaction model for cleaner code * ci: update deploy workflow to reference new Docker Dev Branch Images Build and add new workflow for building Docker images on dev branch * chore: cleanup imports
This commit is contained in:
parent
4cbab86b45
commit
a2fc7d312a
161 changed files with 2998 additions and 2088 deletions
|
|
@ -1,22 +1,25 @@
|
|||
const mongoose = require('mongoose');
|
||||
const { MongoMemoryServer } = require('mongodb-memory-server');
|
||||
const jwt = require('jsonwebtoken');
|
||||
const mongoose = require('mongoose');
|
||||
const { logger } = require('@librechat/data-schemas');
|
||||
const { Strategy: AppleStrategy } = require('passport-apple');
|
||||
const socialLogin = require('./socialLogin');
|
||||
const User = require('~/models/User');
|
||||
const { logger } = require('~/config');
|
||||
const { MongoMemoryServer } = require('mongodb-memory-server');
|
||||
const { createSocialUser, handleExistingUser } = require('./process');
|
||||
const { isEnabled } = require('~/server/utils');
|
||||
const socialLogin = require('./socialLogin');
|
||||
const { findUser } = require('~/models');
|
||||
const { User } = require('~/db/models');
|
||||
|
||||
// Mocking external dependencies
|
||||
jest.mock('jsonwebtoken');
|
||||
jest.mock('~/config', () => ({
|
||||
logger: {
|
||||
error: jest.fn(),
|
||||
debug: jest.fn(),
|
||||
},
|
||||
}));
|
||||
jest.mock('@librechat/data-schemas', () => {
|
||||
const actualModule = jest.requireActual('@librechat/data-schemas');
|
||||
return {
|
||||
...actualModule,
|
||||
logger: {
|
||||
error: jest.fn(),
|
||||
debug: jest.fn(),
|
||||
},
|
||||
};
|
||||
});
|
||||
jest.mock('./process', () => ({
|
||||
createSocialUser: jest.fn(),
|
||||
handleExistingUser: jest.fn(),
|
||||
|
|
@ -64,7 +67,6 @@ describe('Apple Login Strategy', () => {
|
|||
|
||||
// Define getProfileDetails within the test scope
|
||||
getProfileDetails = ({ idToken, profile }) => {
|
||||
console.log('getProfileDetails called with idToken:', idToken);
|
||||
if (!idToken) {
|
||||
logger.error('idToken is missing');
|
||||
throw new Error('idToken is missing');
|
||||
|
|
@ -84,9 +86,7 @@ describe('Apple Login Strategy', () => {
|
|||
email: decoded.email,
|
||||
id: decoded.sub,
|
||||
avatarUrl: null, // Apple does not provide an avatar URL
|
||||
username: decoded.email
|
||||
? decoded.email.split('@')[0].toLowerCase()
|
||||
: `user_${decoded.sub}`,
|
||||
username: decoded.email ? decoded.email.split('@')[0].toLowerCase() : `user_${decoded.sub}`,
|
||||
name: decoded.name
|
||||
? `${decoded.name.firstName} ${decoded.name.lastName}`
|
||||
: profile.displayName || null,
|
||||
|
|
@ -96,8 +96,12 @@ describe('Apple Login Strategy', () => {
|
|||
|
||||
// Mock isEnabled based on environment variable
|
||||
isEnabled.mockImplementation((flag) => {
|
||||
if (flag === 'true') { return true; }
|
||||
if (flag === 'false') { return false; }
|
||||
if (flag === 'true') {
|
||||
return true;
|
||||
}
|
||||
if (flag === 'false') {
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
|
|
@ -154,9 +158,7 @@ describe('Apple Login Strategy', () => {
|
|||
});
|
||||
|
||||
expect(jwt.decode).toHaveBeenCalledWith('fake_id_token');
|
||||
expect(logger.debug).toHaveBeenCalledWith(
|
||||
expect.stringContaining('Decoded Apple JWT'),
|
||||
);
|
||||
expect(logger.debug).toHaveBeenCalledWith(expect.stringContaining('Decoded Apple JWT'));
|
||||
expect(profileDetails).toEqual({
|
||||
email: 'john.doe@example.com',
|
||||
id: 'apple-sub-1234',
|
||||
|
|
@ -209,7 +211,7 @@ describe('Apple Login Strategy', () => {
|
|||
|
||||
beforeEach(() => {
|
||||
jwt.decode.mockReturnValue(decodedToken);
|
||||
findUser.mockImplementation(({ email }) => User.findOne({ email }));
|
||||
findUser.mockResolvedValue(null);
|
||||
});
|
||||
|
||||
it('should create a new user if one does not exist and registration is allowed', async () => {
|
||||
|
|
@ -248,7 +250,7 @@ describe('Apple Login Strategy', () => {
|
|||
});
|
||||
|
||||
it('should handle existing user and update avatarUrl', async () => {
|
||||
// Create an existing user
|
||||
// Create an existing user without saving to database
|
||||
const existingUser = new User({
|
||||
email: 'jane.doe@example.com',
|
||||
username: 'jane.doe',
|
||||
|
|
@ -257,15 +259,15 @@ describe('Apple Login Strategy', () => {
|
|||
providerId: 'apple-sub-9012',
|
||||
avatarUrl: 'old_avatar.png',
|
||||
});
|
||||
await existingUser.save();
|
||||
|
||||
// Mock findUser to return the existing user
|
||||
findUser.mockResolvedValue(existingUser);
|
||||
|
||||
// Mock handleExistingUser to update avatarUrl
|
||||
// Mock handleExistingUser to update avatarUrl without saving to database
|
||||
handleExistingUser.mockImplementation(async (user, avatarUrl) => {
|
||||
user.avatarUrl = avatarUrl;
|
||||
await user.save();
|
||||
// Don't call save() to avoid database operations
|
||||
return user;
|
||||
});
|
||||
|
||||
const mockVerifyCallback = jest.fn();
|
||||
|
|
@ -297,7 +299,7 @@ describe('Apple Login Strategy', () => {
|
|||
appleStrategyInstance._verify(
|
||||
fakeAccessToken,
|
||||
fakeRefreshToken,
|
||||
null, // idToken is missing
|
||||
null, // idToken is missing
|
||||
mockProfile,
|
||||
(err, user) => {
|
||||
mockVerifyCallback(err, user);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue