Files
openchamber/packages/ui/src/components/session/sidebar/folders/SessionBulkActions.behavior.test.tsx
T

80 lines
3.1 KiB
TypeScript

import { describe, expect, mock, test } from 'bun:test';
import React, { act } from 'react';
import { createRoot } from 'react-dom/client';
import { I18nProvider } from '@/lib/i18n';
import { useSessionFoldersStore } from '@/stores/useSessionFoldersStore';
import { useSessionMultiSelectStore } from '@/stores/useSessionMultiSelectStore';
import { installHookTestDom } from '../test-utils/testDom';
type BulkActionCapture = {
onCreateFolderAndMove: () => void;
};
let bulkActionCapture: BulkActionCapture | null = null;
mock.module('./BulkActionBar', () => ({
BulkActionBar: (props: BulkActionCapture) => {
bulkActionCapture = props;
return null;
},
}));
mock.module('./ConfirmDialogs', () => ({
BulkSessionDeleteConfirmDialog: () => null,
}));
const { SessionBulkActions } = await import('./SessionBulkActions');
describe('SessionBulkActions public behavior', () => {
test('moves the selected sessions into a newly created folder while a row edit is active', async () => {
const dom = installHookTestDom();
const root = createRoot(dom.container);
const originalFolders = useSessionFoldersStore.getState();
const originalSelection = useSessionMultiSelectStore.getState();
const cssDescriptor = Object.getOwnPropertyDescriptor(globalThis, 'CSS');
const renameRequests: Array<{ scopeKey: string; folder: { id: string; name: string } }> = [];
const moved: Array<{ scopeKey: string; folderId: string; ids: string[] }> = [];
useSessionFoldersStore.setState({
foldersMap: {},
addSessionsToFolder: (scopeKey, folderId, ids) => moved.push({ scopeKey, folderId, ids }),
});
useSessionMultiSelectStore.setState({
enabled: true,
selectedIds: new Set(['session-a']),
scopeKey: 'project-a',
anchorId: 'session-a',
});
Object.defineProperty(globalThis, 'CSS', {
configurable: true,
value: { escape: (value: string) => value },
});
try {
await act(async () => root.render(
<I18nProvider>
<SessionBulkActions
getFolderScopesForProject={() => [{ scopeKey: '/workspace', directory: '/workspace' }]}
isInlineEditing
startFolderRename={(scopeKey, folder) => renameRequests.push({ scopeKey, folder })}
/>
</I18nProvider>,
));
expect(bulkActionCapture).not.toBeNull();
await act(async () => bulkActionCapture?.onCreateFolderAndMove());
const createdFolder = useSessionFoldersStore.getState().foldersMap['/workspace']?.[0];
expect(createdFolder?.name).toBe('New folder');
expect(renameRequests).toEqual([{ scopeKey: '/workspace', folder: createdFolder }]);
expect(moved).toEqual([{ scopeKey: '/workspace', folderId: createdFolder?.id ?? '', ids: ['session-a'] }]);
} finally {
await act(async () => root.unmount());
useSessionFoldersStore.setState(originalFolders, true);
useSessionMultiSelectStore.setState(originalSelection, true);
if (cssDescriptor) Object.defineProperty(globalThis, 'CSS', cssDescriptor);
else Reflect.deleteProperty(globalThis, 'CSS');
bulkActionCapture = null;
dom.restore();
}
});
});