package Ġcom . project city build . features . b ans . use cases Ċ Ċ import Ġcom . project city build . core . utilities . Failure Ċ import Ġcom . project city build . core . utilities . Success Ċ import Ġcom . project city build . entities . IP Ban Ċ import Ġcom . project city build . modules . datetime . time . Time Ċ import Ġcom . project city build . modules . kick . Player K icker Ċ import Ġcom . project city build . repositories . IP Ban Repository Ċ import Ġcom . project city build . stubs . IP Ban Mock Ċ import Ġkotlinx . coroutines . test . run Test Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . mockito . Argument Matchers . any String Ċ import Ġorg . mockito . Mockito . verify Ċ import Ġorg . mockito . kotlin . eq Ċ import Ġorg . power mock . api . mockito . Power Mockito . mock Ċ import Ġorg . power mock . api . mockito . Power Mockito .` when ` Ċ import Ġjava . time . LocalDateTime Ċ Ċ class ĠB an IP UseCase Test Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġuse Case : ĠB an IP UseCase ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġip Ban Repository : ĠIP Ban Repository ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġplayer K icker : ĠPlayer K icker ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtime : ĠTime ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġip Ban Repository Ġ= Ġmock ( IP Ban Repository :: class . java ) ĊĠĠĠĠĠĠĠ Ġplayer K icker Ġ= Ġmock ( Player K icker :: class . java ) ĊĠĠĠĠĠĠĠ Ġtime Ġ= Ġmock ( Time :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġuse Case Ġ= ĠB an IP UseCase ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġip Ban Repository , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer K icker , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġfail Ġif ĠIP Ġis Ġalready Ġb anned `() Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġip Ġ= Ġ" 1 2 7 . 0 . 0 . 1 " ĊĊĠĠĠĠĠĠĠ Ġ` when `( ip Ban Repository . get ( ip )). thenReturn ( IP Ban Mock ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġuse Case . ban IP ( ip , Ġnull , Ġnull ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( result , ĠFailure ( Ban IP UseCase . Failure Reason . IP _ AL READY _ BAN N ED )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġfail Ġif ĠIP Ġis Ġinvalid `() Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" text ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 2 3 4 ", ĊĠĠĠĠĠĠĠ Ġ). forEach Ġ{ Ġinvalid IP Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġuse Case . ban IP ( invalid IP , Ġnull , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( result , ĠFailure ( Ban IP UseCase . Failure Reason . INVALID _ IP )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġban Ġvalid ĠIP `() Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġips Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 2 7 . 0 . 0 . 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ 1 2 7 . 0 . 0 . 1 : 1 2 3 4 ", Ġ// ĠThis Ġshould Ġget Ġsanitized ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġips . forEach Ġ{ Ġip Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠLocalDateTime . now () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` when `( ip Ban Repository . get ( ip )). thenReturn ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` when `( time . now ()). thenReturn ( now ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġuse Case . ban IP ( ip , Ġ" banner _ name ", Ġ" reason ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ban Ġ= ĠIP Ban ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 2 7 . 0 . 0 . 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" banner _ name ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" reason ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnow , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( ip Ban Repository ). put ( expected Ban ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( result , ĠSuccess ( Unit )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġban Ġvalid ĠIP Ġwithout Ġreason Ġor Ġbanner Ġname Ġgiven `() Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġip Ġ= Ġ" 1 2 7 . 0 . 0 . 1 " ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠLocalDateTime . now () ĊĊĠĠĠĠĠĠĠ Ġ` when `( ip Ban Repository . get ( ip )). thenReturn ( null ) ĊĠĠĠĠĠĠĠ Ġ` when `( time . now ()). thenReturn ( now ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġuse Case . ban IP ( ip , Ġnull , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Ban Ġ= ĠIP Ban ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 2 7 . 0 . 0 . 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnow , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġverify ( ip Ban Repository ). put ( expected Ban ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( result , ĠSuccess ( Unit )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġkick Ġplayer Ġif Ġonline `() Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġip Ġ= Ġ" 1 2 7 . 0 . 0 . 1 " ĊĊĠĠĠĠĠĠĠ Ġ` when `( ip Ban Repository . get ( ip )). thenReturn ( null ) ĊĠĠĠĠĠĠĠ Ġ` when `( time . now ()). thenReturn ( LocalDateTime . now ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġuse Case . ban IP ( ip , Ġ" banner _ name ", Ġ" reason ") ĊĊĠĠĠĠĠĠĠ Ġverify ( player K icker ). kick By IP ( eq ( ip ), Ġany String (), Ġeq ( Player K icker . Kick Context . FATAL )) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( result , ĠSuccess ( Unit )) ĊĠĠĠ Ġ} Ċ } Ċ