package Ġcom . app ify hub . mon ol ith . errors Ċ Ċ import Ġassert k . all Ċ import Ġassert k . assertThat Ċ import Ġassert k . assertions . isEqualTo Ċ import Ġassert k . assertions . prop Ċ import Ġcom . app ify hub . mon ol ith . network . common . Message Response Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġjavax . servlet . http . HttpServletRequest Ċ import Ġjavax . servlet . http . HttpServletResponse Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . mockito . Answers . RET URNS _ DE EP _ ST UB S Ċ import Ġorg . mockito . kotlin . mock Ċ import Ġorg . mockito . kotlin . verify Ċ import Ġorg . mockito . kotlin . verify No More Interactions Ċ import Ġorg . springframework . dao . Empty Result Data AccessException Ċ import Ġorg . springframework . http . HttpHeaders Ċ import Ġorg . springframework . http . HttpStatus Ċ import Ġorg . springframework . http . MediaType Ċ import Ġorg . springframework . security . access . Access Denied Exception Ċ import Ġorg . springframework . security . authentication . Ins ufficient Authentication Exception Ċ import Ġorg . springframework . security . core . Authentication Exception Ċ import Ġorg . springframework . web . server . ResponseStatus Exception Ċ Ċ class ĠGlobal ExceptionHandler Test Ġ{ ĊĊĠ Ġprivate Ġval Ġtest Mapper Ġ= Ġj ack son ObjectMapper () ĊĠ Ġprivate Ġval Ġhandler Ġ= ĠGlobal ExceptionHandler ( test Mapper ) ĊĊĠ Ġ@ Test Ġfun Ġ` handle Ġpre - auth Ġfailure Ġwith Ġcomm ence `() Ġ{ ĊĠĠĠ Ġval Ġrequest Ġ= Ġmock < HttpServletRequest >() ĊĠĠĠ Ġval Ġresponse Ġ= Ġmock < HttpServletResponse >( default Answer Ġ= ĠRET URNS _ DE EP _ ST UB S ) ĊĠĠĠ Ġval Ġexception : ĠAuthentication Exception Ġ= ĠIns ufficient Authentication Exception (" Something Ġfailed ") ĊĊĠĠĠ Ġhandler . comm ence ( request , Ġresponse , Ġexception ) ĊĊĠĠĠ Ġverify No More Interactions ( request ) ĊĠĠĠ Ġverify ( response ). status Ġ= ĠHttpStatus . UN AUTHORIZ ED . value () ĊĠĠĠ Ġverify ( response ). contentType Ġ= ĠMediaType . APPLICATION _ JSON _ VALUE ĊĠĠĠ Ġverify ( response . output Stream ). println ( ĊĠĠĠĠĠ Ġtest Mapper . writeValue AsString ( ĊĠĠĠĠĠĠĠ ĠMessage Response ( message Ġ= Ġ" Unauthorized Ġ: Ġ${ exception . message }") ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` handle Ġauthentication Ġexception `() Ġ{ ĊĠĠĠ Ġval Ġexception : ĠAuthentication Exception Ġ= ĠIns ufficient Authentication Exception (" Something Ġfailed ") ĊĊĠĠĠ Ġval Ġresult Ġ= Ġhandler . handle Throwable ( exception ) ĊĊĠĠĠ ĠassertThat ( result ). all Ġ{ ĊĠĠĠĠĠ Ġprop (" status ") Ġ{ Ġit . statusCode Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpStatus . UN AUTHORIZ ED ) ĊĠĠĠĠĠ Ġprop (" headers ") Ġ{ Ġit . headers Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpHeaders ()) ĊĠĠĠĠĠ Ġprop (" message ") Ġ{ Ġit . body ?. message Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo (" Unauthorized Ġ: Ġ${ exception . message }") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` handle Ġaccess Ġdenied Ġexception `() Ġ{ ĊĠĠĠ Ġval Ġexception Ġ= ĠAccess Denied Exception (" Something Ġfailed ") ĊĊĠĠĠ Ġval Ġresult Ġ= Ġhandler . handle Throwable ( exception ) ĊĊĠĠĠ ĠassertThat ( result ). all Ġ{ ĊĠĠĠĠĠ Ġprop (" status ") Ġ{ Ġit . statusCode Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpStatus . UN AUTHORIZ ED ) ĊĠĠĠĠĠ Ġprop (" headers ") Ġ{ Ġit . headers Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpHeaders ()) ĊĠĠĠĠĠ Ġprop (" message ") Ġ{ Ġit . body ?. message Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo (" Unauthorized Ġ: Ġ${ exception . message }") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` handle Ġcredentials Ġinvalid Ġmessage `() Ġ{ ĊĠĠĠ Ġval Ġexception Ġ= ĠThrowable (" Invalid Ġcredentials ") ĊĊĠĠĠ Ġval Ġresult Ġ= Ġhandler . handle Throwable ( exception ) ĊĊĠĠĠ ĠassertThat ( result ). all Ġ{ ĊĠĠĠĠĠ Ġprop (" status ") Ġ{ Ġit . statusCode Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpStatus . UN AUTHORIZ ED ) ĊĠĠĠĠĠ Ġprop (" headers ") Ġ{ Ġit . headers Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpHeaders ()) ĊĠĠĠĠĠ Ġprop (" message ") Ġ{ Ġit . body ?. message Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo (" Credentials ĠError Ġ: Ġ${ exception . message }") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` handle Ġaccess Ġdenied Ġmessage `() Ġ{ ĊĠĠĠ Ġval Ġexception Ġ= ĠThrowable (" Access Ġis Ġdenied ") ĊĊĠĠĠ Ġval Ġresult Ġ= Ġhandler . handle Throwable ( exception ) ĊĊĠĠĠ ĠassertThat ( result ). all Ġ{ ĊĠĠĠĠĠ Ġprop (" status ") Ġ{ Ġit . statusCode Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpStatus . UN AUTHORIZ ED ) ĊĠĠĠĠĠ Ġprop (" headers ") Ġ{ Ġit . headers Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpHeaders ()) ĊĠĠĠĠĠ Ġprop (" message ") Ġ{ Ġit . body ?. message Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo (" Unauthorized Ġ: Ġ${ exception . message }") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` handle Ġblocked Ġtoken Ġmessage `() Ġ{ ĊĠĠĠ Ġval Ġexception Ġ= ĠThrowable (" Token Ġis Ġblocked ") ĊĊĠĠĠ Ġval Ġresult Ġ= Ġhandler . handle Throwable ( exception ) ĊĊĠĠĠ ĠassertThat ( result ). all Ġ{ ĊĠĠĠĠĠ Ġprop (" status ") Ġ{ Ġit . statusCode Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpStatus . UN AUTHORIZ ED ) ĊĠĠĠĠĠ Ġprop (" headers ") Ġ{ Ġit . headers Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpHeaders ()) ĊĠĠĠĠĠ Ġprop (" message ") Ġ{ Ġit . body ?. message Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo (" Access ĠError Ġ: Ġ${ exception . message }") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` handle Ġexpired Ġtoken Ġmessage `() Ġ{ ĊĠĠĠ Ġval Ġexception Ġ= ĠThrowable (" Token Ġexpired ") ĊĊĠĠĠ Ġval Ġresult Ġ= Ġhandler . handle Throwable ( exception ) ĊĊĠĠĠ ĠassertThat ( result ). all Ġ{ ĊĠĠĠĠĠ Ġprop (" status ") Ġ{ Ġit . statusCode Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpStatus . UN AUTHORIZ ED ) ĊĠĠĠĠĠ Ġprop (" headers ") Ġ{ Ġit . headers Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpHeaders ()) ĊĠĠĠĠĠ Ġprop (" message ") Ġ{ Ġit . body ?. message Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo (" Access ĠError Ġ: Ġ${ exception . message }") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` handle Ġresponse Ġstatus Ġexception Ġwith Ġreason `() Ġ{ ĊĠĠĠ Ġval Ġexception Ġ= ĠResponse Status Exception ( HttpStatus . MULTI _ STATUS , Ġ" Reason ") ĊĊĠĠĠ Ġval Ġresult Ġ= Ġhandler . handle Throwable ( exception ) ĊĊĠĠĠ ĠassertThat ( result ). all Ġ{ ĊĠĠĠĠĠ Ġprop (" status ") Ġ{ Ġit . statusCode Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpStatus . MULTI _ STATUS ) ĊĠĠĠĠĠ Ġprop (" headers ") Ġ{ Ġit . headers Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpHeaders ()) ĊĠĠĠĠĠ Ġprop (" message ") Ġ{ Ġit . body ?. message Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( exception . reason ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` handle Ġresponse Ġstatus Ġexception Ġwithout Ġreason `() Ġ{ ĊĠĠĠ Ġval Ġexception Ġ= ĠResponse Status Exception ( HttpStatus . MULTI _ STATUS ) ĊĊĠĠĠ Ġval Ġresult Ġ= Ġhandler . handle Throwable ( exception ) ĊĊĠĠĠ ĠassertThat ( result ). all Ġ{ ĊĠĠĠĠĠ Ġprop (" status ") Ġ{ Ġit . statusCode Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpStatus . MULTI _ STATUS ) ĊĠĠĠĠĠ Ġprop (" headers ") Ġ{ Ġit . headers Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpHeaders ()) ĊĠĠĠĠĠ Ġprop (" message ") Ġ{ Ġit . body ?. message Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo (" Request ĠError Ġ: Ġ${ exception . message }") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` handle Ġillegal Ġstate Ġexception `() Ġ{ ĊĠĠĠ Ġval Ġexception Ġ= ĠIllegalStateException (" Something Ġfailed ") ĊĊĠĠĠ Ġval Ġresult Ġ= Ġhandler . handle Throwable ( exception ) ĊĊĠĠĠ ĠassertThat ( result ). all Ġ{ ĊĠĠĠĠĠ Ġprop (" status ") Ġ{ Ġit . statusCode Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpStatus . UN PROCESS ABLE _ ENTITY ) ĊĠĠĠĠĠ Ġprop (" headers ") Ġ{ Ġit . headers Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpHeaders ()) ĊĠĠĠĠĠ Ġprop (" message ") Ġ{ Ġit . body ?. message Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo (" Request ĠError Ġ: Ġ${ exception . message }") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` handle Ġillegal Ġargument Ġexception `() Ġ{ ĊĠĠĠ Ġval Ġexception Ġ= ĠIllegalArgumentException (" Something Ġfailed ") ĊĊĠĠĠ Ġval Ġresult Ġ= Ġhandler . handle Throwable ( exception ) ĊĊĠĠĠ ĠassertThat ( result ). all Ġ{ ĊĠĠĠĠĠ Ġprop (" status ") Ġ{ Ġit . statusCode Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpStatus . UN PROCESS ABLE _ ENTITY ) ĊĠĠĠĠĠ Ġprop (" headers ") Ġ{ Ġit . headers Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpHeaders ()) ĊĠĠĠĠĠ Ġprop (" message ") Ġ{ Ġit . body ?. message Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo (" Request ĠError Ġ: Ġ${ exception . message }") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` handle Ġno Ġsuch Ġelement Ġexception `() Ġ{ ĊĠĠĠ Ġval Ġexception Ġ= ĠNoSuch ElementException (" Something Ġfailed ") ĊĊĠĠĠ Ġval Ġresult Ġ= Ġhandler . handle Throwable ( exception ) ĊĊĠĠĠ ĠassertThat ( result ). all Ġ{ ĊĠĠĠĠĠ Ġprop (" status ") Ġ{ Ġit . statusCode Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpStatus . NOT _ FOUND ) ĊĠĠĠĠĠ Ġprop (" headers ") Ġ{ Ġit . headers Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpHeaders ()) ĊĠĠĠĠĠ Ġprop (" message ") Ġ{ Ġit . body ?. message Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo (" Request ĠError Ġ: Ġ${ exception . message }") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` handle Ġempty Ġresult Ġdata Ġaccess Ġexception `() Ġ{ ĊĠĠĠ Ġval Ġexception Ġ= ĠEmpty Result Data AccessException (" Not Ġfound ", Ġ 1 ) ĊĊĠĠĠ Ġval Ġresult Ġ= Ġhandler . handle Throwable ( exception ) ĊĊĠĠĠ ĠassertThat ( result ). all Ġ{ ĊĠĠĠĠĠ Ġprop (" status ") Ġ{ Ġit . statusCode Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpStatus . NOT _ FOUND ) ĊĠĠĠĠĠ Ġprop (" headers ") Ġ{ Ġit . headers Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpHeaders ()) ĊĠĠĠĠĠ Ġprop (" message ") Ġ{ Ġit . body ?. message Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo (" Request ĠError Ġ: Ġ${ exception . message }") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` handle Ġrandom Ġexception `() Ġ{ ĊĠĠĠ Ġval Ġexception Ġ= ĠThrowable (" Random ") ĊĊĠĠĠ Ġval Ġresult Ġ= Ġhandler . handle Throwable ( exception ) ĊĊĠĠĠ ĠassertThat ( result ). all Ġ{ ĊĠĠĠĠĠ Ġprop (" status ") Ġ{ Ġit . statusCode Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpStatus . INTERNAL _ SERVER _ ERROR ) ĊĠĠĠĠĠ Ġprop (" headers ") Ġ{ Ġit . headers Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo ( HttpHeaders ()) ĊĠĠĠĠĠ Ġprop (" message ") Ġ{ Ġit . body ?. message Ġ} ĊĠĠĠĠĠĠĠ Ġ. isEqualTo (" Internal ĠError Ġ: Ġ${ exception . message }") ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ Ċ } Ċ