package Ġcz . ack ee . sample . model . rest Ċ Ċ import Ġandroid . content . Context Ċ import Ġio . app f late . rest mock . Mock Answer Ċ import Ġio . app f late . rest mock . REST Mock Server Ċ import Ġio . app f late . rest mock . REST Mock Server Starter Ċ import Ġio . app f late . rest mock . android . Android Assets File Parser Ċ import Ġio . app f late . rest mock . android . Android Logger Ċ import Ġio . app f late . rest mock . utils . Request Matchers Ċ import Ġokhttp 3 . mock webserver . Mock Response Ċ import Ġjava . util . Random Ċ import Ġjava . util . UUID Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ /** Ċ Ġ* ĠClass Ġsim ulating Ġserver . ĠIt Ġreturns Ġsome Ġdata Ġif Ġuser Ġprovides Ġcorrect Ġtoken . Ċ Ġ*/ Ċ class ĠServer ( val Ġcontext : ĠContext ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠEX PI RES _ IN Ġ= Ġ 1 5 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar ĠaccessToken : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġrefresh Token : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġtoken Expiration : ĠLong ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġitems List Ġ= Ġ""" [ ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ" data " Ġ: Ġ% d ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ" data " Ġ: Ġ% d ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ" data " Ġ: Ġ% d ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ] ĊĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠ Ġprivate Ġvar Ġlogin Response Ġ= Ġ""" ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" name " Ġ: Ġ" John ĠDoe ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" accessToken " Ġ: Ġ"% s ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" refresh Token " Ġ: Ġ"% s ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" expires In " Ġ: Ġ"% d " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠREST Mock Server Starter . start Sync ( Android Assets File Parser ( context ), ĠAndroid Logger ()) ĊĊĠĠĠĠĠĠĠ ĠREST Mock Server . when GET ( Request Matchers . path Contains (" items ")). delay ( TimeUnit . MILLISECONDS , Ġ 5 0 0 ). then Answer ( Mock Answer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Header Ġ= Ġit . getHeader (" Authorization ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Header Ġ== Ġnull Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Header . substring ( token Header . indexOf (" Bearer Ġ") Ġ+ Ġ" Bearer Ġ". length ) Ġ!= ĠaccessToken Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( token Expiration Ġ!= Ġnull Ġ&& ĠSystem . currentTimeMillis () Ġ> Ġtoken Expiration !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// un authorized ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 4 0 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// authorized ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrandom Ġ= ĠRandom () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( items List . format ( random . nextInt (), Ġrandom . nextInt (), Ġrandom . nextInt ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠREST Mock Server . when POST ( Request Matchers . path Contains (" login ")). delay ( TimeUnit . MILLISECONDS , Ġ 5 0 0 ). then Answer ( Mock Answer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġaccepts Ġany Ġlogin / password ĊĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Token Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Expiration Ġ= ĠSystem . currentTimeMillis () Ġ+ ĠEX PI RES _ IN Ġ* Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( login Response . format ( accessToken , Ġrefresh Token , ĠEX PI RES _ IN )) ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠREST Mock Server . when POST ( Request Matchers . path Contains (" refresh _ token ")). delay ( TimeUnit . MILLISECONDS , Ġ 5 0 0 ). then Answer ( Mock Answer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinvalid Ġrefresh Ġtoken ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . request Url . query Parameter (" refresh _ token ") Ġ== Ġnull Ġ|| Ġit . request Url . query Parameter (" refresh _ token ") Ġ!= Ġrefresh Token ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 4 0 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Token Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Expiration Ġ= ĠSystem . currentTimeMillis () Ġ+ ĠEX PI RES _ IN Ġ* Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( login Response . format ( accessToken , Ġrefresh Token , ĠEX PI RES _ IN )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠREST Mock Server . when POST ( Request Matchers . path Contains (" logout ")). delay ( TimeUnit . MILLISECONDS , Ġ 5 0 0 ). then Answer ( Mock Answer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Token Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} Ċ }