package Ġcom . hal cy on mobile . ret rofit . error parsing Ċ Ċ import Ġcom . hal cy on mobile . error parsing .* Ċ import Ġcom . squareup . mos hi . M oshi Ċ import Ġio . reactivex . Observable Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġokhttp 3 . mock webserver . Mock WebServer Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . sky sc ream er . json assert . JSON Assert Ċ import Ġorg . sky sc ream er . json assert . JSON Compare Mode Ċ import Ġretrofit 2 . HttpException Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġretrofit 2 . adapter . rx java 2 . Rx Java 2 Call Adapter Factory Ċ import Ġretrofit 2 . converter . mos hi . M oshi Converter Factory Ċ import Ġretrofit 2 . http . GET Ċ import Ġjava . util . concurrent . Count DownLatch Ċ Ċ /** Ċ Ġ* ĠPurpose Ċ Ġ* Ġ< p > Ċ Ġ* ĠDescription Ċ Ġ* Ġ< p /> Ċ Ġ* ĠNotes : Ċ Ġ* Ġ@ author Ġ( OPTIONAL ! ĠUse Ġonly Ġif Ġthe Ġcode Ġis Ġcomplex , Ġotherwise Ġdelete Ġthis Ġline .) Ċ Ġ*/ Ċ @ Suppress (" Test FunctionName ") Ċ class ĠRx Error Parsing Test Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmock WebServer : ĠMock WebServer ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġservice : ĠService ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġmock WebServer Ġ= ĠMock WebServer () ĊĠĠĠĠĠĠĠ Ġservice Ġ= ĠRet rofit . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Converter Factory ( M oshi Converter Factory . create ( M oshi . Builder (). build ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Call Adapter Factory ( Call Adapter Factory Wrapper ( Rx Java 2 Call Adapter Factory . create ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl ( mock WebServer . url (" something / "). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create ( Service :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ Ġmock WebServer . shutdown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠG IV EN _ request _ annotated _ with _ parsed _ error _ WHEN _ the _ requests _ fails _ THEN _ the _ error _ is _ parsed _ proper ly () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Error Ġ= ĠGeneral Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcauses Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneral Error . Error Cause ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Ġ= Ġ" invalid _ pare meter _ username ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeveloper Message Ġ= Ġ" The Ġusername Ġparameter Ġis Ġnot Ġvalid Ġ( too Ġshort )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= Ġ" The Ġusername Ġis Ġtoo Ġshort , Ġplease Ġprovide Ġsomething Ġlonger " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= Ġ" 1 2 3 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġ 4 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Bad ĠRequest " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock WebServer . enqueue Request ( 4 0 0 , Ġread Json Resource File ToString (" simple _ error . json ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġthrowable : ĠThrowable ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice . exception Parsing (). single Or Error (). subscribe Ġ{ Ġ_, Ġactual Error Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable Ġ= Ġactual Error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable ?. let Ġ{ Ġthrow Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( network Exception : ĠNetwork Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Error , Ġnetwork Exception . parsed Error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJSON Assert . assertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Json Resource File ToString (" simple _ error . json "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Exception . error Body , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJSON Compare Mode . LEN IENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( network Exception . cause Ġis ĠHttp Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue (" The Ġrequest Ġdidn 't Ġthrown Ġan Ġexception ", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠG IV EN _ request _ annotated _ with _ wrap _ int _ network _ WHEN _ the _ Request _ fails _ THEN _ the _ exception _ is _ wrapped (){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock WebServer . enqueue Request ( 4 0 0 , Ġread Json Resource File ToString (" simple _ error . json ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġthrowable : ĠThrowable ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice . network Error Wr apping (). single Or Error (). subscribe Ġ{ Ġ_, Ġactual Error Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable Ġ= Ġactual Error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable ?. let Ġ{ Ġthrow Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( network Exception : ĠNetwork Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( null , Ġnetwork Exception . parsed Error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJSON Assert . assertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Json Resource File ToString (" simple _ error . json "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Exception . error Body , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJSON Compare Mode . LEN IENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( network Exception . cause Ġis ĠHttp Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue (" The Ġrequest Ġdidn 't Ġthrown Ġan Ġexception ", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠG IV EN _ request _ without _ annotated _ WHEN _ the _ Request _ fails _ THEN _ the _ original _ exception _ is _ throw n () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock WebServer . enqueue Request ( 4 0 0 , Ġread Json Resource File ToString (" simple _ error . json ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġthrowable : ĠThrowable ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice . without Annotation (). single Or Error (). subscribe Ġ{ Ġ_, Ġactual Error Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable Ġ= Ġactual Error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable ?. let Ġ{ Ġthrow Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( http Exception : ĠHttp Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue (" The Ġrequest Ġdidn 't Ġthrown Ġan Ġexception ", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠService Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Parsed Error ( value Ġ= ĠGeneral Error :: class ) ĊĠĠĠĠĠĠĠ Ġ@ GET (" al ma ") ĊĠĠĠĠĠĠĠ Ġfun Ġexception Parsing (): ĠObservable < Unit ?> ĊĊĠĠĠĠĠĠĠ Ġ@ Wrap Into Network Exception ĊĠĠĠĠĠĠĠ Ġ@ GET (" al ma ") ĊĠĠĠĠĠĠĠ Ġfun Ġnetwork Error Wr apping (): ĠObservable < Unit ?> ĊĊĠĠĠĠĠĠĠ Ġ@ GET (" al ma ") ĊĠĠĠĠĠĠĠ Ġfun Ġwithout Annotation (): ĠObservable < Unit ?> ĊĠĠĠ Ġ} Ċ }