@@ -347,41 +347,87 @@ describe('connectionResolver', () => {
347347
348348    describe ( '"Relay Cursor Connections Specification (PageInfo)":' ,  ( )  =>  { 
349349      describe ( 'HasPreviousPage' ,  ( )  =>  { 
350-         it ( 'If last was not  set (but first  is present ), return false.' ,  ( )  =>  { 
351-           expect ( preparePageInfo ( fiveEdges ,  {  first : 2  } ,  5 ,   2 ) . hasPreviousPage ) . toBe ( false ) ; 
350+         it ( 'If first is  set (and after  is empty ), return false.' ,  ( )  =>  { 
351+           expect ( preparePageInfo ( fiveEdges ,  {  first : 4  } ,  4 ,   0 ) . hasPreviousPage ) . toBe ( false ) ; 
352352        } ) ; 
353-         it ( 'If last was not set (and first is empty), return true.' ,  ( )  =>  { 
354-           expect ( preparePageInfo ( fiveEdges ,  { } ,  5 ,  2 ) . hasPreviousPage ) . toBe ( true ) ; 
353+         it ( 'If first is set (and after is present), return true.' ,  ( )  =>  { 
354+           expect ( preparePageInfo ( fiveEdges ,  {  first : 4 ,  after : 'abc'  } ,  4 ,  0 ) . hasPreviousPage ) . toBe ( 
355+             true 
356+           ) ; 
355357        } ) ; 
356-         it ( 'If last was not set (but after is present), return true.' ,  ( )  =>  { 
357-           expect ( preparePageInfo ( fiveEdges ,  {  after : 'abc'  } ,  5 ,  0 ) . hasPreviousPage ) . toBe ( true ) ; 
358+         it ( 'If last is set (and before is empty), and edges contains more than last elements, return true.' ,  ( )  =>  { 
359+           // if `first` is empty and `last` is set, `first` will be assigned according to count of edges targeted 
360+           expect ( preparePageInfo ( fiveEdges ,  {  first : 10 ,  last : 5  } ,  5 ,  5 ) . hasPreviousPage ) . toBe ( 
361+             true 
362+           ) ; 
358363        } ) ; 
359-         it ( 'If edges contains more than last elements, return true.' ,  ( )  =>  { 
360-           expect ( preparePageInfo ( fiveEdges ,  {  last : 3  } ,  3 ,  2 ) . hasPreviousPage ) . toBe ( true ) ; 
364+         it ( 'If last is set (and before is empty), and edges contains no more than last elements, return false.' ,  ( )  =>  { 
365+           expect ( preparePageInfo ( fiveEdges ,  {  first : 5 ,  last : 5  } ,  5 ,  0 ) . hasPreviousPage ) . toBe ( 
366+             false 
367+           ) ; 
361368        } ) ; 
362-         it ( 'Return false' ,  ( )  =>  { 
363-           expect ( preparePageInfo ( fiveEdges ,  {  last : 5  } ,  5 ,  0 ) . hasPreviousPage ) . toBe ( false ) ; 
369+         it ( 'If last is set (and before is present), and edges contains more than last elements, return true.' ,  ( )  =>  { 
370+           expect ( 
371+             preparePageInfo ( fiveEdges ,  {  first : 10 ,  last : 4 ,  before : 'abc'  } ,  4 ,  6 ) . hasPreviousPage 
372+           ) . toBe ( true ) ; 
373+         } ) ; 
374+         it ( 'If last is set (and before is present), and edges contains no more than last elements, return false.' ,  ( )  =>  { 
375+           expect ( 
376+             preparePageInfo ( fiveEdges ,  {  first : 4 ,  last : 4 ,  before : 'abc'  } ,  4 ,  0 ) . hasPreviousPage 
377+           ) . toBe ( false ) ; 
378+         } ) ; 
379+         it ( 'If both first and last are set, and edges contains more than last elements, return true.' ,  ( )  =>  { 
380+           expect ( preparePageInfo ( fiveEdges ,  {  first : 10 ,  last : 4  } ,  4 ,  6 ) . hasPreviousPage ) . toBe ( 
381+             true 
382+           ) ; 
383+         } ) ; 
384+         it ( 'If both first and last are set, and edges contains no more than last elements, return true.' ,  ( )  =>  { 
385+           expect ( preparePageInfo ( fiveEdges ,  {  first : 4 ,  last : 4  } ,  4 ,  0 ) . hasPreviousPage ) . toBe ( 
386+             false 
387+           ) ; 
364388        } ) ; 
365389      } ) ; 
366390
367391      describe ( 'HasNextPage' ,  ( )  =>  { 
368-         it ( 'If first was not set (and last is empty), return true.' ,  ( )  =>  { 
392+         it ( 'If first was not set (and last is empty), and there is more edges,  return true.' ,  ( )  =>  { 
369393          // By current Relay Cursor Connections Specification 
370394          //   if `first` and `last` are empty `hasNextPage` should be false. 
371395          // This rule is deviation from specification for better dev experience: 
372396          //   when first and last args are empty 
373397          //   we should check if exist more edges and provide correct `hasNextPage` value. 
374398          expect ( preparePageInfo ( fiveEdges ,  { } ,  4 ,  0 ) . hasNextPage ) . toBe ( true ) ; 
375399        } ) ; 
376-         it ( 'If first was not set (but last is present), return false.' ,  ( )  =>  { 
377-           expect ( preparePageInfo ( fiveEdges ,  {  last : 200  } ,  4 ,  0 ) . hasNextPage ) . toBe ( false ) ; 
400+         it ( 'If last is set (and before is empty), return false.' ,  ( )  =>  { 
401+           // if `first` is empty and `last` is set, `first` will be assigned according to count of edges targeted 
402+           expect ( preparePageInfo ( fiveEdges ,  {  first : 10 ,  last : 5  } ,  5 ,  5 ) . hasNextPage ) . toBe ( false ) ; 
403+         } ) ; 
404+         it ( 'If last is set (and before is present), return true.' ,  ( )  =>  { 
405+           expect ( 
406+             preparePageInfo ( fiveEdges ,  {  first : 10 ,  last : 4 ,  before : 'abc'  } ,  4 ,  6 ) . hasNextPage 
407+           ) . toBe ( true ) ; 
378408        } ) ; 
379-         it ( 'If edges contains more than first elements, return true.' ,  ( )  =>  { 
409+         it ( 'If first is set (and after is empty), and  edges contains more than first elements, return true.' ,  ( )  =>  { 
380410          expect ( preparePageInfo ( fiveEdges ,  {  first : 4  } ,  4 ,  0 ) . hasNextPage ) . toBe ( true ) ; 
381411        } ) ; 
382-         it ( 'Return  false' ,  ( )  =>  { 
412+         it ( 'If first is set (and after is empty), and edges contains no more than first elements, return  false. ' ,  ( )  =>  { 
383413          expect ( preparePageInfo ( fiveEdges ,  {  first : 5  } ,  5 ,  0 ) . hasNextPage ) . toBe ( false ) ; 
384414        } ) ; 
415+         it ( 'If first is set (and after is present), and edges contains more than first elements, return true.' ,  ( )  =>  { 
416+           expect ( preparePageInfo ( fiveEdges ,  {  first : 4 ,  after : 'abc'  } ,  4 ,  0 ) . hasNextPage ) . toBe ( 
417+             true 
418+           ) ; 
419+         } ) ; 
420+         it ( 'If first is set (and after is present), and edges contains no more than first elements, return false.' ,  ( )  =>  { 
421+           expect ( preparePageInfo ( fiveEdges ,  {  first : 5 ,  after : 'abc'  } ,  5 ,  0 ) . hasNextPage ) . toBe ( 
422+             false 
423+           ) ; 
424+         } ) ; 
425+         it ( 'If both first and last are set, and edges contains more than first elements, return true.' ,  ( )  =>  { 
426+           expect ( preparePageInfo ( fiveEdges ,  {  first : 10 ,  last : 4  } ,  4 ,  6 ) . hasNextPage ) . toBe ( true ) ; 
427+         } ) ; 
428+         it ( 'If both first and last are set, and edges contains no more than first elements, return false.' ,  ( )  =>  { 
429+           expect ( preparePageInfo ( fiveEdges ,  {  first : 10 ,  last : 6  } ,  6 ,  4 ) . hasNextPage ) . toBe ( false ) ; 
430+         } ) ; 
385431      } ) ; 
386432
387433      it ( 'should return startCursor' ,  ( )  =>  { 
0 commit comments