/** Ċ Ġ* ĠCopyright Ġ 2 0 1 7 - 2 0 1 8 Ġthe Ġoriginal Ġauthor Ġor Ġauthors Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġio . zh udy . du ic . repository . impl Ċ Ċ import Ġio . zh udy . du ic . User Context Ċ import Ġio . zh udy . du ic . domain . App Ċ import Ġio . zh udy . du ic . domain . Page able Ċ import Ġio . zh udy . du ic . repository . App Repository Ċ import Ġio . zh udy . du ic . server . Application Ċ import Ġio . zh udy . du ic . server . Beans Initializer Ċ import Ġorg . joda . time . DateTime Ċ import Ġorg . joda . time . LocalDate Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Assert .* Ċ import Ġorg . junit . Test Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . boot . test . context . SpringBootTest Ċ import Ġorg . springframework . jdbc . core . ResultSet Extractor Ċ import Ġorg . springframework . jdbc . core . named param . Empty Sql Parameter Source Ċ import Ġorg . springframework . jdbc . core . named param . Named Parameter Jdbc Template Ċ import Ġorg . springframework . test . context . Active Profiles Ċ import Ġorg . springframework . test . context . Context Configuration Ċ import Ġorg . springframework . test . context . junit 4 . Abstract JUnit 4 Spring Context Tests Ċ import Ġorg . springframework . transaction . support . Transaction Template Ċ import Ġreactor . test . Step Verifier Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* Ġ@ author ĠKevin ĠZ ou Ġ( ke vin z @ we gh st . com ) Ċ Ġ*/ Ċ @ Active Profiles (" mysql ", Ġ" test ") Ċ @ SpringBootTest ( classes Ġ= Ġ[ Application :: class ]) Ċ @ Context Configuration ( initial izers Ġ= Ġ[ Beans Initializer :: class ]) Ċ class ĠMySQL App Repository Tests Ġ: ĠAbstract JUnit 4 Spring Context Tests () Ġ{ ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġlateinit Ġvar Ġtransaction Template : ĠTransaction Template ĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġlateinit Ġvar Ġjdbc Template : ĠNamed Parameter Jdbc Template ĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġlateinit Ġvar Ġapp Repository : ĠApp Repository ĊĊĠĠĠ Ġval Ġroot User Context Ġ= Ġobject Ġ: ĠUser Context Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġemail : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġ" root @ unit - test . com " ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġis Root : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġnormal User Context Ġ= Ġobject Ġ: ĠUser Context Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġemail : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġ" a @ unit - test . com " ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġis Root : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun Ġafter () Ġ{ ĊĠĠĠĠĠĠĠ Ġtransaction Template . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjdbc Template . update (" delete Ġfrom Ġapp ", ĠEmpty Sql Parameter Source . INSTANCE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjdbc Template . update (" delete Ġfrom Ġapp _ history ", ĠEmpty Sql Parameter Source . INSTANCE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġinsert () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp Ġ= ĠApp ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" unit Ġtest ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġ"[ TOKEN ]", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Ġ= ĠlistOf (" a @ unit - test . com ", Ġ" b @ unit - test . com ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠStep Verifier . create ( app Repository . insert ( app )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Next ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. verify Complete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdelete () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp Ġ= ĠApp ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" unit Ġtest ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġ"[ TOKEN ]", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Ġ= ĠlistOf (" a @ unit - test . com ", Ġ" b @ unit - test . com ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġapp Repository . insert ( app ). block () ĊĊĠĠĠĠĠĠĠ ĠStep Verifier . create ( app Repository . delete ( app , Ġnormal User Context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Next ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. verify Complete () ĊĊĠĠĠĠĠĠĠ Ġjdbc Template . query ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" SELECT Ġ* ĠFROM Ġapp _ history ĠWHERE Ġname =: name ĠAND Ġprofile =: profile ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" name " Ġto Ġapp . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" profile " Ġto Ġapp . profile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResultSet Extractor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( app . users . join ToString ("," ), Ġit . getString (" users ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( normal User Context . email , Ġit . getString (" deleted _ by ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfind One () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp Ġ= ĠApp ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" unit Ġtest ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġ"[ TOKEN ]", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Ġ= ĠlistOf (" a @ unit - test . com ", Ġ" b @ unit - test . com ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġapp Repository . insert ( app ). block () ĊĊĠĠĠĠĠĠĠ Ġval Ġdb App Ġ= Ġapp Repository . findOne < App >( app . name , Ġapp . profile ). block () ĊĠĠĠĠĠĠĠ ĠassertEquals ( app . name , Ġdb App . name ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( app . profile , Ġdb App . profile ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( app . description , Ġdb App . description ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( app . token , Ġdb App . token ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( app . ip Limit , Ġdb App . ip Limit ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( app . users . join ToString ("," ), Ġdb App . users . join ToString ("," )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġupdate () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp Ġ= ĠApp ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" unit Ġtest ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġ"[ TOKEN ]", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Ġ= ĠlistOf (" a @ unit - test . com ", Ġ" b @ unit - test . com ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġapp Repository . insert ( app ). block () ĊĊĠĠĠĠĠĠĠ ĠStep Verifier . create ( app Repository . update ( app , Ġnormal User Context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Next ( app . v ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. verify Complete () ĊĊĠĠĠĠĠĠĠ Ġjdbc Template . query ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" SELECT Ġ* ĠFROM Ġapp _ history ĠWHERE Ġname =: name ĠAND Ġprofile =: profile ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" name " Ġto Ġapp . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" profile " Ġto Ġapp . profile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResultSet Extractor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( app . users . join ToString ("," ), Ġit . getString (" users ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( normal User Context . email , Ġit . getString (" updated _ by ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġupdate Content () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp Ġ= ĠApp ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" unit Ġtest ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġ"[ TOKEN ]", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Ġ= ĠlistOf (" a @ unit - test . com ", Ġ" b @ unit - test . com ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġapp Repository . insert ( app ). block () ĊĊĠĠĠĠĠĠĠ Ġapp . content Ġ= Ġ" a : Ġa " ĊĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġapp Repository . update Content ( app , Ġnormal User Context ). block () ĊĠĠĠĠĠĠĠ ĠassertEquals ( app . v Ġ+ Ġ 1 , Ġv ) ĊĊĠĠĠĠĠĠĠ Ġjdbc Template . query ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" SELECT Ġ* ĠFROM Ġapp _ history ĠWHERE Ġname =: name ĠAND Ġprofile =: profile ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" name " Ġto Ġapp . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" profile " Ġto Ġapp . profile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResultSet Extractor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( app . users . join ToString ("," ), Ġit . getString (" users ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( normal User Context . email , Ġit . getString (" updated _ by ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( app . v , Ġit . getInt (" v ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠfindAll () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġ 1 .. 3 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Ġ= ĠApp ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" unit Ġtest ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġ"[ TOKEN ]", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Ġ= ĠlistOf (" a @ unit - test . com ", Ġ" b @ unit - test . com ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Repository . insert ( app ). block () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġall Ġ= Ġapp Repository . findAll (). collect List (). block () ĊĠĠĠĠĠĠĠ ĠassertTrue ( all . isNotEmpty ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfind Page () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġ 1 .. 3 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Ġ= ĠApp ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" unit Ġtest ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġ"[ TOKEN ]", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Ġ= ĠlistOf (" a @ unit - test . com ", Ġ" b @ unit - test . com ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Repository . insert ( app ). block () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠPage able () ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġapp Repository . find Page ( p ). block () ĊĠĠĠĠĠĠĠ ĠassertTrue ( list . items . isNotEmpty ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfind Page ByUser () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġ 1 .. 3 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Ġ= ĠApp ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" unit Ġtest ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġ"[ TOKEN ]", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Ġ= ĠlistOf (" a @ unit - test . com ", Ġ" b @ unit - test . com ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Repository . insert ( app ). block () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠPage able () ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġapp Repository . find Page ByUser ( p , Ġnormal User Context ). block () ĊĠĠĠĠĠĠĠ ĠassertTrue ( list . items . isNotEmpty ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsearch Page () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġ 1 .. 3 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Ġ= ĠApp ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" unit Ġtest ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġ"[ TOKEN ]", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Ġ= ĠlistOf (" a @ unit - test . com ", Ġ" b @ unit - test . com ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Repository . insert ( app ). block () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠPage able () ĊĠĠĠĠĠĠĠ ĠStep Verifier . create ( app Repository . search Page ("", Ġp )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Next Matches Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . total Items Ġ>= Ġ 3 0 Ġ&& Ġit . items . size Ġ== Ġp . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. verify Complete () ĊĊĠĠĠĠĠĠĠ ĠStep Verifier . create ( app Repository . search Page (" æµĭè¯ķ ", Ġp )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Next Matches Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . total Items Ġ== Ġ 0 Ġ&& Ġit . items . isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. verify Complete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsearch Page ByUser () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġ 1 .. 3 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Ġ= ĠApp ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" unit Ġtest ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġ"[ TOKEN ]", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Ġ= ĠlistOf (" a @ unit - test . com ", Ġ" b @ unit - test . com ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Repository . insert ( app ). block () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠPage able () ĊĠĠĠĠĠĠĠ ĠStep Verifier . create ( app Repository . search Page ByUser ("", Ġp , Ġnormal User Context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Next Matches Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . total Items Ġ>= Ġ 3 0 Ġ&& Ġit . items . size Ġ== Ġp . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. verify Complete () ĊĊĠĠĠĠĠĠĠ ĠStep Verifier . create ( app Repository . search Page ByUser (" æµĭè¯ķ ", Ġp , Ġnormal User Context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Next Matches Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . total Items Ġ== Ġ 0 Ġ&& Ġit . items . isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. verify Complete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠfindBy UpdatedAt () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġ 1 .. 3 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Ġ= ĠApp ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" unit Ġtest ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġ"[ TOKEN ]", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Ġ= ĠlistOf (" a @ unit - test . com ", Ġ" b @ unit - test . com ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Repository . insert ( app ). block () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠupdatedAt Ġ= ĠLocalDate . parse (" 2 0 1 8 - 0 1 - 0 1 "). toDate () ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġapp Repository . findBy UpdatedAt ( updatedAt ). collect List (). block () ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( list . size Ġ>= Ġ 3 0 ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġprev UpdatedAt : ĠDateTime ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġlist . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev UpdatedAt Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( it . updatedAt !!. is Before ( prev UpdatedAt )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev UpdatedAt Ġ= Ġit . updatedAt ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfind Last 5 0 History () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp Ġ= ĠApp ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" unit Ġtest ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġ"[ TOKEN ]", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Ġ= ĠlistOf (" a @ unit - test . com ", Ġ" b @ unit - test . com ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġapp Repository . insert ( app ). block () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġ 1 .. 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp . description Ġ= Ġ" unit Ġtest [$ n ]" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Repository . update ( app , Ġnormal User Context ). block () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġapp Repository . find Last 5 0 History ( app . name , Ġapp . profile ). collect List (). block () ĊĠĠĠĠĠĠĠ ĠassertEquals ( 5 0 , Ġlist . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠfindAll Names () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġ 1 .. 3 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Ġ= ĠApp ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" unit Ġtest ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġ"[ TOKEN ]", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Ġ= ĠlistOf (" a @ unit - test . com ", Ġ" b @ unit - test . com ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Repository . insert ( app ). block () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġapp Repository . findAll Names (). collect List (). block () ĊĠĠĠĠĠĠĠ ĠassertTrue ( list . size Ġ>= Ġ 3 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfind Profiles ByName () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġ 1 .. 3 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Ġ= ĠApp ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" unit Ġtest ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġ"[ TOKEN ]", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Ġ= ĠlistOf (" a @ unit - test . com ", Ġ" b @ unit - test . com ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Repository . insert ( app ). block () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġapp Repository . find Profiles ByName ( name ). collect List (). block () ĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 0 , Ġlist . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfind Deleted By CreatedAt () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapps Ġ= Ġmutable ListOf < App >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġ 1 .. 3 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Ġ= ĠApp ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" unit Ġtest ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġ"[ TOKEN ]", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Ġ= ĠlistOf (" a @ unit - test . com ", Ġ" b @ unit - test . com ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Repository . insert ( app ). block () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapps . add ( app ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġapps . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Repository . delete ( it , Ġnormal User Context ). block () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠcreatedAt Ġ= ĠLocalDate . parse (" 2 0 1 8 - 0 1 - 0 1 "). toDate () ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġapp Repository . find Deleted By CreatedAt ( createdAt ). collect List (). block () ĊĠĠĠĠĠĠĠ ĠassertTrue ( list . isNotEmpty ()) ĊĊĠĠĠĠĠĠĠ Ġvar Ġprev CreatedAt : ĠDateTime ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġlist . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev CreatedAt Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( it . createdAt !!. is Before ( prev CreatedAt )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev CreatedAt Ġ= Ġit . createdAt ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }