Skip to content

Commit

Permalink
Add tests for local state management in useRecordSelection hook
Browse files Browse the repository at this point in the history
  • Loading branch information
wbonestor committed Mar 25, 2024
1 parent f67bfec commit 5f94b59
Showing 1 changed file with 129 additions and 0 deletions.
129 changes: 129 additions & 0 deletions packages/ra-core/src/controller/list/useRecordSelection.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -131,4 +131,133 @@ describe('useRecordSelection', () => {
expect(selected).toEqual([]);
});
});

describe('using local state', () => {
it('should return empty array by default', () => {
const { result } = renderHook(() =>
useRecordSelection('foo', true)
);
const [selected] = result.current;
expect(selected).toEqual([]);
});

it('should not use the stored value', () => {
const { result } = renderHook(
() => useRecordSelection('foo', true),
{
wrapper: ({ children }) => (
<StoreContextProvider value={memoryStore()}>
<StoreSetter
name="foo.selectedIds"
value={[123, 456]}
>
{children}
</StoreSetter>
</StoreContextProvider>
),
}
);
const [selected] = result.current;
expect(selected).toEqual([]);
});

describe('select', () => {
it('should allow to select a record', () => {
const { result } = renderHook(() =>
useRecordSelection('foo', true)
);
const [selected1, { select }] = result.current;
expect(selected1).toEqual([]);
select([123, 456]);
const [selected2] = result.current;
expect(selected2).toEqual([123, 456]);
});
it('should ignore previous selection', () => {
const { result } = renderHook(() =>
useRecordSelection('foo', true)
);
const [selected1, { select }] = result.current;
expect(selected1).toEqual([]);
select([123, 456]);
const [selected2] = result.current;
expect(selected2).toEqual([123, 456]);
select([123, 789]);
const [selected3] = result.current;
expect(selected3).toEqual([123, 789]);
});
});
describe('unselect', () => {
it('should allow to unselect a record', () => {
const { result } = renderHook(() =>
useRecordSelection('foo', true)
);
const [, { select, unselect }] = result.current;
select([123, 456]);
unselect([123]);
const [selected] = result.current;
expect(selected).toEqual([456]);
});
it('should not fail if the record was not selected', () => {
const { result } = renderHook(() =>
useRecordSelection('foo', true)
);
const [, { select, unselect }] = result.current;
select([123, 456]);
unselect([789]);
const [selected] = result.current;
expect(selected).toEqual([123, 456]);
});
});
describe('toggle', () => {
it('should allow to toggle a record selection', () => {
const { result } = renderHook(() =>
useRecordSelection('foo', true)
);
const [selected1, { toggle }] = result.current;
expect(selected1).toEqual([]);
toggle(123);
const [selected2] = result.current;
expect(selected2).toEqual([123]);
toggle(456);
const [selected3] = result.current;
expect(selected3).toEqual([123, 456]);
toggle(123);
const [selected4] = result.current;
expect(selected4).toEqual([456]);
});
it('should allow to empty the selection', () => {
const { result } = renderHook(() =>
useRecordSelection('foo', true)
);
const [, { select, toggle }] = result.current;
select([123]);
toggle(123);
const [selected] = result.current;
expect(selected).toEqual([]);
});
});
describe('clearSelection', () => {
it('should allow to clear the selection', () => {
const { result } = renderHook(() =>
useRecordSelection('foo', true)
);
const [, { toggle, clearSelection }] = result.current;
toggle(123);
const [selected2] = result.current;
expect(selected2).toEqual([123]);
clearSelection();
const [selected3] = result.current;
expect(selected3).toEqual([]);
});
it('should not fail on empty selection', () => {
const { result } = renderHook(() =>
useRecordSelection('foo', true)
);
const [, { clearSelection }] = result.current;
clearSelection();
const [selected] = result.current;
expect(selected).toEqual([]);
});
});
});
});

0 comments on commit 5f94b59

Please sign in to comment.