package Ġio . ple o . ant ae us . ret rier . retry . app . services Ċ Ċ import Ġio . mock k .* Ċ import Ġio . ple o . ant ae us . rabbitmq . Bus Ċ import Ġio . ple o . ant ae us . ret rier . retry . domain .* Ċ import Ġio . ple o . ant ae us . ret rier . retry . domain . event . Invoice Pay Commit Failed Event Ċ import Ġio . ple o . ant ae us . ret rier . retry . domain . event . Invoice Pay Retry Approved Event Ċ import Ġio . ple o . ant ae us . ret rier . retry . domain . event . Invoice Pay Retry Exceeded Event Ċ import Ġio . ple o . ant ae us . ret rier . retry . infra . db . Payment Dal Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . format . DateTime Formatter Ċ Ċ class ĠRetry Service Test Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmax Retries Ġ= Ġ 2 ĊĊĠĠĠ Ġprivate Ġval Ġbus Ġ= Ġmock k < Bus > Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġpublish Message ( any ()) Ġ} Ġreturns ĠUnit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġnow Ġ= Ġfun Ġ(): ĠLocalDateTime Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstr Ġ= Ġ" 2 0 0 0 - 0 4 - 0 8 Ġ 1 2 : 3 0 " ĊĠĠĠĠĠĠĠ Ġval Ġformatter Ġ= ĠDateTime Formatter . of Pattern (" yyyy - MM - dd ĠHH : mm ") ĊĠĠĠĠĠĠĠ Ġreturn ĠLocalDateTime . parse ( str , Ġformatter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` if Ġthe Ġpayment Ġis Ġsuccessful Ġit Ġshould Ġnot Ġdo Ġanything `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpayment Ġ= Ġmock k < Payment >( relax ed Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfinal Status () Ġ} Ġreturns ĠStatus . SU CCE ED ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdb al Ġ= Ġmock k < Payment Dal >( relax ed Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfetch Payment Aggregation ( 1 ) Ġ} Ġreturns Ġpayment ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġretry Service Ġ= ĠRetry Service ( db al , Ġbus , Ġnow , Ġmax Retries ) ĊĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠInvoice Pay Commit Failed Event ( invoice ID Ġ= Ġ 1 , Ġtimestamp Ġ= Ġ 1 , Ġreason Ġ= Ġ" foo ") ĊĠĠĠĠĠĠĠ Ġretry Service . payment Event ( Payment Event ( invoice Id Ġ= Ġevent . invoice ID , Ġtype Ġ= Ġevent . topic (), Ġevent Ġ= Ġevent )) ĊĊĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbus Ġwas Not ĠCalled ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconfirm Verified ( bus ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` payment Ġfailed Ġshould Ġsend Ġa Ġmessage Ġif Ġstill Ġcan Ġretry `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpayment Ġ= Ġmock k < Payment >( relax ed Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfinal Status () Ġ} Ġreturns ĠStatus . FAILED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġtotal Changes () Ġ} Ġreturns Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdb al Ġ= Ġmock k < Payment Dal >( relax ed Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfetch Payment Aggregation ( 2 ) Ġ} Ġreturns Ġpayment ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġretry Service Ġ= ĠRetry Service ( db al , Ġbus , Ġnow , Ġmax Retries ) ĊĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠInvoice Pay Commit Failed Event ( invoice ID Ġ= Ġ 2 , Ġtimestamp Ġ= Ġ 1 , Ġreason Ġ= Ġ" foo ") ĊĠĠĠĠĠĠĠ Ġretry Service . payment Event ( Payment Event ( invoice Id Ġ= Ġevent . invoice ID , Ġtype Ġ= Ġevent . topic (), Ġevent Ġ= Ġevent )) ĊĊĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbus . publish Message ( Invoice Pay Retry Approved Event ( invoice ID Ġ= Ġ 2 , Ġtimestamp Ġ= Ġ 9 5 5 1 9 7 0 0 0 0 0 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconfirm Verified ( bus ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` payment Ġfailed Ġshould Ġsend Ġa Ġmessage Ġif Ġcan Ġno Ġlonger Ġretry `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpayment Ġ= Ġmock k < Payment >( relax ed Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfinal Status () Ġ} Ġreturns ĠStatus . FAILED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġtotal Changes () Ġ} Ġreturns Ġ 4 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdb al Ġ= Ġmock k < Payment Dal >( relax ed Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfetch Payment Aggregation ( 3 ) Ġ} Ġreturns Ġpayment ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġretry Service Ġ= ĠRetry Service ( db al , Ġbus , Ġnow , Ġmax Retries ) ĊĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠInvoice Pay Commit Failed Event ( invoice ID Ġ= Ġ 3 , Ġtimestamp Ġ= Ġ 1 , Ġreason Ġ= Ġ" foo ") ĊĠĠĠĠĠĠĠ Ġretry Service . payment Event ( Payment Event ( invoice Id Ġ= Ġevent . invoice ID , Ġtype Ġ= Ġevent . topic (), Ġevent Ġ= Ġevent )) ĊĊĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbus . publish Message ( Invoice Pay Retry Exceeded Event ( invoice ID Ġ= Ġ 3 , Ġtimestamp Ġ= Ġ 9 5 5 1 9 7 0 0 0 0 0 0 , Ġmax Retries Ġ= Ġmax Retries )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconfirm Verified ( bus ) ĊĠĠĠ Ġ} ĊĊĊ Ċ }