package Ġcom . auth 0 . android . request . internal Ċ Ċ import Ġandroid . os . Looper Ċ import Ġcom . auth 0 . android . Auth 0 Exception Ċ import Ġcom . auth 0 . android . callback . Callback Ċ import Ġcom . auth 0 . android . request .* Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . n ha ar man . mock it ok otlin 2 .* Ċ import Ġorg . hamcrest . Matcher Assert Ċ import Ġorg . hamcrest . Matchers Ċ import Ġorg . hamcrest . collection . Is Map Containing Ċ import Ġorg . hamcrest . collection . Is Map With Size Ċ import Ġorg . hamcrest . core . Is Collection Containing Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . mockito . Argument Matchers Ċ import Ġorg . mockito . Mock Ċ import Ġorg . mockito . Mockito Ċ import Ġorg . mockito . Mockito Annotations Ċ import Ġorg . mockito . internal . verification . Verification Mode Factory Ċ import Ġorg . ro bo lectric . Ro bo lectric TestRunner Ċ import Ġorg . ro bo lectric . android . util . concurrent . Paused ExecutorService Ċ import Ġorg . ro bo lectric . shadow s . Shadow Looper Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . Reader Ċ import Ġjava . util .* Ċ Ċ @ RunWith ( Ro bo lectric TestRunner :: class ) Ċ public Ġclass ĠBase Request Test Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbase Request : ĠBase Request < Simple Po jo , ĠAuth 0 Exception > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġresult Adapter : ĠJson Adapter < Simple Po jo > ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġclient : ĠNetwork ing Client ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġerror Adapter : ĠError Adapter < Auth 0 Exception > ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġauth 0 Exception : ĠAuth 0 Exception ĊĊĠĠĠ Ġprivate Ġval Ġoptions Captor : ĠK Argument Captor < RequestOptions > Ġ= Ġargument Captor () ĊĊĠĠĠ Ġprivate Ġval Ġreader Captor : ĠK Argument Captor < Reader > Ġ= Ġargument Captor () ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġpublic Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito Annotations . open Mocks ( this ) ĊĠĠĠĠĠĠĠ Ġresult Adapter Ġ= ĠMockito . spy ( Gson Adapter ( Simple Po jo :: class . java , ĠGson ())) ĊĠĠĠĠĠĠĠ Ġbase Request Ġ= Ġcreate Request () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Request (): ĠBase Request < Simple Po jo , ĠAuth 0 Exception > Ġ= ĊĠĠĠĠĠĠĠ ĠBase Request ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . POST , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBASE _ URL , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Adapter ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġpublic Ġfun Ġshould Add Headers () Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Successful Server Response () ĊĠĠĠĠĠĠĠ Ġbase Request . add Header (" A ", Ġ" 1 ") ĊĠĠĠĠĠĠĠ Ġbase Request . execute () ĊĠĠĠĠĠĠĠ Ġverify ( client ). load ( eq ( BASE _ URL ), Ġoptions Captor . capture ()) ĊĠĠĠĠĠĠĠ Ġval Ġvalues : ĠMap < String , ĠString > Ġ= Ġoptions Captor . first Value . headers ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( values , ĠIs Map With Size . a Map With Size ( 1 )) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( values , ĠIs Map Containing . has Entry (" A ", Ġ" 1 ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġpublic Ġfun Ġshould Add Parameter () Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Successful Server Response () ĊĠĠĠĠĠĠĠ Ġbase Request . add Parameter (" A ", Ġ" 1 ") ĊĠĠĠĠĠĠĠ Ġbase Request . execute () ĊĠĠĠĠĠĠĠ Ġverify ( client ). load ( eq ( BASE _ URL ), Ġoptions Captor . capture ()) ĊĠĠĠĠĠĠĠ Ġval Ġvalues : ĠMap < String , ĠAny > Ġ= Ġoptions Captor . first Value . parameters ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( values , ĠIs Map With Size . a Map With Size ( 1 )) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( values , ĠIs Map Containing . has Entry (" A ", Ġ" 1 ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġpublic Ġfun Ġshould En force Oid c Scope () Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Successful Server Response () ĊĠĠĠĠĠĠĠ Ġcreate Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" scope ", Ġ" email Ġprofile ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute () ĊĊĠĠĠĠĠĠĠ Ġmock Successful Server Response () ĊĠĠĠĠĠĠĠ Ġcreate Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" scope ", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute () ĊĊĠĠĠĠĠĠĠ Ġmock Successful Server Response () ĊĠĠĠĠĠĠĠ Ġcreate Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameters ( map Of (" scope " Ġto Ġ" name ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute () ĊĊĠĠĠĠĠĠĠ Ġmock Successful Server Response () ĊĠĠĠĠĠĠĠ Ġcreate Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameters ( map Of (" scope " Ġto Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute () ĊĊĠĠĠĠĠĠĠ Ġverify ( client , ĠVerification Mode Factory . times ( 4 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( BASE _ URL ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions Captor . capture () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġvalues 1 : ĠMap < String , ĠAny > Ġ= Ġoptions Captor . all Values [ 0 ]. parameters ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( values 1 , ĠIs Map With Size . a Map With Size ( 1 )) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( values 1 , ĠIs Map Containing . has Entry (" scope ", Ġ" email Ġprofile Ġopen id ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġvalues 2 : ĠMap < String , ĠAny > Ġ= Ġoptions Captor . all Values [ 1 ]. parameters ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( values 2 , ĠIs Map With Size . a Map With Size ( 1 )) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( values 2 , ĠIs Map Containing . has Entry (" scope ", Ġ" openid ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġvalues 3 : ĠMap < String , ĠAny > Ġ= Ġoptions Captor . all Values [ 2 ]. parameters ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( values 3 , ĠIs Map With Size . a Map With Size ( 1 )) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( values 3 , ĠIs Map Containing . has Entry (" scope ", Ġ" name Ġopen id ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġvalues 4 : ĠMap < String , ĠAny > Ġ= Ġoptions Captor . all Values [ 3 ]. parameters ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( values 4 , ĠIs Map With Size . a Map With Size ( 1 )) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( values 4 , ĠIs Map Containing . has Entry (" scope ", Ġ" openid ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġpublic Ġfun Ġshould Add Parameters () Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Successful Server Response () ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= ĠHashMap < String , ĠString >() ĊĠĠĠĠĠĠĠ Ġparameters [" A "] Ġ= Ġ" 1 " ĊĠĠĠĠĠĠĠ Ġparameters [" B "] Ġ= Ġ" 2 " ĊĠĠĠĠĠĠĠ Ġbase Request . add Parameters ( parameters ) ĊĠĠĠĠĠĠĠ Ġbase Request . execute () ĊĠĠĠĠĠĠĠ Ġverify ( client ). load ( eq ( BASE _ URL ), Ġoptions Captor . capture ()) ĊĠĠĠĠĠĠĠ Ġval Ġvalues : ĠMap < String , ĠAny > Ġ= Ġoptions Captor . first Value . parameters ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( values , ĠIs Map With Size . a Map With Size ( 2 )) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( values , ĠIs Map Containing . has Entry (" A ", Ġ" 1 ")) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( values , ĠIs Map Containing . has Entry (" B ", Ġ" 2 ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġpublic Ġfun Ġshould Build Error From Exception () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnetwork Error Ġ= Ġmock < IOException >() ĊĠĠĠĠĠĠĠ ĠMockito .` when `( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . load ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( BASE _ URL ), Ġany () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). then Throw ( network Error ) ĊĠĠĠĠĠĠĠ ĠMockito .` when `( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Adapter . from Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). thenReturn ( auth 0 Exception ) ĊĠĠĠĠĠĠĠ Ġvar Ġexception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠSimple Po jo ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġbase Request . execute () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ġ= Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( exception , ĠMatch ers .` is `( auth 0 Exception )) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( result , ĠMatch ers .` is `( Matchers . null Value ())) ĊĠĠĠĠĠĠĠ Ġverify Zero Interactions ( result Adapter ) ĊĠĠĠĠĠĠĠ Ġverify ( error Adapter ). from Exception ( eq ( network Error )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġpublic Ġfun Ġshould Build Error From Un successful JsonResponse () Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Failed Json Server Response () ĊĠĠĠĠĠĠĠ Ġvar Ġexception : ĠAuth 0 Exception ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠSimple Po jo ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġbase Request . execute () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠAuth 0 Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ġ= Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( result , ĠMatch ers .` is `( Matchers . null Value ())) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( exception , ĠMatch ers .` is `( Matchers . notNull Value ())) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( exception , ĠMatch ers .` is `( auth 0 Exception )) ĊĠĠĠĠĠĠĠ Ġverify ( error Adapter ). fromJson Response ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( 4 2 2 ), Ġany () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġreader Ġ= Ġreader Captor . first Value ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( reader , ĠMatch ers .` is `( Matchers . notNull Value ())) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader , ĠMatch ers .` is `( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMatch ers . instance Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA ware InputStream Reader :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġaware Reader Ġ= Ġreader Ġas ĠA ware InputStream Reader ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( aware Reader . is Closed , ĠMatch ers .` is `( true )) ĊĠĠĠĠĠĠĠ Ġverify Zero Interactions ( result Adapter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġpublic Ġfun Ġshould Build Error From Un successful Raw Response () Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Failed Raw Server Response () ĊĠĠĠĠĠĠĠ Ġvar Ġexception : ĠAuth 0 Exception ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠSimple Po jo ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġbase Request . execute () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠAuth 0 Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ġ= Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( result , ĠMatch ers .` is `( Matchers . null Value ())) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( exception , ĠMatch ers .` is `( Matchers . notNull Value ())) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( exception , ĠMatch ers .` is `( auth 0 Exception )) ĊĠĠĠĠĠĠĠ Ġval Ġheaders Map Captor : ĠK Argument Captor < Map < String , ĠList < String >>> Ġ= Ġargument Captor () ĊĠĠĠĠĠĠĠ Ġverify ( error Adapter ). from Raw Response ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( 5 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeq (" Failure "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheaders Map Captor . capture () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġheaders Map Ġ= Ġheaders Map Captor . first Value ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( headers Map , ĠMatch ers .` is `( Matchers . notNull Value ())) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( headers Map , ĠIs Map With Size . a Map With Size ( 1 )) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheaders Map , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIs Map Containing . has Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMatch ers .` is ` (" Content - Type "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIs Collection Containing . has Item (" text / plain ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġverify Zero Interactions ( result Adapter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġpublic Ġfun Ġshould Build Result From Successful Response () Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Successful Server Response () ĊĠĠĠĠĠĠĠ Ġvar Ġexception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠSimple Po jo ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġbase Request . execute () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ġ= Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( exception , ĠMatch ers .` is `( Matchers . null Value ())) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( result , ĠMatch ers .` is `( Matchers . notNull Value ())) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( result !!. prop , ĠMatch ers .` is ` (" test - value ")) ĊĠĠĠĠĠĠĠ Ġverify ( result Adapter ). fromJson ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader Captor . capture () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġreader Ġ= Ġreader Captor . first Value ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( reader , ĠMatch ers .` is `( Matchers . notNull Value ())) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader , ĠMatch ers .` is `( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMatch ers . instance Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA ware InputStream Reader :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġaware Reader Ġ= Ġreader Ġas ĠA ware InputStream Reader ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( aware Reader . is Closed , ĠMatch ers .` is `( true )) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( error Adapter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġpublic Ġfun Ġshould Execute Request On Background Thread And Post Success To MainThread () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpaused ExecutorService Ġ= ĠPause d ExecutorService () ĊĠĠĠĠĠĠĠ Ġval Ġthread Switch er Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . spy ( Thread Switch er ( Looper . get Main Looper (), Ġpaused ExecutorService )) ĊĠĠĠĠĠĠĠ Ġval Ġbase Request Ġ= ĠBase Request ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . POST , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBASE _ URL , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthread Switch er ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġmock Successful Server Response () ĊĠĠĠĠĠĠĠ Ġval Ġcallback : ĠCallback < Simple Po jo , ĠAuth 0 Exception > Ġ= Ġmock () ĊĊĠĠĠĠĠĠĠ Ġ// Ġverify Ġbackground Ġthread Ġis Ġqueued ĊĠĠĠĠĠĠĠ Ġbase Request . start ( callback ) ĊĠĠĠĠĠĠĠ Ġverify ( thread Switch er ). background Thread ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġany () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġverify ( thread Switch er , ĠMockito . never ()). main Thread ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġany () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġlet Ġthe Ġbackground Ġthread Ġrun ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( paused ExecutorService . run Next (), ĠMatch ers .` is `( true )) ĊĠĠĠĠĠĠĠ Ġverify ( thread Switch er ). main Thread ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġany () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġverify ( callback , ĠMockito . never ()). on Success ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġany () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRelease Ġthe Ġmain Ġthread Ġqueue ĊĠĠĠĠĠĠĠ ĠShadow Looper . shadow Main Looper (). idle () ĊĠĠĠĠĠĠĠ Ġval Ġpo jo Captor Ġ= Ġargument Captor < Simple Po jo >() ĊĠĠĠĠĠĠĠ Ġverify ( callback ). on Success ( pojo Captor . capture ()) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( pojo Captor . first Value , ĠMatch ers .` is `( Matchers . notNull Value ())) ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( pojo Captor . first Value . prop , ĠMatch ers .` is ` (" test - value ")) ĊĠĠĠĠĠĠĠ Ġverify ( callback , ĠMockito . never ()). on Failure ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġany () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġpublic Ġfun Ġshould Execute Request On Background Thread And Post Failure To MainThread () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpaused ExecutorService Ġ= ĠPause d ExecutorService () ĊĠĠĠĠĠĠĠ Ġval Ġthread Switch er Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . spy ( Thread Switch er ( Looper . get Main Looper (), Ġpaused ExecutorService )) ĊĠĠĠĠĠĠĠ Ġval Ġbase Request Ġ= ĠBase Request ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . POST , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBASE _ URL , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthread Switch er ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġmock Failed Raw Server Response () ĊĠĠĠĠĠĠĠ Ġval Ġcallback : ĠCallback < Simple Po jo , ĠAuth 0 Exception > Ġ= Ġmock () ĊĊĠĠĠĠĠĠĠ Ġ// Ġverify Ġbackground Ġthread Ġis Ġqueued ĊĠĠĠĠĠĠĠ Ġbase Request . start ( callback ) ĊĠĠĠĠĠĠĠ Ġverify ( thread Switch er ). background Thread ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġany () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġverify ( thread Switch er , ĠMockito . never ()). main Thread ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġany () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġlet Ġthe Ġbackground Ġthread Ġrun ĊĠĠĠĠĠĠĠ ĠMatcher Assert . assertThat ( paused ExecutorService . run Next (), ĠMatch ers .` is `( true )) ĊĠĠĠĠĠĠĠ Ġverify ( thread Switch er ). main Thread ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġany () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġverify ( callback , ĠMockito . never ()). on Failure ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġany () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRelease Ġthe Ġmain Ġthread Ġqueue ĊĠĠĠĠĠĠĠ ĠShadow Looper . shadow Main Looper (). idle () ĊĠĠĠĠĠĠĠ Ġverify ( callback ). on Failure ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġany () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġverify ( callback , ĠMockito . never ()). on Success ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġany () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġmock Successful Server Response () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheaders Ġ= ĠCollections . singleton Map (" Content - Type ", ĠlistOf (" application / json ")) ĊĠĠĠĠĠĠĠ Ġval Ġjson Response Ġ= Ġ"{\" prop \":\" test - value \" }" ĊĠĠĠĠĠĠĠ Ġval ĠinputStream : ĠInputStream Ġ= ĠByteArrayInputStream ( json Response . toByteArray ()) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠServer Response ( 2 0 0 , ĠinputStream , Ġheaders ) ĊĠĠĠĠĠĠĠ ĠMockito .` when `( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . load ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( BASE _ URL ), Ġany () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). thenReturn ( response ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġmock Failed Raw Server Response () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheaders Ġ= ĠCollections . singleton Map (" Content - Type ", ĠlistOf (" text / plain ")) ĊĠĠĠĠĠĠĠ Ġval Ġtext Response Ġ= Ġ" Failure " ĊĠĠĠĠĠĠĠ Ġval ĠinputStream : ĠInputStream Ġ= ĠByteArrayInputStream ( text Response . toByteArray ()) ĊĠĠĠĠĠĠĠ ĠMockito .` when `( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Adapter . from Raw Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( 5 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArgument Matchers . any String (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArgument Matchers . any Map () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). thenReturn ( auth 0 Exception ) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠServer Response ( 5 0 0 , ĠinputStream , Ġheaders ) ĊĠĠĠĠĠĠĠ ĠMockito .` when `( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . load ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( BASE _ URL ), Ġany () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). thenReturn ( response ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġmock Failed Json Server Response () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheaders Ġ= ĠCollections . singleton Map (" Content - Type ", ĠlistOf (" application / json ")) ĊĠĠĠĠĠĠĠ Ġval Ġjson Response Ġ= Ġ"{\" error _ code \":\" invalid _ token \" }" ĊĠĠĠĠĠĠĠ Ġval ĠinputStream : ĠInputStream Ġ= ĠByteArrayInputStream ( json Response . toByteArray ()) ĊĠĠĠĠĠĠĠ ĠMockito .` when `( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Adapter . fromJson Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( 4 2 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader Captor . capture () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). thenReturn ( auth 0 Exception ) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠServer Response ( 4 2 2 , ĠinputStream , Ġheaders ) ĊĠĠĠĠĠĠĠ ĠMockito .` when `( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . load ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( BASE _ URL ), Ġany () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). thenReturn ( response ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠSimple Po jo ( val Ġprop : ĠString ) ĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBASE _ URL Ġ= Ġ" https :// auth 0 . com " ĊĠĠĠ Ġ} Ċ }