lobehub/src/features/ResourceManager/components/Explorer/hooks/useResetSelectionOnQueryChange.test.tsx
Innei 26449e522a
feat(resource): add select all hint and improve resource explorer selection (#13134)
*  feat(resource): add select all hint and improve resource explorer selection

Made-with: Cursor

* ♻️ refactor(resource): flatten store actions and improve type imports

Made-with: Cursor

* ♻️ refactor resource explorer list view

* refactor: engine

Signed-off-by: Innei <tukon479@gmail.com>

*  feat: checkpoint current workspace updates

* ♻️ refine resource explorer fetch ownership

* 🐛 fix: resolve resource manager ci regressions

* 🐛 fix(lambda): delete page-backed knowledge items by document id

* 🐛 fix(lambda): include knowledge-base files in remove-all

* 🐛 fix(resource): preserve cross-page select-all exclusions

* 🐛 fix(resource): retain off-screen optimistic resources

* 🐛 fix(resource): hide moved root items from current query

* 🐛 fix(resource): reset explorer selection on query change

* 🐛 fix(resource): fix select-all batchChunking and optimistic replace visibility

- batchChunking: pass through server-resolved IDs not in local resourceMap
  when selectAllState is 'all', letting server filter unsupported types
- replaceLocalResource: keep replacement visible if the optimistic item was
  already in the list, avoiding slug-vs-UUID mismatch in visibility check

* 🐛 fix(resource): reset selectAllState after batch operations and preserve off-screen optimistic items

- Reset selectAllState to 'none' after delete, removeFromKnowledgeBase,
  and batchChunking to prevent stale 'all' state causing unintended
  re-selection of remaining items
- Preserve off-screen optimistic resources in clearCurrentQueryResources
  so background uploads from other folders survive delete-all-by-query

* 🐛 fix: satisfy import-x/first in resource action test

Made-with: Cursor

* 🎨 lint: sort imports in ResourceExplorer

Made-with: Cursor

* 🐛 fix: widen searchQuery type in useResetSelectionOnQueryChange test

Made-with: Cursor

---------

Signed-off-by: Innei <tukon479@gmail.com>
2026-03-28 11:51:23 +08:00

76 lines
2.1 KiB
TypeScript

import { act, renderHook } from '@testing-library/react';
import { beforeEach, describe, expect, it } from 'vitest';
import { useResourceManagerStore } from '@/routes/(main)/resource/features/store';
import { initialState } from '@/routes/(main)/resource/features/store/initialState';
import { FilesTabs } from '@/types/files';
import { useResetSelectionOnQueryChange } from './useResetSelectionOnQueryChange';
describe('useResetSelectionOnQueryChange', () => {
beforeEach(() => {
useResourceManagerStore.setState(initialState);
});
it('should clear all-selection mode when the search query changes', () => {
const { rerender } = renderHook(
(props: { searchQuery: string | null }) =>
useResetSelectionOnQueryChange({
category: FilesTabs.All,
currentFolderSlug: 'folder-a',
libraryId: undefined,
searchQuery: props.searchQuery,
}),
{
initialProps: { searchQuery: null as string | null },
},
);
act(() => {
useResourceManagerStore.setState({
selectAllState: 'all',
selectedFileIds: ['file-1'],
});
});
act(() => {
rerender({ searchQuery: 'report' });
});
expect(useResourceManagerStore.getState()).toMatchObject({
selectAllState: 'none',
selectedFileIds: [],
});
});
it('should clear selection when the folder changes', () => {
const { rerender } = renderHook(
(props: { currentFolderSlug: string | null }) =>
useResetSelectionOnQueryChange({
category: FilesTabs.All,
currentFolderSlug: props.currentFolderSlug,
libraryId: undefined,
searchQuery: null,
}),
{
initialProps: { currentFolderSlug: 'folder-a' },
},
);
act(() => {
useResourceManagerStore.setState({
selectAllState: 'loaded',
selectedFileIds: ['file-1', 'file-2'],
});
});
act(() => {
rerender({ currentFolderSlug: 'folder-b' });
});
expect(useResourceManagerStore.getState()).toMatchObject({
selectAllState: 'none',
selectedFileIds: [],
});
});
});