package org.basex.http.auth;
import static org.basex.query.func.Function.*;
import static org.junit.Assert.*;
import java.io.*;
import org.basex.core.*;
import org.basex.http.*;
import org.basex.query.*;
import org.basex.util.*;
import org.junit.*;
/**
* HTTP authentication tests.
*
* @author BaseX Team 2005-17, BSD License
* @author Christian Gruen
*/
public abstract class AuthTest extends HTTPTest {
/** Local database context. */
private static Context ctx;
/** Authentication method. */
protected static String method;
/**
* Initializes the test.
* @param meth method
* @throws Exception exception
*/
protected static void init(final String meth) throws Exception {
Prop.put(StaticOptions.AUTHMETHOD, meth);
method = meth;
init(REST_ROOT, true, true);
ctx = new Context();
}
/**
* Stops the test.
*/
@AfterClass
public static void close() {
Prop.clear();
ctx.close();
}
/**
* Successful request.
* @throws Exception Exception
*/
@Test
public void sendRequestOk() throws Exception {
assertEquals("200", sendRequest("admin", "admin"));
}
/**
* Failed request.
* @throws Exception Exception
*/
@Test
public void sendRequestFail() throws Exception {
assertEquals("401", sendRequest("unknown", "wrong"));
}
/**
* Calls the specified URL and checks the error message.
* @param url URL
* @param error expected error, or {@code null} if no error is expected
*/
protected static void test(final String url, final String error) {
try {
final String request = request(url, "", "GET");
if(error != null) fail("Error expected:\n" + request);
} catch(final IOException ex) {
if(error == null) fail("No error expected:\n" + ex);
assertEquals(error, ex.getMessage());
}
}
/**
* Tests authentication.
* @param user user
* @param pass password
* @return code
* @throws Exception Exception
*/
private String sendRequest(final String user, final String pass) throws Exception {
try(QueryProcessor qp = new QueryProcessor(_HTTP_SEND_REQUEST.args(
"<http:request xmlns:http='http://expath.org/ns/http-client' method='GET' " +
"auth-method='" + method + "' username='" + user + "' password='" + pass + "' " +
"send-authorization='true' href='" + REST_ROOT + "'/>") +
"[. instance of node()]/@status/string()", ctx)) {
return qp.value().serialize().toString();
}
}
}