package svanimpe.reminders.resources;
import java.net.URL;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.glassfish.jersey.client.filter.HttpBasicAuthFilter;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.RunAsClient;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.junit.InSequence;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import svanimpe.reminders.ArchiveFactory;
import static org.junit.Assert.*;
import static svanimpe.reminders.util.Utilities.*;
@RunWith(Arquillian.class)
@RunAsClient
public class UsersTest
{
@Deployment
public static WebArchive createArchive()
{
return ArchiveFactory.createArchive();
}
@ArquillianResource
private URL base;
private WebTarget target;
@Before
public void setUp()
{
target = ClientBuilder.newClient().target(base.toExternalForm() + "/api/users");
}
@Test @InSequence(1)
public void testGetAllUsers() throws Exception
{
Response response = target.request(MediaType.APPLICATION_JSON).get();
assertEquals(200, response.getStatus());
byte[] expectedOutput = getResourceAsBytes("/users/get-all.json");
assertArrayEquals(expectedOutput, response.readEntity(byte[].class));
}
@Test @InSequence(2)
public void testGetAllUsersWithParameters() throws Exception
{
Response response = target.queryParam("from", 1).queryParam("results", 1).request(MediaType.APPLICATION_JSON).get();
assertEquals(200, response.getStatus());
byte[] expectedOutput = getResourceAsBytes("/users/get-all-params.json");
assertArrayEquals(expectedOutput, response.readEntity(byte[].class));
}
@Test @InSequence(3)
public void testAddUser() throws Exception
{
byte[] input = getResourceAsBytes("/users/add.json");
Response response = target.request().post(Entity.json(input));
assertEquals(201, response.getStatus());
assertEquals("/users/somenewuser", response.getHeaderString("Location"));
// This does not test whether the roles were reset to USER.
// This is tested as part of testGetUser.
}
@Test @InSequence(4)
public void testAddInvalidUser() throws Exception
{
byte[] input = getResourceAsBytes("/users/add-invalid.json");
Response response = target.request().post(Entity.json(input));
assertEquals(400, response.getStatus());
}
@Test @InSequence(5)
public void testAddDuplicateUser() throws Exception
{
byte[] input = getResourceAsBytes("/users/add-duplicate.json");
Response response = target.request().post(Entity.json(input));
assertEquals(400, response.getStatus());
}
@Test @InSequence(6)
public void testAddUserInvalidJson() throws Exception
{
byte[] input = getResourceAsBytes("/users/add-invalid-json.json");
Response response = target.request().post(Entity.json(input));
assertEquals(400, response.getStatus());
}
@Test @InSequence(7)
public void testGetUser() throws Exception
{
Response response = target.path("/somenewuser").request(MediaType.APPLICATION_JSON).get();
assertEquals(200, response.getStatus());
byte[] expectedOutput = getResourceAsBytes("/users/get.json");
assertArrayEquals(expectedOutput, response.readEntity(byte[].class));
// This doesn't test whether the password was saved correctly.
// Since we use that password to authenticate in later tests, this is not an issue.
}
@Test @InSequence(8)
public void testGetUnknownUser() throws Exception
{
Response response = target.path("/unknownuser").request(MediaType.APPLICATION_JSON).get();
assertEquals(404, response.getStatus());
}
@Test @InSequence(9)
public void testUpdateUser() throws Exception
{
target.register(new HttpBasicAuthFilter("somenewuser", "supersecret"));
byte[] input = getResourceAsBytes("/users/update.json");
Response response = target.path("/somenewuser").request().put(Entity.json(input));
assertEquals(204, response.getStatus());
response = target.path("/somenewuser").request(MediaType.APPLICATION_JSON).get();
assertEquals(200, response.getStatus());
assertTrue(response.readEntity(String.class).contains("My New Name"));
// No need to check whether the new password was saved correctly.
// That password is used to authenticate in later tests.
}
@Test @InSequence(10)
public void testUpdateUserClearFullName() throws Exception
{
target.register(new HttpBasicAuthFilter("somenewuser", "mynewpassword"));
byte[] input = getResourceAsBytes("/users/update-clear-name.json");
Response response = target.path("/somenewuser").request().put(Entity.json(input));
assertEquals(204, response.getStatus());
response = target.path("/somenewuser").request(MediaType.APPLICATION_JSON).get();
assertEquals(200, response.getStatus());
assertFalse(response.readEntity(String.class).contains("fullName"));
}
@Test @InSequence(11)
public void testUpdateUserFullNameNotAString() throws Exception
{
target.register(new HttpBasicAuthFilter("somenewuser", "mynewpassword"));
byte[] input = getResourceAsBytes("/users/update-invalid-name.json");
Response response = target.path("/somenewuser").request().put(Entity.json(input));
assertEquals(400, response.getStatus());
}
@Test @InSequence(12)
public void testUpdateUserRolesForbidden() throws Exception
{
target.register(new HttpBasicAuthFilter("somenewuser", "mynewpassword"));
byte[] input = getResourceAsBytes("/users/update-roles.json");
Response response = target.path("/somenewuser").request().put(Entity.json(input));
assertEquals(403, response.getStatus());
}
@Test @InSequence(13)
public void testUpdateUserRolesAsAdmin() throws Exception
{
target.register(new HttpBasicAuthFilter("someuser", "supersecret"));
byte[] input = getResourceAsBytes("/users/update-roles.json");
Response response = target.path("/somenewuser").request().put(Entity.json(input));
assertEquals(204, response.getStatus());
response = target.path("/somenewuser").request(MediaType.APPLICATION_JSON).get();
assertEquals(200, response.getStatus());
assertTrue(response.readEntity(String.class).contains("ADMINISTRATOR"));
}
@Test @InSequence(14)
public void testUpdateUserInvalidRole() throws Exception
{
target.register(new HttpBasicAuthFilter("somenewuser", "mynewpassword"));
byte[] input = getResourceAsBytes("/users/update-invalid-role.json");
Response response = target.path("/somenewuser").request().put(Entity.json(input));
assertEquals(400, response.getStatus());
}
@Test @InSequence(15)
public void testUpdateUserRolesNotAnArray() throws Exception
{
target.register(new HttpBasicAuthFilter("somenewuser", "mynewpassword"));
byte[] input = getResourceAsBytes("/users/update-invalid-roles.json");
Response response = target.path("/somenewuser").request().put(Entity.json(input));
assertEquals(400, response.getStatus());
}
@Test @InSequence(16)
public void testUpdateUserInvalidPassword() throws Exception
{
target.register(new HttpBasicAuthFilter("somenewuser", "mynewpassword"));
byte[] input = getResourceAsBytes("/users/update-invalid-password-1.json");
Response response = target.path("/somenewuser").request().put(Entity.json(input));
assertEquals(400, response.getStatus());
}
@Test @InSequence(17)
public void testUpdateUserPasswordNotAString() throws Exception
{
target.register(new HttpBasicAuthFilter("somenewuser", "mynewpassword"));
byte[] input = getResourceAsBytes("/users/update-invalid-password-2.json");
Response response = target.path("/somenewuser").request().put(Entity.json(input));
assertEquals(400, response.getStatus());
}
@Test @InSequence(18)
public void testUpdateUserUnauthenticated() throws Exception
{
byte[] input = getResourceAsBytes("/users/update.json");
Response response = target.path("/somenewuser").request().put(Entity.json(input));
assertEquals(401, response.getStatus());
}
@Test @InSequence(19)
public void testUpdateUnknownUser() throws Exception
{
target.register(new HttpBasicAuthFilter("somenewuser", "mynewpassword"));
byte[] input = getResourceAsBytes("/users/update.json");
Response response = target.path("/unknownuser").request().put(Entity.json(input));
assertEquals(404, response.getStatus());
}
@Test @InSequence(20)
public void testUpdateDifferentUserForbidden() throws Exception
{
target.register(new HttpBasicAuthFilter("someotheruser", "supersecret"));
byte[] input = getResourceAsBytes("/users/update.json");
Response response = target.path("/somenewuser").request().put(Entity.json(input));
assertEquals(403, response.getStatus());
}
@Test @InSequence(21)
public void testUpdateDifferentUserAsAdmin() throws Exception
{
target.register(new HttpBasicAuthFilter("someuser", "supersecret"));
byte[] input = getResourceAsBytes("/users/update.json");
Response response = target.path("/somenewuser").request().put(Entity.json(input));
assertEquals(204, response.getStatus());
response = target.path("/somenewuser").request(MediaType.APPLICATION_JSON).get();
assertEquals(200, response.getStatus());
assertTrue(response.readEntity(String.class).contains("My New Name"));
}
@Test @InSequence(22)
public void testRemoveUser() throws Exception
{
target.register(new HttpBasicAuthFilter("somenewuser", "mynewpassword"));
Response response = target.path("/somenewuser").request().delete();
assertEquals(204, response.getStatus());
response = target.path("/somenewuser").request(MediaType.APPLICATION_JSON).get();
assertEquals(404, response.getStatus());
}
@Test @InSequence(23)
public void testReaddUser() throws Exception
{
byte[] input = getResourceAsBytes("/users/add.json");
Response response = target.request().post(Entity.json(input));
assertEquals(201, response.getStatus());
assertEquals("/users/somenewuser", response.getHeaderString("Location"));
}
@Test @InSequence(24)
public void testRemoveUserUnauthenticated() throws Exception
{
Response response = target.path("/somenewuser").request().delete();
assertEquals(401, response.getStatus());
}
@Test @InSequence(25)
public void testRemoveUnkownUser() throws Exception
{
target.register(new HttpBasicAuthFilter("somenewuser", "supersecret"));
Response response = target.path("/unknownuser").request().delete();
assertEquals(404, response.getStatus());
}
@Test @InSequence(26)
public void testRemoveDifferentUserForbidden() throws Exception
{
target.register(new HttpBasicAuthFilter("someotheruser", "supersecret"));
Response response = target.path("/somenewuser").request().delete();
assertEquals(403, response.getStatus());
}
@Test @InSequence(27)
public void testRemoveDifferentUserAsAdmin() throws Exception
{
target.register(new HttpBasicAuthFilter("someuser", "supersecret"));
Response response = target.path("/somenewuser").request().delete();
assertEquals(204, response.getStatus());
}
}