package Ġsg . ned ig ital . my info . repositories Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . res . Resources Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġcom . google . gson . Gson Builder Ċ 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 . stub Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . times Ċ 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 Ġjava . util . concurrent . Count DownLatch Ċ import Ġjunit . framework . Assert . assertEquals Ċ import Ġnet . openid . app auth . Auth State Ċ import Ġnet . openid . app auth . Authorization Service Ċ import Ġnet . openid . app auth . connectivity . Default Connection Builder Ċ import Ġokhttp 3 . mock webserver . Mock Response Ċ import Ġokhttp 3 . mock webserver . Mock WebServer Ċ import Ġokhttp 3 . mock webserver . Socket Policy Ċ import Ġorg . json . JSONObject Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Assert Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . ro bo lectric . Ro bo lectric TestRunner Ċ import Ġorg . ro bo lectric . util . Reflection Helpers Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġretrofit 2 . converter . gson . Gson Converter Factory Ċ import Ġsg . ned ig ital . my info . My Info Configuration Ċ import Ġsg . ned ig ital . my info . My Info Environment Ċ import Ġsg . ned ig ital . my info . exceptions . My Info Exception Ċ import Ġsg . ned ig ital . my info . services . My Info Service Ċ import Ġsg . ned ig ital . my info . util . Auth StateManager Ċ import Ġsg . ned ig ital . my info . util . JWT Decoder Ċ import Ġsg . ned ig ital . my info . util . My Info Callback Ċ Ċ @ RunWith ( Ro bo lectric TestRunner :: class ) Ċ internal Ġclass ĠMy Info Repository Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġmock Server Ġ= ĠMock WebServer () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġservice : ĠMy Info Service ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrepository : ĠMy Info Repository ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcontext : ĠApplication ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġconfig : ĠMy Info Configuration ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġauth StateManager : ĠAuth StateManager ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġjwt Decoder : ĠJWT Decoder ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġauth Service Mock : ĠAuthorization Service ĊĊĠĠĠ Ġval Ġgson Ġ= ĠGson Builder () ĊĠĠĠĠĠĠĠ Ġ. create () ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ ĠReflection Helpers . set Static Field ( Build . VERSION :: class . java , Ġ" SDK _ INT ", Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġmock Server . start () ĊĠĠĠĠĠĠĠ Ġval Ġretrofit Ġ= ĠRet rofit . Builder (). baseUrl ( mock Server . url ("/ ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Converter Factory ( Gson Converter Factory . create ( gson )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġservice Ġ= Ġretrofit . create ( My Info Service :: class . java ) ĊĠĠĠĠĠĠĠ Ġauth StateManager Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġconfig Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġjwt Decoder Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġcontext Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġauth Service Mock Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġval Ġresource Mock : ĠResources Ġ= Ġmock () ĊĊĠĠĠĠĠĠĠ Ġresource Mock . stub Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġget Color ( any ()) Ġ}. thenReturn ( Color . parse Color ("# 0 0 0 0 0 0 ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcontext . stub Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġresources Ġ}. thenReturn ( resource Mock ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Mock : ĠAuth State Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġcurrent Mock . stub Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġauthorization Service Configuration Ġ}. thenReturn ( mock ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġauth StateManager . stub Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġcurrent Ġ}. thenReturn ( current Mock ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġconfig . stub Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġget Connection Builder () Ġ}. thenReturn ( Default Connection Builder . INSTANCE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġwarm Up Browser ( any OrNull (), Ġany OrNull ()) Ġ}. thenReturn ( mock ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġcreate Authorization Service () Ġ}. thenReturn ( auth Service Mock ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ ĠclientId Ġ}. thenReturn (" client _ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġauth Endpoint Uri Ġ}. thenReturn ( Uri . parse (" https :// auth Endpoint . com ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġtoken Endpoint Uri Ġ}. thenReturn ( Uri . parse (" https :// token Endpoint . com ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġredirect Uri Ġ}. thenReturn ( Uri . parse (" https :// redirect . com ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġattributes Ġ}. thenReturn (" attributes ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġenvironment Ġ}. thenReturn ( My Info Environment . SAN DB OX ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrepository Ġ= ĠMy Info Repository Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth StateManager , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgson , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjwt Decoder ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Server . shutdown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Person Test Success () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġwhenever ( auth StateManager . current . accessToken ). thenReturn (" at ") ĊĠĠĠĠĠĠĠ Ġwhenever ( jwt Decoder . decode ( any ())). thenReturn ( mock ()) ĊĠĠĠĠĠĠĠ Ġwhenever ( jwt Decoder . get Claim ( any ())). thenReturn (" 1 2 3 ") ĊĠĠĠĠĠĠĠ Ġmock Server . enqueue ( Mock Response (). set Body ("{} ")) ĊĠĠĠĠĠĠĠ Ġrepository . get Person (" attributes ", Ġobject Ġ: ĠMy Info Callback < JSONObject > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( payload : ĠJSONObject ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" success ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( throwable : ĠMy Info Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . fail ( throwable . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` get Person Test Ġsuccess Ġno Ġbody `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġwhenever ( auth StateManager . current . accessToken ). thenReturn (" at ") ĊĠĠĠĠĠĠĠ Ġwhenever ( jwt Decoder . decode ( any ())). thenReturn ( mock ()) ĊĠĠĠĠĠĠĠ Ġwhenever ( jwt Decoder . get Claim ( any ())). thenReturn (" 1 2 3 ") ĊĠĠĠĠĠĠĠ Ġmock Server . enqueue ( Mock Response (). set Response Code ( 2 0 0 )) ĊĠĠĠĠĠĠĠ Ġrepository . get Person (" attributes ", Ġobject Ġ: ĠMy Info Callback < JSONObject > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( payload : ĠJSONObject ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . fail (" it Ġshould Ġfail Ġwith Ġempty Ġbody ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( throwable : ĠMy Info Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Empty Ġresponse ", Ġthrowable . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Person Test No AccessToken () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġwhenever ( auth StateManager . current . accessToken ). thenReturn ( null ) ĊĠĠĠĠĠĠĠ Ġwhenever ( jwt Decoder . decode ( any ())). thenReturn ( mock ()) ĊĠĠĠĠĠĠĠ Ġwhenever ( jwt Decoder . get Claim ( any ())). thenReturn (" 1 2 3 ") ĊĠĠĠĠĠĠĠ Ġrepository . get Person (" attributes ", Ġobject Ġ: ĠMy Info Callback < JSONObject > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( payload : ĠJSONObject ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . fail (" should Ġerror Ġon Ġno ĠAT ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( throwable : ĠMy Info Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Access Ġtoken Ġnot Ġfound ", Ġthrowable . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Person Test No Sub Claim () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġwhenever ( auth StateManager . current . accessToken ). thenReturn (" at ") ĊĠĠĠĠĠĠĠ Ġwhenever ( jwt Decoder . decode ( any ())). thenReturn ( mock ()) ĊĠĠĠĠĠĠĠ Ġwhenever ( jwt Decoder . get Claim ( any ())). thenReturn ( null ) ĊĠĠĠĠĠĠĠ Ġrepository . get Person (" attributes ", Ġobject Ġ: ĠMy Info Callback < JSONObject > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( payload : ĠJSONObject ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . fail (" should Ġerror Ġon Ġno Ġclaim ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( throwable : ĠMy Info Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Invalid Ġaccess Ġtoken , Ġno Ġclaim Ġfound ", Ġthrowable . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Person Test Fail () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġwhenever ( auth StateManager . current . accessToken ). thenReturn (" at ") ĊĠĠĠĠĠĠĠ Ġwhenever ( jwt Decoder . decode ( any ())). thenReturn ( mock ()) ĊĠĠĠĠĠĠĠ Ġwhenever ( jwt Decoder . get Claim ( any ())). thenReturn (" 1 2 3 ") ĊĠĠĠĠĠĠĠ Ġmock Server . enqueue ( Mock Response (). set Response Code ( 4 0 0 )) ĊĠĠĠĠĠĠĠ Ġrepository . get Person (" attributes ", Ġobject Ġ: ĠMy Info Callback < JSONObject > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( payload : ĠJSONObject ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . fail (" should Ġerror Ġon Ġreturn Ġ 4 0 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( throwable : ĠMy Info Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( throwable . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Person Test Exception () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġwhenever ( auth StateManager . current . accessToken ). thenReturn (" at ") ĊĠĠĠĠĠĠĠ Ġwhenever ( jwt Decoder . decode ( any ())). thenReturn ( mock ()) ĊĠĠĠĠĠĠĠ Ġwhenever ( jwt Decoder . get Claim ( any ())). thenReturn (" 1 2 3 ") ĊĊĠĠĠĠĠĠĠ Ġmock Server . enqueue ( Mock Response (). set Socket Policy ( Socket Policy . DIS CONNECT _ AT _ START )) ĊĊĠĠĠĠĠĠĠ Ġrepository . get Person (" attributes ", Ġobject Ġ: ĠMy Info Callback < JSONObject > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( payload : ĠJSONObject ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . fail (" should Ġerror Ġon Ġno Ġconnection ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( throwable : ĠMy Info Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( throwable . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Intent Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmock : ĠIntent Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġwhenever ( auth Service Mock . get Authorization Request Intent ( any (), Ġany ())). thenReturn ( mock ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( mock , Ġrepository . get Auth Intent ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnew Config Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( config . has Configuration Changed ()). thenReturn ( true ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Mock : ĠAuth State Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġcurrent Mock . stub Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġauthorization Service Configuration Ġ}. thenReturn ( null ). thenReturn ( mock ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġauth StateManager . stub Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġcurrent Ġ}. thenReturn ( current Mock ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrepository Ġ= ĠMy Info Repository Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth StateManager , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgson , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjwt Decoder ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġverify ( auth StateManager , Ġtimes ( 2 )). replace ( any ()) ĊĠĠĠĠĠĠĠ Ġverify ( config ). accept Configuration () ĊĠĠĠ Ġ} Ċ } Ċ