/*
* Copyright 2012 Nodeable Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.streamreduce.rest;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.streamreduce.AbstractInContainerTestCase;
import com.streamreduce.ConnectionTypeConstants;
import com.streamreduce.ProviderIdConstants;
import com.streamreduce.connections.AuthType;
import com.streamreduce.connections.ProjectHostingProvider;
import com.streamreduce.core.model.Account;
import com.streamreduce.core.model.Connection;
import com.streamreduce.core.model.ConnectionCredentials;
import com.streamreduce.core.model.InventoryItem;
import com.streamreduce.core.model.SobaObject;
import com.streamreduce.core.model.User;
import com.streamreduce.rest.dto.response.AuthTypeResponseDTO;
import com.streamreduce.rest.dto.response.ConnectionProviderResponseDTO;
import com.streamreduce.rest.dto.response.ConnectionProvidersResponseDTO;
import com.streamreduce.rest.dto.response.ConnectionResponseDTO;
import com.streamreduce.rest.dto.response.ConstraintViolationExceptionResponseDTO;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.annotation.Nullable;
import net.sf.json.JSONObject;
import org.codehaus.jackson.map.type.TypeFactory;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
public class ConnectionResourceITCase extends AbstractInContainerTestCase {
private String authnToken = null;
private ConnectionResponseDTO cloud;
private ConnectionResponseDTO jira;
private ConnectionResponseDTO gitHub;
@Before
@Override
public void setUp() throws Exception {
super.setUp();
authnToken = login(testUsername, testUsername);
}
@Test
@Ignore
public void testAllProviders() throws Exception {
ConnectionProvidersResponseDTO responseDTO = jsonToObject(makeRequest(connectionsBaseUrl + "/providers",
"GET", null, authnToken),
TypeFactory.defaultInstance().constructType(
ConnectionProvidersResponseDTO.class));
//AWS, Github, Jira, RSS Feed, Generic Gateway, Pingdom and Twitter
assertEquals(7, responseDTO.getProviders().size());
}
@Test
@Ignore
public void testAllProvidersNoShowAuthTypeParam() throws Exception {
//Test that verifies authType information is left out of ConnectionProviderResponseDTO unless specified
ConnectionProvidersResponseDTO responseDTO = jsonToObject(makeRequest(connectionsBaseUrl + "/providers",
"GET", null, authnToken),
TypeFactory.defaultInstance().constructType(
ConnectionProvidersResponseDTO.class));
for (ConnectionProviderResponseDTO provider : responseDTO.getProviders()) {
assertTrue(provider.getAuthTypes() == null);
}
}
@Test
@Ignore
public void testAllProvidersShowAuthTypeParam() throws Exception {
//Test that verifies authType information is included in ConnectionProviderResponseDTO when showAuthTypes
//is set to true
String rawResponse = makeRequest(connectionsBaseUrl + "/providers?showAuthTypes=true", "GET", null, authnToken);
ConnectionProvidersResponseDTO responseDTO = jsonToObject(rawResponse,
TypeFactory.defaultInstance().constructType(
ConnectionProvidersResponseDTO.class));
for (ConnectionProviderResponseDTO provider : responseDTO.getProviders()) {
assertTrue(provider.getAuthTypes() != null);
assertTrue(provider.getAuthTypes().getAuthTypes().size() != 0);
}
}
@Test
@Ignore
public void testCloudAwsProviderWithAuthTypeParam() throws Exception {
//Test that a proper response is returned for /api/connections/providers/cloud
//
ConnectionProvidersResponseDTO responseDTO = jsonToObject(makeRequest(connectionsBaseUrl + "/providers/cloud?showAuthTypes=true",
"GET", null, authnToken),
TypeFactory.defaultInstance().constructType(
ConnectionProvidersResponseDTO.class));
assertTrue(responseDTO.getProviders().size() == 1);
ConnectionProviderResponseDTO awsProvider = responseDTO.getProviders().get(0);
assertEquals("aws", awsProvider.getId());
List<AuthTypeResponseDTO> authTypes = awsProvider.getAuthTypes().getAuthTypes();
assertEquals(1, authTypes.size());
assertEquals(AuthType.USERNAME_PASSWORD.toString(), authTypes.get(0).getType());
}
@Test
@Ignore
public void testFeedRssProviderWithAuthTypeParam() throws Exception {
//Test that a proper response is returned for /api/connections/providers/cloud
ConnectionProvidersResponseDTO responseDTO = jsonToObject(makeRequest(connectionsBaseUrl + "/providers/feed?showAuthTypes=true",
"GET", null, authnToken),
TypeFactory.defaultInstance().constructType(
ConnectionProvidersResponseDTO.class));
assertTrue(responseDTO.getProviders().size() == 1);
ConnectionProviderResponseDTO feedProviders = responseDTO.getProviders().get(0);
assertEquals("rss", feedProviders.getId());
List<AuthTypeResponseDTO> authTypes = feedProviders.getAuthTypes().getAuthTypes();
//These will fail with NoSuchElementExceptions if the criteria aren't met
Iterables.find(authTypes, new Predicate<AuthTypeResponseDTO>() {
@Override
public boolean apply(@Nullable AuthTypeResponseDTO input) {
return input != null && input.getType().equals(AuthType.NONE.toString())
&& input.getUsernameLabel() == null
&& input.getPasswordLabel() == null;
}
});
Iterables.find(authTypes, new Predicate<AuthTypeResponseDTO>() {
@Override
public boolean apply(@Nullable AuthTypeResponseDTO input) {
return input != null && input.getType().equals(AuthType.USERNAME_PASSWORD.toString())
&& input.getUsernameLabel().equalsIgnoreCase("UserName")
&& input.getPasswordLabel().equalsIgnoreCase("Password");
}
});
}
@Test
@Ignore
public void testGithubProviderWithAuthTypeParam() throws Exception {
//Test that a proper response is returned for /api/connections/providers/projecthosting for the the github id
ConnectionProvidersResponseDTO responseDTO = jsonToObject(makeRequest(connectionsBaseUrl + "/providers/projecthosting?showAuthTypes=true",
"GET", null, authnToken),
TypeFactory.defaultInstance().constructType(
ConnectionProvidersResponseDTO.class));
assertTrue(responseDTO.getProviders().size() == 2);
ConnectionProviderResponseDTO githubProviderDTO = Iterables.find(responseDTO.getProviders(), new Predicate<ConnectionProviderResponseDTO>() {
@Override
public boolean apply(@Nullable ConnectionProviderResponseDTO input) {
return input != null && input.getId().equals("github");
}
});
List<AuthTypeResponseDTO> authTypes = githubProviderDTO.getAuthTypes().getAuthTypes();
//These will fail with NoSuchElementExceptions if the criteria aren't met
Iterables.find(authTypes, new Predicate<AuthTypeResponseDTO>() {
@Override
public boolean apply(@Nullable AuthTypeResponseDTO input) {
return input != null && input.getType().equals(AuthType.USERNAME_PASSWORD.toString())
&& input.getUsernameLabel().equalsIgnoreCase("UserName")
&& input.getPasswordLabel().equalsIgnoreCase("Password");
}
});
Iterables.find(authTypes, new Predicate<AuthTypeResponseDTO>() {
@Override
public boolean apply(@Nullable AuthTypeResponseDTO input) {
return input != null && input.getType().equals(AuthType.OAUTH.toString())
&& input.getUsernameLabel() == null
&& input.getPasswordLabel() == null
&& input.getOauthEndpoint().equals("/api/oauth/providers/github")
&& input.getCommandLabel() != null;
}
});
}
@Test
@Ignore
public void testAllConnections() throws Exception {
String req = makeRequest(connectionsBaseUrl, "GET", null, authnToken);
List<ConnectionResponseDTO> allConnections = jsonToObject(req,
TypeFactory.defaultInstance().constructCollectionType(List.class, ConnectionResponseDTO.class));
assertEquals(25, allConnections.size()); // The 21 RSS feed connections, 1 AWS, 1 GitHub and 1 Jira
cloud = createConnection(authnToken, "AWS Cloud Connection", "This is a test cloud connection to AWS.",
new ConnectionCredentials(cloudProperties.getString("nodeable.aws.accessKeyId"),
cloudProperties.getString("nodeable.aws.secretKey")),
ProviderIdConstants.AWS_PROVIDER_ID, null, ConnectionTypeConstants.CLOUD_TYPE, AuthType.USERNAME_PASSWORD);
allConnections = jsonToObject(makeRequest(connectionsBaseUrl, "GET", null, authnToken),
TypeFactory.defaultInstance().constructCollectionType(List.class, ConnectionResponseDTO.class));
assertEquals(26, allConnections.size());
jira = createConnection(authnToken, "Jira Connection", "This is a test project hosting connection to Jira.",
new ConnectionCredentials(jiraProperties.getString("nodeable.jira.username"),
jiraProperties.getString("nodeable.jira.password")),
ProviderIdConstants.JIRA_PROVIDER_ID, jiraProperties.getString("nodeable.jira.url"),
ConnectionTypeConstants.PROJECT_HOSTING_TYPE, AuthType.USERNAME_PASSWORD);
allConnections = jsonToObject(makeRequest(connectionsBaseUrl, "GET", null, authnToken),
TypeFactory.defaultInstance()
.constructCollectionType(List.class, ConnectionResponseDTO.class));
assertEquals(27, allConnections.size());
gitHub = createConnection(authnToken, "GitHub Connection",
"This is a test project hosting connection to GitHub.",
new ConnectionCredentials(gitHubProperties.getString("nodeable.github.username"),
gitHubProperties.getString("nodeable.github.password")),
ProviderIdConstants.GITHUB_PROVIDER_ID, null,
ConnectionTypeConstants.PROJECT_HOSTING_TYPE, AuthType.USERNAME_PASSWORD);
allConnections = jsonToObject(makeRequest(connectionsBaseUrl, "GET", null, authnToken),
TypeFactory.defaultInstance()
.constructCollectionType(List.class, ConnectionResponseDTO.class));
assertEquals(28, allConnections.size());
}
/**
* SOBA-1034
*
* @throws Exception if anything goes wrong.
*/
@Test
@Ignore
public void testUpdatingCredentials() throws Exception {
gitHub = createConnection(authnToken, "GitHub Connection",
"This is a test project hosting connection to GitHub.",
new ConnectionCredentials(gitHubProperties.getString("nodeable.github.username"),
gitHubProperties.getString("nodeable.github.password")),
ProviderIdConstants.GITHUB_PROVIDER_ID, null,
ConnectionTypeConstants.PROJECT_HOSTING_TYPE, AuthType.USERNAME_PASSWORD);
// To test that we can successfully change connection credentials via REST, we will change the credentials
// to known bad values and expect to return an exception response that says the credentials were invalid.
JSONObject json = new JSONObject();
JSONObject credentialsJSON = new JSONObject();
credentialsJSON.put("credential", "fake");
credentialsJSON.put("identity", "fake");
json.put("credentials", credentialsJSON);
try {
cloud = jsonToObject(makeRequest(connectionsBaseUrl + "/" + gitHub.getId(), "PUT", json, authnToken),
TypeFactory.defaultInstance().constructType(ConnectionResponseDTO.class));
} catch (Exception e) {
assertTrue(e.getMessage().contains("credentials") && e.getMessage().contains("are invalid"));
}
}
/**
* SOBA-1080
*
* @throws Exception if anything goes wrong
*/
@Test
@Ignore
public void testCannotUpdateVisibilityToPublic() throws Exception {
gitHub = createConnection(authnToken, "GitHub Connection",
"This is a test project hosting connection to GitHub.",
new ConnectionCredentials(gitHubProperties.getString("nodeable.github.username"),
gitHubProperties.getString("nodeable.github.password")),
ProviderIdConstants.GITHUB_PROVIDER_ID, null,
ConnectionTypeConstants.PROJECT_HOSTING_TYPE, AuthType.USERNAME_PASSWORD);
JSONObject json = new JSONObject();
json.put("visibility", "PUBLIC");
ConstraintViolationExceptionResponseDTO response =
jsonToObject(makeRequest(connectionsBaseUrl + "/" + gitHub.getId(), "PUT", json, authnToken),
TypeFactory.defaultInstance().constructType(ConstraintViolationExceptionResponseDTO.class));
Map<String, String> violations = response.getViolations();
boolean violationFound = false;
for (String violationKey : violations.keySet()) {
if (violationKey.equals("visibility")) {
violationFound = true;
break;
}
}
assertTrue(violationFound);
// Just to be sure, let's change the visibility to something valid
json.put("visibility", SobaObject.Visibility.SELF);
gitHub = jsonToObject(makeRequest(connectionsBaseUrl + "/" + gitHub.getId(), "PUT", json, authnToken),
TypeFactory.defaultInstance().constructType(ConnectionResponseDTO.class));
assertEquals(SobaObject.Visibility.SELF, gitHub.getVisibility());
}
/**
* Verify that tagging a connection tags the inventory items too
*
* @throws Exception
*/
@Test
@Ignore
public void testHashtagOnConnectionAndChildren() throws Exception {
// random tag to connection...
String random = UUID.randomUUID().toString().substring(0, 4);
User user = applicationManager.getUserService().getUser(testUser.getUsername());
String authnToken = login(user.getUsername(), testUser.getUsername()); // ugh
// just get the first random one
List<Connection> connections = applicationManager.getConnectionService().getConnections(ProjectHostingProvider.TYPE, user);
Connection connection = connections.get(0);
JSONObject json = new JSONObject();
// Just to be sure, let's change the visibility to something valid
json.put("hashtag", random);
makeRequest(connectionsBaseUrl + "/" + connection.getId() + "/hashtag", "POST", json, authnToken);
/// verify the connection is tagged
connection = applicationManager.getConnectionService().getConnection(connection.getId());
assertNotNull(connection.getHashtags());
assertTrue(connection.getHashtags().size() > 0);
assertTrue(connection.getHashtags().contains("#" + random));
// now check the child items
List<InventoryItem> items = applicationManager.getInventoryService().getInventoryItems(connection, user);
assertNotNull(items);
assertTrue(items.size() > 0);
for (InventoryItem item : items) {
assertTrue(item.getHashtags().contains("#" + random));
}
// now delete
makeRequest(connectionsBaseUrl + "/" + connection.getId() + "/hashtag/" + random, "DELETE", null, authnToken);
// get a fresh copy from the db
connection = applicationManager.getConnectionService().getConnection(connection.getId());
assertFalse(connection.getHashtags().contains("#" + random));
// now check the child items
items = applicationManager.getInventoryService().getInventoryItems(connection, user);
for (InventoryItem item : items) {
assertFalse(item.getHashtags().contains("#" + random));
}
}
@Test
@Ignore
public void testCanBlacklistPublicConnection() throws Exception {
List<Connection> connectionList = applicationManager.getConnectionService().getPublicConnections("feed");
// get an RSS connection bootstrapped by nodeable
Connection connection = connectionList.get(0);
assertNotNull(connection);
// try and delete the connection.
String response = makeRequest(connectionsBaseUrl + "/" + connection.getId(), "DELETE", null, authnToken);
Assert.assertEquals("200", response);
// make sure it's still exists
connection = applicationManager.getConnectionService().getConnection(connection.getId());
assertNotNull(connection);
// make sure you account object has it in the blacklisted list
//boolean exists =
Account account = applicationManager.getUserService().getAccount(testUser.getAccount().getId());
assertFalse(!account.getPublicConnectionBlacklist().contains(connection.getId()));
// should not show up in your connection list now.
String req = makeRequest(connectionsBaseUrl, "GET", null, authnToken);
List<ConnectionResponseDTO> allConnections = jsonToObject(req,
TypeFactory.defaultInstance().constructCollectionType(List.class, ConnectionResponseDTO.class));
for(ConnectionResponseDTO connectionResponseDTO : allConnections) {
assertFalse(connectionResponseDTO.getId().equals(connection.getId()));
}
}
}