package org.basex.http.rest;
import static org.junit.Assert.*;
import java.io.*;
import org.basex.core.*;
import org.basex.io.*;
import org.basex.io.in.*;
import org.basex.util.*;
import org.basex.util.http.*;
import org.junit.*;
/**
* This class tests the embedded REST API and the GET method.
*
* @author BaseX Team 2005-17, BSD License
* @author Christian Gruen
*/
public final class RESTGetTest extends RESTTest {
/**
* GET Test.
* @throws Exception exception
*/
@Test
public void basic() throws Exception {
assertEquals("1", get("?query=1"));
assertEquals("a,b", get("?query=string-join(('a','b'),',')"));
put(NAME, new ArrayInput("<a/>"));
put(NAME + "/raw", new ArrayInput("XXX"), MediaType.APPLICATION_OCTET_STREAM);
assertEquals("<a/>", get(NAME + '/' + NAME + ".xml"));
assertEquals("XXX", get(NAME + "/raw"));
delete(NAME);
}
/**
* GET Test.
* @throws Exception exception
*/
@Test
public void input() throws Exception {
assertEquals("<a/>", get("?query=.&context=<a/>"));
try {
assertEquals("<a/>", get("?query=.&context=<"));
fail("Error expected.");
} catch(final IOException ex) {
/** expected. */
}
}
/**
* Binding.
* @throws IOException I/O exception
*/
@Test
public void bind() throws IOException {
assertEquals("123", get('?'
+ "query=declare+variable+$x+as+xs:integer+external;$x&$x=123"));
assertEquals("124", get("?$x=123&"
+ "query=declare+variable+$x+as+xs:integer+external;$x%2b1"));
assertEquals("6", get('?'
+ "query=declare+variable+$a++as+xs:integer+external;"
+ "declare+variable+$b+as+xs:integer+external;"
+ "declare+variable+$c+as+xs:integer+external;" + "$a*$b*$c&"
+ "$a=1&$b=2&$c=3"));
}
/** Error. */
@Test
public void error1() {
try {
get("?query=(");
fail("Error expected.");
} catch(final IOException ex) {
assertContains(ex.getMessage(), "[XPST0003]");
}
}
/** Error. */
@Test
public void error2() {
try {
get("?query=()&method=xxx");
fail("Error expected.");
} catch(final IOException ignored) {
}
}
/**
* Content type.
* @throws Exception exception
*/
@Test
public void contentType() throws Exception {
assertMediaType(mediaType("?query=1"), MediaType.APPLICATION_XML);
assertMediaType(mediaType("?command=info"), MediaType.TEXT_PLAIN);
assertMediaType(mediaType("?query=1&method=xml"), MediaType.APPLICATION_XML);
assertMediaType(mediaType("?query=1&method=xhtml"), MediaType.TEXT_HTML);
assertMediaType(mediaType("?query=1&method=html"), MediaType.TEXT_HTML);
assertMediaType(mediaType("?query=1&method=text"), MediaType.TEXT_PLAIN);
assertMediaType(mediaType("?query=<json+type='object'/>&method=json"),
MediaType.APPLICATION_JSON);
assertMediaType(mediaType("?query=1&media-type=application/octet-stream"),
MediaType.APPLICATION_OCTET_STREAM);
assertMediaType(mediaType("?query=1&media-type=application/xml"), MediaType.APPLICATION_XML);
assertMediaType(mediaType("?query=1&media-type=text/html"), MediaType.TEXT_HTML);
assertMediaType(mediaType("?query=1&media-type=xxx"), new MediaType("xxx"));
}
/**
* Specify options.
* @throws IOException I/O exception
*/
@Test
public void queryOption() throws IOException {
assertEquals("2", get("?query=2,delete+node+<a/>&" + MainOptions.MIXUPDATES.name() + "=true"));
try {
get("?query=1,delete+node+<a/>&" + MainOptions.MIXUPDATES.name() + "=false");
fail("Error expected.");
} catch(final IOException ex) {
assertContains(ex.getMessage(), "[XUST0001]");
}
}
/**
* Specify a server file.
* @throws IOException I/O exception
*/
@Test
public void runOption() throws IOException {
final String path = context.soptions.get(StaticOptions.WEBPATH);
new IOFile(path, "x.xq").write(Token.token("1"));
assertEquals("1", get("?run=x.xq"));
new IOFile(path, "x.bxs").write(Token.token("xquery 2"));
assertEquals("2", get("?run=x.bxs"));
new IOFile(path, "x.bxs").write(Token.token("xquery 3\nxquery 4"));
assertEquals("34", get("?run=x.bxs"));
new IOFile(path, "x.bxs").write(Token.token("<commands><xquery>5</xquery></commands>"));
assertEquals("5", get("?run=x.bxs"));
new IOFile(path, "x.bxs").write(Token.token("<set option='maxlen'>123</set>"));
assertEquals("", get("?run=x.bxs"));
try {
get("?run=unknown.abc");
fail("Error expected.");
} catch(final IOException ignored) {
}
try {
new IOFile(path, "x.bxs").write(Token.token("<set option='unknown'>123</set>"));
assertEquals("", get("?run=x.bxs"));
fail("Error expected.");
} catch(final IOException ignored) {
}
}
}