mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-20 10:20:15 +01:00
refactor: organize Sharing/Agent components, improve type safety for resource types and access role ids, rename enums to PascalCase refactor: organize Sharing/Agent components, improve type safety for resource types and access role ids chore: move sharing related components to dedicated "Sharing" directory chore: remove PublicSharingToggle component and update index exports chore: move non-sidepanel agent components to `~/components/Agents` chore: move AgentCategoryDisplay component with tests chore: remove commented out code refactor: change PERMISSION_BITS from const to enum for better type safety refactor: reorganize imports in GenericGrantAccessDialog and update index exports for hooks refactor: update type definitions to use ACCESS_ROLE_IDS for improved type safety refactor: remove unused canAccessPromptResource middleware and related code refactor: remove unused prompt access roles from createAccessRoleMethods refactor: update resourceType in AclEntry type definition to remove unused 'prompt' value refactor: introduce ResourceType enum and update resourceType usage across data provider files for improved type safety refactor: update resourceType usage to ResourceType enum across sharing and permissions components for improved type safety refactor: standardize resourceType usage to ResourceType enum across agent and prompt models, permissions controller, and middleware for enhanced type safety refactor: update resourceType references from PROMPT_GROUP to PROMPTGROUP for consistency across models, middleware, and components refactor: standardize access role IDs and resource type usage across agent, file, and prompt models for improved type safety and consistency chore: add typedefs for TUpdateResourcePermissionsRequest and TUpdateResourcePermissionsResponse to enhance type definitions chore: move SearchPicker to PeoplePicker dir refactor: implement debouncing for query changes in SearchPicker for improved performance chore: fix typing, import order for agent admin settings fix: agent admin settings, prevent agent form submission refactor: rename `ACCESS_ROLE_IDS` to `AccessRoleIds` refactor: replace PermissionBits with PERMISSION_BITS refactor: replace PERMISSION_BITS with PermissionBits
150 lines
4.6 KiB
TypeScript
150 lines
4.6 KiB
TypeScript
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
import React from 'react';
|
|
import { render, screen } from '@testing-library/react';
|
|
import '@testing-library/jest-dom';
|
|
import { EModelEndpoint } from 'librechat-data-provider';
|
|
import { MarketplaceProvider } from '../MarketplaceContext';
|
|
import { useChatContext } from '~/Providers';
|
|
|
|
// Mock the ChatContext from Providers
|
|
jest.mock('~/Providers', () => ({
|
|
ChatContext: {
|
|
Provider: ({ children, value }: { children: React.ReactNode; value: any }) => (
|
|
<div data-testid="chat-context-provider" data-value={JSON.stringify(value)}>
|
|
{children}
|
|
</div>
|
|
),
|
|
},
|
|
useChatContext: jest.fn(),
|
|
}));
|
|
|
|
// Mock useChatHelpers to avoid Recoil dependency
|
|
jest.mock('~/hooks', () => ({
|
|
useChatHelpers: jest.fn(),
|
|
}));
|
|
|
|
const mockedUseChatContext = useChatContext as jest.MockedFunction<typeof useChatContext>;
|
|
|
|
// Test component that consumes the context
|
|
const TestConsumer: React.FC = () => {
|
|
const context = mockedUseChatContext();
|
|
|
|
return (
|
|
<div>
|
|
<div data-testid="endpoint">{context?.conversation?.endpoint}</div>
|
|
<div data-testid="conversation-id">{context?.conversation?.conversationId}</div>
|
|
<div data-testid="title">{context?.conversation?.title}</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
describe('MarketplaceProvider', () => {
|
|
beforeEach(() => {
|
|
mockedUseChatContext.mockClear();
|
|
|
|
// Mock useChatHelpers return value
|
|
const { useChatHelpers } = require('~/hooks');
|
|
(useChatHelpers as jest.Mock).mockReturnValue({
|
|
conversation: {
|
|
endpoint: EModelEndpoint.agents,
|
|
conversationId: 'marketplace',
|
|
title: 'Agent Marketplace',
|
|
},
|
|
});
|
|
});
|
|
|
|
it('provides correct marketplace context values', () => {
|
|
const mockContext = {
|
|
conversation: {
|
|
endpoint: EModelEndpoint.agents,
|
|
conversationId: 'marketplace',
|
|
title: 'Agent Marketplace',
|
|
},
|
|
};
|
|
|
|
mockedUseChatContext.mockReturnValue(mockContext as ReturnType<typeof useChatContext>);
|
|
|
|
render(
|
|
<MarketplaceProvider>
|
|
<TestConsumer />
|
|
</MarketplaceProvider>,
|
|
);
|
|
|
|
expect(screen.getByTestId('endpoint')).toHaveTextContent(EModelEndpoint.agents);
|
|
expect(screen.getByTestId('conversation-id')).toHaveTextContent('marketplace');
|
|
expect(screen.getByTestId('title')).toHaveTextContent('Agent Marketplace');
|
|
});
|
|
|
|
it('creates ChatContext.Provider with correct structure', () => {
|
|
render(
|
|
<MarketplaceProvider>
|
|
<div>{/* eslint-disable-line i18next/no-literal-string */}Test Child</div>
|
|
</MarketplaceProvider>,
|
|
);
|
|
|
|
const provider = screen.getByTestId('chat-context-provider');
|
|
expect(provider).toBeInTheDocument();
|
|
|
|
const valueData = JSON.parse(provider.getAttribute('data-value') || '{}');
|
|
expect(valueData.conversation).toEqual({
|
|
endpoint: EModelEndpoint.agents,
|
|
conversationId: 'marketplace',
|
|
title: 'Agent Marketplace',
|
|
});
|
|
});
|
|
|
|
it('renders children correctly', () => {
|
|
render(
|
|
<MarketplaceProvider>
|
|
<div data-testid="test-child">
|
|
{/* eslint-disable-line i18next/no-literal-string */}Test Content
|
|
</div>
|
|
</MarketplaceProvider>,
|
|
);
|
|
|
|
expect(screen.getByTestId('test-child')).toBeInTheDocument();
|
|
expect(screen.getByTestId('test-child')).toHaveTextContent('Test Content');
|
|
});
|
|
|
|
it('provides stable context value (memoization)', () => {
|
|
const { rerender } = render(
|
|
<MarketplaceProvider>
|
|
<TestConsumer />
|
|
</MarketplaceProvider>,
|
|
);
|
|
|
|
const firstProvider = screen.getByTestId('chat-context-provider');
|
|
const firstValue = firstProvider.getAttribute('data-value');
|
|
|
|
// Rerender should provide the same memoized value
|
|
rerender(
|
|
<MarketplaceProvider>
|
|
<TestConsumer />
|
|
</MarketplaceProvider>,
|
|
);
|
|
|
|
const secondProvider = screen.getByTestId('chat-context-provider');
|
|
const secondValue = secondProvider.getAttribute('data-value');
|
|
|
|
expect(firstValue).toBe(secondValue);
|
|
});
|
|
|
|
it('provides minimal context without bloated functions', () => {
|
|
render(
|
|
<MarketplaceProvider>
|
|
<div>{/* eslint-disable-line i18next/no-literal-string */}Test</div>
|
|
</MarketplaceProvider>,
|
|
);
|
|
|
|
const provider = screen.getByTestId('chat-context-provider');
|
|
const valueData = JSON.parse(provider.getAttribute('data-value') || '{}');
|
|
|
|
// Should only have conversation object, not 44 empty functions
|
|
expect(Object.keys(valueData)).toContain('conversation');
|
|
expect(valueData.conversation).toEqual({
|
|
endpoint: EModelEndpoint.agents,
|
|
conversationId: 'marketplace',
|
|
title: 'Agent Marketplace',
|
|
});
|
|
});
|
|
});
|