package Ġnet . de an . j raw . test . unit Ċ Ċ import Ġcom . w inter be . ex pe kt . expect Ċ import Ġcom . w inter be . ex pe kt . should Ċ import Ġnet . de an . j raw . oauth . Account Helper Ċ import Ġnet . de an . j raw . oauth . Auth Manager Ċ import Ġnet . de an . j raw . oauth . Auth Method Ċ import Ġnet . de an . j raw . oauth . No op Token Store Ċ import Ġnet . de an . j raw . test .* Ċ import Ġokhttp 3 . Http Url Ċ import Ġorg . jetbrains . spe k . api . Spe k Ċ import Ġorg . jetbrains . spe k . api . dsl . describe Ċ import Ġorg . jetbrains . spe k . api . dsl . it Ċ import Ġjava . util .* Ċ import Ġkotlin . properties . Deleg ates Ċ Ċ class ĠAccount Helper Test Ġ: ĠSpe k ({ ĊĠĠĠ Ġval Ġusername Ġ= Ġ" foo " ĊĠĠĠ Ġval Ġtoken Store Ġ= ĠIn Memory Token Store () ĊĠĠĠ Ġval Ġmock Adapter Ġ= ĠMock Network Adapter () ĊĠĠĠ Ġval Ġuuid Ġ= ĠUUID . randomUUID () ĊĠĠĠ Ġval Ġcreds Ġ= Ġcreate Mock Credentials ( Auth Method . APP ) ĊĊĠĠĠ Ġval Ġoauth Data Json Ġ= Ġ""" {" expires _ in ": 3 6 0 0 , Ġ" access _ token ":" < token >", Ġ" token _ type ": Ġ" bearer ", Ġ" scope ": Ġ"* "} """ ĊĊĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠ Ġtoken Store . reset () ĊĠĠĠĠĠĠĠ Ġmock Adapter . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdescribe ("< init >") Ġ{ ĊĠĠĠĠĠĠĠ Ġit (" should Ġthrow Ġa ĠIllegalArgumentException Ġif Ġgiven Ġthe Ġwrong Ġtype Ġof ĠCredentials ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( valid , Ġinvalid ) Ġ= ĠAuth Method . values (). partition Ġ{ Ġit Ġ== ĠAuth Method . APP Ġ|| Ġit Ġ== ĠAuth Method . WEB APP Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( m Ġin Ġvalid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAccount Helper ( No op Network Adapter , Ġcreate Mock Credentials ( m ), ĠNo op Token Store (), Ġuuid ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( m Ġin Ġinvalid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Exception ( IllegalArgumentException :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAccount Helper ( No op Network Adapter , Ġcreate Mock Credentials ( m ), ĠNo op Token Store (), Ġuuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdescribe (" switch To User less ") Ġ{ ĊĠĠĠĠĠĠĠ Ġit (" should Ġuse Ġun expired ĠOAuth Data Ġwhen Ġavailable ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Store . store Latest ( Auth Manager . USERNAME _ USER LESS , Ġcreate Mock OAuth Data ( false )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh Ġ= ĠAccount Helper ( No op Network Adapter , Ġcreds , Ġtoken Store , Ġuuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShould Ġnot Ġrequire Ġan ĠHTTP Ġrequest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġre dd it Ġ= Ġh . switch To User less () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre dd it . auth Manager . current Username (). should . equal ( Auth Manager . USERNAME _ USER LESS ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġit Ġwas Ġgiven Ġthe Ġuser less ĠCredentials ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre dd it . auth Method . is User less . should . be .` true ` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre dd it . should . be . of . identity ( h . reddit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" should Ġfetch Ġnew ĠOAuth Data Ġwhen Ġthere Ġis Ġno Ġun expired Ġdata Ġin Ġthe Ġstore ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh Ġ= ĠAccount Helper ( mock Adapter , Ġcreds , ĠNo op Token Store (), Ġuuid ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Adapter . enqueue ( oauth Data Json ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġh . switch To User less () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Adapter . mock Server . request Count . should . equal ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdescribe (" try Switch To User ") Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġhelper : ĠAccount Helper Ġby ĠDeleg ates . notNull () ĊĊĠĠĠĠĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelper Ġ= ĠAccount Helper ( No op Network Adapter , Ġcreds , Ġtoken Store , Ġuuid ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" should Ġreport Ġa Ġnon - user less ĠAuth Method Ġwhen Ġswitched Ġto Ġsuccessfully ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Store . store Latest ( username , Ġcreate Mock OAuth Data ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelper . try Switch To User ( username )?. auth Method . should . equal ( Auth Method . APP ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" should Ġreturn Ġnull Ġwhen Ġthere Ġis Ġno Ġdata Ġto Ġuse ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelper . try Switch To User (" some Ġrandom Ġuser "). should . be .` null ` ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" should Ġuse Ġan Ġun expired ĠOAuth Data Ġwhen Ġavailable ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Store . store Latest ( username , Ġcreate Mock OAuth Data ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelper . try Switch To User ( username ). should . not . be .` null ` ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" should Ġuse Ġa Ġrefresh Ġtoken Ġwhen Ġavailable ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrefresh Token Ġ= Ġ"< refresh Ġtoken >" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Store . store RefreshToken ( username , Ġrefresh Token ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġhelper . try Switch To User ( username ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr . should . not . be .` null ` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr !!. auth Manager . refresh Token . should . equal ( refresh Token ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġonly Ġa Ġrefresh Ġtoken Ġis Ġavailable ĠAccount Helper Ġgives Ġthe ĠRed dit Client Ġa Ġ" fake " ĠOAuth Data Ġinstance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthat 's Ġalready Ġexpired Ġwith Ġa Ġvalid Ġrefresh Ġtoken ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr . auth Manager . current . should . not . be .` null ` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr . auth Manager . current !!. is Expired . should . be .` true ` ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġthe ĠAccount Helper Ġforces Ġthe Ġclient Ġto Ġrenew Ġits Ġaccess Ġtoken Ġon Ġthe Ġfirst Ġrequest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr . force Renew . should . be .` true ` ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" should Ġupdate Ġthe Ġhelper 's ĠRed dit Client Ġreference Ġon Ġsuccess ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Store . store Latest ( username , Ġcreate Mock OAuth Data ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġhelper . try Switch To User ( username ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( r Ġ=== Ġhelper . reddit ). should . be .` true ` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Store . reset () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Store . store RefreshToken ( username , Ġ"< refresh Ġtoken >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr 2 Ġ= Ġhelper . try Switch To User ( username ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( r 2 Ġ=== Ġhelper . reddit ). should . be .` true ` ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdescribe (" switch To User ") Ġ{ ĊĠĠĠĠĠĠĠ Ġit (" should Ġthrow Ġan ĠIllegalStateException Ġwhen Ġtry Switch To User Ġreturns Ġnull ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhelper Ġ= ĠAccount Helper ( No op Network Adapter , Ġcreds , Ġtoken Store , Ġuuid ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelper . try Switch To User ( username ). should . be .` null ` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Exception ( IllegalStateException :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhelper . switch To User ( username ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdescribe (" switch To New User ") Ġ{ ĊĠĠĠĠĠĠĠ Ġit (" should Ġupdate Ġthe Ġclient Ġafter Ġauthentication ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhelper Ġ= ĠAccount Helper ( mock Adapter , Ġcreds , Ġtoken Store , Ġuuid ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate ful Helper Ġ= Ġhelper . switch To New User () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= ĠHttp Url . parse ( state ful Helper . get Authorization Url ( scopes Ġ= Ġ* array Of (" foo "))) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġurl . query Parameter (" state ") !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmocked Redirect Url Ġ= Ġ" https :// google . com /? state =$ state & code = mocked _ code " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Adapter . enqueue ( oauth Data Json ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFake Ġthe Ġ/ api / v 1 / me Ġcall Ġwith Ġonly Ġthe Ġimportant Ġdata Ġsince Ġwe Ġcan 't Ġspecify Ġan Ġoverride Ġusername ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Adapter . enqueue (""" {" name ": Ġ" foo "} """) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġre dd it Ġ= Ġstate ful Helper . on User Challenge ( mocked Redirect Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġon Authenticated Ġcallback Ġshould Ġassign Ġhelper 's Ġclient Ġto Ġthe Ġnewly Ġauthenticated Ġclient ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( reddit Ġ=== Ġhelper . reddit ). should . be .` true ` ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdescribe (" is Authenticated ") Ġ{ ĊĠĠĠĠĠĠĠ Ġit (" should Ġreturn Ġfalse Ġwhen Ġthere Ġis Ġno Ġmanaged ĠRed dit Client ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhelper Ġ= ĠAccount Helper ( mock Adapter , Ġcreds , Ġtoken Store , Ġuuid ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo ĠRed dit Client Ġinstance Ġyet ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelper . is Authenticated (). should . be .` false ` ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" should Ġreturn Ġtrue Ġafter Ġswitching Ġto Ġa Ġuser ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhelper Ġ= ĠAccount Helper ( mock Adapter , Ġcreds , Ġtoken Store , Ġuuid ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStore Ġsome Ġun expired Ġmock ĠOAuth Data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Store . store Latest ( username , Ġcreate Mock OAuth Data ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSince Ġwe Ġhave Ġun expired Ġdata , Ġis Authenticated () Ġshould Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelper . switch To User ( username ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelper . is Authenticated (). should . be .` true ` ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" should Ġreturn Ġtrue Ġif Ġthere Ġis Ġno ĠOAuth Data Ġbut Ġthere Ġis Ġa Ġrefresh Ġtoken ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhelper Ġ= ĠAccount Helper ( mock Adapter , Ġcreds , Ġtoken Store , Ġuuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Store . store RefreshToken ( username , Ġ"< refresh _ token >") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHaving Ġthe Ġrefresh Ġtoken Ġwill Ġcause Ġauth Manager . needs Renew ing () Ġto Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelper . switch To User ( username ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelper . is Authenticated (). should . be .` true ` ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdescribe (" logout ") Ġ{ ĊĠĠĠĠĠĠĠ Ġit (" should Ġdo Ġnothing Ġif Ġthere 's Ġno Ġcurrent Ġclient ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhelper Ġ= ĠAccount Helper ( mock Adapter , Ġcreds , Ġtoken Store , Ġuuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelper . logout () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" should Ġlogout Ġand Ġun manage Ġthe Ġcurrent ĠRed dit Client ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhelper Ġ= ĠAccount Helper ( mock Adapter , Ġcreds , Ġtoken Store , Ġuuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Store . store Latest ( username , Ġcreate Mock OAuth Data ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġre dd it Ġ= Ġhelper . switch To User ( username ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġre dd it . logged Out . should . be .` false ` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelper . logout () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre dd it . logged Out . should . be .` true ` ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Exception ( IllegalStateException :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhelper ._ reddit Ġshould Ġbe Ġnull , Ġhelper . reddit Ġshould Ġthrow Ġan ĠException ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhelper . reddit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdescribe (" on Switch ") Ġ{ ĊĠĠĠĠĠĠĠ Ġit (" should Ġexecute Ġsome Ġcode Ġwhen Ġthe Ġclient Ġis Ġswitched ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhelper Ġ= ĠAccount Helper ( mock Adapter , Ġcreds , Ġtoken Store , Ġuuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelper . on Switch Ġ{ Ġcount ++ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Store . store Latest ( username , Ġcreate Mock OAuth Data ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelper . switch To User ( username ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( count ). to . equal ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠafterEach Test Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Adapter . reset () ĊĠĠĠ Ġ} Ċ }) Ċ