mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-17 17:00:15 +01:00
* fix: dropdown overflow * fix: make dropdown work on mobile * feat: update headlessui to 2.0 and use portal * feat: rewrite modal using headlessui * fix: applying of maxHeight * fix: optimize backdrop for dark mode * fix: rendering dropdown width * feat: match small screen layout to radix-ui dialog * revert: mobile modifications * fix: modal animations * fix: z-index * chore: Migrate from HeadlessUI 1.0 to 2.0 * fix: h2 nesting * fix: use lighter border for PopoverButtons * feat: Move modal to the top if using a small screen * fix: mobile position * fix: frontend tests * feat: use row layout in mobile instead of col * fix: remove config path from tsconfig * fix: fix dropdown tests (gpt4o ftw!) * feat: Upgrade to latest headlessui version * fix:test1 * fix: ThemeSelector test * fix: re-add speech tab * style: use pl and pr-3 * fix: speech tab dropdowns * style: use maxHeight for language * feat: convert DropdownNoState to v2.0 * fix: use v2 params for voiceDropdown * style: reduce maxHeight for VoiceDropdown and set fixed width * chore: rebuild package-lock * style(fix): copy over the same styles for the settingsTab * style(fix): use -top-1 for speech tabs * style(fix): use max-w-[400px] --------- Co-authored-by: Danny Avila <danny@librechat.ai>
62 lines
1.7 KiB
TypeScript
62 lines
1.7 KiB
TypeScript
// ThemeSelector.spec.tsx
|
|
import 'test/matchMedia.mock';
|
|
|
|
import React from 'react';
|
|
import { render, fireEvent, waitFor } from '@testing-library/react';
|
|
import '@testing-library/jest-dom/extend-expect';
|
|
import { ThemeSelector } from './General';
|
|
import { RecoilRoot } from 'recoil';
|
|
|
|
describe('ThemeSelector', () => {
|
|
let mockOnChange;
|
|
|
|
beforeEach(() => {
|
|
mockOnChange = jest.fn();
|
|
});
|
|
|
|
it('renders correctly', () => {
|
|
global.ResizeObserver = class MockedResizeObserver {
|
|
observe = jest.fn();
|
|
unobserve = jest.fn();
|
|
disconnect = jest.fn();
|
|
};
|
|
const { getByText } = render(
|
|
<RecoilRoot>
|
|
<ThemeSelector theme="system" onChange={mockOnChange} />
|
|
</RecoilRoot>,
|
|
);
|
|
|
|
expect(getByText('Theme')).toBeInTheDocument();
|
|
expect(getByText('System')).toBeInTheDocument();
|
|
});
|
|
|
|
it('calls onChange when the select value changes', async () => {
|
|
global.ResizeObserver = class MockedResizeObserver {
|
|
observe = jest.fn();
|
|
unobserve = jest.fn();
|
|
disconnect = jest.fn();
|
|
};
|
|
const { getByText, getByTestId } = render(
|
|
<RecoilRoot>
|
|
<ThemeSelector theme="system" onChange={mockOnChange} />
|
|
</RecoilRoot>,
|
|
);
|
|
|
|
expect(getByText('Theme')).toBeInTheDocument();
|
|
|
|
// Find the dropdown button by data-testid
|
|
const dropdownButton = getByTestId('theme-selector');
|
|
|
|
// Open the dropdown
|
|
fireEvent.click(dropdownButton);
|
|
|
|
// Find the option by text and click it
|
|
const darkOption = getByText('Dark');
|
|
fireEvent.click(darkOption);
|
|
|
|
// Ensure that the onChange is called with the expected value
|
|
await waitFor(() => {
|
|
expect(mockOnChange).toHaveBeenCalledWith('dark');
|
|
});
|
|
});
|
|
});
|