/**
* Copyright (c) 2012, Thilo Planz. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package v7db.files.milton;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Date;
import java.util.Hashtable;
import java.util.Properties;
import javax.servlet.http.HttpServletResponse;
import jmockmongo.MockMongoTestCaseSupport;
import org.bson.BasicBSONObject;
import org.bson.types.ObjectId;
import org.xml.sax.SAXException;
import v7db.files.UnitTestSupport;
import com.meterware.httpunit.GetMethodWebRequest;
import com.meterware.httpunit.HttpNotFoundException;
import com.meterware.httpunit.PutMethodWebRequest;
import com.meterware.httpunit.WebRequest;
import com.meterware.httpunit.WebResponse;
import com.meterware.servletunit.ServletRunner;
import com.meterware.servletunit.ServletUnitClient;
public class MiltonServletTest extends MockMongoTestCaseSupport {
private ServletRunner sr;
@Override
protected void setUp() throws Exception {
super.setUp();
Properties props = UnitTestSupport.getDefaultProperties();
props.put("auth.provider", "demo");
props.put("acl.provider", "global");
props.put("acl.read", "admins");
props.put("acl.write", "admins");
UnitTestSupport.initConfiguration(props);
sr = new ServletRunner();
Hashtable<String, String> initParams = new Hashtable<String, String>();
initParams.put("webdav.endpoint", "webdav");
initParams.put("resource.factory.factory.class",
ResourceFactoryFactory.class.getName());
sr.registerServlet("myServlet/*", MiltonServlet.class.getName(),
initParams);
}
public void testSimpleScenario() throws IOException, SAXException {
ServletUnitClient sc = sr.newClient();
sc.setAuthentication("V7Files", "admin", "admin");
{
WebRequest request = new MkColWebRequest("http://test/myServlet/1");
WebResponse resp = sc.getResponse(request);
assertEquals(HttpServletResponse.SC_CREATED, resp.getResponseCode());
}
{
WebRequest request = new PutMethodWebRequest(
"http://test/myServlet/1/test.txt",
new ByteArrayInputStream("testPUT".getBytes()),
"text/plain");
WebResponse resp = sc.getResponse(request);
assertEquals(HttpServletResponse.SC_CREATED, resp.getResponseCode());
}
assertExists(sc, "http://test/myServlet/1/test.txt");
{
WebRequest request = new MoveWebRequest("http://test/myServlet/1",
"/myServlet/2");
WebResponse resp = sc.getResponse(request);
assertEquals(HttpServletResponse.SC_CREATED, resp.getResponseCode());
}
}
public void testGET() throws IOException, SAXException {
ServletUnitClient sc = sr.newClient();
sc.setAuthentication("V7Files", "admin", "admin");
{
WebRequest request = new GetMethodWebRequest(
"http://test/myServlet/a.txt");
try {
sc.getResponse(request);
fail("file not found => 404");
} catch (HttpNotFoundException e) {
}
}
prepareMockData("test.v7files.files", new BasicBSONObject("_id",
new ObjectId()).append("filename", "a.txt").append("parent",
"webdav").append("created_at", new Date()).append("in",
"abcd".getBytes()));
assertGET(sc, "http://test/myServlet/a.txt", "abcd");
{
WebRequest request = new GetMethodWebRequest(
"http://test/myServlet/a.txt");
WebResponse resp = sc.getResponse(request);
String eTag = resp.getHeaderField("Etag");
request.setHeaderField("If-None-Match", eTag);
resp = sc.getResponse(request);
assertEquals(HttpServletResponse.SC_NOT_MODIFIED, resp
.getResponseCode());
assertEquals("", resp.getText());
}
}
private void assertExists(ServletUnitClient sc, String url)
throws IOException, SAXException {
WebRequest request = new GetMethodWebRequest(url);
WebResponse resp = sc.getResponse(request);
assertEquals(HttpServletResponse.SC_OK, resp.getResponseCode());
}
private void assertGET(ServletUnitClient sc, String url, String contents)
throws IOException, SAXException {
WebRequest request = new GetMethodWebRequest(url);
WebResponse resp = sc.getResponse(request);
assertEquals(contents, resp.getText());
assertEquals(HttpServletResponse.SC_OK, resp.getResponseCode());
}
public void testCOPYFile() throws IOException, SAXException {
ServletUnitClient sc = sr.newClient();
sc.setAuthentication("V7Files", "admin", "admin");
prepareMockData("test.v7files.files", new BasicBSONObject("_id",
new ObjectId()).append("filename", "a.txt").append("parent",
"webdav").append("in", "abcd".getBytes()));
{
WebRequest request = new CopyWebRequest(
"http://test/myServlet/a.txt", "/myServlet/b.txt");
WebResponse resp = sc.getResponse(request);
assertEquals(HttpServletResponse.SC_CREATED, resp.getResponseCode());
}
assertGET(sc, "http://test/myServlet/a.txt", "abcd");
assertGET(sc, "http://test/myServlet/b.txt", "abcd");
}
public void testCOPYFolder() throws IOException, SAXException {
ServletUnitClient sc = sr.newClient();
sc.setAuthentication("V7Files", "admin", "admin");
{
WebRequest request = new MkColWebRequest("http://test/myServlet/1");
WebResponse resp = sc.getResponse(request);
assertEquals(HttpServletResponse.SC_CREATED, resp.getResponseCode());
}
{
WebRequest request = new PutMethodWebRequest(
"http://test/myServlet/1/test.txt",
new ByteArrayInputStream("testPUT".getBytes()),
"text/plain");
WebResponse resp = sc.getResponse(request);
assertEquals(HttpServletResponse.SC_CREATED, resp.getResponseCode());
}
{
WebRequest request = new CopyWebRequest("http://test/myServlet/1",
"/myServlet/2");
WebResponse resp = sc.getResponse(request);
assertEquals(HttpServletResponse.SC_CREATED, resp.getResponseCode());
}
assertExists(sc, "http://test/myServlet/2/test.txt");
}
}