package com.github.jreddit.oauth; import static org.mockito.Mockito.when; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.apache.oltu.oauth2.client.response.OAuthJSONAccessTokenResponse; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import com.github.jreddit.oauth.param.RedditScope; @RunWith(MockitoJUnitRunner.class) public class RedditTokenTest { @Mock private OAuthJSONAccessTokenResponse jsonToken; @Mock private OAuthJSONAccessTokenResponse refreshJsonToken; private String accessToken = "djsaf98s9fasjofjkasjdf9"; private String refreshToken = "89sd89fafjdajiofafsfasf"; private String tokenType = "bearer"; private long expiresIn = 1; private String scope = "edit,flair"; private String accessToken2 = "9sd89s8fahhsf9898saf"; private String tokenType2 = "bearer"; private long expiresIn2 = 3600; private String scope2 = "edit"; @Before public void setup() { when(jsonToken.getAccessToken()).thenReturn(accessToken); when(jsonToken.getRefreshToken()).thenReturn(refreshToken); when(jsonToken.getParam(RedditToken.PARAM_TOKEN_TYPE)).thenReturn(tokenType); when(jsonToken.getExpiresIn()).thenReturn(expiresIn); when(jsonToken.getScope()).thenReturn(scope); when(refreshJsonToken.getAccessToken()).thenReturn(accessToken2); when(refreshJsonToken.getParam(RedditToken.PARAM_TOKEN_TYPE)).thenReturn(tokenType2); when(refreshJsonToken.getExpiresIn()).thenReturn(expiresIn2); when(refreshJsonToken.getScope()).thenReturn(scope2); } @Test public void testGetters() { RedditToken subject = new RedditToken(jsonToken); RedditToken subjectUserProvided = new RedditToken(accessToken, tokenType, expiresIn, scope); assertEquals(accessToken, subject.getAccessToken()); assertEquals(refreshToken, subject.getRefreshToken()); assertEquals(tokenType, subject.getTokenType()); assertEquals(expiresIn, subject.getExpirationSpan()); assertTrue(subject.hasScope(RedditScope.EDIT)); assertTrue(subject.hasScope(RedditScope.FLAIR)); assertFalse(subject.hasScope(RedditScope.PRIVATEMESSAGE)); assertTrue(subject.isRefreshable()); assertFalse(subjectUserProvided.isRefreshable()); } @Test public void testRefresh() { RedditToken subject = new RedditToken(jsonToken); assertEquals(accessToken, subject.getAccessToken()); assertEquals(refreshToken, subject.getRefreshToken()); assertEquals(tokenType, subject.getTokenType()); assertEquals(expiresIn, subject.getExpirationSpan()); assertTrue(subject.hasScope(RedditScope.EDIT)); assertTrue(subject.hasScope(RedditScope.FLAIR)); subject.refresh(refreshJsonToken); assertEquals(accessToken2, subject.getAccessToken()); assertEquals(refreshToken, subject.getRefreshToken()); assertEquals(tokenType2, subject.getTokenType()); assertEquals(expiresIn2, subject.getExpirationSpan()); assertTrue(subject.hasScope(RedditScope.EDIT)); assertFalse(subject.hasScope(RedditScope.FLAIR)); } @Test public void testTimeSensitiveExpiration() { RedditToken subject = new RedditToken(jsonToken); RedditToken subjectUserProvided = new RedditToken(accessToken, tokenType, expiresIn2, scope); assertFalse(subjectUserProvided.willExpireIn(expiresIn2 - 60)); assertTrue(subjectUserProvided.willExpireIn(expiresIn2 + 60)); assertFalse(subjectUserProvided.isExpired()); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } assertTrue(subject.isExpired()); assertTrue(subject.getExpiration() < (System.currentTimeMillis() / 1000)); } }