package Ġorg . simple . clin ic . rules Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . content . SharedPreferences Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġorg . junit . rules . Test Rule Ċ import Ġorg . junit . runner . Description Ċ import Ġorg . junit . runners . model . Statement Ċ import Ġorg . simple . clin ic . App Database Ċ import Ġorg . simple . clin ic . Test Clin ic App Ċ import Ġorg . simple . shared Test Code . TestData Ċ import Ġorg . simple . clin ic . facility . Facility Ċ import Ġorg . simple . clin ic . facility . Facility Pull Result Ċ import Ġorg . simple . clin ic . facility . Facility Sync Ċ import Ġorg . simple . clin ic . login . Login Request Ċ import Ġorg . simple . clin ic . login . User Payload Ċ import Ġorg . simple . clin ic . login . Users Api Ċ import Ġorg . simple . clin ic . login . activate user . Activate UserRequest Ċ import Ġorg . simple . clin ic . security . Password Hash er Ċ import Ġorg . simple . clin ic . user . User Ċ import Ġorg . simple . clin ic . user . User Session Ċ import Ġorg . simple . clin ic . user . User Status Ċ import Ġorg . simple . clin ic . user . find user . Find User Result .* Ċ import Ġorg . simple . clin ic . user . find user . User Lookup Ċ import Ġorg . simple . clin ic . user . register user . Register User Ċ import Ġorg . simple . clin ic . user . register user . Registration Result Ċ import Ġorg . simple . clin ic . util . to Nullable Ċ import Ġjava . util . UUID Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Named Ċ Ċ /** Ċ Ġ* ĠRuns Ġevery Ġtest Ġwith Ġan Ġactual Ġuser Ġon Ġthe Ġserver . Ċ Ġ* Ċ Ġ* Ġ### ĠHow Ġthis Ġworks Ċ Ġ* ĠThis Ġlooks Ġfor Ġa Ġcached Ġuser Ġinformation Ġthat Ġhas Ġbeen Ġregistered Ġon Ġa Ġprevious Ġtest . ĠThis Ġis Ċ Ġ* Ġstored Ġin Ġthe Ġapp 's Ġcache Ġdirectory Ġand Ġwill Ġget Ġcleared Ġwhen Ġthe Ġapp Ġis Ġun installed . ĠIf Ġthis Ċ Ġ* Ġinformation Ġdoes Ġnot Ġexist , Ġit Ġregisters Ġa Ġnew Ġuser Ġand Ġstores Ġthis Ġinformation Ġinto Ġthe Ġcache . Ċ Ġ**/ Ċ class ĠServer Authentication Rule Ġ: ĠTest Rule Ġ{ ĊĊĠ Ġ@ Inject ĊĠ Ġlateinit Ġvar Ġuser Session : ĠUser Session ĊĊĠ Ġ@ Inject ĊĠ Ġlateinit Ġvar ĠtestData : ĠTest Data ĊĊĠ Ġ@ Inject ĊĠ Ġlateinit Ġvar Ġfacility Sync : ĠFac ility Sync ĊĊĠ Ġ@ Inject ĊĠ Ġlateinit Ġvar Ġapp Database : ĠApp Database ĊĊĠ Ġ@ Inject ĊĠ Ġlateinit Ġvar Ġshared Preferences : ĠSharedPreferences ĊĊĠ Ġ@ Inject ĊĠ Ġlateinit Ġvar Ġapplication : ĠApplication ĊĊĠ Ġ@ Inject ĊĠ Ġlateinit Ġvar Ġusers Api : ĠUsers Api ĊĊĠ Ġ@ Inject ĊĠ Ġlateinit Ġvar Ġregister User : ĠRegister User ĊĊĠ Ġ@ Inject ĊĠ Ġlateinit Ġvar Ġpassword Hash er : ĠPassword Hash er ĊĊĠ Ġ@ Inject ĊĠ Ġlateinit Ġvar Ġuser Lookup : ĠUser Lookup ĊĊĠ Ġ@ Inject ĊĠ Ġ@ Named (" user _ pin ") ĊĠ Ġlateinit Ġvar Ġuser Pin : ĠString ĊĊĠ Ġ@ Inject ĊĠ Ġ@ Named (" user _ otp ") ĊĠ Ġlateinit Ġvar Ġuser O tp : ĠString ĊĊĠ Ġ@ Inject ĊĠ Ġ@ Named (" user _ phone _ number ") ĊĠ Ġlateinit Ġvar Ġuser PhoneNumber : ĠString ĊĊĠ Ġoverride Ġfun Ġapply ( base : ĠStatement , Ġdescription : ĠDescription ): ĠStatement Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠStatement () Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġevaluate () Ġ{ ĊĠĠĠĠĠĠĠ ĠTest Clin ic App . app Component (). inject ( this @ Server Authentication Rule ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġensure LoggedIn User () ĊĠĠĠĠĠĠĠĠĠ Ġbase . evaluate () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġclear Data () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġensure LoggedIn User () Ġ{ ĊĠĠĠ Ġensure Fac ilities () ĊĠĠĠ Ġfind Or Register User () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġensure Fac ilities () Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġfacility Sync . pull With Result () ĊĊĠĠĠ ĠassertThat ( result ). isEqualTo ( Facility Pull Result . Success ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfind Or Register User () Ġ{ ĊĠĠĠ Ġwhen Ġ( val Ġresult Ġ= Ġuser Lookup . find ( user PhoneNumber )) Ġ{ ĊĠĠĠĠĠ Ġis ĠFound Ġ-> Ġlogin With PhoneNumber ( result . uuid , Ġuser PhoneNumber ) ĊĠĠĠĠĠ ĠNotFound Ġ-> Ġregister () ĊĠĠĠĠĠ ĠNetwork Error , ĠUnexpected Error Ġ-> Ġthrow ĠRuntimeException (" Could Ġnot Ġlookup Ġuser Ġbecause : Ġ$ result ") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġlogin With PhoneNumber ( user Uuid : ĠUUID , ĠphoneNumber : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġlogin Request Ġ= ĠLogin Request ( ĊĠĠĠĠĠĠĠ ĠUser Payload ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠphoneNumber Ġ= ĠphoneNumber , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpin Ġ= Ġuser Pin , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo tp Ġ= Ġuser O tp ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠEven Ġthough Ġthe ĠO TP Ġdoes Ġnot Ġchange Ġfor ĠQA Ġusers , Ġthe Ġserver Ġchecks Ġwhether Ġan ĠO TP Ġfor ĊĠĠĠ Ġ// Ġa Ġuser Ġhas Ġbeen Ġconsumed Ġwhen Ġwe Ġmake Ġthe Ġlogin Ġcall . ĊĠĠĠ Ġusers Api . activate ( Activate UserRequest . create ( user Uuid , Ġuser Pin )). execute () ĊĊĠĠĠ Ġusers Api ĊĠĠĠĠĠĠĠ Ġ. login ( login Request ) ĊĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ Ġuser Session . store User And AccessToken ( it . logged In User , Ġit . accessToken ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. blocking Await () ĊĊĠĠĠ Ġverify AccessToken Is Present () ĊĠĠĠ Ġverify User Can Sync Data () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġregister () Ġ{ ĊĠĠĠ Ġval Ġregister Facility At Ġ= Ġget First Stored Facility () ĊĊĠĠĠ Ġval Ġregistration Result Ġ= Ġregister User At Facility ( register Facility At ) ĊĠĠĠ Ġif Ġ( registration Result Ġ! is ĠRegistration Result . Success ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠRuntimeException (" Could Ġnot Ġregister Ġuser Ġbecause : Ġ$ registration Result ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġverify AccessToken Is Present () ĊĠĠĠ Ġverify User Can Sync Data () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget First Stored Facility (): ĠFac ility Ġ{ ĊĠĠĠ Ġreturn Ġapp Database ĊĠĠĠĠĠĠĠ Ġ. facility Dao () ĊĠĠĠĠĠĠĠ Ġ. all () ĊĠĠĠĠĠĠĠ Ġ. blocking First () ĊĠĠĠĠĠĠĠ Ġ. first () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġregister User At Facility ( facility : ĠFac ility ): ĠRegistration Result Ġ{ ĊĠĠĠ Ġval Ġuser Ġ= ĠtestData . logged In User ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Android ĠTest ĠUser ", ĊĠĠĠĠĠĠĠ Ġphone Ġ= Ġuser PhoneNumber , ĊĠĠĠĠĠĠĠ Ġpin Digest Ġ= Ġpassword Hash er . hash ( user Pin ), ĊĠĠĠĠĠĠĠ Ġcurrent Facility Uuid Ġ= Ġfacility . uuid , ĊĠĠĠĠĠĠĠ Ġregistration Facility Uuid Ġ= Ġfacility . uuid ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġreturn Ġregister User . register User At Facility ( user ). blocking Get () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġverify AccessToken Is Present () Ġ{ ĊĠĠĠ Ġval ĠaccessToken Ġ= Ġuser Session . accessToken (). to Nullable () ĊĠĠĠ ĠassertThat ( accessToken ). isNotNull () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġverify User Can Sync Data () Ġ{ ĊĠĠĠ Ġval Ġlogged In User Ġ= Ġuser Session . logged In User (). blocking First (). get () ĊĠĠĠ ĠassertThat ( user Session . is User Present Loc ally ()). isTrue () ĊĠĠĠ ĠassertThat ( logged In User . status ). isEqualTo ( User Status . Approved For Sync ing ) ĊĠĠĠ ĠassertThat ( logged In User . logged In Status ). isEqualTo ( User . LoggedIn Status . LOG GED _ IN ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġclear Data () Ġ{ ĊĠĠĠ Ġshared Preferences . edit (). clear (). commit () ĊĠĠĠ Ġapp Database . clear All Tables () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġapp Version (): ĠString Ġ{ ĊĠĠĠ Ġval Ġpackage Manager Ġ= Ġapplication . package Manager ĊĠĠĠ Ġreturn Ġpackage Manager . get Package Info ( application . packageName , Ġ 0 ). version Name ĊĠ Ġ} Ċ } Ċ