package Ġio . sentry . spring . web flux Ċ Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . any Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . any OrNull Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . mock Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . never Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . reset Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . verify Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . wh enever Ċ import Ġio . sentry . Hub Adapter Ċ import Ġio . sentry . I Hub Ċ import Ġio . sentry . IT r ansport Factory Ċ import Ġio . sentry . S entry Ċ import Ġio . sentry . check Event Ċ import Ġio . sentry . transport . IT r ansport Ċ import Ġjava . time . Duration Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertNotNull Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . await ility . kotlin . await Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . boot . Application Runner Ċ import Ġorg . springframework . boot . autoconfigure . SpringBoot Application Ċ import Ġorg . springframework . boot . autoconfigure . security . reactive . Reactive Security Auto Configuration Ċ import Ġorg . springframework . boot . autoconfigure . security . servlet . Security Auto Configuration Ċ import Ġorg . springframework . boot . test . context . SpringBootTest Ċ import Ġorg . springframework . boot . web . server . Local Server Port Ċ import Ġorg . springframework . context . annotation . Bean Ċ import Ġorg . springframework . http . Response Entity Ċ import Ġorg . springframework . test . context . junit 4 . Spring Runner Ċ import Ġorg . springframework . test . web . reactive . server . Web Test Client Ċ import Ġorg . springframework . web . bind . annotation . Controller Ad vice Ċ import Ġorg . springframework . web . bind . annotation . ExceptionHandler Ċ import Ġorg . springframework . web . bind . annotation . GetMapping Ċ import Ġorg . springframework . web . bind . annotation . RestController Ċ import Ġreactor . core . publisher . Mono Ċ import Ġreactor . core . scheduler . Schedulers Ċ Ċ @ RunWith ( Spring Runner :: class ) Ċ @ SpringBootTest ( ĊĠĠĠ Ġclasses Ġ= Ġ[ App :: class ], ĊĠĠĠ Ġweb Environment Ġ= ĠSpring Boot Test . Web Environment . RANDOM _ PORT , ĊĠĠĠ Ġproperties Ġ= Ġ[" spring . main . web - application - type = reactive "] Ċ ) Ċ class ĠS entry Web flux IntegrationTest Ġ{ ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġlateinit Ġvar Ġtransport : ĠI Transport ĊĊĠĠĠ Ġ@ Local Server Port ĊĠĠĠ Ġvar Ġport : ĠInt ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġtest Client Ġ= ĠWeb Test Client . bind ToServer (). build () ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġ` reset Ġmocks `() Ġ{ ĊĠĠĠĠĠĠĠ Ġreset ( transport ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` att aches Ġrequest Ġinformation Ġto ĠS entry Events `() Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Client . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. uri (" http :// localhost :$ port / hello ? param = value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. exchange () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Status () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. is Ok ĊĊĠĠĠĠĠĠĠ Ġverify ( transport ). send ( check Event Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( event . request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" http :// localhost :$ port / hello ? param = value ", Ġit . url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" GET ", Ġit . method ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" param = value ", Ġit . queryString ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġany OrNull ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` s ends Ġevents Ġfor Ġunhandled Ġexceptions `() Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Client . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. uri (" http :// localhost :$ port / throws ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. exchange () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Status () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. is 5 xx ServerError ĊĊĠĠĠĠĠĠĠ Ġverify ( transport ). send ( check Event Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" GET Ġ/ throws ", Ġevent . transaction ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( event . exceptions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġex Ġ= Ġit . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" something Ġwent Ġwrong ", Ġex . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( ex . me chanism ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . is Handled ). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġany OrNull ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` does Ġnot Ġsend Ġevents Ġfor Ġhandled Ġexceptions `() Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Client . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. uri (" http :// localhost :$ port / throws - handled ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. exchange () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Status () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. is BadRequest ĊĊĠĠĠĠĠĠĠ Ġawait . during ( Duration . of Seconds ( 2 )). until Assert ed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( transport , Ġnever ()). send ( check Event Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġany OrNull ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ SpringBoot Application ( exclude Ġ= Ġ[ Reactive Security Auto Configuration :: class , ĠSecurity Auto Configuration :: class ]) Ċ open Ġclass ĠApp Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġtransport Ġ= Ġmock < IT r ansport >() ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġopen Ġfun Ġmock Transport Factory (): ĠI Transport Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= Ġmock < IT r ansport Factory >() ĊĠĠĠĠĠĠĠ Ġwhenever ( factory . create ( any (), Ġany ())). thenReturn ( transport ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfactory ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġopen Ġfun Ġmock Transport () Ġ= Ġtransport ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġopen Ġfun Ġhub () Ġ= ĠHub Adapter . getInstance () ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġopen Ġfun Ġs entry Filter ( hub : ĠI Hub ) Ġ= ĠS entry Web Filter ( hub ) ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġopen Ġfun Ġs entry Web ExceptionHandler ( hub : ĠI Hub ) Ġ= ĠS entry Web ExceptionHandler ( hub ) ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġopen Ġfun Ġs entry Schedule Hook Registrar () Ġ= ĠApplication Runner Ġ{ ĊĠĠĠĠĠĠĠ ĠS chedulers . on Schedule Hook (" sentry ", ĠS entry Schedule Hook ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġopen Ġfun Ġs entry Initializer ( transport Factory : ĠI Transport Factory ) Ġ= ĠApplication Runner Ġ{ ĊĠĠĠĠĠĠĠ ĠS entry . init Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . dsn Ġ= Ġ" http :// key @ localhost / proj " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Debug ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Transport Factory ( transport Factory ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ RestController Ċ class ĠHello Controller Ġ{ ĊĊĠĠĠ Ġ@ GetMapping ("/ hello ") ĊĠĠĠ Ġfun Ġhello (): ĠMono < Void > Ġ{ ĊĠĠĠĠĠĠĠ ĠS entry . capture Message (" hello ") ĊĠĠĠĠĠĠĠ Ġreturn ĠMono . empty < Void >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ GetMapping ("/ throws ") ĊĠĠĠ Ġfun Ġthrows () Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" something Ġwent Ġwrong ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ GetMapping ("/ throws - handled ") ĊĠĠĠ Ġfun Ġthrows Handled () Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠCustom Exception (" handled Ġexception ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠCustom Exception ( message : ĠString ) Ġ: ĠRuntimeException ( message ) Ċ Ċ @ Controller Ad vice Ċ class ĠException Handlers Ġ{ ĊĊĠĠĠ Ġ@ ExceptionHandler ( Custom Exception :: class ) ĊĠĠĠ Ġfun Ġhandle ( e : ĠCustom Exception ) Ġ= ĠResponseEntity . bad Request (). build < Void >() Ċ } Ċ