| import { getTransactionsConfig, getBalanceConfig } from './config'; |
| import { logger } from '@librechat/data-schemas'; |
| import { FileSources } from 'librechat-data-provider'; |
| import type { TCustomConfig } from 'librechat-data-provider'; |
| import type { AppConfig } from '@librechat/data-schemas'; |
|
|
| |
| const createTestAppConfig = (overrides: Partial<AppConfig> = {}): AppConfig => { |
| const minimalConfig: TCustomConfig = { |
| version: '1.0.0', |
| cache: true, |
| interface: { |
| endpointsMenu: true, |
| }, |
| registration: { |
| socialLogins: [], |
| }, |
| endpoints: {}, |
| }; |
|
|
| return { |
| config: minimalConfig, |
| paths: { |
| uploads: '', |
| imageOutput: '', |
| publicPath: '', |
| }, |
| fileStrategy: FileSources.local, |
| fileStrategies: {}, |
| imageOutputType: 'png', |
| ...overrides, |
| }; |
| }; |
|
|
| jest.mock('@librechat/data-schemas', () => ({ |
| logger: { |
| warn: jest.fn(), |
| }, |
| })); |
|
|
| jest.mock('~/utils', () => ({ |
| isEnabled: jest.fn((value) => value === 'true'), |
| })); |
|
|
| describe('getTransactionsConfig', () => { |
| beforeEach(() => { |
| jest.clearAllMocks(); |
| delete process.env.CHECK_BALANCE; |
| delete process.env.START_BALANCE; |
| }); |
|
|
| describe('when appConfig is not provided', () => { |
| it('should return default config with enabled: true', () => { |
| const result = getTransactionsConfig(); |
| expect(result).toEqual({ enabled: true }); |
| }); |
| }); |
|
|
| describe('when appConfig is provided', () => { |
| it('should return transactions config when explicitly set to false', () => { |
| const appConfig = createTestAppConfig({ |
| transactions: { enabled: false }, |
| balance: { enabled: false }, |
| }); |
| const result = getTransactionsConfig(appConfig); |
| expect(result).toEqual({ enabled: false }); |
| expect(logger.warn).not.toHaveBeenCalled(); |
| }); |
|
|
| it('should return transactions config when explicitly set to true', () => { |
| const appConfig = createTestAppConfig({ |
| transactions: { enabled: true }, |
| balance: { enabled: false }, |
| }); |
| const result = getTransactionsConfig(appConfig); |
| expect(result).toEqual({ enabled: true }); |
| expect(logger.warn).not.toHaveBeenCalled(); |
| }); |
|
|
| it('should return default config when transactions is not defined', () => { |
| const appConfig = createTestAppConfig({ |
| balance: { enabled: false }, |
| }); |
| const result = getTransactionsConfig(appConfig); |
| expect(result).toEqual({ enabled: true }); |
| expect(logger.warn).not.toHaveBeenCalled(); |
| }); |
|
|
| describe('balance and transactions interaction', () => { |
| it('should force transactions to be enabled when balance is enabled but transactions is disabled', () => { |
| const appConfig = createTestAppConfig({ |
| transactions: { enabled: false }, |
| balance: { enabled: true }, |
| }); |
| const result = getTransactionsConfig(appConfig); |
| expect(result).toEqual({ enabled: true }); |
| expect(logger.warn).toHaveBeenCalledWith( |
| 'Configuration warning: transactions.enabled=false is incompatible with balance.enabled=true. ' + |
| 'Transactions will be enabled to ensure balance tracking works correctly.', |
| ); |
| }); |
|
|
| it('should not override transactions when balance is enabled and transactions is enabled', () => { |
| const appConfig = createTestAppConfig({ |
| transactions: { enabled: true }, |
| balance: { enabled: true }, |
| }); |
| const result = getTransactionsConfig(appConfig); |
| expect(result).toEqual({ enabled: true }); |
| expect(logger.warn).not.toHaveBeenCalled(); |
| }); |
|
|
| it('should allow transactions to be disabled when balance is disabled', () => { |
| const appConfig = createTestAppConfig({ |
| transactions: { enabled: false }, |
| balance: { enabled: false }, |
| }); |
| const result = getTransactionsConfig(appConfig); |
| expect(result).toEqual({ enabled: false }); |
| expect(logger.warn).not.toHaveBeenCalled(); |
| }); |
|
|
| it('should use default when balance is enabled but transactions is not defined', () => { |
| const appConfig = createTestAppConfig({ |
| balance: { enabled: true }, |
| }); |
| const result = getTransactionsConfig(appConfig); |
| expect(result).toEqual({ enabled: true }); |
| expect(logger.warn).not.toHaveBeenCalled(); |
| }); |
| }); |
|
|
| describe('with environment variables for balance', () => { |
| it('should force transactions enabled when CHECK_BALANCE env is true and transactions is false', () => { |
| process.env.CHECK_BALANCE = 'true'; |
| const appConfig = createTestAppConfig({ |
| transactions: { enabled: false }, |
| }); |
| const result = getTransactionsConfig(appConfig); |
| expect(result).toEqual({ enabled: true }); |
| expect(logger.warn).toHaveBeenCalledWith( |
| 'Configuration warning: transactions.enabled=false is incompatible with balance.enabled=true. ' + |
| 'Transactions will be enabled to ensure balance tracking works correctly.', |
| ); |
| }); |
|
|
| it('should allow transactions disabled when CHECK_BALANCE env is false', () => { |
| process.env.CHECK_BALANCE = 'false'; |
| const appConfig = createTestAppConfig({ |
| transactions: { enabled: false }, |
| }); |
| const result = getTransactionsConfig(appConfig); |
| expect(result).toEqual({ enabled: false }); |
| expect(logger.warn).not.toHaveBeenCalled(); |
| }); |
| }); |
|
|
| describe('edge cases', () => { |
| it('should handle empty appConfig object', () => { |
| const appConfig = createTestAppConfig(); |
| const result = getTransactionsConfig(appConfig); |
| expect(result).toEqual({ enabled: true }); |
| expect(logger.warn).not.toHaveBeenCalled(); |
| }); |
|
|
| it('should handle appConfig with null balance', () => { |
| const appConfig = createTestAppConfig({ |
| transactions: { enabled: false }, |
| |
| balance: null as any, |
| }); |
| const result = getTransactionsConfig(appConfig); |
| expect(result).toEqual({ enabled: false }); |
| expect(logger.warn).not.toHaveBeenCalled(); |
| }); |
|
|
| it('should handle appConfig with undefined balance', () => { |
| const appConfig = createTestAppConfig({ |
| transactions: { enabled: false }, |
| balance: undefined, |
| }); |
| const result = getTransactionsConfig(appConfig); |
| expect(result).toEqual({ enabled: false }); |
| expect(logger.warn).not.toHaveBeenCalled(); |
| }); |
|
|
| it('should handle appConfig with balance enabled undefined', () => { |
| const appConfig = createTestAppConfig({ |
| transactions: { enabled: false }, |
| |
| balance: { enabled: undefined as any }, |
| }); |
| const result = getTransactionsConfig(appConfig); |
| expect(result).toEqual({ enabled: false }); |
| expect(logger.warn).not.toHaveBeenCalled(); |
| }); |
| }); |
| }); |
| }); |
|
|
| describe('getBalanceConfig', () => { |
| beforeEach(() => { |
| jest.clearAllMocks(); |
| delete process.env.CHECK_BALANCE; |
| delete process.env.START_BALANCE; |
| }); |
|
|
| describe('when appConfig is not provided', () => { |
| it('should return config based on environment variables', () => { |
| process.env.CHECK_BALANCE = 'true'; |
| process.env.START_BALANCE = '1000'; |
| const result = getBalanceConfig(); |
| expect(result).toEqual({ |
| enabled: true, |
| startBalance: 1000, |
| }); |
| }); |
|
|
| it('should return empty config when no env vars are set', () => { |
| const result = getBalanceConfig(); |
| expect(result).toEqual({ enabled: false }); |
| }); |
|
|
| it('should handle CHECK_BALANCE true without START_BALANCE', () => { |
| process.env.CHECK_BALANCE = 'true'; |
| const result = getBalanceConfig(); |
| expect(result).toEqual({ |
| enabled: true, |
| }); |
| }); |
|
|
| it('should handle START_BALANCE without CHECK_BALANCE', () => { |
| process.env.START_BALANCE = '5000'; |
| const result = getBalanceConfig(); |
| expect(result).toEqual({ |
| enabled: false, |
| startBalance: 5000, |
| }); |
| }); |
| }); |
|
|
| describe('when appConfig is provided', () => { |
| it('should merge appConfig balance with env config', () => { |
| process.env.CHECK_BALANCE = 'true'; |
| process.env.START_BALANCE = '1000'; |
| const appConfig = createTestAppConfig({ |
| balance: { |
| enabled: false, |
| startBalance: 2000, |
| autoRefillEnabled: true, |
| }, |
| }); |
| const result = getBalanceConfig(appConfig); |
| expect(result).toEqual({ |
| enabled: false, |
| startBalance: 2000, |
| autoRefillEnabled: true, |
| }); |
| }); |
|
|
| it('should use env config when appConfig balance is not provided', () => { |
| process.env.CHECK_BALANCE = 'true'; |
| process.env.START_BALANCE = '3000'; |
| const appConfig = createTestAppConfig(); |
| const result = getBalanceConfig(appConfig); |
| expect(result).toEqual({ |
| enabled: true, |
| startBalance: 3000, |
| }); |
| }); |
|
|
| it('should handle appConfig with null balance', () => { |
| process.env.CHECK_BALANCE = 'true'; |
| const appConfig = createTestAppConfig({ |
| |
| balance: null as any, |
| }); |
| const result = getBalanceConfig(appConfig); |
| expect(result).toEqual({ |
| enabled: true, |
| }); |
| }); |
| }); |
| }); |
|
|