package Ġcom . github . t iz b ass ar Ċ Ċ import Ġcom . github . t iz b ass ar . Controller . transfer Ċ import Ġio . ktor . http . ContentType Ċ import Ġio . ktor . http . HttpHeaders Ċ import Ġio . ktor . http . HttpMethod Ċ import Ġio . ktor . http . HttpStatusCode Ċ import Ġio . ktor . http . form Url Encode Ċ import Ġio . ktor . server . testing . Test Application Engine Ċ import Ġio . ktor . server . testing . handle Request Ċ import Ġio . ktor . server . testing . set Body Ċ import Ġio . ktor . server . testing . with Test Application Ċ import Ġio . mock k . co Every Ċ import Ġio . mock k . co Verify Ċ import Ġio . mock k . mock k Ċ import Ġorg . junit . jupiter . params . Parameterized Test Ċ import Ġorg . junit . jupiter . params . provider . Csv Source Ċ import Ġkotlin . test . assertEquals Ċ Ċ const Ġval Ġvalid From Ġ= Ġ 1 L Ċ const Ġval Ġvalid To Ġ= Ġ 2 L Ċ const Ġval Ġvalid Amount Ġ= Ġ 1 0 0 L Ċ const Ġval Ġinvalid Ġ= Ġ 9 9 9 L Ċ const Ġval Ġlocked From Ġ= Ġ 3 L Ċ const Ġval Ġlocked To Ġ= Ġ 4 L Ċ Ċ internal Ġclass ĠController Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġtransfer Service Ġ= Ġmock k < Transfer Service >( relax ed Ġ= Ġtrue ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransfer Service . transfer ( Transfer Request ( valid From , Ġvalid To , Ġvalid Amount )) ĊĠĠĠĠĠĠĠ Ġ} Ġreturns ĠTransfer Result . Success ( 4 0 0 , Ġ 7 0 0 ) ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransfer Service . transfer ( Transfer Request ( valid From , Ġvalid To , Ġinvalid )) ĊĠĠĠĠĠĠĠ Ġ} Ġreturns ĠTransfer Result . Not En ough Balance ( 5 0 0 ) ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransfer Service . transfer ( Transfer Request ( invalid , Ġvalid To , Ġvalid Amount )) ĊĠĠĠĠĠĠĠ Ġ} Ġreturns ĠTransfer Result . Source Account NotFound ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransfer Service . transfer ( Transfer Request ( valid From , Ġinvalid , Ġvalid Amount )) ĊĠĠĠĠĠĠĠ Ġ} Ġreturns ĠTransfer Result . Target Account NotFound ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransfer Service . transfer ( Transfer Request ( locked From , Ġvalid To , Ġvalid Amount )) ĊĠĠĠĠĠĠĠ Ġ} Ġreturns ĠTransfer Result . Source Account Locked ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransfer Service . transfer ( Transfer Request ( valid From , Ġlocked To , Ġvalid Amount )) ĊĠĠĠĠĠĠĠ Ġ} Ġreturns ĠTransfer Result . Target Account Locked ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Parameterized Test ĊĠĠĠ Ġ@ Csv Source ( ĊĠĠĠĠĠĠĠ Ġ"$ valid From , Ġ$ valid To , Ġ$ valid Amount , Ġ 2 0 0 ", ĊĠĠĠĠĠĠĠ Ġ"$ valid From , Ġ$ valid To , Ġ$ invalid , Ġ 4 5 0 ", ĊĠĠĠĠĠĠĠ Ġ"$ invalid , Ġ$ valid To , Ġ$ valid Amount , Ġ 4 5 1 ", ĊĠĠĠĠĠĠĠ Ġ"$ valid From , Ġ$ invalid , Ġ$ valid Amount , Ġ 4 5 3 ", ĊĠĠĠĠĠĠĠ Ġ"$ locked From , Ġ$ valid To , Ġ$ valid Amount , Ġ 4 5 2 ", ĊĠĠĠĠĠĠĠ Ġ"$ valid From , Ġ$ locked To , Ġ$ valid Amount , Ġ 4 5 4 " ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġshould Convert Transfer Results To Appro priate StatusCode s ( ĊĠĠĠĠĠĠĠ Ġfrom : ĠAccount Id , ĊĠĠĠĠĠĠĠ Ġto : ĠAccount Id , ĊĠĠĠĠĠĠĠ Ġamount : ĠMoney , ĊĠĠĠĠĠĠĠ ĠstatusCode : ĠInt ĊĠĠĠ Ġ) Ġ= Ġwith Test Application ({ ĊĠĠĠĠĠĠĠ Ġtransfer ( transfer Service ) ĊĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠTransfer Request ( from , Ġto , Ġamount ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcall Ġ= Ġrequest Transfer ( request ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatusCode . from Value ( statusCode ), Ġcall . response . status ()) ĊĠĠĠĠĠĠĠ Ġco Verify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransfer Service . transfer ( request ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Parameterized Test ĊĠĠĠ Ġ@ Csv Source ( ĊĠĠĠĠĠĠĠ Ġ"$ valid From , Ġ$ valid To , Ġinv ", ĊĠĠĠĠĠĠĠ Ġ" inv , Ġ$ valid To , Ġ$ valid Amount ", ĊĠĠĠĠĠĠĠ Ġ"$ valid From , Ġinv , Ġ$ valid Amount ", ĊĠĠĠĠĠĠĠ Ġ"$ valid From , Ġ$ valid To , Ġ", ĊĠĠĠĠĠĠĠ Ġ", Ġ$ valid To , Ġ$ valid Amount ", ĊĠĠĠĠĠĠĠ Ġ"$ valid From , Ġ, Ġ$ valid Amount ", ĊĠĠĠĠĠĠĠ Ġ", Ġ, Ġ" ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġshould Fail If Request Is Bad ( from : ĠString ?, Ġto : ĠString ?, Ġamount : ĠString ?) Ġ= Ġwith Test Application ({ ĊĠĠĠĠĠĠĠ Ġtransfer ( transfer Service ) ĊĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcall Ġ= Ġrequest Transfer ( from , Ġto , Ġamount ) ĊĊĠĠĠĠĠĠĠ Ġwith ( call ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatusCode . BadRequest , Ġresponse . status ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransfer Service . transfer ( any ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠTest Application Engine . request Transfer ( request : ĠTransfer Request ) Ġ= ĊĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Post , Ġ"/ accounts / transfer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . ContentType , ĠContentType . Application . Form Url Encoded . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Body ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" from " Ġto Ġrequest . from . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" to " Ġto Ġrequest . to . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" amount " Ġto Ġrequest . amount . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). form Url Encode ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠTest Application Engine . request Transfer ( from : ĠString ?, Ġto : ĠString ?, Ġamount : ĠString ?) Ġ= ĊĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Post , Ġ"/ accounts / transfer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . ContentType , ĠContentType . Application . Form Url Encoded . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Body ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" from " Ġto Ġfrom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" to " Ġto Ġto , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" amount " Ġto Ġamount ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). form Url Encode ()) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ