package Ġbr . com . gui ab ol so . connector . persistence . token Ċ Ċ import Ġbr . com . gui ab ol so . connector . G cp ErrorCode . DATA STORE _ FAILURE Ċ import Ġbr . com . gui ab ol so . connector . common . crypto graphy . Encrypted Data Ċ import Ġbr . com . gui ab ol so . connector . configuration . Config Service Ċ import Ġbr . com . gui ab ol so . connector . event . exception . Persistence Exception Ċ import Ġbr . com . gui ab ol so . connector . misc . Easy Random Wrapper . next Object Ċ import Ġcom . google . cloud . datastore . Datastore Ċ import Ġcom . google . cloud . datastore . testing . Local Datastore Helper Ċ import Ġcom . n ha ar man . mockito _ kotlin . mock Ċ import Ġcom . n ha ar man . mockito _ kotlin . wh enever Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . assertj . core . api . Assertions . assertThat Exception OfType Ċ import Ġorg . junit . jupiter . api . After All Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . Test Instance Ċ import Ġorg . junit . jupiter . api . Test Instance . Lifecycle . PER _ CLASS Ċ Ċ @ Test Instance ( PER _ CLASS ) Ċ class ĠData store Token Repository Test Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġconfig Service : ĠConfig Service ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdatastore Service : ĠData store ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrepository : ĠData store Token Repository ĊĊĠĠĠ Ġprivate Ġval Ġhelper Ġ= ĠLocal Datastore Helper . create (). also Ġ{ Ġit . start () Ġ} ĊĊĠĠĠ Ġ@ After All ĊĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ Ġhelper . stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġconfig Service Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġwhenever ( config Service . get Required String ( DATA STORE _ KIND _ TOKEN _ KEY )). thenReturn ( DATA STORE _ KIND _ TOKEN _ VALUE ) ĊĊĠĠĠĠĠĠĠ Ġdatastore Service Ġ= Ġhelper . options . service ĊĊĠĠĠĠĠĠĠ Ġrepository Ġ= ĠData store Token Repository ( config Service , Ġdatastore Service ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġinsert Ġtoken `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġnext Object < String >() ĊĠĠĠĠĠĠĠ Ġval ĠaccessToken Ġ= ĠEn crypted Data ( next Object < String >(). toByteArray ()) ĊĠĠĠĠĠĠĠ Ġval Ġrefresh Token Ġ= ĠEn crypted Data ( next Object < String >(). toByteArray ()) ĊĊĠĠĠĠĠĠĠ Ġrepository . put Token ( userId , ĠaccessToken , Ġrefresh Token ) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġrepository . find AccessToken By ( userId ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( actual ). isEqualTo ( accessToken ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġnot Ġfind Ġaccess Ġtoken `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġnext Object < String >() ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġrepository . find AccessToken By ( userId ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( actual ). isNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġfind Ġaccess Ġtoken `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġnext Object < String >() ĊĠĠĠĠĠĠĠ Ġval ĠaccessToken Ġ= ĠEn crypted Data ( next Object < String >(). toByteArray ()) ĊĠĠĠĠĠĠĠ Ġval Ġrefresh Token Ġ= ĠEn crypted Data ( next Object < String >(). toByteArray ()) ĊĊĠĠĠĠĠĠĠ Ġrepository . put Token ( userId , ĠaccessToken , Ġrefresh Token ) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġrepository . find AccessToken By ( userId ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( actual ). isEqualTo ( accessToken ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġnot Ġfind Ġrefresh Ġtoken `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġnext Object < String >() ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġrepository . find RefreshToken By ( userId ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( actual ). isNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġfind Ġrefresh Ġtoken `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġnext Object < String >() ĊĠĠĠĠĠĠĠ Ġval ĠaccessToken Ġ= ĠEn crypted Data ( next Object < String >(). toByteArray ()) ĊĠĠĠĠĠĠĠ Ġval Ġrefresh Token Ġ= ĠEn crypted Data ( next Object < String >(). toByteArray ()) ĊĊĠĠĠĠĠĠĠ Ġrepository . put Token ( userId , ĠaccessToken , Ġrefresh Token ) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġrepository . find RefreshToken By ( userId ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( actual ). isEqualTo ( refresh Token ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġthrow Ġexception Ġwhen Ġtry Ġto Ġupdate Ġan Ġnon existent Ġtoken `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġnext Object < String >() ĊĠĠĠĠĠĠĠ Ġval Ġnew AccessToken Ġ= ĠEn crypted Data ( next Object < String >(). toByteArray ()) ĊĊĠĠĠĠĠĠĠ ĠassertThat Exception OfType ( Persistence Exception :: class . java ). is Thrown By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . update AccessToken ( userId , Ġnew AccessToken ) ĊĠĠĠĠĠĠĠ Ġ}. with Message ( DATA STORE _ FAILURE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġupdate Ġaccess Ġtoken `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġnext Object < String >() ĊĠĠĠĠĠĠĠ Ġval ĠaccessToken Ġ= ĠEn crypted Data ( next Object < String >(). toByteArray ()) ĊĠĠĠĠĠĠĠ Ġval Ġrefresh Token Ġ= ĠEn crypted Data ( next Object < String >(). toByteArray ()) ĊĊĠĠĠĠĠĠĠ Ġrepository . put Token ( userId , ĠaccessToken , Ġrefresh Token ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnew AccessToken Ġ= ĠEn crypted Data ( next Object < String >(). toByteArray ()) ĊĊĠĠĠĠĠĠĠ Ġrepository . update AccessToken ( userId , Ġnew AccessToken ) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġrepository . find AccessToken By ( userId ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( actual ). isEqualTo ( new AccessToken ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDATA STORE _ KIND _ TOKEN _ KEY Ġ= Ġ" datastore . kind . token " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDATA STORE _ KIND _ TOKEN _ VALUE Ġ= Ġ" token " ĊĠĠĠ Ġ} Ċ } Ċ