/* Ċ Ġ* ĠCopyright ĠThe ĠTitan ĠProject ĠContributors . Ċ Ġ*/ Ċ Ċ package Ġio . tit and ata Ċ Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġcom . google . gson . reflect . Type Token Ċ import Ġio . kot lint est . Spec Ċ import Ġio . kot lint est . TestCase Ċ import Ġio . kot lint est . TestCase Order Ċ import Ġio . kot lint est . TestResult Ċ import Ġio . kot lint est . shouldBe Ċ import Ġio . kot lint est . specs . String Spec Ċ import Ġio . ktor . http . ContentType Ċ import Ġio . ktor . http . HttpHeaders Ċ import Ġio . ktor . http . HttpMethod Ċ import Ġio . ktor . http . HttpStatusCode Ċ import Ġio . ktor . server . testing . Test Application Engine Ċ import Ġio . ktor . server . testing . contentType Ċ import Ġio . ktor . server . testing . create Test Environment Ċ import Ġio . ktor . server . testing . handle Request Ċ import Ġio . ktor . server . testing . set Body Ċ import Ġio . ktor . util . K tor Experimental API Ċ import Ġio . mock k . Mock K Annotations Ċ import Ġio . mock k . Runs Ċ import Ġio . mock k . clear All Mocks Ċ import Ġio . mock k . every Ċ import Ġio . mock k . impl . annotations . Inject Mock Ks Ċ import Ġio . mock k . impl . annotations . Override Mock Ks Ċ import Ġio . mock k . impl . annotations . Spy K Ċ import Ġio . mock k . just Ċ import Ġio . mock k . mock k Ċ import Ġio . tit and ata . context . docker . Docker Z fs Context Ċ import Ġio . tit and ata . metadata . Operation Data Ċ import Ġio . tit and ata . models . Commit Ċ import Ġio . tit and ata . models . Error Ċ import Ġio . tit and ata . models . Operation Ċ import Ġio . tit and ata . models . Progress Entry Ċ import Ġio . tit and ata . models . Remote Ċ import Ġio . tit and ata . models . Remote Parameters Ċ import Ġio . tit and ata . models . Repository Ċ import Ġio . tit and ata . models . Volume Ċ import Ġjava . time . Duration Ċ import Ġjava . util . UUID Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlinx . coroutines . time . delay Ċ import Ġorg . jetbrains . ex posed . sql . transactions . transaction Ċ Ċ @ Use Experimental ( K tor Experimental API :: class ) Ċ class ĠOperations Api Test Ġ: ĠString Spec () Ġ{ ĊĊĠĠĠ Ġ@ Spy K ĊĠĠĠ Ġvar Ġcontext Ġ= ĠDocker Z fs Context ( map Of (" pool " Ġto Ġ" test ")) ĊĊĠĠĠ Ġlateinit Ġvar Ġvs 1 : ĠString ĊĠĠĠ Ġlateinit Ġvar Ġvs 2 : ĠString ĊĊĠĠĠ Ġ@ Inject Mock Ks ĊĠĠĠ Ġ@ Override Mock Ks ĊĠĠĠ Ġvar Ġservices Ġ= ĠService Locator ( mock k ()) ĊĊĠĠĠ Ġvar Ġengine Ġ= ĠTest Application Engine ( create Test Environment ()) ĊĊĠĠĠ Ġval Ġgson Ġ= ĠGson Builder (). create () ĊĊĠĠĠ Ġoverride Ġfun Ġbefore Spec ( spec : ĠSpec ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( engine ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservices . metadata . init () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication . main Provider ( services ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġafter Spec ( spec : ĠSpec ) Ġ{ ĊĠĠĠĠĠĠĠ Ġengine . stop ( 0 L , Ġ 0 L , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbefore Test ( testCase : ĠTestCase ) Ġ{ ĊĠĠĠĠĠĠĠ Ġservices . operations . clear State () ĊĠĠĠĠĠĠĠ Ġservices . metadata . clear () ĊĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservices . metadata . create Repository ( Repository ( name Ġ= Ġ" foo ", Ġproperties Ġ= Ġmap Of ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservices . metadata . add Remote (" foo ", ĠRemote (" nop ", Ġ" remote ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvs 1 Ġ= Ġservices . metadata . create Volume Set (" foo ", Ġnull , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvs 2 Ġ= Ġservices . metadata . create Volume Set (" foo ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservices . metadata . create Volume ( vs 1 , ĠVolume (" volume ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠMock K Annotations . init ( this ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcontext . create Volume Set ( any ()) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcontext . create Volume ( any (), Ġany ()) Ġ} Ġreturns Ġmap Of (" mo un tpoint " Ġto Ġ"/ mo un tpoint ") ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcontext . clone Volume ( any (), Ġany (), Ġany (), Ġany (), Ġany ()) Ġ} Ġreturns Ġmap Of (" mo un tpoint " Ġto Ġ"/ mo un tpoint ") ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcontext . activate Volume ( any (), Ġany (), Ġany ()) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcontext . deactivate Volume ( any (), Ġany (), Ġany ()) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcontext . delete Volume ( any (), Ġany (), Ġany ()) Ġ} Ġjust ĠRuns ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġafter Test ( testCase : ĠTestCase , Ġresult : ĠTest Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclear All Mocks () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtestCase Order () Ġ= ĠTestCase Order . Random ĊĊĠĠĠ Ġfun Ġload Operation ( data : ĠOperation Data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservices . metadata . create Operation (" foo ", Ġdata . operation . id , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Test Operations () Ġ{ ĊĠĠĠĠĠĠĠ Ġload Operation ( Operation Data ( operation Ġ= ĠOperation ( id Ġ= Ġvs 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠOperation . Type . PUSH , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠOperation . State . RUNNING , Ġremote Ġ= Ġ" remote ", Ġcommit Id Ġ= Ġ" commit 1 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= ĠRemote Parameters (" nop "), Ġrepo Ġ= Ġ" foo ")) ĊĠĠĠĠĠĠĠ Ġload Operation ( Operation Data ( operation Ġ= ĠOperation ( id Ġ= Ġvs 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠOperation . Type . PULL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠOperation . State . RUNNING , Ġremote Ġ= Ġ" remote ", Ġcommit Id Ġ= Ġ" commit 2 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= ĠRemote Parameters (" nop "), Ġrepo Ġ= Ġ" foo ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ" list Ġempty Ġoperations Ġsucceeds " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( engine . handle Request ( HttpMethod . Get , Ġ"/ v 1 / operations ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () ĠshouldBe ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . contentType (). toString () ĠshouldBe Ġ" application / json ; Ġcharset = UTF - 8 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . content ĠshouldBe Ġ" []" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" list Ġoperations Ġsucceeds " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Test Operations () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( engine . handle Request ( HttpMethod . Get , Ġ"/ v 1 / operations ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () ĠshouldBe ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . contentType (). toString () ĠshouldBe Ġ" application / json ; Ġcharset = UTF - 8 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . content ĠshouldBe Ġ"[ {\" id \":\" $ vs 1 \",\" type \":\" PUSH \ "," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\" state \":\" RUNNING \",\" remote \":\" remote \",\" commit Id \":\" commit 1 \" }," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"{\" id \":\" $ vs 2 \",\" type \":\" PULL \",\" state \":\" RUNNING \ "," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\" remote \":\" remote \",\" commit Id \":\" commit 2 \" }] " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" list Ġoperations Ġby Ġrepo Ġsucceeds " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Test Operations () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( engine . handle Request ( HttpMethod . Get , Ġ"/ v 1 / operations ? repository = foo ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () ĠshouldBe ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . contentType (). toString () ĠshouldBe Ġ" application / json ; Ġcharset = UTF - 8 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . content ĠshouldBe Ġ"[ {\" id \":\" $ vs 1 \",\" type \":\" PUSH \ "," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\" state \":\" RUNNING \",\" remote \":\" remote \",\" commit Id \":\" commit 1 \" }," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"{\" id \":\" $ vs 2 \",\" type \":\" PULL \",\" state \":\" RUNNING \ "," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\" remote \":\" remote \",\" commit Id \":\" commit 2 \" }] " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" list Ġoperations Ġby Ġrepo Ġreturns Ġempty Ġlist " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Test Operations () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservices . metadata . create Repository ( Repository ( name Ġ= Ġ" bar ", Ġproperties Ġ= Ġmap Of ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( engine . handle Request ( HttpMethod . Get , Ġ"/ v 1 / operations ? repository = bar ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () ĠshouldBe ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . contentType (). toString () ĠshouldBe Ġ" application / json ; Ġcharset = UTF - 8 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . content ĠshouldBe Ġ" []" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" get Ġoperation Ġfails Ġfor Ġnon - existent Ġoperation " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( engine . handle Request ( HttpMethod . Get , Ġ"/ v 1 / operations /$ id ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () ĠshouldBe ĠHttpStatusCode . NotFound ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠGson (). fromJson ( response . content , ĠError :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror . code ĠshouldBe Ġ" NoSuch Object Exception " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror . message ĠshouldBe Ġ" no Ġsuch Ġoperation Ġ'$ id '" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" get Ġoperation Ġsucceeds " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Test Operations () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( engine . handle Request ( HttpMethod . Get , Ġ"/ v 1 / operations /$ vs 1 ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () ĠshouldBe ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . contentType (). toString () ĠshouldBe Ġ" application / json ; Ġcharset = UTF - 8 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . content ĠshouldBe Ġ"{\" id \":\" $ vs 1 \",\" type \":\" PUSH \ "," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\" state \":\" RUNNING \",\" remote \":\" remote \",\" commit Id \":\" commit 1 \" }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" abort Ġin - progress Ġoperation Ġresults Ġin Ġaborted Ġstate " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservices . metadata . create Commit (" foo ", Ġvs 1 , ĠCommit (" commit ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Operation ( Operation Data ( Operation ( id Ġ= Ġvs 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠOperation . Type . PUSH , Ġcommit Id Ġ= Ġ" commit ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠOperation . State . RUNNING , Ġremote Ġ= Ġ" remote "), Ġrepo Ġ= Ġ" foo ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= ĠRemote Parameters (" nop ", Ġmap Of (" delay " Ġto Ġ 1 0 )))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservices . operations . load State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( engine . handle Request ( HttpMethod . Delete , Ġ"/ v 1 / operations /$ vs 2 ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () ĠshouldBe ĠHttpStatusCode . No Content ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( Duration . of Millis ( 5 0 0 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( engine . handle Request ( HttpMethod . Get , Ġ"/ v 1 / operations /$ vs 2 ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () ĠshouldBe ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġop Ġ= Ġgson . fromJson ( response . content , ĠOperation :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop . state ĠshouldBe ĠOperation . State . ABORT ED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" abort Ġcompleted Ġoperation Ġdoesn 't Ġalter Ġoperation " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservices . metadata . create Commit (" foo ", Ġvs 1 , ĠCommit (" commit ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Operation ( Operation Data ( Operation ( id Ġ= Ġvs 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠOperation . Type . PUSH , Ġcommit Id Ġ= Ġ" commit ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠOperation . State . COMPLETE , Ġremote Ġ= Ġ" remote "), Ġrepo Ġ= Ġ" foo ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= ĠRemote Parameters (" nop ", Ġmap Of (" delay " Ġto Ġ 1 0 )))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservices . operations . load State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( engine . handle Request ( HttpMethod . Delete , Ġ"/ v 1 / operations /$ vs 1 ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () ĠshouldBe ĠHttpStatusCode . No Content ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( engine . handle Request ( HttpMethod . Get , Ġ"/ v 1 / operations /$ vs 1 ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () ĠshouldBe ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . content ĠshouldBe Ġ"{\" id \":\" $ vs 1 \",\" type \":\" PUSH \ "," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\" state \":\" COMPLETE \",\" remote \":\" remote \",\" commit Id \":\" commit \" }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" get Ġres umed Ġprogress Ġreturns Ġcorrect Ġstate " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservices . metadata . create Commit (" foo ", Ġvs 1 , ĠCommit (" commit ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcontext . create Volume ( any (), Ġany ()) Ġ} Ġreturns Ġempty Map () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Operation ( Operation Data ( Operation ( id Ġ= Ġvs 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠOperation . Type . PUSH , Ġcommit Id Ġ= Ġ" commit ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠOperation . State . RUNNING , Ġremote Ġ= Ġ" remote "), Ġrepo Ġ= Ġ" foo ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= ĠRemote Parameters (" nop ", Ġmap Of (" delay " Ġto Ġ 1 0 )))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservices . operations . load State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( Duration . of Millis ( 5 0 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( engine . handle Request ( HttpMethod . Get , Ġ"/ v 1 / operations /$ vs 2 / progress ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () ĠshouldBe ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentries : ĠList < Progress Entry > Ġ= Ġgson . fromJson ( response . content , Ġobject Ġ: ĠType Token < List < Progress Entry >>() Ġ{ Ġ}. type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentries . size ĠshouldBe Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentries [ 0 ]. type ĠshouldBe ĠProgress Entry . Type . MESSAGE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentries [ 0 ]. message ĠshouldBe Ġ" Retry ing Ġoperation Ġafter Ġrestart " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" push Ġstarts Ġoperation " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservices . metadata . create Commit (" foo ", Ġvs 1 , ĠCommit (" commit ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġengine . handle Request ( HttpMethod . Post , Ġ"/ v 1 / repositories / foo / rem otes / remote / commits / commit / push ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . ContentType , ĠContentType . Application . Json . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Body ("{ \" provider \":\" nop \",\" properties \": {}} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . response . status () ĠshouldBe ĠHttpStatusCode . Created ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperation Ġ= Ġgson . fromJson ( result . response . content , ĠOperation :: class . java ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperation . commit Id ĠshouldBe Ġ" commit " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperation . remote ĠshouldBe Ġ" remote " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperation . type ĠshouldBe ĠOperation . Type . PUSH ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( engine . handle Request ( HttpMethod . Get , Ġ"/ v 1 / operations /${ operation . id } ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () ĠshouldBe ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" pull Ġstarts Ġoperation " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġengine . handle Request ( HttpMethod . Post , Ġ"/ v 1 / repositories / foo / rem otes / remote / commits / commit / pull ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . ContentType , ĠContentType . Application . Json . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Body ("{ \" provider \":\" nop \",\" properties \": {}} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . response . status () ĠshouldBe ĠHttpStatusCode . Created ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperation Ġ= Ġgson . fromJson ( result . response . content , ĠOperation :: class . java ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperation . commit Id ĠshouldBe Ġ" commit " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperation . remote ĠshouldBe Ġ" remote " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperation . type ĠshouldBe ĠOperation . Type . PULL ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( engine . handle Request ( HttpMethod . Get , Ġ"/ v 1 / operations /${ operation . id } ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () ĠshouldBe ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ