package Ġcom . op id is . unit of work . data Ċ Ċ import Ġorg . junit . jupiter . api . After Each Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Nested Ċ import Ġorg . junit . jupiter . api . Test Ċ Ċ internal Ġclass ĠUnit OfWork Aware User Test Ġ{ ĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġclass ĠWith No Tracking Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġunit OfWork Aware User : ĠUnit OfWork Aware User ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ@ BeforeEach ĊĠĠĠĠĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunit OfWork Aware User Ġ= ĠUnit OfWork Aware User ( name Ġ= Ġ" Ch ris ", Ġaddress Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Id ox ĠSoftware ĠLtd ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠGro sv en or ĠBuilding ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 7 2 ĠG ord on ĠStreet ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" G las g ow ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" G 1 Ġ 3 RS ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" UK " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ After Each ĊĠĠĠĠĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun ĠgetName () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( unit OfWork Aware User ?. name Ġ== Ġ" Ch ris ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġget Address () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( unit OfWork Aware User ?. address ?. size Ġ== Ġ 6 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġclass ĠWith Unit OfWork Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġunit OfWork : ĠEntity Tracking Unit OfWork ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġunit OfWork Aware User : ĠUnit OfWork Aware User ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġquery Configuration : ĠMock Query Configuration ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġclass ĠMock Query ĊĊĠĠĠĠĠĠĠ Ġclass ĠMock Query Configuration Ġ: ĠQuery Mapping Configuration < Mock Query > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠlistOf User Changes Ġ= ĠArrayList < Unit OfWork Aware User >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠlistOf User Add itions Ġ= ĠArrayList < Unit OfWork Aware User >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠlistOf User De letions Ġ= ĠArrayList < Unit OfWork Aware User >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġquery For ( change Type : ĠChange Type , Ġentity : ĠEntity ): ĠMock Query Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint ("$ entity Ġ${ entity . java Class } Ġ${ entity . java Class . kotlin }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity As User Ġ= Ġentity Ġas ĠUnit OfWork Aware User ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( change Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChange Type . Delete Ġ-> ĠlistOf User De letions . add ( entity As User ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChange Type . Insert Ġ-> ĠlistOf User Add itions . add ( entity As User ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChange Type . Update Ġ-> ĠlistOf User Changes . add ( entity As User ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Query () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Query Coordinator For ( numberOf Results : ĠInt )= Ġobject Ġ: ĠQuery Coordinator < Mock Query > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtransaction ( transaction al : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExecute Ġthe Ġbody Ġof Ġthe Ġtransaction , Ġe . g . Ġquery Ġgeneration Ġand Ġexecution . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction al () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbatch Execute ( queries : ĠList < Mock Query >) Ġ= ĠInt Array ( numberOf Results ) Ġ{ Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ BeforeEach ĊĠĠĠĠĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmock Query Configuration Ġ= ĠMock Query Configuration () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Configuration Ġ= Ġmock Query Configuration ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġunit OfWork Ġ= ĠDefault Entity Tracking Unit OfWork ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Configuration Ġ= Ġmock Query Configuration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Coordinator Ġ= Ġget Query Coordinator For ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġunit OfWork Aware User Ġ= ĠUnit OfWork Aware User ( name Ġ= Ġ" Ch ris ", Ġaddress Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Id ox ĠSoftware ĠLtd ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠGro sv en or ĠBuilding ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 7 2 ĠG ord on ĠStreet ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" G las g ow ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" G 1 Ġ 3 RS ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" UK " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġentity Tracking Unit OfWork Ġ= Ġunit OfWork ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ After Each ĊĠĠĠĠĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun ĠgetName () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( unit OfWork Aware User ?. name Ġ== Ġ" Ch ris ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun ĠlistOf Changes ShouldBe Zero Before Changes Made () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunit OfWork Aware User ?. name Ġ= Ġ" G ord on " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( unit OfWork Aware User ?. name Ġ== Ġ" G ord on ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( query Configuration ?. listOf User Changes ?. size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" List Ġof Ġuser Ġchanges Ġshould Ġbe Ġzero Ġbefore Ġmodifying Ġdata " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun ĠsetName () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunit OfWork Aware User ?. name Ġ= Ġ" G ord on " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( unit OfWork Aware User ?. name Ġ== Ġ" G ord on ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġperform Ġcomplete Ġto Ġget Ġthe Ġquery Ġgeneration Ġto Ġoccur Ġand Ġhave Ġthe Ġchanges Ġpropag ated Ġto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġmock ĠQuery Configuration Ġobject . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunit OfWork ?. complete () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( query Configuration ?. listOf User Changes ?. size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ query Configuration ?. listOf User Changes ?. size } Ġuser Ġchange Ġentries Ġwere Ġmade Ġwhen Ġ 1 Ġentry Ġshould Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" have Ġbeen Ġmade " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( query Configuration ?. listOf User Changes ?. contains ( unit OfWork Aware User ) Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġtrack Deletion () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTrack Ġdeletion Ġof Ġthe Ġunit Ġof Ġwork Ġaware Ġuser Ġentity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunit OfWork ?. track Delete ( unit OfWork Aware User !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġperform Ġcomplete Ġto Ġget Ġthe Ġquery Ġgeneration Ġto Ġoccur Ġand Ġhave Ġthe Ġchanges Ġpropag ated Ġto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġmock ĠQuery Configuration Ġobject . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunit OfWork ?. complete () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( query Configuration ?. listOf User De letions ?. size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ query Configuration ?. listOf User De letions ?. size } Ġuser Ġchange Ġentries Ġwere Ġmade Ġwhen Ġ 1 Ġentry Ġshould Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" have Ġbeen Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" made " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( query Configuration ?. listOf User De letions ?. contains ( unit OfWork Aware User ) Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġtrack Addition () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTrack Ġdeletion Ġof Ġthe Ġunit Ġof Ġwork Ġaware Ġuser Ġentity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunit OfWork ?. track New ( unit OfWork Aware User !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġperform Ġcomplete Ġto Ġget Ġthe Ġquery Ġgeneration Ġto Ġoccur Ġand Ġhave Ġthe Ġchanges Ġpropag ated Ġto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġmock ĠQuery Configuration Ġobject . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunit OfWork ?. complete () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( query Configuration ?. listOf User Add itions ?. size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ query Configuration ?. listOf User Add itions ?. size } Ġuser Ġchange Ġentries Ġwere Ġmade Ġwhen Ġ 1 Ġentry Ġshould Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" have Ġbeen Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" made " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( query Configuration ?. listOf User Add itions ?. contains ( unit OfWork Aware User ) Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġget Address () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( unit OfWork Aware User ?. address ?. size Ġ== Ġ 6 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }