package Ġcom . ne el k am ath . om ni Chat Backend . graphql . data Transfer Objects Ċ Ċ import Ġcom . fasterxml . jackson . module . kotlin . convert Value Ċ import Ġcom . ne el k am ath . om ni Chat Backend . Db Extension Ċ import Ġcom . ne el k am ath . om ni Chat Backend . create Verified Users Ċ import Ġcom . ne el k am ath . om ni Chat Backend . db . Backward Pagination Ċ import Ġcom . ne el k am ath . om ni Chat Backend . db . tables . Group Ch ats Ċ import Ġcom . ne el k am ath . om ni Chat Backend . db . tables . Messages Ċ import Ġcom . ne el k am ath . om ni Chat Backend . db . tables . create Ċ import Ġcom . ne el k am ath . om ni Chat Backend . db . tables . message Ċ import Ġcom . ne el k am ath . om ni Chat Backend . graphql . engine . execute Graph Ql Via Engine Ċ import Ġcom . ne el k am ath . om ni Chat Backend . testing ObjectMapper Ċ import Ġorg . junit . jupiter . api . Nested Ċ import Ġorg . junit . jupiter . api . extension . Extend With Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ Ċ @ Extend With ( Db Extension :: class ) Ċ class ĠChat Messages Test Ġ{ ĊĠĠĠ Ġprivate Ġdata Ġclass ĠSearch Messages Response ( val Ġedges : ĠList < Edge >) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠEdge ( val Ġnode : ĠNode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġclass ĠNode ( val Ġchat : ĠChat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġclass ĠChat ( val Ġmessages : ĠMessages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġclass ĠMessages ( val Ġedges : ĠList < Edge >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġclass ĠEdge ( val Ġnode : ĠNode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġclass ĠNode ( val ĠmessageId : ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠGet Messages Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Messages ( userId : ĠInt , Ġpagination : ĠBack ward Pagination ? Ġ= Ġnull ): ĠList < Int > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġexecute Graph Ql Via Engine ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery ĠSearch Messages ($ {" $ "} query : ĠString !, Ġ${ "$ "} last : ĠInt , Ġ${ "$ "} before : ĠCursor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Messages ( query : Ġ${ "$ "} query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedges Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessages ( last : Ġ${ "$ "} last , Ġbefore : Ġ${ "$ "} before ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedges Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmessageId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" query " Ġto Ġ"", Ġ" last " Ġto Ġpagination ?. last , Ġ" before " Ġto Ġpagination ?. before ?. toString ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). data !! [" search Messages "] Ġas ĠMap < *, Ġ*> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtesting ObjectMapper . convert Value < Search Messages Response >( data ). edges . flatMap Ġ{ Ġ( node ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . chat . messages . edges . map Ġ{ Ġit . node . message Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Every Ġitem Ġmust Ġbe Ġretrieved Ġif Ġneither Ġcursor Ġnor Ġlimit Ġget Ġsupplied `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadmin Id Ġ= Ġcreate Verified Users ( 1 ). first (). userId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchat Id Ġ= ĠGroup Ch ats . create ( set Of ( admin Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage IdList Ġ= Ġ( 1 .. 1 0 ). map Ġ{ ĠMessages . message ( admin Id , Ġchat Id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( message IdList , Ġget Messages ( admin Id )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` The Ġnumber Ġof Ġitems Ġspecified Ġby Ġthe Ġlimit Ġmust Ġbe Ġreturned Ġfrom Ġbefore Ġthe Ġcursor `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadmin Id Ġ= Ġcreate Verified Users ( 1 ). first (). userId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchat Id Ġ= ĠGroup Ch ats . create ( set Of ( admin Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage IdList Ġ= Ġ( 1 .. 1 0 ). map Ġ{ ĠMessages . message ( admin Id , Ġchat Id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Ġ= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġ 7 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġget Messages ( admin Id , ĠBack ward Pagination ( last , Ġbefore Ġ= Ġmessage IdList [ index ])) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( message IdList . sub List ( index Ġ- Ġlast , Ġindex ), Ġactual ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` The Ġnumber Ġof Ġitems Ġspecified Ġby Ġthe Ġlimit Ġfrom Ġthe Ġlast Ġitem Ġmust Ġbe Ġretrieved Ġwhen Ġthere 's Ġno Ġcursor `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadmin Id Ġ= Ġcreate Verified Users ( 1 ). first (). userId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchat Id Ġ= ĠGroup Ch ats . create ( set Of ( admin Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage IdList Ġ= Ġ( 1 .. 1 0 ). map Ġ{ ĠMessages . message ( admin Id , Ġchat Id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Ġ= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġget Messages ( admin Id , ĠBack ward Pagination ( last )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( message IdList . take Last ( last ), Ġactual ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Every Ġitem Ġbefore Ġthe Ġcursor Ġmust Ġbe Ġretrieved Ġwhen Ġthere 's Ġno Ġlimit `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadmin Id Ġ= Ġcreate Verified Users ( 1 ). first (). userId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchat Id Ġ= ĠGroup Ch ats . create ( set Of ( admin Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage IdList Ġ= Ġ( 1 .. 1 0 ). map Ġ{ ĠMessages . message ( admin Id , Ġchat Id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġ 7 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġget Messages ( admin Id , ĠBack ward Pagination ( before Ġ= Ġmessage IdList [ index ])) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( message IdList . take ( index ), Ġactual ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Zero Ġitems Ġmust Ġbe Ġretrieved Ġwhen Ġusing Ġthe Ġfirst Ġitem 's Ġcursor `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadmin Id Ġ= Ġcreate Verified Users ( 1 ). first (). userId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchat Id Ġ= ĠGroup Ch ats . create ( set Of ( admin Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage IdList Ġ= Ġ( 1 .. 1 0 ). map Ġ{ ĠMessages . message ( admin Id , Ġchat Id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġget Messages ( admin Id , ĠBack ward Pagination ( before Ġ= Ġmessage IdList [ 0 ])). size ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġactual ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Given Ġitems Ġ 1 - 1 0 Ġwhere Ġitem Ġ 4 Ġhas Ġbeen Ġdeleted , Ġwhen Ġrequesting Ġthe Ġlast Ġthree Ġitems Ġbefore Ġitem Ġ 6 , Ġthen Ġitems Ġ 2 , Ġ 3 , Ġand Ġ 5 Ġmust Ġbe Ġretrieved `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadmin Id Ġ= Ġcreate Verified Users ( 1 ). first (). userId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchat Id Ġ= ĠGroup Ch ats . create ( set Of ( admin Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage IdList Ġ= Ġ( 1 .. 1 0 ). map Ġ{ ĠMessages . message ( admin Id , Ġchat Id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMessages . delete ( message IdList [ 3 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġget Messages ( admin Id , ĠBack ward Pagination ( last Ġ= Ġ 3 , Ġbefore Ġ= Ġmessage IdList [ 5 ])) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( message IdList [ 1 ], Ġmessage IdList [ 2 ], Ġmessage IdList [ 4 ]), Ġactual ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Using Ġa Ġdeleted Ġitem 's Ġcursor Ġmust Ġcause Ġpagination Ġto Ġwork Ġas Ġif Ġthe Ġitem Ġstill Ġexists `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadmin Id Ġ= Ġcreate Verified Users ( 1 ). first (). userId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchat Id Ġ= ĠGroup Ch ats . create ( set Of ( admin Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage IdList Ġ= Ġ( 1 .. 1 0 ). map Ġ{ ĠMessages . message ( admin Id , Ġchat Id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMessages . delete ( message IdList [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġget Messages ( admin Id , ĠBack ward Pagination ( before Ġ= Ġmessage IdList [ index ])) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( message IdList . take ( index ), Ġactual ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ