@@ -29,6 +29,12 @@ function getItems2() {
29
29
} ) ;
30
30
}
31
31
32
+ function getItemsEnd ( ) {
33
+ return new Promise ( resolve => {
34
+ setTimeout ( ( ) => resolve ( { items : ITEMS , cursor : null } ) , 100 ) ;
35
+ } ) ;
36
+ }
37
+
32
38
describe ( 'useAsyncList' , ( ) => {
33
39
beforeAll ( ( ) => {
34
40
jest . useFakeTimers ( ) ;
@@ -870,6 +876,59 @@ describe('useAsyncList', () => {
870
876
expect ( result . current . selectedKeys ) . toEqual ( 'all' ) ;
871
877
} ) ;
872
878
879
+ it ( 'should maintain all selection if last visible item removed and unloaded items still exist' , async ( ) => {
880
+ let load = jest . fn ( )
881
+ . mockImplementationOnce ( getItems ) ;
882
+ let { result, waitForNextUpdate} = renderHook (
883
+ ( ) => useAsyncList ( { load} )
884
+ ) ;
885
+ await act ( async ( ) => {
886
+ result . current . loadMore ( ) ;
887
+ jest . runAllTimers ( ) ;
888
+ await waitForNextUpdate ( ) ;
889
+ result . current . setSelectedKeys ( 'all' ) ;
890
+ result . current . remove ( 1 ) ;
891
+ result . current . remove ( 2 ) ;
892
+ jest . runAllTimers ( ) ;
893
+ } ) ;
894
+ expect ( result . current . selectedKeys ) . toEqual ( 'all' ) ;
895
+ } ) ;
896
+
897
+ it ( 'should change selection to empty set if last item removed with no unloaded items left' , async ( ) => {
898
+ let load = jest . fn ( )
899
+ . mockImplementationOnce ( getItemsEnd ) ;
900
+ let { result, waitForNextUpdate} = renderHook (
901
+ ( ) => useAsyncList ( { load} )
902
+ ) ;
903
+ await act ( async ( ) => {
904
+ result . current . loadMore ( ) ;
905
+ jest . runAllTimers ( ) ;
906
+ await waitForNextUpdate ( ) ;
907
+ result . current . setSelectedKeys ( 'all' ) ;
908
+ result . current . remove ( 1 ) ;
909
+ result . current . remove ( 2 ) ;
910
+ jest . runAllTimers ( ) ;
911
+ } ) ;
912
+ expect ( result . current . selectedKeys ) . toEqual ( new Set ( ) ) ;
913
+ } ) ;
914
+
915
+ it ( 'should change selection to empty set if all items removed' , async ( ) => {
916
+ let load = jest . fn ( )
917
+ . mockImplementationOnce ( getItemsEnd ) ;
918
+ let { result, waitForNextUpdate} = renderHook (
919
+ ( ) => useAsyncList ( { load} )
920
+ ) ;
921
+ await act ( async ( ) => {
922
+ result . current . loadMore ( ) ;
923
+ jest . runAllTimers ( ) ;
924
+ await waitForNextUpdate ( ) ;
925
+ result . current . setSelectedKeys ( 'all' ) ;
926
+ result . current . removeSelectedItems ( ) ;
927
+ jest . runAllTimers ( ) ;
928
+ } ) ;
929
+ expect ( result . current . selectedKeys ) . toEqual ( new Set ( ) ) ;
930
+ } ) ;
931
+
873
932
describe ( 'filtering' , function ( ) {
874
933
const filterItems = [ { id : 1 , name : 'Bob' } , { id : 2 , name : 'Joe' } , { id : 3 , name : 'Bob Joe' } ] ;
875
934
const itemsFirstCall = [ { id : 1 , name : 'Bob' } , { id : 3 , name : 'Bob Joe' } ] ;
0 commit comments