package Ġio . ple o . ant ae us . app . saga Ċ Ċ import Ġio . mock k . every Ċ import Ġio . mock k . mock k Ċ import Ġio . ple o . ant ae us . app . Ant ae us App Test Ċ import Ġio . ple o . ant ae us . app . payment . Payment CommandHandler Ċ import Ġio . ple o . ant ae us . app . payment . Payment EventHandler Ċ import Ġio . ple o . ant ae us . app . vert icle . Payment Vert icle Ċ import Ġio . ple o . ant ae us . context . invoice . Invoice Service Ċ import Ġio . ple o . ant ae us . context . invoice . Invoice Status Ċ import Ġio . ple o . ant ae us . context . payment .* Ċ import Ġio . ple o . ant ae us . context . payment . external . Payment Provider Ċ import Ġio . ple o . ant ae us . core . exceptions . Network Exception Ċ import Ġio . ple o . ant ae us . core . message bus . Command Bus Ċ import Ġio . ple o . ant ae us . core . message bus . EventBus Ċ import Ġio . ple o . ant ae us . core . value . Currency Ċ import Ġio . ple o . ant ae us . data . Ant ae us Dal Ċ import Ġio . ple o . ant ae us . message bus . Vert x Command Bus Ċ import Ġio . ple o . ant ae us . message bus . Vert x EventBus Ċ import Ġio . ple o . ant ae us . model . Bill ings Table Ċ import Ġio . ple o . ant ae us . model . Customer Table Ċ import Ġio . ple o . ant ae us . model . Invoice Table Ċ import Ġio . ple o . ant ae us . model . Payment Table Ċ import Ġio . ple o . ant ae us . repository . Ex posed Invoice Repository Ċ import Ġio . ple o . ant ae us . repository . InMemory Payment Repository Ċ import Ġio . vertx . core . Vert x Ċ import Ġio . vertx . junit 5 . Vert x Extension Ċ import Ġio . vertx . junit 5 . Vert x TestContext Ċ import Ġorg . jetbrains . ex posed . sql . Database Ċ import Ġorg . jetbrains . ex posed . sql . Schema Utils Ċ import Ġorg . jetbrains . ex posed . sql . Std Out Sql Logger Ċ import Ġorg . jetbrains . ex posed . sql . add Logger Ċ import Ġorg . jetbrains . ex posed . sql . transactions . Transaction Manager Ċ import Ġorg . jetbrains . ex posed . sql . transactions . transaction Ċ import Ġorg . junit . jupiter . api . Before All Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . Test Instance Ċ import Ġorg . junit . jupiter . api . extension . Extend With Ċ import Ġjava . io . File Ċ import Ġjava . sql . Connection Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ @ Extend With ( Vert x Extension :: class ) Ċ @ Test Instance ( Test Instance . Lifecycle . PER _ CLASS ) Ċ class ĠPayment Process IntegrationTest Ġ{ ĊĊĠĠĠ Ġlateinit Ġvar Ġdal : ĠAnt ae us Dal ĊĠĠĠ Ġlateinit Ġvar Ġdb : ĠDatabase ĊĠĠĠ Ġlateinit Ġvar Ġpayment Saga : ĠPayment Saga ĊĠĠĠ Ġprivate Ġval Ġpayments Map Ġ= Ġmutable Map Of < UUID , ĠPayment ?> () ĊĠĠĠ Ġprivate Ġval Ġpayment Provider Ġ= Ġmock k < Payment Provider >( relax ed Ġ= Ġtrue ) ĊĠĠĠ Ġlateinit Ġvar Ġpayment CommandHandler : ĠPayment CommandHandler ĊĠĠĠ Ġlateinit Ġvar Ġpayment EventHandler : ĠPayment EventHandler ĊĠĠĠ Ġlateinit Ġvar Ġinvoice Service : ĠInvoice Service ĊĠĠĠ Ġlateinit Ġvar Ġpayment Service : ĠPayment Service ĊĠĠĠ Ġlateinit Ġvar Ġcommand Bus : ĠCommand Bus ĊĠĠĠ Ġlateinit Ġvar Ġevent Bus : ĠEvent Bus ĊĊĠĠĠ Ġ@ Before All ĊĠĠĠ Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtables Ġ= ĠarrayOf ( Bill ings Table , ĠPayment Table , ĠInvoice Table , ĠCustomer Table ) ĊĠĠĠĠĠĠĠ Ġval Ġdb File : ĠFile Ġ= ĠFile . create TempFile (" ant ae us - db ", Ġ". 2 ") ĊĊĠĠĠĠĠĠĠ Ġdb Ġ= ĠDatabase ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. connect ( url Ġ= Ġ" jdbc : sqlite :${ db File . absolute Path }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdriver Ġ= Ġ" org . sqlite . JDBC ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Ġ= Ġ" root ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Ġ= Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransaction Manager . manager . default Isolation Level Ġ= ĠConnection . TRANSACTION _ SERIAL IZ ABLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Logger ( Std Out Sql Logger ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDrop Ġall Ġexisting Ġtables Ġto Ġensure Ġa Ġclean Ġs late Ġon Ġeach Ġrun ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSchema Utils . drop (* tables ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġall Ġtables ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSchema Utils . create (* tables ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun Ġsetup ( vertx : ĠVert x , Ġtest Context : ĠVert x TestContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpayments Map . clear () ĊĠĠĠĠĠĠĠ Ġdal Ġ= ĠAnt ae us Dal ( db Ġ= Ġdb ) ĊĠĠĠĠĠĠĠ Ġval Ġinvoice Repository Ġ= ĠEx posed Invoice Repository ( db ) ĊĠĠĠĠĠĠĠ Ġval Ġpayment Repository Ġ= ĠIn Memory Payment Repository ( payments Map ) ĊĊĠĠĠĠĠĠĠ Ġcommand Bus Ġ= ĠVert x Command Bus ( vertx . event Bus ()) ĊĠĠĠĠĠĠĠ Ġevent Bus Ġ= ĠVert x EventBus ( vertx . event Bus ()) ĊĠĠĠĠĠĠĠ Ġinvoice Service Ġ= ĠInvoice Service ( invoice Repository , Ġpayment Provider ) ĊĠĠĠĠĠĠĠ Ġpayment Service Ġ= ĠPayment Service ( invoice Repository , Ġpayment Repository , Ġcommand Bus ) ĊĠĠĠĠĠĠĠ Ġpayment Saga Ġ= ĠPayment Saga ( command Bus ) ĊĊĠĠĠĠĠĠĠ Ġpayment CommandHandler Ġ= ĠPayment CommandHandler ( payment Service , Ġinvoice Service ) ĊĠĠĠĠĠĠĠ Ġpayment EventHandler Ġ= ĠPayment EventHandler ( payment Saga ) ĊĊĠĠĠĠĠĠĠ Ġvert x . deploy Vert icle ( Payment Vert icle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Handler Ġ= Ġpayment CommandHandler , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Handler Ġ= Ġpayment EventHandler ĊĠĠĠĠĠĠĠ Ġ), Ġtest Context . comp leting ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġcancel Ġpayment Ġwhen Ġinvoice Ġdoes Ġnot Ġexist `( test Context : ĠVert x TestContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// When Ġrequest Ġcreate Ġpayment ĊĠĠĠĠĠĠĠ Ġcommand Bus . send ( Create Payment Command ( 1 0 0 )) ĊĠĠĠĠĠĠĠ Ġtest Context . await Completion ( 1 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠ Ġtest Context . complete Now () ĊĊĠĠĠĠĠĠĠ Ġval Ġpayment Ġ= Ġpayments Map . values . first () ĊĠĠĠĠĠĠĠ Ġassert ( payment !!. status Ġ== ĠPayment Status . C ANCE LED ) ĊĠĠĠĠĠĠĠ Ġassert ( payment . c ancellation Reason Ġ== Ġ" Invoice NotFoundException ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġcancel Ġpayment Ġwhen Ġinvoice Ġis Ġpaid `( test Context : ĠVert x TestContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Given Ġa Ġpaid Ġinvoice ĊĠĠĠĠĠĠĠ Ġval Ġa Customer Ġ= Ġdal . create Customer ( Currency . EUR ) ĊĠĠĠĠĠĠĠ Ġval Ġinvoice Ġ= Ġdal . create Invoice ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnt ae us App Test . TEN _ EU RO , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Customer !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInvoice Status . PA ID ) ĊĊĠĠĠĠĠĠĠ Ġ// When Ġrequest Ġcreate Ġpayment ĊĠĠĠĠĠĠĠ Ġcommand Bus . send ( Create Payment Command ( invoice !!. id )) ĊĠĠĠĠĠĠĠ Ġtest Context . await Completion ( 1 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠ Ġtest Context . complete Now () ĊĊĠĠĠĠĠĠĠ Ġval Ġpayment Ġ= Ġpayments Map . values . first () ĊĠĠĠĠĠĠĠ Ġval Ġinvoice Result Ġ= Ġdal . fetch Invoice ( invoice . id ) ĊĠĠĠĠĠĠĠ Ġassert ( invoice Result Ġ== Ġinvoice ) ĊĠĠĠĠĠĠĠ Ġassert ( payment !!. status Ġ== ĠPayment Status . C ANCE LED ) ĊĠĠĠĠĠĠĠ Ġassert ( payment !!. c ancellation Reason Ġ== Ġ" Invalid Invoice Status Exception ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġcancel Ġpayment Ġwhen Ġcharge Ġfails `( test Context : ĠVert x TestContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Given Ġa Ġpaid Ġinvoice ĊĠĠĠĠĠĠĠ Ġval Ġa Customer Ġ= Ġdal . create Customer ( Currency . EUR ) ĊĠĠĠĠĠĠĠ Ġval Ġinvoice Ġ= Ġdal . create Invoice ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnt ae us App Test . TEN _ EU RO , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Customer !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInvoice Status . PENDING ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġpayment Provider . charge ( any ()) Ġ} Ġthrows ĠNetwork Exception () ĊĊĠĠĠĠĠĠĠ Ġ// When Ġrequest Ġcreate Ġpayment ĊĠĠĠĠĠĠĠ Ġcommand Bus . send ( Create Payment Command ( invoice !!. id )) ĊĠĠĠĠĠĠĠ Ġtest Context . await Completion ( 1 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠ Ġtest Context . complete Now () ĊĊĠĠĠĠĠĠĠ Ġval Ġpayment Ġ= Ġpayments Map . values . first () ĊĠĠĠĠĠĠĠ Ġval Ġinvoice Result Ġ= Ġdal . fetch Invoice ( invoice . id ) ĊĊĠĠĠĠĠĠĠ Ġassert ( invoice Result Ġ== Ġinvoice . copy ( version Ġ= Ġ 3 )) ĊĠĠĠĠĠĠĠ Ġassert ( payment !!. status Ġ== ĠPayment Status . C ANCE LED ) ĊĠĠĠĠĠĠĠ Ġassert ( payment . c ancellation Reason Ġ== Ġ" Network Exception ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġcancel Ġpayment Ġwhen Ġcharge Ġfalse `( test Context : ĠVert x TestContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Given Ġa Ġpaid Ġinvoice ĊĠĠĠĠĠĠĠ Ġval Ġa Customer Ġ= Ġdal . create Customer ( Currency . EUR ) ĊĠĠĠĠĠĠĠ Ġval Ġinvoice Ġ= Ġdal . create Invoice ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnt ae us App Test . TEN _ EU RO , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Customer !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInvoice Status . PENDING ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġch arging Ġis Ġfalse ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġpayment Provider . charge ( any ()) Ġ} Ġreturns Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// When Ġrequest Ġcreate Ġpayment ĊĠĠĠĠĠĠĠ Ġcommand Bus . send ( Create Payment Command ( invoice !!. id )) ĊĠĠĠĠĠĠĠ Ġtest Context . await Completion ( 1 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠ Ġtest Context . complete Now () ĊĊĠĠĠĠĠĠĠ Ġval Ġpayment Ġ= Ġpayments Map . values . first () ĊĠĠĠĠĠĠĠ Ġval Ġinvoice Result Ġ= Ġdal . fetch Invoice ( invoice . id ) ĊĊĠĠĠĠĠĠĠ Ġassert ( invoice Result Ġ== Ġinvoice . copy ( version Ġ= Ġ 3 )) ĊĠĠĠĠĠĠĠ Ġassert ( payment !!. status Ġ== ĠPayment Status . C ANCE LED ) ĊĠĠĠĠĠĠĠ Ġassert ( payment . c ancellation Reason Ġ== Ġ" Account Balance Exception ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġcomplete Ġpayment Ġwhen Ġcharge Ġtrue `( test Context : ĠVert x TestContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Given Ġa Ġpaid Ġinvoice ĊĠĠĠĠĠĠĠ Ġval Ġa Customer Ġ= Ġdal . create Customer ( Currency . EUR ) ĊĠĠĠĠĠĠĠ Ġval Ġinvoice Ġ= Ġdal . create Invoice ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnt ae us App Test . TEN _ EU RO , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Customer !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInvoice Status . PENDING ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġpayment Provider . charge ( any ()) Ġ} Ġreturns Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// When Ġrequest Ġcreate Ġpayment ĊĠĠĠĠĠĠĠ Ġcommand Bus . send ( Create Payment Command ( invoice !!. id )) ĊĠĠĠĠĠĠĠ Ġtest Context . await Completion ( 1 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠ Ġtest Context . complete Now () ĊĊĠĠĠĠĠĠĠ Ġval Ġpayment Ġ= Ġpayments Map . values . first () ĊĠĠĠĠĠĠĠ Ġval Ġinvoice Result Ġ= Ġdal . fetch Invoice ( invoice . id ) ĊĊĠĠĠĠĠĠĠ Ġassert ( invoice Result Ġ== Ġinvoice . copy ( version Ġ= Ġ 2 , Ġstatus Ġ= ĠInvoice Status . PA ID )) ĊĠĠĠĠĠĠĠ Ġassert ( payment !!. status Ġ== ĠPayment Status . COMPLETED ) ĊĠĠĠ Ġ} Ċ Ċ }