package com.box.sdk; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.junit.Assert; import org.junit.Test; import org.junit.experimental.categories.Category; import com.eclipsesource.json.JsonObject; public class BoxAPIConnectionTest { @Test @Category(UnitTest.class) public void canRefreshWhenGivenRefreshToken() { final String anyClientID = ""; final String anyClientSecret = ""; final String anyAccessToken = ""; final String anyRefreshToken = ""; BoxAPIConnection api = new BoxAPIConnection(anyClientID, anyClientSecret, anyAccessToken, anyRefreshToken); assertThat(api.canRefresh(), is(true)); } @Test @Category(UnitTest.class) public void needsRefreshWhenTokenHasExpired() { final String anyAccessToken = ""; BoxAPIConnection api = new BoxAPIConnection(anyAccessToken); api.setExpires(-1); assertThat(api.needsRefresh(), is(true)); } @Test @Category(UnitTest.class) public void doesNotNeedRefreshWhenTokenHasNotExpired() { final String anyAccessToken = ""; BoxAPIConnection api = new BoxAPIConnection(anyAccessToken); api.setExpires(Long.MAX_VALUE); assertThat(api.needsRefresh(), is(not(true))); } @Test @Category(UnitTest.class) public void needsRefreshWhenExpiresIsZero() { final String anyAccessToken = ""; BoxAPIConnection api = new BoxAPIConnection(anyAccessToken); api.setExpires(0); assertThat(api.needsRefresh(), is(true)); } @Test @Category(UnitTest.class) public void interceptorReceivesSentRequest() throws MalformedURLException { BoxAPIConnection api = new BoxAPIConnection(""); BoxAPIResponse fakeResponse = new BoxAPIResponse(); RequestInterceptor mockInterceptor = mock(RequestInterceptor.class); when(mockInterceptor.onRequest(any(BoxAPIRequest.class))).thenReturn(fakeResponse); api.setRequestInterceptor(mockInterceptor); BoxAPIRequest request = new BoxAPIRequest(api, new URL("http://anyurl.com"), "GET"); BoxAPIResponse response = request.send(); assertThat(response, is(equalTo(fakeResponse))); } @Test @Category(UnitTest.class) public void restoreConnectionThatDoesNotNeedRefresh() { BoxAPIConnection api = new BoxAPIConnection("fake client ID", "fake client secret", "fake access token", "fake refresh token"); api.setExpires(3600000L); api.setLastRefresh(System.currentTimeMillis()); String state = api.save(); final BoxAPIConnection restoredAPI = BoxAPIConnection.restore("fake client ID", "fake client secret", state); restoredAPI.setRequestInterceptor(new RequestInterceptor() { @Override public BoxAPIResponse onRequest(BoxAPIRequest request) { String tokenURLString = restoredAPI.getTokenURL().toString(); String requestURLString = request.getUrl().toString(); if (requestURLString.contains(tokenURLString)) { fail("The connection was refreshed."); } if (requestURLString.contains("folders")) { return new BoxJSONResponse() { @Override public String getJSON() { JsonObject responseJSON = new JsonObject() .add("id", "fake ID") .add("type", "folder"); return responseJSON.toString(); } }; } fail("Unexpected request."); return null; } }); assertFalse(restoredAPI.needsRefresh()); } @Test @Category(UnitTest.class) public void getAuthorizetionURLSuccess() throws Exception { List<String> scopes = new ArrayList<String>(); scopes.add("root_readwrite"); scopes.add("manage_groups"); URL authURL = BoxAPIConnection.getAuthorizationURL("wncmz88sacf5oyaxf502dybcruqbzzy0", new URI("http://localhost:3000"), "test", scopes); Assert.assertTrue(authURL.toString().startsWith("https://account.box.com/api/oauth2/authorize")); StringTokenizer tokenizer = new StringTokenizer(authURL.getQuery(), "&"); while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); if (token.startsWith("client_id")) { Assert.assertEquals(token, "client_id=wncmz88sacf5oyaxf502dybcruqbzzy0"); } else if (token.startsWith("response_type")) { Assert.assertEquals(token, "response_type=code"); } else if (token.startsWith("redirect_uri")) { Assert.assertEquals(token, "redirect_uri=http%3A%2F%2Flocalhost%3A3000"); } else if (token.startsWith("state")) { Assert.assertEquals(token, "state=test"); } else if (token.startsWith("scope")) { Assert.assertEquals(token, "scope=root_readwrite+manage_groups"); } } } @Test @Category(IntegrationTest.class) public void requestIsSentNormallyWhenInterceptorReturnsNullResponse() throws MalformedURLException { BoxAPIConnection api = new BoxAPIConnection(""); RequestInterceptor mockInterceptor = mock(RequestInterceptor.class); when(mockInterceptor.onRequest(any(BoxAPIRequest.class))).thenReturn(null); api.setRequestInterceptor(mockInterceptor); BoxAPIRequest request = new BoxAPIRequest(api, new URL("http://box.com"), "GET"); BoxAPIResponse response = request.send(); assertThat(response.getResponseCode(), is(200)); } @Test @Category(IntegrationTest.class) public void refreshSucceeds() { final String originalAccessToken = TestConfig.getAccessToken(); final String originalRefreshToken = TestConfig.getRefreshToken(); BoxAPIConnection api = new BoxAPIConnection(TestConfig.getClientID(), TestConfig.getClientSecret(), originalAccessToken, originalRefreshToken); api.refresh(); String actualAccessToken = api.getAccessToken(); String actualRefreshToken = api.getRefreshToken(); assertThat(originalRefreshToken, not(equalTo(actualRefreshToken))); assertThat(originalAccessToken, not(equalTo(actualAccessToken))); TestConfig.setAccessToken(actualAccessToken); TestConfig.setRefreshToken(actualRefreshToken); } @Test @Category(IntegrationTest.class) public void refreshesWhenGetAccessTokenIsCalledAndTokenHasExpired() { final String originalAccessToken = TestConfig.getAccessToken(); final String originalRefreshToken = TestConfig.getRefreshToken(); BoxAPIConnection api = new BoxAPIConnection(TestConfig.getClientID(), TestConfig.getClientSecret(), originalAccessToken, originalRefreshToken); api.setExpires(-1); String actualAccessToken = api.getAccessToken(); String actualRefreshToken = api.getRefreshToken(); assertThat(originalRefreshToken, not(equalTo(actualRefreshToken))); assertThat(originalAccessToken, not(equalTo(actualAccessToken))); TestConfig.setAccessToken(actualAccessToken); TestConfig.setRefreshToken(actualRefreshToken); } @Test @Category(IntegrationTest.class) public void doesNotRefreshWhenGetAccessTokenIsCalledAndTokenHasNotExpired() { final String originalAccessToken = TestConfig.getAccessToken(); final String originalRefreshToken = TestConfig.getRefreshToken(); BoxAPIConnection api = new BoxAPIConnection(TestConfig.getClientID(), TestConfig.getClientSecret(), originalAccessToken, originalRefreshToken); api.setExpires(Long.MAX_VALUE); String actualAccessToken = api.getAccessToken(); String actualRefreshToken = api.getRefreshToken(); assertThat(originalRefreshToken, equalTo(actualRefreshToken)); assertThat(originalAccessToken, equalTo(actualAccessToken)); TestConfig.setAccessToken(actualAccessToken); TestConfig.setRefreshToken(actualRefreshToken); } @Test @Category(IntegrationTest.class) public void successfullySavesAndRestoresConnection() { final String originalAccessToken = TestConfig.getAccessToken(); final String originalRefreshToken = TestConfig.getRefreshToken(); BoxAPIConnection api = new BoxAPIConnection(TestConfig.getClientID(), TestConfig.getClientSecret(), originalAccessToken, originalRefreshToken); String state = api.save(); BoxAPIConnection restoredAPI = BoxAPIConnection.restore(TestConfig.getClientID(), TestConfig.getClientSecret(), state); BoxFolder.Info rootFolderInfo = BoxFolder.getRootFolder(restoredAPI).getInfo(); TestConfig.setAccessToken(restoredAPI.getAccessToken()); TestConfig.setRefreshToken(restoredAPI.getRefreshToken()); } @Test @Category(IntegrationTestJWT.class) public void developerEditionAppAuthWorks() throws IOException { Reader reader = new FileReader("src/test/config/config.json"); BoxConfig boxConfig = BoxConfig.readFrom(reader); IAccessTokenCache accessTokenCache = new InMemoryLRUAccessTokenCache(100); BoxDeveloperEditionAPIConnection api = BoxDeveloperEditionAPIConnection.getAppEnterpriseConnection(boxConfig, accessTokenCache); assertThat(api.getAccessToken(), not(equalTo(null))); final String name = "app user name"; BoxUser.Info createdUserInfo = BoxUser.createAppUser(api, name); final String appUserId = createdUserInfo.getID(); assertThat(createdUserInfo.getID(), not(equalTo(null))); assertThat(createdUserInfo.getName(), equalTo(name)); BoxUser appUser = new BoxUser(api, appUserId); final String newName = "app user updated name"; createdUserInfo.setName(newName); appUser.updateInfo(createdUserInfo); assertThat(createdUserInfo.getName(), equalTo(newName)); appUser.delete(false, true); api.refresh(); } @Test @Category(IntegrationTestJWT.class) public void developerEditionAppUserWorks() throws IOException { Reader reader = new FileReader("src/test/config/config.json"); BoxConfig boxConfig = BoxConfig.readFrom(reader); IAccessTokenCache accessTokenCache = new InMemoryLRUAccessTokenCache(100); BoxDeveloperEditionAPIConnection appAuthConnection = BoxDeveloperEditionAPIConnection.getAppEnterpriseConnection(boxConfig, accessTokenCache); final String name = "app user name two"; BoxUser.Info createdUserInfo = BoxUser.createAppUser(appAuthConnection, name); final String appUserId = createdUserInfo.getID(); BoxDeveloperEditionAPIConnection api = BoxDeveloperEditionAPIConnection.getAppUserConnection(appUserId, boxConfig, accessTokenCache); BoxUser appUser = new BoxUser(api, appUserId); assertThat(api.getAccessToken(), not(equalTo(null))); BoxUser.Info info = appUser.getInfo(); assertThat(info.getID(), equalTo(appUserId)); assertThat(info.getName(), equalTo(name)); api.refresh(); BoxUser appUserFromAdmin = new BoxUser(appAuthConnection, appUserId); appUserFromAdmin.delete(false, true); } }