package Ġuk . gov . just ice . digital . h mp ps . pec s . j pc . domain . move Ċ Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . any Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . arg That Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . mock Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . spy Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . times Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . verify Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . wh enever Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . mockito . Argument Matcher Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . boot . test . autoconfigure . orm . jpa . Data Jpa Test Ċ import Ġorg . springframework . boot . test . autoconfigure . orm . jpa . Test EntityManager Ċ import Ġorg . springframework . test . context . Active Profiles Ċ import Ġuk . gov . just ice . digital . h mp ps . pec s . j pc . service . spreadsheet . inbound . report . profile Factory Ċ import Ġuk . gov . just ice . digital . h mp ps . pec s . j pc . service . spreadsheet . inbound . report . report Person Factory Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . LocalDateTime Ċ Ċ private Ġclass ĠPerson Matcher ( var Ġperson : ĠPerson ) Ġ: ĠArgument Matcher < Person > Ġ{ ĊĠ Ġoverride Ġfun Ġmatches ( other Person : ĠPerson ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġperson . person Id Ġ== Ġother Person . person Id ĊĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠProfile Matcher ( var Ġprofile : ĠProfile ) Ġ: ĠArgument Matcher < Profile > Ġ{ ĊĠ Ġoverride Ġfun Ġmatches ( other Profile : ĠProfile ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġprofile . profile Id Ġ== Ġother Profile . profile Id Ġ&& ĊĠĠĠĠĠ Ġprofile . person Id Ġ== Ġprofile . person Id ĊĠ Ġ} Ċ } Ċ Ċ @ Active Profiles (" test ") Ċ @ Data Jpa Test Ċ internal Ġclass ĠPerson Pers ister Test ( ĊĠ Ġ@ Autowired Ġprivate Ġval Ġperson Repository : ĠPerson Repository , ĊĠ Ġ@ Autowired Ġprivate Ġval Ġprofile Repository : ĠProfile Repository , ĊĠ Ġ@ Autowired Ġprivate Ġval Ġentity Manager : ĠTest EntityManager Ċ ) Ġ{ ĊĠ Ġprivate Ġval Ġperson Repository Spy : ĠPerson Repository Ġ= Ġmock Ġ{ Ġspy ( person Repository ) Ġ} ĊĠ Ġprivate Ġval Ġprofile Repository Spy : ĠProfile Repository Ġ= Ġmock Ġ{ Ġspy ( profile Repository ) Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` Persist ĠP II Ġdata `() Ġ{ ĊĠĠĠ Ġval Ġreport Person Ġ= Ġreport Person Factory () ĊĠĠĠ ĠPerson Pers ister ( person Repository , Ġprofile Repository ). persist People ( listOf ( report Person )) ĊĊĠĠĠ Ġentity Manager . flush () ĊĊĠĠĠ Ġval Ġretrieved Person Ġ= Ġperson Repository . findById ( report Person . person Id ). get () ĊĊĠĠĠ Ġ// ĠP II Ġdata Ġshould Ġbe Ġpopulated ĊĠĠĠ ĠassertThat ( retrie ved Person . eth nic ity ). isEqualTo (" White ĠAmerican ") ĊĠĠĠ ĠassertThat ( retrie ved Person . gender ). isEqualTo (" male ") ĊĠĠĠ ĠassertThat ( retrie ved Person . date OfBirth ). isEqualTo ( LocalDate . of ( 1 9 8 0 , Ġ 1 2 , Ġ 2 5 )) ĊĠĠĠ ĠassertThat ( retrie ved Person . first Names ). isEqualTo (" B illy Ġthe ") ĊĠĠĠ ĠassertThat ( retrie ved Person . lastName ). isEqualTo (" K id ") ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` save Ġinvoked Ġonce Ġfor Ġ 1 Ġperson `() Ġ{ ĊĠĠĠ ĠPerson Pers ister ( ĊĠĠĠĠĠ Ġperson Repository Spy , ĊĠĠĠĠĠ Ġprofile Repository Spy ĊĠĠĠ Ġ). persist People ( entities ( 1 ) Ġ{ Ġid Ġ-> Ġreport Person Factory (). copy ( person Id Ġ= Ġid ) Ġ}) ĊĊĠĠĠ Ġverify ( person Repository Spy ). save And Flush ( any ()) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` save Ġinvoked Ġ 5 0 Ġtimes Ġfor Ġ 5 0 Ġpeople `() Ġ{ ĊĠĠĠ ĠPerson Pers ister ( ĊĠĠĠĠĠ Ġperson Repository Spy , ĊĠĠĠĠĠ Ġprofile Repository Spy ĊĠĠĠ Ġ). persist People ( entities ( 5 0 ) Ġ{ Ġid Ġ-> Ġreport Person Factory (). copy ( person Id Ġ= Ġid ) Ġ}) ĊĊĠĠĠ Ġverify ( person Repository Spy , Ġtimes ( 5 0 )). save And Flush ( any ()) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` save Ġinvoked Ġ 5 1 Ġtimes Ġfor Ġ 5 1 Ġpeople `() Ġ{ ĊĠĠĠ ĠPerson Pers ister ( ĊĠĠĠĠĠ Ġperson Repository Spy , ĊĠĠĠĠĠ Ġprofile Repository Spy ĊĠĠĠ Ġ). persist People ( entities ( 5 1 ) Ġ{ Ġid Ġ-> Ġreport Person Factory (). copy ( person Id Ġ= Ġid ) Ġ}) ĊĊĠĠĠ Ġverify ( person Repository Spy , Ġtimes ( 5 1 )). save And Flush ( any ()) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` persist People Ġreturns Ġ 4 Ġwhen Ġ 2 Ġof Ġ 6 Ġpeople Ġare Ġinvalid `() Ġ{ ĊĠĠĠ Ġwhenever ( ĊĠĠĠĠĠ Ġperson Repository Spy . save And Flush ( ĊĠĠĠĠĠĠĠ Ġarg That ( ĊĠĠĠĠĠĠĠĠĠ ĠPerson Matcher ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPerson ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" invalid ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDateTime . now (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" invalid " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ). then Throw ( ĊĠĠĠĠĠ ĠRuntimeException (" An Ġerror Ġmessage ") ĊĠĠĠ Ġ) ĊĊĠĠĠ ĠassertThat ( ĊĠĠĠĠĠ ĠPerson Pers ister ( ĊĠĠĠĠĠĠĠ Ġperson Repository Spy , ĊĠĠĠĠĠĠĠ Ġprofile Repository Spy ĊĠĠĠĠĠ Ġ). persist People ( ĊĠĠĠĠĠĠĠ Ġentities ( 2 ) Ġ{ Ġreport Person Factory (). copy ( person Id Ġ= Ġ" invalid ") Ġ} Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġentities ( 4 ) Ġ{ Ġid Ġ-> Ġreport Person Factory (). copy ( person Id Ġ= Ġid ) Ġ} ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ). isEqualTo ( 4 ) ĊĊĠĠĠ Ġverify ( person Repository Spy , Ġtimes ( 6 )). save And Flush ( any ()) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` save Ġinvoked Ġonce Ġfor Ġ 1 Ġprofile `() Ġ{ ĊĠĠĠ ĠPerson Pers ister ( ĊĠĠĠĠĠ Ġperson Repository Spy , ĊĠĠĠĠĠ Ġprofile Repository Spy ĊĠĠĠ Ġ). persist Profiles ( entities ( 1 ) Ġ{ Ġid Ġ-> Ġprofile Factory (). copy ( profile Id Ġ= Ġid , Ġperson Id Ġ= Ġid ) Ġ}) ĊĊĠĠĠ Ġverify ( profile Repository Spy , Ġtimes ( 1 )). save And Flush ( any ()) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` save Ġinvoked Ġ 5 0 Ġtimes Ġfor Ġ 5 0 Ġprofiles `() Ġ{ ĊĠĠĠ ĠPerson Pers ister ( ĊĠĠĠĠĠ Ġperson Repository Spy , ĊĠĠĠĠĠ Ġprofile Repository Spy ĊĠĠĠ Ġ). persist Profiles ( entities ( 5 0 ) Ġ{ Ġid Ġ-> Ġprofile Factory (). copy ( profile Id Ġ= Ġid , Ġperson Id Ġ= Ġid ) Ġ}) ĊĊĠĠĠ Ġverify ( profile Repository Spy , Ġtimes ( 5 0 )). save And Flush ( any ()) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` save Ġinvoked Ġ 5 1 Ġtimes Ġfor Ġ 5 1 Ġprofiles `() Ġ{ ĊĠĠĠ ĠPerson Pers ister ( ĊĠĠĠĠĠ Ġperson Repository Spy , ĊĠĠĠĠĠ Ġprofile Repository Spy ĊĠĠĠ Ġ). persist Profiles ( entities ( 5 1 ) Ġ{ Ġid Ġ-> Ġprofile Factory (). copy ( profile Id Ġ= Ġid , Ġperson Id Ġ= Ġid ) Ġ}) ĊĊĠĠĠ Ġverify ( profile Repository Spy , Ġtimes ( 5 1 )). save And Flush ( any ()) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` persist Profiles Ġreturns Ġ 4 Ġwhen Ġ 2 Ġof Ġ 6 Ġprofiles Ġare Ġinvalid `() Ġ{ ĊĠĠĠ Ġwhenever ( ĊĠĠĠĠĠ Ġprofile Repository Spy . save And Flush ( ĊĠĠĠĠĠĠĠ Ġarg That ( ĊĠĠĠĠĠĠĠĠĠ ĠProfile Matcher ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProfile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" invalid ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDateTime . now (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" invalid " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ). then Throw ( ĊĠĠĠĠĠ ĠRuntimeException (" An Ġerror Ġmessage ") ĊĠĠĠ Ġ) ĊĊĠĠĠ ĠassertThat ( ĊĠĠĠĠĠ ĠPerson Pers ister ( ĊĠĠĠĠĠĠĠ Ġperson Repository Spy , ĊĠĠĠĠĠĠĠ Ġprofile Repository Spy ĊĠĠĠĠĠ Ġ). persist Profiles ( ĊĠĠĠĠĠĠĠ Ġentities ( 2 ) Ġ{ Ġprofile Factory (). copy ( profile Id Ġ= Ġ" invalid ", Ġperson Id Ġ= Ġ" invalid ") Ġ} Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġentities ( 4 ) Ġ{ Ġid Ġ-> Ġprofile Factory (). copy ( profile Id Ġ= Ġid , Ġperson Id Ġ= Ġid ) Ġ} ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ). isEqualTo ( 4 ) ĊĊĠĠĠ Ġverify ( profile Repository Spy , Ġtimes ( 6 )). save And Flush ( any ()) ĊĠ Ġ} ĊĊĠ Ġfun Ġ< T > Ġentities ( numberOf : ĠInt , Ġf : Ġ( id : ĠString ) Ġ-> ĠT ): ĠList < T > Ġ= ĊĠĠĠ ĠMutable List ( numberOf ) Ġ{ Ġindex Ġ-> Ġf ( index . toString ()) Ġ} Ċ } Ċ