package Ġcom . one login . oidc . login Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . net . Uri Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . Fragment Activity Ċ import Ġandroidx . fragment . app . FragmentManager Ċ import Ġandroidx . fragment . app . Fragment Transaction Ċ import Ġcom . one login . oidc . Callback Ċ import Ġcom . one login . oidc . OID C Configuration Ċ import Ġcom . one login . oidc . Test R ail Ċ import Ġcom . one login . oidc . data . repository . OID C Repository Ċ import Ġio . mock k .* Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . channels . produce Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġnet . openid . app auth .* Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . ro bo lectric . Ro bo lectric TestRunner Ċ Ċ @ RunWith ( Ro bo lectric TestRunner :: class ) Ċ class ĠSign In Manager Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġauthorization Service Ġ= Ġmock k < Authorization Service >() ĊĠĠĠ Ġprivate Ġval Ġrepository Ġ= Ġmock k < OID C Repository >() ĊĠĠĠ Ġprivate Ġval Ġsign In Fragment Ġ= Ġmock k < SignIn Fragment >() ĊĠĠĠ Ġprivate Ġval Ġactivity Ġ= Ġmock k < Fragment Activity >() ĊĠĠĠ Ġprivate Ġval Ġfragment Manager Ġ= Ġmock k < FragmentManager >() ĊĠĠĠ Ġprivate Ġval Ġfragment Transaction Ġ= Ġmock k < Fragment Transaction >() ĊĠĠĠ Ġprivate Ġval Ġcallback Ġ= Ġmock k < Callback < SignIn Success , ĠSign In Error >>() ĊĠĠĠ Ġprivate Ġval Ġspy Response Ġ= Ġspy k ( Authorization Response . Builder ( mock k ()). build ()) ĊĠĠĠ Ġprivate Ġval Ġauth State Ġ= Ġspy k ( Auth State ()) ĊĊĠĠĠ Ġprivate Ġval Ġoid c Configuration Ġ= ĠO IDC Configuration . Builder () ĊĠĠĠĠĠĠĠ Ġ. issuer (" test Issuer ") ĊĠĠĠĠĠĠĠ Ġ. scopes ( listOf (" openid ")) ĊĠĠĠĠĠĠĠ Ġ. redirect Url (" redirect Test ") ĊĠĠĠĠĠĠĠ Ġ. clientId (" test ClientId ") ĊĠĠĠĠĠĠĠ Ġ. login Hint (" test Hint ") ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsign In Manager : ĠSign In Manager ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġsign In Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSign In ManagerImpl ( oidc Configuration , Ġauthorization Service , Ġrepository ) Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsign In Fragment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġrepository . get Configurations () Ġ} Ġreturns ĠAuthorization Service Configuration ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse (" auth Endpoint "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse (" token Endpoint ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġrepository . get Latest Auth State () Ġ} Ġreturns Ġauth State ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġrepository . persist Auth State ( any ()) Ġ} Ġreturns ĠUnit ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġauth State . update ( any < Token Response >(), Ġany ()) Ġ} Ġreturns ĠUnit ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġspy Response . create Token Exchange Request ( any ()) Ġ} Ġreturns Ġmock k () ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġactivity . support FragmentManager Ġ} Ġreturns Ġfragment Manager ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfragment Manager . find Fragment By Tag ( any ()) Ġ} Ġreturns Ġnull ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfragment Manager . beginTransaction () Ġ} Ġreturns Ġfragment Transaction ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfragment Transaction . add ( any < Fragment >(), Ġany ()) Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Transaction ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfragment Transaction . remove ( any ()) Ġ} Ġreturns Ġfragment Transaction ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfragment Transaction . commit () Ġ} Ġreturns Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcallback . on Success ( any ()) Ġ} Ġreturns ĠUnit ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcallback . onError ( any ()) Ġ} Ġreturns ĠUnit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠIllegalStateException :: class ) ĊĠĠĠ Ġ@ Test R ail ĊĠĠĠ Ġfun Ġsign In Fails On Non Fragment Activity () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= Ġmock k < Activity >() ĊĠĠĠĠĠĠĠ Ġsign In Manager . signIn ( activity , Ġcallback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Test R ail ĊĠĠĠ Ġfun Ġsign In Flows Exec utes Correct ly () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġservice Callback Slot Ġ= Ġslot < Authorization Service . Token Response Callback >() ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsign In Fragment . result Channel Ġ}. returns ( produce < Pair < Authorization Response ?, ĠAuthorization Exception ? >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( spy Response Ġto Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠChannel ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthorization Service . perform Token Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapture ( service Callback Slot ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice Callback Slot . captured . on Token Request Completed ( mock k (), Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsign In Manager . signIn ( activity , Ġcallback ) ĊĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 2 ) Ġ{ Ġrepository . persist Auth State ( any ()) Ġ} ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġauthorization Service . perform Token Request ( any (), Ġany ()) Ġ} ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġcallback . on Success ( any ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Test R ail ĊĠĠĠ Ġfun Ġsign In Fragment Is Attached And Removed () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġservice Callback Slot Ġ= Ġslot < Authorization Service . Token Response Callback >() ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsign In Fragment . result Channel Ġ}. returns ( produce < Pair < Authorization Response ?, ĠAuthorization Exception ? >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( spy Response Ġto Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠChannel ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthorization Service . perform Token Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapture ( service Callback Slot ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice Callback Slot . captured . on Token Request Completed ( mock k (), Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsign In Manager . signIn ( activity , Ġcallback ) ĊĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Transaction . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsign In Fragment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSign In Fragment . LOGIN _ FRAGMENT _ TAG ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Test R ail ĊĠĠĠ Ġfun Ġsign In Fragment Is Removed If Att atched () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġservice Callback Slot Ġ= Ġslot < Authorization Service . Token Response Callback >() ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsign In Fragment . result Channel Ġ}. returns ( produce < Pair < Authorization Response ?, ĠAuthorization Exception ? >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( spy Response Ġto Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠChannel ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthorization Service . perform Token Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapture ( service Callback Slot ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice Callback Slot . captured . on Token Request Completed ( mock k (), Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfragment Manager . find Fragment By Tag ( any ()) Ġ} Ġreturns Ġsign In Fragment ĊĊĠĠĠĠĠĠĠ Ġsign In Manager . signIn ( activity , Ġcallback ) ĊĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 2 ) Ġ{ Ġfragment Transaction . remove ( signIn Fragment ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Test R ail ĊĠĠĠ Ġfun Ġsign In Fails On Authorization Exception () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsign In Fragment . result Channel Ġ}. returns ( produce < Pair < Authorization Response ?, ĠAuthorization Exception ? >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( null Ġto ĠAuthorization Exception ( 1 , Ġ 1 , Ġ" error ", Ġ" test Error ", Ġnull , Ġnull )) ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠChannel ) ĊĠĠĠĠĠĠĠ Ġsign In Manager . signIn ( activity , Ġcallback ) ĊĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġcallback . onError ( any ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Test R ail ĊĠĠĠ Ġfun Ġsign In Fragment Fails If Code Exchange Fails () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġservice Callback Slot Ġ= Ġslot < Authorization Service . Token Response Callback >() ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsign In Fragment . result Channel Ġ}. returns ( produce < Pair < Authorization Response ?, ĠAuthorization Exception ? >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( spy Response Ġto Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠChannel ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthorization Service . perform Token Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapture ( service Callback Slot ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice Callback Slot . captured . on Token Request Completed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuthorization Exception ( 1 , Ġ 1 , Ġ" error ", Ġ" test Error ", Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsign In Manager . signIn ( activity , Ġcallback ) ĊĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġauthorization Service . perform Token Request ( any (), Ġany ()) Ġ} ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġcallback . onError ( any ()) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ