import static play.test.Helpers.HTMLUNIT;
import static play.test.Helpers.POST;
import static play.test.Helpers.routeAndCall;
import static play.test.Helpers.running;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.junit.Assert;
import org.junit.Test;
import play.libs.F.Callback;
import play.libs.Json;
import play.mvc.Http.Status;
import play.mvc.Result;
import play.test.FakeRequest;
import play.test.TestBrowser;
import com.baasbox.security.SessionKeys;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import core.AbstractTest;
import core.TestConfig;
public class UserLoginTest extends AbstractTest
{
private static final String ADMIN_USERNAME = TestConfig.AUTH_ADMIN.split(":")[0];
private static final String ADMIN_PASSWORD = TestConfig.AUTH_ADMIN.split(":")[1];
private Object json;
@Override
public String getRouteAddress() {
// TODO Auto-generated method stub
return "/login";
}
@Override
public String getMethod() {
// TODO Auto-generated method stub
return POST;
}
@Override
protected void assertContent(String s) {
json = toJSON(s);
assertJSON(json, "user");
}
@Test
public void testRouteLoginUser()
{
running
(
getFakeApplication(),
new Runnable()
{
public void run()
{
String sAuthEnc = TestConfig.AUTH_ADMIN_ENC;
// Test login user
FakeRequest request = new FakeRequest(getMethod(), getRouteAddress());
request = request.withHeader(TestConfig.KEY_APPCODE, TestConfig.VALUE_APPCODE);
request = request.withHeader(TestConfig.KEY_AUTH, sAuthEnc);
Map<String,String> params = new HashMap<String,String>();
params.put("username",ADMIN_USERNAME);
params.put("password",ADMIN_PASSWORD);
params.put("appcode",TestConfig.VALUE_APPCODE);
request = request.withFormUrlEncodedBody(params);
Result result = routeAndCall(request);
assertRoute(result, "testRouteLoginUser", Status.OK, null, true);
String body = play.test.Helpers.contentAsString(result);
JsonNode jsonRes = Json.parse(body);
String token = jsonRes.get("data").get(SessionKeys.TOKEN.toString()).textValue();
Assert.assertNotNull(token);
JsonNode user = jsonRes.get("data").get("user");
Assert.assertNotNull(user);
assertJSON(user, "admin");
//test logout
request = new FakeRequest(POST, "/logout");
request = request.withHeader(TestConfig.KEY_APPCODE, TestConfig.VALUE_APPCODE);
request = request.withHeader(TestConfig.KEY_TOKEN, token);
result = routeAndCall(request);
assertRoute(result, "testRouteLogoutUser", Status.OK, "\"result\":\"ok\",\"data\":\"user logged out\",\"http_code\":200", true);
}
}
);
}
@Test
public void testRouteLoginUserJson()
{
running
(
getTestServer(),
HTMLUNIT,
new Callback<TestBrowser>()
{
public void invoke(TestBrowser browser)
{
// Test login user
ObjectMapper om = new ObjectMapper();
JsonNode payload;
try {
payload = om.readTree("{\"username\":\""+ADMIN_USERNAME+"\",\"password\":\""+ADMIN_PASSWORD+"\",\"appcode\":\""+TestConfig.VALUE_APPCODE+"\"}");
} catch (IOException e) {
Assert.fail(ExceptionUtils.getFullStackTrace((e)));
return;
}
setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
httpRequest (
TestConfig.SERVER_URL + getRouteAddress(),
getMethod(),
payload
);
assertServer("testServerLoginUserJson", Status.OK, null, false);
String body = getResponse();
JsonNode jsonRes = Json.parse(body);
String token = jsonRes.get("data").get(SessionKeys.TOKEN.toString()).textValue();
Assert.assertNotNull(token);
JsonNode user = jsonRes.get("data").get("user");
Assert.assertNotNull(user);
assertJSON(user, "admin");
//test logout
setHeader(TestConfig.KEY_APPCODE, TestConfig.VALUE_APPCODE);
setHeader(TestConfig.KEY_TOKEN, token);
removeHeader(HttpHeaders.CONTENT_TYPE);
httpRequest (
TestConfig.SERVER_URL + "/logout",
POST
);
assertServer("testServerLogoutUser", Status.OK, "\"result\":\"ok\",\"data\":\"user logged out\",\"http_code\":200", true);
}
}
);
}
@Test
public void testRouteLoginUserPlainText()
{
running
(
getTestServer(),
HTMLUNIT,
new Callback<TestBrowser>()
{
public void invoke(TestBrowser browser)
{
ObjectMapper om = new ObjectMapper();
JsonNode payload;
try {
payload = om.readTree("{\"username\":\""+ADMIN_USERNAME+"\",\"password\":\""+ADMIN_PASSWORD+"\",\"appcode\":\""+TestConfig.VALUE_APPCODE+"\"}");
} catch (IOException e) {
Assert.fail(ExceptionUtils.getFullStackTrace((e)));
return;
}
setHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN);
httpRequest (
TestConfig.SERVER_URL + getRouteAddress(),
getMethod(),
payload
);
assertServer("testServerLoginUserPlainText", Status.BAD_REQUEST, "Detected: text/plain", true);
}
}
);
}
}