package functional;
import models.User;
import models.helpers.UserConnectionHelper;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import play.Logger;
import play.cache.Cache;
import play.mvc.Http;
import play.test.Fixtures;
import play.test.FunctionalTest;
/**
* Tests the Users Controller
*
* @see Users
* @author Alex Jarvis axj7@aber.ac.uk
*/
public class UsersTest extends FunctionalTest {
private Http.Response response;
private static final String BASE_CONTROLLER_PATH = "/users";
private String userBaseQuery = "?oauth_token=";
private String user1Query = "";
private String user2Query = "";
private User user1;
private User user2;
private User user3;
@Before
public void setUp() {
Fixtures.deleteDatabase();
Cache.clear();
Fixtures.loadModels("test-data.yml");
user1 = User.find("byEmail", "bob@gmail.com").first();
user1Query += userBaseQuery + user1.accessToken;
user2 = User.find("byEmail", "bob2@gmail.com").first();
user2Query += userBaseQuery + user2.accessToken;
UserConnectionHelper.createUserConnection(user1, user2);
user3 = User.find("byEmail", "alex@jarvis.com").first();
}
@After
public void log() {
if (response != null) {
Logger.debug("Response Status: " + response.status.toString());
Logger.debug("Response: " + (response.out.toString().isEmpty() ? "" : "\n" + response.out.toString()) );
}
}
@Test
public void testIndexPage() {
response = GET(BASE_CONTROLLER_PATH + user1Query);
assertIsOk(response);
assertContentType("application/json", response);
}
@Test
public void testCreate() {
String body = "{\"email\":\"axj7@aber.ac.uk\","
+ "\"firstName\":\"Alex\","
+ "\"lastName\":\"Jarvis\","
+ "\"password\":\"password\","
+ "\"mobileNumber\":\"123\"}";
Http.Request request = newRequest();
request.params.put("body", body);
response = POST(request, BASE_CONTROLLER_PATH, "application/json; charset=UTF-8", body);
assertStatus(201, response);
}
@Test
public void testCreateErrorExistingEmail() {
testCreate();
String body = "{\"email\":\"axj7@aber.ac.uk\","
+ "\"firstName\":\"Alex\","
+ "\"lastName\":\"Jarvis\","
+ "\"password\":\"password\","
+ "\"mobileNumber\":\"123\"}";
Http.Request request = newRequest();
request.params.put("body", body);
response = POST(request, BASE_CONTROLLER_PATH, "application/json; charset=UTF-8", body);
assertStatus(400, response);
assertContentEquals("Email already exists", response);
}
@Test
public void testCreateWithEmailValidationError() {
testCreate();
String body = "{\"email\":\"axj7\","
+ "\"firstName\":\"Alex\","
+ "\"lastName\":\"Jarvis\","
+ "\"password\":\"password\","
+ "\"mobileNumber\":\"123\"}";
Http.Request request = newRequest();
request.params.put("body", body);
response = POST(request, BASE_CONTROLLER_PATH, "application/json; charset=UTF-8", body);
assertStatus(400, response);
//assertContentEquals("Email already exists", response);
}
@Test
public void testShowAuthUser() {
response = GET(BASE_CONTROLLER_PATH + "/" + user1.id + user1Query);
assertIsOk(response);
assertContentType("application/json", response);
// Contains the connections to other users
assertTrue(response.out.toString().contains("connections"));
}
@Test
public void testShowUser() {
response = GET(BASE_CONTROLLER_PATH + "/" + user2.id + user1Query);
assertIsOk(response);
assertContentType("application/json", response);
// Does not contain the connections to other users
assertFalse(response.out.toString().contains("connections"));
}
@Test
public void testShowNonUser() {
response = GET(BASE_CONTROLLER_PATH + "/" + "9999999999" + user1Query);
assertIsNotFound(response);
assertContentType("application/json", response);
}
@Test
public void testShowAuthUserWithEmail() {
response = GET(BASE_CONTROLLER_PATH + "/" + user1.email + user1Query);
assertIsOk(response);
assertContentType("application/json", response);
// Contains the connections to other users
assertTrue(response.out.toString().contains("connections"));
}
@Test
public void testShowUserWithEmail() {
response = GET(BASE_CONTROLLER_PATH + "/" + user2.email + user1Query);
assertIsOk(response);
assertContentType("application/json", response);
// Does not contain the connections to other users
assertFalse(response.out.toString().contains("connections"));
}
@Test
public void testUpdateAuthUser() {
String body = "{\"email\":\"axj7@aber.ac.uk\","
+ "\"firstName\":\"Alex\","
+ "\"lastName\":\"Jarvis\","
+ "\"password\":\"password\","
+ "\"mobileNumber\":\"123\"}";
Http.Request request = newRequest();
request.params.put("body", body);
response = PUT(request, BASE_CONTROLLER_PATH + "/" + user1.id + user1Query, "application/json; charset=UTF-8", body);
assertIsOk(response);
}
@Test
public void testUpdateNonAuthUser() {
String body = "{\"email\":\"axj7@aber.ac.uk\","
+ "\"firstName\":\"Alex\","
+ "\"lastName\":\"Jarvis\","
+ "\"password\":\"password\","
+ "\"mobileNumber\":\"123\"}";
Http.Request request = newRequest();
request.params.put("body", body);
response = PUT(request, BASE_CONTROLLER_PATH + "/" + user2.id + user1Query, "application/json; charset=UTF-8", body);
assertStatus(400, response);
}
@Test
public void testUpdateClashes() {
String body = "{\"email\":\"bob2@gmail.com\","
+ "\"firstName\":\"Alex\","
+ "\"lastName\":\"Jarvis\","
+ "\"password\":\"password\","
+ "\"mobileNumber\":\"123\"}";
Http.Request request = newRequest();
request.params.put("body", body);
response = PUT(request, BASE_CONTROLLER_PATH + "/" + user1.id + user1Query, "application/json; charset=UTF-8", body);
assertStatus(400, response);
assertContentEquals("Email already exists", response);
}
@Test
public void testDeleteUserWithId() {
response = DELETE(BASE_CONTROLLER_PATH + "/" + user2.id + user1Query);
assertIsOk(response);
}
@Test
public void testDeleteUserWithEmail() {
response = DELETE(BASE_CONTROLLER_PATH + "/" + user2.email + user1Query);
assertIsOk(response);
}
@Test
public void testDeleteAuthUser() {
response = DELETE(BASE_CONTROLLER_PATH + "/" + user1.id + user1Query);
assertStatus(404, response);
}
@Test
public void testDeleteNonConnectedUser() {
response = DELETE(BASE_CONTROLLER_PATH + "/" + user3.id + user1Query);
assertStatus(400, response);
}
@Test
public void testDeleteUserWithUser2() {
response = DELETE(BASE_CONTROLLER_PATH + "/" + user1.id + user2Query);
assertStatus(200, response);
}
@Test
public void testAddUserRequest() {
UserConnectionHelper.removeUserConnection(user1, user2);
response = POST(BASE_CONTROLLER_PATH + "/" + user2.email + "/add/" + user1Query);
assertIsOk(response);
}
@Test
public void testAddUserRequestWithAuthUser() {
response = POST(BASE_CONTROLLER_PATH + "/" + user1.email + "/add/" + user1Query);
assertStatus(400, response);
}
@Test
public void testAcceptUserRequest() {
// Remove the existing user connection and add the request
UserConnectionHelper.removeUserConnection(user1, user2);
response = POST(BASE_CONTROLLER_PATH + "/" + user2.email + "/add/" + user1Query);
assertIsOk(response);
// Connect with 2nd user and accept the user connection request
response = POST(BASE_CONTROLLER_PATH + "/" + user1.email + "/accept/" + user2Query);
assertIsOk(response);
// Try to accept the user connection request again
response = POST(BASE_CONTROLLER_PATH + "/" + user1.email + "/accept/" + user2Query);
assertStatus(400, response);
}
@Test
public void testAcceptUserRequestNotExist() {
response = POST(BASE_CONTROLLER_PATH + "/" + user1.email + "/accept/" + user2Query);
assertStatus(400, response);
}
@Test
public void testDeclineUserRequest() {
// Remove the existing user connection and add the request
UserConnectionHelper.removeUserConnection(user1, user2);
response = POST(BASE_CONTROLLER_PATH + "/" + user2.email + "/add/" + user1Query);
assertIsOk(response);
// Connect with 2nd user and decline the user connection request
response = POST(BASE_CONTROLLER_PATH + "/" + user1.email + "/decline/" + user2Query);
assertIsOk(response);
// Try to decline the user connection request again
response = POST(BASE_CONTROLLER_PATH + "/" + user1.email + "/decline/" + user2Query);
assertStatus(400, response);
}
@Test
public void testDeclineUserRequestNotExist() {
response = POST(BASE_CONTROLLER_PATH + "/" + user1.email + "/decline/" + user2Query);
assertStatus(400, response);
}
@Test
public void testSearchUserByFirstName() {
response = GET("/search" + BASE_CONTROLLER_PATH + "/" + user1Query + "&query=" + "Bob");
assertIsOk(response);
assertContentMatch("(.)*firstName\":\"Bob\",\"lastName\":\"Smith\"(.)*", response);
}
@Test
public void testSearchUserByFirstNameLowerCase() {
response = GET("/search" + BASE_CONTROLLER_PATH + "/" + user1Query + "&query=" + "Bob");
assertIsOk(response);
assertContentMatch("(.)*firstName\":\"Bob\",\"lastName\":\"Smith\"(.)*", response);
}
@Test
public void testSearchUserByFirstNameUpperCase() {
response = GET("/search" + BASE_CONTROLLER_PATH + "/" + user1Query + "&query=" + "BOB");
assertIsOk(response);
assertContentMatch("(.)*firstName\":\"Bob\",\"lastName\":\"Smith\"(.)*", response);
}
@Test
public void testSearchUserByLastName() {
response = GET("/search" + BASE_CONTROLLER_PATH + "/" + user1Query + "&query=" + "Smith");
assertIsOk(response);
assertContentMatch("(.)*firstName\":\"Bob\",\"lastName\":\"Smith\"(.)*", response);
}
@Test
public void testSearchUserByLastNameLowerCase() {
response = GET("/search" + BASE_CONTROLLER_PATH + "/" + user1Query + "&query=" + "smith");
assertIsOk(response);
assertContentMatch("(.)*firstName\":\"Bob\",\"lastName\":\"Smith\"(.)*", response);
}
@Test
public void testSearchUserByLastNameUpperCase() {
response = GET("/search" + BASE_CONTROLLER_PATH + "/" + user1Query + "&query=" + "SMITH");
assertIsOk(response);
assertContentMatch("(.)*firstName\":\"Bob\",\"lastName\":\"Smith\"(.)*", response);
}
@Test
public void testSearchUserByActualName() {
response = GET("/search" + BASE_CONTROLLER_PATH + "/" + user1Query + "&query=" + "Bob Smith");
assertIsOk(response);
assertContentMatch("(.)*firstName\":\"Bob\",\"lastName\":\"Smith\"(.)*", response);
}
@Test
public void testSearchUserByActualNameLowerCase() {
response = GET("/search" + BASE_CONTROLLER_PATH + "/" + user1Query + "&query=" + "bob smith");
assertIsOk(response);
assertContentMatch("(.)*firstName\":\"Bob\",\"lastName\":\"Smith\"(.)*", response);
}
@Test
public void testSearchUserByActualNameUpperCase() {
response = GET("/search" + BASE_CONTROLLER_PATH + "/" + user1Query + "&query=" + "BOB SMITH");
assertIsOk(response);
assertContentMatch("(.)*firstName\":\"Bob\",\"lastName\":\"Smith\"(.)*", response);
}
@Test
public void testSearchUserNotExist() {
response = GET("/search" + BASE_CONTROLLER_PATH + "/" + user1Query + "&query=" + "William");
assertStatus(404, response);
}
}