/*
* @(#)FunctionalTest.java 2013-1-22 下午11:57:14
*
* Copyright (c) 2011-2013 Makersoft.org all rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
*
*/
package org.makersoft.test.functional;
import org.makersoft.test.BaseTest;
/**
* 功能测试基类.
*/
public class FunctionalTest extends BaseTest{
// public static final String APPLICATION_X_WWW_FORM_URLENCODED = "application/x-www-form-urlencoded";
// public static final String MULTIPART_FORM_DATA = "multipart/form-data";
//
// private static Map<String, Http.Cookie> savedCookies; // cookies stored between calls
//
// private static Map<String, Object> renderArgs = new HashMap<String, Object>();
//
// @Before
// public void clearCookies() {
// savedCookies = null;
// }
//
// // Requests
// public static Response GET(Object url) {
// return GET(newRequest(), url);
// }
//
// /**
// * sends a GET request to the application under tests.
// *
// * @param url
// * relative url such as <em>"/products/1234"</em>
// * @param followRedirect
// * indicates if request have to follow redirection (status 302)
// * @return the response
// */
// public static Response GET(Object url, boolean followRedirect) {
// Response response = GET(url);
// if (Http.StatusCode.FOUND == response.status && followRedirect) {
// Http.Header redirectedTo = response.headers.get("Location");
// java.net.URL redirectedUrl = null;
// try {
// redirectedUrl = new java.net.URL(redirectedTo.value());
// } catch (MalformedURLException e) {
// throw new RuntimeException(e);
// }
// response = GET(redirectedUrl.getPath());
// }
// return response;
// }
//
// /**
// * sends a GET request to the application under tests.
// *
// * @param request
// * @param url
// * relative url such as <em>"/products/1234"</em>
// * @return the response
// */
// public static Response GET(Request request, Object url) {
// String path = "";
// String queryString = "";
// String turl = url.toString();
// if (turl.contains("?")) {
// path = turl.substring(0, turl.indexOf("?"));
// queryString = turl.substring(turl.indexOf("?") + 1);
// } else {
// path = turl;
// }
// request.method = "GET";
// request.url = turl;
// request.path = path;
// request.querystring = queryString;
// request.body = new ByteArrayInputStream(new byte[0]);
// if (savedCookies != null)
// request.cookies = savedCookies;
// return makeRequest(request);
// }
//
// // convenience methods
// public static Response POST(Object url) {
// return POST(url, APPLICATION_X_WWW_FORM_URLENCODED, "");
// }
//
// public static Response POST(Request request, Object url) {
// return POST(request, url, APPLICATION_X_WWW_FORM_URLENCODED, "");
// }
//
// public static Response POST(Object url, String contenttype, String body) {
// return POST(newRequest(), url, contenttype, body);
// }
//
// public static Response POST(Request request, Object url, String contenttype, String body) {
// return POST(request, url, contenttype, new ByteArrayInputStream(body.getBytes()));
// }
//
// public static Response POST(Object url, String contenttype, InputStream body) {
// return POST(newRequest(), url, contenttype, body);
// }
//
// /**
// * Sends a POST request to the application under tests.
// *
// * @param request
// * @param url
// * relative url such as <em>"/products/1234"</em>
// * @param contenttype
// * content-type of the request
// * @param body
// * posted data
// * @return the response
// */
// public static Response POST(Request request, Object url, String contenttype, InputStream body) {
// String path = "";
// String queryString = "";
// String turl = url.toString();
// if (turl.contains("?")) {
// path = turl.substring(0, turl.indexOf("?"));
// queryString = turl.substring(turl.indexOf("?") + 1);
// } else {
// path = turl;
// }
// request.method = "POST";
// request.contentType = contenttype;
// request.url = turl;
// request.path = path;
// request.querystring = queryString;
// request.body = body;
// if (savedCookies != null)
// request.cookies = savedCookies;
// return makeRequest(request);
// }
//
// /**
// * Sends a POST request to the application under tests as a multipart form. Designed for file
// * upload testing.
// *
// * @param url
// * relative url such as <em>"/products/1234"</em>
// * @param parameters
// * map of parameters to be posted
// * @param files
// * map containing files to be uploaded
// * @return the response
// */
// public static Response POST(Object url, Map<String, String> parameters, Map<String, File> files) {
// return POST(newRequest(), url, parameters, files);
// }
//
// public static Response POST(Object url, Map<String, String> parameters) {
// return POST(newRequest(), url, parameters, new HashMap<String, File>());
// }
//
// public static Response POST(Request request, Object url, Map<String, String> parameters,
// Map<String, File> files) {
// List<Part> parts = new ArrayList<Part>();
//
// for (String key : parameters.keySet()) {
// parts.add(new StringPart(key, parameters.get(key)));
// }
//
// for (String key : files.keySet()) {
// Part filePart;
// try {
// filePart = new FilePart(key, files.get(key));
// } catch (FileNotFoundException e) {
// throw new RuntimeException(e);
// }
// parts.add(filePart);
// }
//
// MultipartRequestEntity requestEntity = new MultipartRequestEntity(
// parts.toArray(new Part[] {}), null);
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
// try {
// requestEntity.writeRequest(baos);
// } catch (IOException e) {
// throw new RuntimeException(e);
// }
// InputStream body = new ByteArrayInputStream(baos.toByteArray());
// String contentType = requestEntity.getContentType();
// Http.Header header = new Http.Header();
// header.name = "content-type";
// header.values = Arrays.asList(new String[] { contentType });
// request.headers.put("content-type", header);
// return POST(request, url, MULTIPART_FORM_DATA, body);
// }
//
// public static Response PUT(Object url, String contenttype, String body) {
// return PUT(newRequest(), url, contenttype, body);
// }
//
// /**
// * Sends a PUT request to the application under tests.
// *
// * @param request
// * @param url
// * relative url such as <em>"/products/1234"</em>
// * @param contenttype
// * content-type of the request
// * @param body
// * data to send
// * @return the response
// */
// public static Response PUT(Request request, Object url, String contenttype, String body) {
// String path = "";
// String queryString = "";
// String turl = url.toString();
// if (turl.contains("?")) {
// path = turl.substring(0, turl.indexOf("?"));
// queryString = turl.substring(turl.indexOf("?") + 1);
// } else {
// path = turl;
// }
// request.method = "PUT";
// request.contentType = contenttype;
// request.url = turl;
// request.path = path;
// request.querystring = queryString;
// request.body = new ByteArrayInputStream(body.getBytes());
// return makeRequest(request);
// }
//
// public static Response DELETE(String url) {
// return DELETE(newRequest(), url);
// }
//
// /**
// * Sends a DELETE request to the application under tests.
// *
// * @param request
// * @param url
// * relative url eg. <em>"/products/1234"</em>
// * @return the response
// */
// public static Response DELETE(Request request, Object url) {
// String path = "";
// String queryString = "";
// String turl = url.toString();
// if (turl.contains("?")) {
// path = turl.substring(0, turl.indexOf("?"));
// queryString = turl.substring(turl.indexOf("?") + 1);
// } else {
// path = turl;
// }
// request.method = "DELETE";
// request.url = turl;
// request.path = path;
// request.querystring = queryString;
// if (savedCookies != null)
// request.cookies = savedCookies;
// request.body = new ByteArrayInputStream(new byte[0]);
// return makeRequest(request);
// }
//
// public static void makeRequest(final Request request, final Response response) {
// final Future invocationResult = TestEngine.functionalTestsExecutor
// .submit(new Invoker.Invocation() {
//
// @Override
// public void execute() throws Exception {
// renderArgs.clear();
// ActionInvoker.invoke(request, response);
//
// if (RenderArgs.current().data != null) {
// renderArgs.putAll(RenderArgs.current().data);
// }
// }
//
// @Override
// public InvocationContext getInvocationContext() {
// ActionInvoker.resolve(request, response);
// return new InvocationContext(Http.invocationType, request.invokedMethod
// .getAnnotations(), request.invokedMethod.getDeclaringClass()
// .getAnnotations());
// }
//
// });
// try {
// invocationResult.get(30, TimeUnit.SECONDS);
// if (savedCookies == null) {
// savedCookies = new HashMap<String, Http.Cookie>();
// }
// for (Map.Entry<String, Http.Cookie> e : response.cookies.entrySet()) {
// // If Max-Age is unset, browsers discard on exit; if
// // 0, they discard immediately.
// if (e.getValue().maxAge == null || e.getValue().maxAge > 0) {
// savedCookies.put(e.getKey(), e.getValue());
// }
// }
// response.out.flush();
// } catch (Exception ex) {
// throw new RuntimeException(ex);
// }
// }
//
// public static Response makeRequest(final Request request) {
// Response response = newResponse();
// makeRequest(request, response);
//
// if (response.status == 302) { // redirect
// // if Location-header is pressent, fix it to "look like" a functional-test-url
// Http.Header locationHeader = response.headers.get("Location");
// if (locationHeader != null) {
// String locationUrl = locationHeader.value();
// if (locationUrl.startsWith("http://localhost/")) {
// locationHeader.values.clear();
// locationHeader.values.add(locationUrl.substring(16));// skip 'http://localhost'
// }
// }
// }
// return response;
// }
//
// public static Response newResponse() {
// Response response = new Response();
// response.out = new ByteArrayOutputStream();
// return response;
// }
//
// public static Request newRequest() {
// Request request = Request.createRequest(null, "GET", "/", "", null, null, null, null,
// false, 80, "localhost", false, null, null);
// return request;
// }
//
// // Assertions
// /**
// * Asserts a <em>2OO Success</em> response
// *
// * @param response
// * server response
// */
// public static void assertIsOk(Response response) {
// assertStatus(200, response);
// }
//
// /**
// * Asserts a <em>404 (not found)</em> response
// *
// * @param response
// * server response
// */
// public static void assertIsNotFound(Response response) {
// assertStatus(404, response);
// }
//
// /**
// * Asserts response status code
// *
// * @param status
// * expected HTTP response code
// * @param response
// * server response
// */
// public static void assertStatus(int status, Response response) {
// assertEquals("Response status ", (Object) status, response.status);
// }
//
// /**
// * Exact equality assertion on response body
// *
// * @param content
// * expected body content
// * @param response
// * server response
// */
// public static void assertContentEquals(String content, Response response) {
// assertEquals(content, getContent(response));
// }
//
// /**
// * Asserts response body matched a pattern or contains some text.
// *
// * @param pattern
// * a regular expression pattern or a regular text, ( which must be escaped using
// * Pattern.quote)
// * @param response
// * server response
// */
// public static void assertContentMatch(String pattern, Response response) {
// Pattern ptn = Pattern.compile(pattern);
// boolean ok = ptn.matcher(getContent(response)).find();
// assertTrue("Response content does not match '" + pattern + "'", ok);
// }
//
// /**
// * Verify response charset encoding, as returned by the server in the Content-Type header. Be
// * aware that if no charset is returned, assertion will fail.
// *
// * @param charset
// * expected charset encoding such as "utf-8" or "iso8859-1".
// * @param response
// * server response
// */
// public static void assertCharset(String charset, Response response) {
// int pos = response.contentType.indexOf("charset=") + 8;
// String responseCharset = (pos > 7) ? response.contentType.substring(pos).toLowerCase() : "";
// assertEquals("Response charset", charset.toLowerCase(), responseCharset);
// }
//
// /**
// * Verify the response content-type
// *
// * @param contentType
// * expected content-type without any charset extension, such as "text/html"
// * @param response
// * server response
// */
// public static void assertContentType(String contentType, Response response) {
// assertTrue("Response contentType unmatched : '" + contentType + "' !~ '"
// + response.contentType + "'", response.contentType.startsWith(contentType));
// }
//
// /**
// * Exact equality assertion on a response header value
// *
// * @param headerName
// * header to verify. case-insensitive
// * @param value
// * expected header value
// * @param response
// * server response
// */
// public static void assertHeaderEquals(String headerName, String value, Response response) {
// assertNotNull("Response header " + headerName + " missing",
// response.headers.get(headerName));
// assertEquals("Response header " + headerName + " mismatch", value,
// response.headers.get(headerName).value());
// }
//
// /**
// * obtains the response body as a string
// *
// * @param response
// * server response
// * @return the response body as an <em>utf-8 string</em>
// */
// public static String getContent(Response response) {
// byte[] data = response.out.toByteArray();
// try {
// return new String(data, response.encoding);
// } catch (UnsupportedEncodingException ex) {
// throw new RuntimeException(ex);
// }
// }
//
// public static Object renderArgs(String name) {
// return renderArgs.get(name);
// }
//
// // Utils
//
// public void sleep(int seconds) {
// try {
// Thread.sleep(seconds * 1000);
// } catch (Exception e) {
// throw new RuntimeException(e);
// }
// }
//
// protected static URL reverse() {
// ControllerInstrumentation.stopActionCall();
// ActionDefinition actionDefinition = new ActionDefinition();
// Controller._currentReverse.set(actionDefinition);
// return new URL(actionDefinition);
// }
//
// public static class URL {
//
// ActionDefinition actionDefinition;
//
// URL(ActionDefinition actionDefinition) {
// this.actionDefinition = actionDefinition;
// }
//
// @Override
// public String toString() {
// return actionDefinition.url;
// }
//
// }
}