/*
* Copyright (c) 2001-2016, Inversoft Inc., All Rights Reserved
*
* 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.primeframework.mvc.control.form;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.StringWriter;
import java.lang.reflect.Method;
import java.util.ArrayList;
import org.example.action.user.Edit;
import org.example.action.user.Index;
import org.primeframework.mvc.action.ActionInvocation;
import org.primeframework.mvc.action.config.ActionConfiguration;
import org.primeframework.mvc.control.ControlBaseTest;
import org.primeframework.mvc.util.MapBuilder;
import org.testng.annotations.Test;
import com.google.inject.Inject;
import static java.util.Arrays.asList;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertSame;
import static org.testng.Assert.assertTrue;
/**
* This tests the form control.
*
* @author Brian Pontarelli
*/
public class FormTest extends ControlBaseTest {
@Inject Form form;
@Test
public void noPrepare() {
request.setUri("/user/");
Index index = new Index();
ais.setCurrent(new ActionInvocation(index, null, "/user/", null,
new ActionConfiguration(Index.class, null, null, new ArrayList<>(), null, null, null, null, null, null, null, null, null, null, "/user/", null)));
new ControlTester(form).
attr("action", "/user/").
attr("method", "POST").
go("<div class=\"form\">\n" +
"<form action=\"/user/\" method=\"POST\">\n" +
"</form>\n" +
"</div>\n");
}
@Test
public void jsessionid() {
request.setUri("/user/;jsessionid=C35A2D9557C051F2854845305B1AB911");
Index index = new Index();
ais.setCurrent(new ActionInvocation(index, null, "/user/", null,
new ActionConfiguration(Index.class, null, null, new ArrayList<Method>(), null, null, null, null, null, null, null, null, null, null, "/user/", null)));
new ControlTester(form).
attr("action", "/user/").
attr("method", "POST").
go("<div class=\"form\">\n" +
"<form action=\"/user/;jsessionid=C35A2D9557C051F2854845305B1AB911\" method=\"POST\">\n" +
"</form>\n" +
"</div>\n");
}
@Test
public void noPrepareRelative() {
request.setUri("/user/");
Index index = new Index();
ais.setCurrent(new ActionInvocation(index, null, "/user/", null, null));
new ControlTester(form).
attr("action", "edit").
attr("method", "POST").
go("<div class=\"form\">\n" +
"<form action=\"/user/edit\" method=\"POST\">\n" +
"</form>\n" +
"</div>\n");
}
@Test
public void noPrepareFullyQualified() {
request.setUri("/user/");
Index index = new Index();
ais.setCurrent(new ActionInvocation(index, null, "/user/", null,
new ActionConfiguration(Index.class, null, null, new ArrayList<Method>(), null, null, null, null, null, null, null, null, null, null, "/user/", null)));
new ControlTester(form).
attr("action", "https://www.google.com").
attr("method", "POST").
go("<div class=\"form\">\n" +
"<form action=\"https://www.google.com\" method=\"POST\">\n" +
"</form>\n" +
"</div>\n");
}
@Test
public void noPrepareContextPath() {
request.setUri("/context/user/");
request.setContextPath("/context");
Index index = new Index();
ais.setCurrent(new ActionInvocation(index, null, "/user/", null,
new ActionConfiguration(Index.class, null, null, new ArrayList<Method>(), null, null, null, null, null, null, null, null, null, null, "/user/", null)));
new ControlTester(form).
attr("action", "/user/").
attr("method", "POST").
go("<div class=\"form\">\n" +
"<form action=\"/context/user/\" method=\"POST\">\n" +
"</form>\n" +
"</div>\n");
}
@Test
public void relativeContextPath() {
request.setUri("/context/user/");
request.setContextPath("/context");
Index index = new Index();
ais.setCurrent(new ActionInvocation(index, null, "/user/", null, null));
new ControlTester(form).
attr("action", "edit").
attr("method", "POST").
go("<div class=\"form\">\n" +
"<form action=\"/context/user/edit\" method=\"POST\">\n" +
"</form>\n" +
"</div>\n");
}
@Test
public void fullyQualifiedContextPath() {
request.setUri("/context/user/");
request.setContextPath("/context");
Index index = new Index();
ais.setCurrent(new ActionInvocation(index, null, "/user/", null,
new ActionConfiguration(Index.class, null, null, new ArrayList<Method>(), null, null, null, null, null, null, null, null, null, null, "/user/", null)));
new ControlTester(form).
attr("action", "https://www.google.com").
attr("method", "POST").
go("<div class=\"form\">\n" +
"<form action=\"https://www.google.com\" method=\"POST\">\n" +
"</form>\n" +
"</div>\n");
}
@Test
public void prepare() throws IOException, ServletException, NoSuchMethodException {
request.setUri("/user/edit");
Edit edit = new Edit();
ais.setCurrent(new ActionInvocation(edit, null, "/user/edit", null,
new ActionConfiguration(Index.class, null, null, asList(Edit.class.getMethod("formPrepare")), null, null, null, null, null, null, null, null, null, null, "/user/", null)));
new ControlTester(form).
attr("action", "/user/edit").
attr("method", "POST").
go("<div class=\"form\">\n" +
"<form action=\"/user/edit\" method=\"POST\">\n" +
"</form>\n" +
"</div>\n");
assertTrue(edit.formPrepared);
}
@Test
public void actionIsDifferentURI() throws IOException, ServletException {
request.setUri("/user/");
Index index = new Index();
ais.setCurrent(new ActionInvocation(index, null, "/user/", null, null));
StringWriter writer = new StringWriter();
form.renderStart(writer, MapBuilder.map("action", (Object) "/user/edit").put("method", "POST").done(), MapBuilder.map("param", "param-value").done());
Edit edit = (Edit) ais.getCurrent().action;
assertTrue(edit.formPrepared);
form.renderEnd(writer);
assertSame(Index.class, ais.getCurrent().action.getClass());
assertEquals(
"<div class=\"form\">\n" +
"<form action=\"/user/edit\" method=\"POST\">\n" +
"</form>\n" +
"</div>\n", writer.toString());
}
}