@@ -432,7 +432,7 @@ public class CredentialsManagerTest {
432432 " token" , " type" ,
433433 Date (accessTokenExpiry), " scope"
434434 )
435- Mockito .`when `(storage.retrieveString(" audience" )).thenReturn(gson.toJson(apiCredentials))
435+ Mockito .`when `(storage.retrieveString(" audience::scope " )).thenReturn(gson.toJson(apiCredentials))
436436 manager.getApiCredentials(" audience" , " scope" , callback = apiCredentialsCallback)
437437 verify(apiCredentialsCallback).onSuccess(apiCredentialsCaptor.capture())
438438 val retrievedCredentials = apiCredentialsCaptor.firstValue
@@ -457,7 +457,7 @@ public class CredentialsManagerTest {
457457 @Test
458458 public fun shouldRenewApiCredentialsIfThereIsNoExistingApiCredentials () {
459459 verifyNoMoreInteractions(client)
460- Mockito .`when `(storage.retrieveString(" audience" )).thenReturn(null )
460+ Mockito .`when `(storage.retrieveString(" audience::newScope " )).thenReturn(null )
461461 Mockito .`when `(storage.retrieveString(" com.auth0.refresh_token" )).thenReturn(" refreshToken" )
462462 Mockito .`when `(
463463 client.renewAuth(" refreshToken" , " audience" , " newScope" )
@@ -481,7 +481,7 @@ public class CredentialsManagerTest {
481481 verify(storage).store(" com.auth0.id_token" , renewedCredentials.idToken)
482482 // RefreshToken should not be replaced
483483 verify(storage).store(" com.auth0.refresh_token" , " refreshToken" )
484- verify(storage).store(" audience" , gson.toJson(renewedCredentials.toAPICredentials()))
484+ verify(storage).store(" audience::newScope " , gson.toJson(renewedCredentials.toAPICredentials()))
485485 // Verify the returned credentials are the latest
486486 val newAPiCredentials = apiCredentialsCaptor.firstValue
487487 MatcherAssert .assertThat(newAPiCredentials, Is .`is `(Matchers .notNullValue()))
@@ -499,7 +499,7 @@ public class CredentialsManagerTest {
499499 " token" , " type" ,
500500 Date (accessTokenExpiry), " scope"
501501 )
502- Mockito .`when `(storage.retrieveString(" audience" )).thenReturn(gson.toJson(apiCredentials))
502+ Mockito .`when `(storage.retrieveString(" audience::scope " )).thenReturn(gson.toJson(apiCredentials))
503503 Mockito .`when `(storage.retrieveString(" com.auth0.refresh_token" )).thenReturn(" refreshToken" )
504504 Mockito .`when `(
505505 client.renewAuth(" refreshToken" , " audience" , " scope" )
@@ -523,7 +523,7 @@ public class CredentialsManagerTest {
523523 verify(storage).store(" com.auth0.id_token" , renewedCredentials.idToken)
524524 // RefreshToken should not be replaced
525525 verify(storage).store(" com.auth0.refresh_token" , " refreshToken" )
526- verify(storage).store(" audience" , gson.toJson(renewedCredentials.toAPICredentials()))
526+ verify(storage).store(" audience::scope " , gson.toJson(renewedCredentials.toAPICredentials()))
527527 // Verify the returned credentials are the latest
528528 val newAPiCredentials = apiCredentialsCaptor.firstValue
529529 MatcherAssert .assertThat(newAPiCredentials, Is .`is `(Matchers .notNullValue()))
@@ -541,7 +541,7 @@ public class CredentialsManagerTest {
541541 " token" , " type" ,
542542 Date (accessTokenExpiry), " scope"
543543 )
544- Mockito .`when `(storage.retrieveString(" audience" )).thenReturn(gson.toJson(apiCredentials))
544+ Mockito .`when `(storage.retrieveString(" audience::scope " )).thenReturn(gson.toJson(apiCredentials))
545545 Mockito .`when `(storage.retrieveString(" com.auth0.refresh_token" )).thenReturn(" refreshToken" )
546546 Mockito .`when `(
547547 client.renewAuth(" refreshToken" , " audience" , " scope" )
@@ -565,7 +565,7 @@ public class CredentialsManagerTest {
565565 verify(storage).store(" com.auth0.id_token" , renewedCredentials.idToken)
566566 // RefreshToken should not be replaced
567567 verify(storage).store(" com.auth0.refresh_token" , " refreshToken" )
568- verify(storage).store(" audience" , gson.toJson(renewedCredentials.toAPICredentials()))
568+ verify(storage).store(" audience::scope " , gson.toJson(renewedCredentials.toAPICredentials()))
569569 // Verify the returned credentials are the latest
570570 val newAPiCredentials = apiCredentialsCaptor.firstValue
571571 MatcherAssert .assertThat(newAPiCredentials, Is .`is `(Matchers .notNullValue()))
@@ -575,55 +575,13 @@ public class CredentialsManagerTest {
575575 MatcherAssert .assertThat(newAPiCredentials.scope, Is .`is `(" scope" ))
576576 }
577577
578- @Test
579- public fun shouldRenewApiCredentialsIfSavedScopeIsDifferentFromRequiredScope () {
580- verifyNoMoreInteractions(client)
581- val accessTokenExpiry = CredentialsMock .ONE_HOUR_AHEAD_MS
582- val apiCredentials = ApiCredentialsMock .create(
583- " token" , " type" ,
584- Date (accessTokenExpiry), " scope"
585- )
586- Mockito .`when `(storage.retrieveString(" audience" )).thenReturn(gson.toJson(apiCredentials))
587- Mockito .`when `(storage.retrieveString(" com.auth0.refresh_token" )).thenReturn(" refreshToken" )
588- Mockito .`when `(
589- client.renewAuth(" refreshToken" , " audience" , " newScope" )
590- ).thenReturn(request)
591- val newDate = Date (CredentialsMock .ONE_HOUR_AHEAD_MS + ONE_HOUR_SECONDS * 1000 )
592- val jwtMock = mock<Jwt >()
593- Mockito .`when `(jwtMock.expiresAt).thenReturn(newDate)
594- Mockito .`when `(jwtDecoder.decode(" newId" )).thenReturn(jwtMock)
595-
596- // Trigger success
597- val newRefresh: String? = null
598- val renewedCredentials =
599- Credentials (" newId" , " newAccess" , " newType" , newRefresh, newDate, " newScope" )
600- Mockito .`when `(request.execute()).thenReturn(renewedCredentials)
601- manager.getApiCredentials(" audience" , " newScope" , callback = apiCredentialsCallback)
602- verify(apiCredentialsCallback).onSuccess(
603- apiCredentialsCaptor.capture()
604- )
605-
606- // Verify the credentials are property stored
607- verify(storage).store(" com.auth0.id_token" , renewedCredentials.idToken)
608- // RefreshToken should not be replaced
609- verify(storage).store(" com.auth0.refresh_token" , " refreshToken" )
610- verify(storage).store(" audience" , gson.toJson(renewedCredentials.toAPICredentials()))
611- // Verify the returned credentials are the latest
612- val newAPiCredentials = apiCredentialsCaptor.firstValue
613- MatcherAssert .assertThat(newAPiCredentials, Is .`is `(Matchers .notNullValue()))
614- MatcherAssert .assertThat(newAPiCredentials.accessToken, Is .`is `(" newAccess" ))
615- MatcherAssert .assertThat(newAPiCredentials.type, Is .`is `(" newType" ))
616- MatcherAssert .assertThat(newAPiCredentials.expiresAt, Is .`is `(newDate))
617- MatcherAssert .assertThat(newAPiCredentials.scope, Is .`is `(" newScope" ))
618- }
619-
620578 @Test
621579 public fun shouldReplaceTheExistingRefreshTokenIfaNewOneIsObtainedInApiCredentials () {
622580 verifyNoMoreInteractions(client)
623581 Mockito .`when `(storage.retrieveString(" audience" )).thenReturn(null )
624582 Mockito .`when `(storage.retrieveString(" com.auth0.refresh_token" )).thenReturn(" refreshToken" )
625583 Mockito .`when `(
626- client.renewAuth(" refreshToken" , " audience" , " newScope" )
584+ client.renewAuth(" refreshToken" , " audience" ," newScope" )
627585 ).thenReturn(request)
628586 val newDate = Date (CredentialsMock .ONE_HOUR_AHEAD_MS + ONE_HOUR_SECONDS * 1000 )
629587 val jwtMock = mock<Jwt >()
@@ -643,7 +601,7 @@ public class CredentialsManagerTest {
643601 verify(storage).store(" com.auth0.id_token" , renewedCredentials.idToken)
644602 // RefreshToken should be replaced
645603 verify(storage).store(" com.auth0.refresh_token" , " newRefreshToken" )
646- verify(storage).store(" audience" , gson.toJson(renewedCredentials.toAPICredentials()))
604+ verify(storage).store(" audience::newScope " , gson.toJson(renewedCredentials.toAPICredentials()))
647605 // Verify the returned credentials are the latest
648606 val newAPiCredentials = apiCredentialsCaptor.firstValue
649607 MatcherAssert .assertThat(newAPiCredentials, Is .`is `(Matchers .notNullValue()))
@@ -692,7 +650,7 @@ public class CredentialsManagerTest {
692650 " token" , " type" ,
693651 Date (accessTokenExpiry), " scope"
694652 )
695- Mockito .`when `(storage.retrieveString(" audience" )).thenReturn(gson.toJson(apiCredentials))
653+ Mockito .`when `(storage.retrieveString(" audience::scope " )).thenReturn(gson.toJson(apiCredentials))
696654 val retrievedCredentials = manager.awaitApiCredentials(" audience" , " scope" )
697655 MatcherAssert .assertThat(retrievedCredentials, Is .`is `(Matchers .notNullValue()))
698656 Assert .assertEquals(retrievedCredentials.accessToken, apiCredentials.accessToken)
@@ -1535,6 +1493,220 @@ public class CredentialsManagerTest {
15351493 verifyNoMoreInteractions(storage)
15361494 }
15371495
1496+ @Test
1497+ public fun shouldSaveApiCredentialsWithScopeAsKey () {
1498+ val expirationTime = CredentialsMock .ONE_HOUR_AHEAD_MS
1499+ val apiCredentials = APICredentials (
1500+ accessToken = " apiAccessToken" ,
1501+ type = " type" ,
1502+ expiresAt = Date (expirationTime),
1503+ scope = " read:data write:data"
1504+ )
1505+
1506+ manager.saveApiCredentials(apiCredentials, " audience" , " read:data write:data" )
1507+
1508+ verify(storage).store(
1509+ eq(" audience::read:data::write:data" ),
1510+ eq(gson.toJson(apiCredentials))
1511+ )
1512+ }
1513+
1514+ @Test
1515+ public fun shouldSaveApiCredentialsWithoutScopeUsingOnlyAudience () {
1516+ val expirationTime = CredentialsMock .ONE_HOUR_AHEAD_MS
1517+ val apiCredentials = APICredentials (
1518+ accessToken = " apiAccessToken" ,
1519+ type = " type" ,
1520+ expiresAt = Date (expirationTime),
1521+ scope = " read:data"
1522+ )
1523+
1524+ manager.saveApiCredentials(apiCredentials, " audience" , null )
1525+
1526+ verify(storage).store(eq(" audience" ), eq(gson.toJson(apiCredentials)))
1527+ }
1528+
1529+ @Test
1530+ public fun shouldSaveApiCredentialsWithDifferentScopesUnderDifferentKeys () {
1531+ val expirationTime = CredentialsMock .ONE_HOUR_AHEAD_MS
1532+ val apiCredentials1 = APICredentials (
1533+ accessToken = " apiAccessToken1" ,
1534+ type = " type" ,
1535+ expiresAt = Date (expirationTime),
1536+ scope = " read:data"
1537+ )
1538+ val apiCredentials2 = APICredentials (
1539+ accessToken = " apiAccessToken2" ,
1540+ type = " type" ,
1541+ expiresAt = Date (expirationTime),
1542+ scope = " write:data"
1543+ )
1544+
1545+ manager.saveApiCredentials(apiCredentials1, " audience" , " read:data" )
1546+ manager.saveApiCredentials(apiCredentials2, " audience" , " write:data" )
1547+
1548+ verify(storage).store(eq(" audience::read:data" ), eq(gson.toJson(apiCredentials1)))
1549+ verify(storage).store(eq(" audience::write:data" ), eq(gson.toJson(apiCredentials2)))
1550+ }
1551+
1552+ @Test
1553+ public fun shouldClearApiCredentialsWithScope () {
1554+ manager.clearApiCredentials(" audience" , " read:data write:data" )
1555+ verify(storage).remove(" audience::read:data::write:data" )
1556+ }
1557+
1558+ @Test
1559+ public fun shouldClearApiCredentialsWithoutScopeUsingAudienceOnly () {
1560+ manager.clearApiCredentials(" audience" , null )
1561+ verify(storage).remove(" audience" )
1562+ }
1563+
1564+ @Test
1565+ public fun shouldClearApiCredentialsWithDefaultNullScope () {
1566+ manager.clearApiCredentials(" audience" )
1567+ verify(storage).remove(" audience" )
1568+ }
1569+
1570+ @Test
1571+ public fun shouldGetApiCredentialsWithSpecificScope () {
1572+ verifyNoMoreInteractions(client)
1573+ val accessTokenExpiry = CredentialsMock .ONE_HOUR_AHEAD_MS
1574+ val apiCredentials = ApiCredentialsMock .create(
1575+ accessToken = " apiToken" ,
1576+ expiresAt = Date (accessTokenExpiry),
1577+ scope = " read:data"
1578+ )
1579+ Mockito .`when `(storage.retrieveString(" audience::read:data" ))
1580+ .thenReturn(gson.toJson(apiCredentials))
1581+
1582+ manager.getApiCredentials(" audience" , " read:data" , callback = apiCredentialsCallback)
1583+
1584+ verify(apiCredentialsCallback).onSuccess(apiCredentialsCaptor.capture())
1585+ val retrievedCredentials = apiCredentialsCaptor.firstValue
1586+ MatcherAssert .assertThat(retrievedCredentials.accessToken, Is .`is `(" apiToken" ))
1587+ MatcherAssert .assertThat(retrievedCredentials.scope, Is .`is `(" read:data" ))
1588+ }
1589+
1590+ @Test
1591+ public fun shouldGetApiCredentialsWithoutScopeFromAudienceKey () {
1592+ verifyNoMoreInteractions(client)
1593+ val accessTokenExpiry = CredentialsMock .ONE_HOUR_AHEAD_MS
1594+ val apiCredentials = ApiCredentialsMock .create(
1595+ accessToken = " apiToken" ,
1596+ expiresAt = Date (accessTokenExpiry),
1597+ scope = " openid"
1598+ )
1599+ Mockito .`when `(storage.retrieveString(" audience" ))
1600+ .thenReturn(gson.toJson(apiCredentials))
1601+
1602+ manager.getApiCredentials(" audience" , null , callback = apiCredentialsCallback)
1603+
1604+ verify(apiCredentialsCallback).onSuccess(apiCredentialsCaptor.capture())
1605+ val retrievedCredentials = apiCredentialsCaptor.firstValue
1606+ MatcherAssert .assertThat(retrievedCredentials.accessToken, Is .`is `(" apiToken" ))
1607+ }
1608+
1609+ @Test
1610+ public fun shouldRenewApiCredentialsWhenRequestingScopeButStoredUnderDifferentScopeKey () {
1611+ verifyNoMoreInteractions(client)
1612+ val accessTokenExpiry = CredentialsMock .ONE_HOUR_AHEAD_MS
1613+ Mockito .`when `(storage.retrieveString(" audience::write:data" ))
1614+ .thenReturn(null )
1615+ Mockito .`when `(storage.retrieveString(" com.auth0.refresh_token" ))
1616+ .thenReturn(" refreshToken" )
1617+ Mockito .`when `(client.renewAuth(" refreshToken" , " audience" , " write:data" ))
1618+ .thenReturn(request)
1619+
1620+ val newDate = Date (CredentialsMock .ONE_HOUR_AHEAD_MS + ONE_HOUR_SECONDS * 1000 )
1621+ val jwtMock = mock<Jwt >()
1622+ Mockito .`when `(jwtMock.expiresAt).thenReturn(newDate)
1623+ Mockito .`when `(jwtDecoder.decode(" newId" )).thenReturn(jwtMock)
1624+
1625+ val renewedCredentials = Credentials (
1626+ " newId" , " newAccess" , " newType" , null , newDate, " write:data"
1627+ )
1628+ Mockito .`when `(request.execute()).thenReturn(renewedCredentials)
1629+
1630+ manager.getApiCredentials(" audience" , " write:data" , callback = apiCredentialsCallback)
1631+
1632+ verify(apiCredentialsCallback).onSuccess(apiCredentialsCaptor.capture())
1633+ val newApiCredentials = apiCredentialsCaptor.firstValue
1634+ MatcherAssert .assertThat(newApiCredentials.scope, Is .`is `(" write:data" ))
1635+ MatcherAssert .assertThat(newApiCredentials.accessToken, Is .`is `(" newAccess" ))
1636+ verify(storage).store(eq(" audience::write:data" ), any<String >())
1637+ }
1638+
1639+ @Test
1640+ public fun shouldStoreApiCredentialsUnderCorrectKeyWhenRenewing () {
1641+ verifyNoMoreInteractions(client)
1642+ Mockito .`when `(storage.retrieveString(" audience::custom:scope" ))
1643+ .thenReturn(null )
1644+ Mockito .`when `(storage.retrieveString(" com.auth0.refresh_token" ))
1645+ .thenReturn(" refreshToken" )
1646+ Mockito .`when `(client.renewAuth(" refreshToken" , " audience" , " custom:scope" ))
1647+ .thenReturn(request)
1648+
1649+ val newDate = Date (CredentialsMock .ONE_HOUR_AHEAD_MS + ONE_HOUR_SECONDS * 1000 )
1650+ val jwtMock = mock<Jwt >()
1651+ Mockito .`when `(jwtMock.expiresAt).thenReturn(newDate)
1652+ Mockito .`when `(jwtDecoder.decode(" newId" )).thenReturn(jwtMock)
1653+
1654+ val renewedCredentials = Credentials (
1655+ " newId" , " newAccess" , " newType" , null , newDate, " custom:scope"
1656+ )
1657+ Mockito .`when `(request.execute()).thenReturn(renewedCredentials)
1658+
1659+ manager.getApiCredentials(" audience" , " custom:scope" , callback = apiCredentialsCallback)
1660+
1661+ verify(storage).store(eq(" audience::custom:scope" ), any<String >())
1662+ }
1663+
1664+ @Test
1665+ @ExperimentalCoroutinesApi
1666+ public fun shouldAwaitApiCredentialsWithSpecificScope (): Unit = runTest {
1667+ verifyNoMoreInteractions(client)
1668+ val accessTokenExpiry = CredentialsMock .ONE_HOUR_AHEAD_MS
1669+ val apiCredentials = ApiCredentialsMock .create(
1670+ accessToken = " apiToken" ,
1671+ expiresAt = Date (accessTokenExpiry),
1672+ scope = " read:data"
1673+ )
1674+ Mockito .`when `(storage.retrieveString(" audience::read:data" ))
1675+ .thenReturn(gson.toJson(apiCredentials))
1676+
1677+ val result = manager.awaitApiCredentials(" audience" , " read:data" )
1678+
1679+ MatcherAssert .assertThat(result.accessToken, Is .`is `(" apiToken" ))
1680+ MatcherAssert .assertThat(result.scope, Is .`is `(" read:data" ))
1681+ }
1682+
1683+ @Test
1684+ @ExperimentalCoroutinesApi
1685+ public fun shouldAwaitAndRenewApiCredentialsWithScope (): Unit = runTest {
1686+ verifyNoMoreInteractions(client)
1687+ Mockito .`when `(storage.retrieveString(" audience::write:data" ))
1688+ .thenReturn(null )
1689+ Mockito .`when `(storage.retrieveString(" com.auth0.refresh_token" ))
1690+ .thenReturn(" refreshToken" )
1691+ Mockito .`when `(client.renewAuth(" refreshToken" , " audience" , " write:data" ))
1692+ .thenReturn(request)
1693+
1694+ val newDate = Date (CredentialsMock .ONE_HOUR_AHEAD_MS + ONE_HOUR_SECONDS * 1000 )
1695+ val jwtMock = mock<Jwt >()
1696+ Mockito .`when `(jwtMock.expiresAt).thenReturn(newDate)
1697+ Mockito .`when `(jwtDecoder.decode(" newId" )).thenReturn(jwtMock)
1698+
1699+ val renewedCredentials = Credentials (
1700+ " newId" , " newAccess" , " newType" , null , newDate, " write:data"
1701+ )
1702+ Mockito .`when `(request.execute()).thenReturn(renewedCredentials)
1703+
1704+ val result = manager.awaitApiCredentials(" audience" , " write:data" )
1705+
1706+ MatcherAssert .assertThat(result.scope, Is .`is `(" write:data" ))
1707+ MatcherAssert .assertThat(result.accessToken, Is .`is `(" newAccess" ))
1708+ }
1709+
15381710 @Test
15391711 public fun shouldHaveCredentialsWhenTokenHasNotExpired () {
15401712 val expirationTime = CredentialsMock .ONE_HOUR_AHEAD_MS
0 commit comments