/*
* Copyright 2012 SURFnet bv, The Netherlands
*
* 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 org.surfnet.oaaas.it;
import java.util.List;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.GenericType;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import org.codehaus.jackson.jaxrs.JacksonJsonProvider;
import org.junit.Before;
import org.junit.Test;
import org.surfnet.oaaas.auth.principal.AuthenticatedPrincipal;
import org.surfnet.oaaas.model.ResourceServer;
import org.surfnet.oaaas.model.StatisticsResponse;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
/**
* Integration tests for ResourceServer REST resource. This presumes on the
* server side:
* <ul>
* <li>An existing access token</li>
* </ul>
*/
public class ResourceServerTestIT extends AbstractAuthorizationServerTest {
private WebResource webResource;
@Before
public void client() {
ClientConfig config = new DefaultClientConfig();
// Default jaxb provider cannot properly deserialize lists.
config.getClasses().add(JacksonJsonProvider.class);
webResource = Client.create(config).resource(baseUrl()).path("admin").path("resourceServer");
}
@Test
public void put() {
ResourceServer resourceServer = buildResourceServer();
final ClientResponse response = webResource.header("Authorization", authorizationBearer(ACCESS_TOKEN)).put(ClientResponse.class,
resourceServer);
assertEquals(201, response.getStatus());
ResourceServer returnedResourceServer = response.getEntity(ResourceServer.class);
assertEquals(resourceServer.getName(), returnedResourceServer.getName());
assertNotNull("the server should generate an ID", returnedResourceServer.getId());
assertNotNull("the server should generate a secret", returnedResourceServer.getSecret());
}
@Test
public void putInvalid() {
ResourceServer resourceServer = buildResourceServer();
final ClientResponse response = webResource.header("Authorization", authorizationBearer(ACCESS_TOKEN)).put(ClientResponse.class,
resourceServer);
assertEquals(201, response.getStatus());
final ClientResponse response2 = webResource.header("Authorization", authorizationBearer(ACCESS_TOKEN)).put(ClientResponse.class,
resourceServer);
assertEquals("putting the same server twice should not work because id+name combination has unique constraint", 500,
response2.getStatus());
}
@Test
public void get() {
// First get a non existing resource server
ClientResponse response = webResource.path("-1").header("Authorization", authorizationBearer(ACCESS_TOKEN)).get(ClientResponse.class);
assertEquals("Random id should return nothing", 404, response.getStatus());
// Insert some random one.
ResourceServer existingResourceServer = putSomeResourceServer();
// Get it again.
final ResourceServer returnedFromGet = webResource.path(String.valueOf(existingResourceServer.getId()))
.header("Authorization", authorizationBearer(ACCESS_TOKEN)).get(ResourceServer.class);
assertEquals(existingResourceServer, returnedFromGet);
// Get all
final List<ResourceServer> returnFromGetAll = webResource.header("Authorization", authorizationBearer(ACCESS_TOKEN)).get(
new GenericType<List<ResourceServer>>() {
});
assertTrue(returnFromGetAll.size() > 0);
}
@Test
public void post() {
ResourceServer existingResourceServer = putSomeResourceServer();
final String newThumbnailUrl = "http://example.com/anotherThumbNailUrl";
existingResourceServer.setThumbNailUrl(newThumbnailUrl);
ResourceServer returnedFromPost = webResource.path(String.valueOf(existingResourceServer.getId()))
.header("Authorization", authorizationBearer(ACCESS_TOKEN)).post(ResourceServer.class, existingResourceServer);
assertEquals(newThumbnailUrl, returnedFromPost.getThumbNailUrl());
}
@Test
public void delete() {
// create a random resourceServer
ResourceServer existingResourceServer = putSomeResourceServer();
// Delete it again.
String id = String.valueOf(existingResourceServer.getId());
ClientResponse response = webResource.path(id).header("Authorization", authorizationBearer(ACCESS_TOKEN)).delete(ClientResponse.class);
// Make sure that the response is a 'no content' one
assertEquals(204, response.getStatus());
// And make sure it is not found anymore afterwards.
ClientResponse responseFromGet = webResource.path(id).header("Authorization", authorizationBearer(ACCESS_TOKEN))
.delete(ClientResponse.class);
assertEquals(404, responseFromGet.getStatus());
}
@Test
public void stats() {
final ClientResponse response = webResource.path("stats").header("Authorization", authorizationBearer(ACCESS_TOKEN))
.get(ClientResponse.class);
assertEquals(200, response.getStatus());
StatisticsResponse entity = response.getEntity(StatisticsResponse.class);
assertTrue(entity.getResourceServers().size() > 0);
assertNotNull(entity.getResourceServers().get(0).getName());
}
@Test
public void principal() {
final ClientResponse response = webResource.path("principal").header("Authorization", authorizationBearer(ACCESS_TOKEN))
.get(ClientResponse.class);
assertEquals(200, response.getStatus());
AuthenticatedPrincipal principal = response.getEntity(AuthenticatedPrincipal.class);
assertEquals("admin-enduser",principal.getName());
}
/**
* Convenience method to put some random resourceServer.
*
* @return a persisted resourceServer
*/
private ResourceServer putSomeResourceServer() {
ResourceServer resourceServer = buildResourceServer();
return webResource.header("Authorization", authorizationBearer(ACCESS_TOKEN)).put(ResourceServer.class, resourceServer);
}
/**
* Create a resourceServer that's ready to be persisted.
*
* @return a ResourceServer
*/
private ResourceServer buildResourceServer() {
ResourceServer resourceServer = new ResourceServer();
resourceServer.setContactName("myContactName");
resourceServer.setDescription("The description");
resourceServer.setName("the name" + System.currentTimeMillis());
resourceServer.setKey("the-key-" + System.currentTimeMillis());
resourceServer.setThumbNailUrl("http://example.com/thumbnail");
return resourceServer;
}
}