package org.basex.http.restxq;
import static org.junit.Assert.*;
import java.io.*;
import org.basex.core.*;
import org.basex.util.http.*;
import org.junit.*;
/**
* This test contains RESTXQ methods.
*
* @author BaseX Team 2005-17, BSD License
* @author Christian Gruen
*/
public final class RestXqMethodTest extends RestXqTest {
/**
* Retrieve path with typed variable.
* @throws Exception exception
*/
@Test
public void post() throws Exception {
// text
String f = "declare %R:POST('{$x}') %R:path('') function m:f($x) {$x};";
post(f, "12", "12", MediaType.TEXT_PLAIN);
post(f, "<x>A</x>", "<x>A</x>", MediaType.APPLICATION_XML);
// json
f = "declare %R:POST('{$x}') %R:path('') function m:f($x) {$x/json/*};";
post(f, "<A>B</A>", "{ \"A\":\"B\" }", MediaType.APPLICATION_JSON);
// csv
f = "declare %R:POST('{$x}') %R:path('') function m:f($x) {$x/csv/*/*};";
post(f, "<entry>A</entry>", "A", MediaType.TEXT_CSV);
// binary
f = "declare %R:POST('{$x}') %R:path('') function m:f($x) {$x};";
post(f, "AAA", "AAA", MediaType.APPLICATION_OCTET_STREAM);
post(f, "AAA", "AAA", new MediaType("whatever/type"));
}
/**
* Custom method.
* @throws Exception exception */
@Test
public void method() throws Exception {
// standard HTTP method without body
get("declare %R:method('GET') %R:path('') function m:f() {'x'};", "", "x");
// standard HTTP method specified twice
getE("declare %R:method('GET') %R:GET %R:path('') function m:f() {'x'};", "");
// standard HTTP method without body, body provided in request
getE("declare %R:method('GET', '{$b}') %R:path('') function m:f($b) {$b};", "");
// standard HTTP method with body, body provided in request
post("declare %R:method('POST', '{$b}') %R:path('') function m:f($b) {$b};", "12", "12",
MediaType.TEXT_PLAIN);
// ignore case
get("declare %R:method('get') %R:path('') function m:f() {'x'};", "", "x");
getE("declare %R:method('get') declare %R:method('GET') %R:path('') "
+ "function m:f() {'x'};", "");
// custom HTTP method without body
install("declare %R:method('RETRIEVE') %R:path('') function m:f() {'x'};");
// java.net.HttpUrlConnection does not support custom HTTP methods
// assertEquals("x", request("", "RETRIEVE"));
// custom HTTP method with body
install("declare %R:method('RETRIEVE', '{$b}') %R:path('') function m:f($b) {$b};");
// java.net.HttpUrlConnection does not support custom HTTP methods
// assertEquals("12", request("", "RETRIEVE", "12", MediaType.TEXT_PLAIN));
// custom HTTP method specified twice
final String q = "declare %R:method('RETRIEVE') %R:method('RETRIEVE') %R:path('') "
+ "function m:f() {'x'};";
install(q);
try {
// java.net.HttpUrlConnection does not support custom HTTP methods
request("", "RETRIEVE");
fail("Error expected: " + q);
} catch (final BaseXException ignored) {
}
}
/**
* {@code %HEAD} method.
* @throws Exception exception
*/
@Test
public void head() throws Exception {
// correct return type
headR("declare %R:HEAD %R:path('') function m:f() { <R:response/> };");
headR("declare %R:HEAD %R:path('') function m:f() as element(R:response) { <R:response/> };");
// wrong type
headE("declare %R:HEAD %R:path('') function m:f() { () };");
headE("declare %R:HEAD %R:path('') function m:f() { <response/> };");
headE("declare %R:HEAD %R:path('') function m:f() as element(R:response)* {()};");
}
/**
* Executes the specified POST request and tests the result.
*
* @param function function to test
* @param exp expected result
* @param request request body
* @param type media type
* @throws IOException I/O exception
*/
private static void post(final String function, final String exp, final String request,
final MediaType type) throws IOException {
install(function);
assertEquals(exp, post("", request, type));
}
/**
* Executes the specified HEAD request and tests the result.
*
* @param function function to test
* @throws IOException I/O exception
*/
private static void headR(final String function) throws IOException {
install(function);
assertEquals("", head(""));
}
/**
* Executes the specified HEAD request and tests for an error.
*
* @param function function to test
* @throws IOException I/O exception
*/
private static void headE(final String function) throws IOException {
install(function);
try {
head("");
fail("Error expected: " + "");
} catch(final BaseXException ignored) {
}
}
}