import static org.junit.Assert.fail;
import static play.mvc.Http.Status.OK;
import static play.test.Helpers.GET;
import static play.test.Helpers.PUT;
import static play.test.Helpers.contentAsString;
import static play.test.Helpers.routeAndCall;
import static play.test.Helpers.running;
import java.util.Iterator;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.JsonNode;
import org.junit.Assert;
import org.junit.Test;
import play.mvc.Result;
import play.test.FakeRequest;
import core.AbstractAdminTest;
import core.TestConfig;
public class AdminSettingsModificationTest extends AbstractAdminTest{
String originalValue;
final static String BASE_URL = "/admin/configuration/";
@Override
public String getRouteAddress() {
return BASE_URL + "dump.json";
}
public String getRouteAddress(String path) {
return BASE_URL + path;
}
public String getRouteAddressWithoutQS() {
return getRouteAddress("Push/profile1.sandbox.ios.certificate.password");
}
@Override
public String getMethod() {
return GET;
}
@Test
public void test()
{
running
(
getFakeApplication(),
new Runnable()
{
public void run()
{
JsonFactory factory = new JsonFactory();
ObjectMapper mp = new ObjectMapper(factory);
FakeRequest request = new FakeRequest(getMethod(), getRouteAddress());
request = request.withHeader(TestConfig.KEY_APPCODE, TestConfig.VALUE_APPCODE);
request = request.withHeader(TestConfig.KEY_AUTH, TestConfig.AUTH_ADMIN_ENC);
Result result = routeAndCall(request);
JsonNode configuration = null;
try{
configuration = mp.readTree(contentAsString(result));
}catch(Exception e){
}
originalValue = findInConfigurationDump(configuration,"Push","push","profile1.sandbox.ios.certificate.password");
//load settings
request = new FakeRequest(PUT, getRouteAddress("Push/profile1.sandbox.ios.certificate.password/fromquerystring"));
request = request.withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
request = request.withHeader(TestConfig.KEY_APPCODE, TestConfig.VALUE_APPCODE);
request = request.withHeader(TestConfig.KEY_AUTH, TestConfig.AUTH_ADMIN_ENC);
result = routeAndCall(request);
assertRoute(result, "Set configuration with QS", OK, "data\":\"You provided key and value in the query string.In order to prevent security issue consider moving those value into the body of the request.\"", true);
//Verify value has changed
request = new FakeRequest(getMethod(), getRouteAddress());
request = request.withHeader(TestConfig.KEY_APPCODE, TestConfig.VALUE_APPCODE);
request = request.withHeader(TestConfig.KEY_AUTH, TestConfig.AUTH_ADMIN_ENC);
result = routeAndCall(request);
assertRoute(result, "LoadConfigurationAsJSON", OK,
"profile1.sandbox.ios.certificate.password\":\"fromquerystring\"", true);
//Write value with body
request = new FakeRequest(PUT, getRouteAddressWithoutQS());
request = request.withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
request = request.withHeader(TestConfig.KEY_APPCODE, TestConfig.VALUE_APPCODE);
request = request.withHeader(TestConfig.KEY_AUTH, TestConfig.AUTH_ADMIN_ENC);
JsonNode node = null;
try{
node = mp.readTree("{\"value\":\"frombodyparams\"}");
}catch(Exception e){
fail("Unable to parse");
}
request = request.withJsonBody(node,PUT);
result = routeAndCall(request);
assertRoute(result, "Set configuration with Request Body", OK, null, false);
request = new FakeRequest("GET", "/admin/configuration/dump.json");
request = request.withHeader(TestConfig.KEY_APPCODE, TestConfig.VALUE_APPCODE);
request = request.withHeader(TestConfig.KEY_AUTH, TestConfig.AUTH_ADMIN_ENC);
result = routeAndCall(request);
assertRoute(result, "LoadConfigurationAsJSON", OK,
"profile1.sandbox.ios.certificate.password\":\"frombodyparams\"", true);
request = new FakeRequest(PUT, getRouteAddressWithoutQS());
request = request.withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
request = request.withHeader(TestConfig.KEY_APPCODE, TestConfig.VALUE_APPCODE);
request = request.withHeader(TestConfig.KEY_AUTH, TestConfig.AUTH_ADMIN_ENC);
node = null;
try{
node = mp.readTree("{\"value\":\""+originalValue+"\"}");
}catch(Exception e){
fail("Unable to parse");
}
request = request.withJsonBody(node,PUT);
result = routeAndCall(request);
assertRoute(result, "Set Original configuration with Request Body", OK, null, false);
}
}
);
}
private String findInConfigurationDump(JsonNode data,
String section,String subsection, String key) {
Iterator<JsonNode> values = data.get("data").elements();
String result = null;
while(values.hasNext()){
JsonNode n = values.next();
if(n.has("section") && n.get("section").textValue().equalsIgnoreCase(section)){
JsonNode subValues = n.get("sub sections").get(subsection);
if(subValues!= null){
Iterator<JsonNode> keys = subValues.elements();
while(keys.hasNext()){
JsonNode keyNode = keys.next();
if(keyNode.has(key)){
result = keyNode.get(key).textValue();
break;
}
}
}
}
}
return result;
}
@Override
protected void assertContent(String s) {
// TODO Auto-generated method stub
}
}