mirror of
https://github.com/sismics/docs.git
synced 2024-06-15 06:21:23 +02:00
421 lines
22 KiB
Java
421 lines
22 KiB
Java
package com.sismics.docs.rest;
|
|
|
|
|
|
import java.io.BufferedInputStream;
|
|
import java.io.InputStream;
|
|
import java.util.Date;
|
|
|
|
import javax.ws.rs.core.MediaType;
|
|
|
|
import junit.framework.Assert;
|
|
|
|
import org.codehaus.jettison.json.JSONArray;
|
|
import org.codehaus.jettison.json.JSONException;
|
|
import org.codehaus.jettison.json.JSONObject;
|
|
import org.joda.time.format.DateTimeFormat;
|
|
import org.junit.Test;
|
|
|
|
import com.google.common.io.ByteStreams;
|
|
import com.sismics.docs.rest.filter.CookieAuthenticationFilter;
|
|
import com.sun.jersey.api.client.ClientResponse;
|
|
import com.sun.jersey.api.client.ClientResponse.Status;
|
|
import com.sun.jersey.api.client.WebResource;
|
|
import com.sun.jersey.core.util.MultivaluedMapImpl;
|
|
import com.sun.jersey.multipart.FormDataBodyPart;
|
|
import com.sun.jersey.multipart.FormDataMultiPart;
|
|
|
|
/**
|
|
* Exhaustive test of the document resource.
|
|
*
|
|
* @author bgamard
|
|
*/
|
|
public class TestDocumentResource extends BaseJerseyTest {
|
|
/**
|
|
* Test the document resource.
|
|
*
|
|
* @throws JSONException
|
|
*/
|
|
@Test
|
|
public void testDocumentResource() throws JSONException {
|
|
// Login document1
|
|
clientUtil.createUser("document1");
|
|
String document1Token = clientUtil.login("document1");
|
|
|
|
// Create a tag
|
|
WebResource tagResource = resource().path("/tag");
|
|
tagResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
MultivaluedMapImpl postParams = new MultivaluedMapImpl();
|
|
postParams.add("name", "SuperTag");
|
|
postParams.add("color", "#ffff00");
|
|
ClientResponse response = tagResource.put(ClientResponse.class, postParams);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
JSONObject json = response.getEntity(JSONObject.class);
|
|
String tag1Id = json.optString("id");
|
|
Assert.assertNotNull(tag1Id);
|
|
|
|
// Create a document
|
|
WebResource documentResource = resource().path("/document");
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
postParams = new MultivaluedMapImpl();
|
|
postParams.add("title", "My super title document 1");
|
|
postParams.add("description", "My super description for document 1");
|
|
postParams.add("tags", tag1Id);
|
|
postParams.add("language", "eng");
|
|
long create1Date = new Date().getTime();
|
|
postParams.add("create_date", create1Date);
|
|
response = documentResource.put(ClientResponse.class, postParams);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
json = response.getEntity(JSONObject.class);
|
|
String document1Id = json.optString("id");
|
|
Assert.assertNotNull(document1Id);
|
|
|
|
// Add a file
|
|
WebResource fileResource = resource().path("/file");
|
|
fileResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
FormDataMultiPart form = new FormDataMultiPart();
|
|
InputStream file = this.getClass().getResourceAsStream("/file/Einstein-Roosevelt-letter.png");
|
|
FormDataBodyPart fdp = new FormDataBodyPart("file",
|
|
new BufferedInputStream(file),
|
|
MediaType.APPLICATION_OCTET_STREAM_TYPE);
|
|
form.bodyPart(fdp);
|
|
form.field("id", document1Id);
|
|
response = fileResource.type(MediaType.MULTIPART_FORM_DATA).put(ClientResponse.class, form);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
json = response.getEntity(JSONObject.class);
|
|
|
|
// Share this document
|
|
WebResource fileShareResource = resource().path("/share");
|
|
fileShareResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
postParams = new MultivaluedMapImpl();
|
|
postParams.add("id", document1Id);
|
|
response = fileShareResource.put(ClientResponse.class, postParams);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
json = response.getEntity(JSONObject.class);
|
|
|
|
// List all documents
|
|
documentResource = resource().path("/document/list");
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
MultivaluedMapImpl getParams = new MultivaluedMapImpl();
|
|
getParams.putSingle("sort_column", 3);
|
|
getParams.putSingle("asc", false);
|
|
response = documentResource.queryParams(getParams).get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
JSONArray documents = json.getJSONArray("documents");
|
|
JSONArray tags = documents.getJSONObject(0).getJSONArray("tags");
|
|
Assert.assertTrue(documents.length() == 1);
|
|
Assert.assertEquals(document1Id, documents.getJSONObject(0).getString("id"));
|
|
Assert.assertEquals("eng", documents.getJSONObject(0).getString("language"));
|
|
Assert.assertEquals(1, tags.length());
|
|
Assert.assertEquals(tag1Id, tags.getJSONObject(0).getString("id"));
|
|
Assert.assertEquals("SuperTag", tags.getJSONObject(0).getString("name"));
|
|
Assert.assertEquals("#ffff00", tags.getJSONObject(0).getString("color"));
|
|
|
|
// Search documents by query in full content
|
|
documentResource = resource().path("/document/list");
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
getParams = new MultivaluedMapImpl();
|
|
getParams.putSingle("search", "full:uranium");
|
|
response = documentResource.queryParams(getParams).get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
documents = json.getJSONArray("documents");
|
|
Assert.assertTrue(documents.length() == 1);
|
|
|
|
// Search documents by query in full content
|
|
documentResource = resource().path("/document/list");
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
getParams = new MultivaluedMapImpl();
|
|
getParams.putSingle("search", "full:title");
|
|
response = documentResource.queryParams(getParams).get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
documents = json.getJSONArray("documents");
|
|
Assert.assertTrue(documents.length() == 1);
|
|
|
|
// Search documents by query in title/description
|
|
documentResource = resource().path("/document/list");
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
getParams = new MultivaluedMapImpl();
|
|
getParams.putSingle("search", "title");
|
|
response = documentResource.queryParams(getParams).get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
documents = json.getJSONArray("documents");
|
|
Assert.assertTrue(documents.length() == 1);
|
|
|
|
// Search documents by query in title/description
|
|
documentResource = resource().path("/document/list");
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
getParams = new MultivaluedMapImpl();
|
|
getParams.putSingle("search", "description");
|
|
response = documentResource.queryParams(getParams).get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
documents = json.getJSONArray("documents");
|
|
Assert.assertTrue(documents.length() == 1);
|
|
|
|
// Search documents by specific date
|
|
documentResource = resource().path("/document/list");
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
getParams = new MultivaluedMapImpl();
|
|
getParams.putSingle("search", "at:" + DateTimeFormat.forPattern("yyyy-MM").print(new Date().getTime()));
|
|
response = documentResource.queryParams(getParams).get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
documents = json.getJSONArray("documents");
|
|
Assert.assertTrue(documents.length() == 1);
|
|
Assert.assertEquals(document1Id, documents.getJSONObject(0).getString("id"));
|
|
|
|
// Search documents by date span
|
|
documentResource = resource().path("/document/list");
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
getParams = new MultivaluedMapImpl();
|
|
getParams.putSingle("search", "after:2010 before:2040-08");
|
|
response = documentResource.queryParams(getParams).get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
documents = json.getJSONArray("documents");
|
|
Assert.assertTrue(documents.length() == 1);
|
|
Assert.assertEquals(document1Id, documents.getJSONObject(0).getString("id"));
|
|
|
|
// Search documents by tag
|
|
documentResource = resource().path("/document/list");
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
getParams = new MultivaluedMapImpl();
|
|
getParams.putSingle("search", "tag:super");
|
|
response = documentResource.queryParams(getParams).get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
documents = json.getJSONArray("documents");
|
|
Assert.assertTrue(documents.length() == 1);
|
|
Assert.assertEquals(document1Id, documents.getJSONObject(0).getString("id"));
|
|
|
|
// Search documents by shared status
|
|
documentResource = resource().path("/document/list");
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
getParams = new MultivaluedMapImpl();
|
|
getParams.putSingle("search", "shared:yes");
|
|
response = documentResource.queryParams(getParams).get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
documents = json.getJSONArray("documents");
|
|
Assert.assertTrue(documents.length() == 1);
|
|
Assert.assertEquals(document1Id, documents.getJSONObject(0).getString("id"));
|
|
Assert.assertEquals(true, documents.getJSONObject(0).getBoolean("shared"));
|
|
|
|
// Search documents by language
|
|
documentResource = resource().path("/document/list");
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
getParams = new MultivaluedMapImpl();
|
|
getParams.putSingle("search", "lang:eng");
|
|
response = documentResource.queryParams(getParams).get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
documents = json.getJSONArray("documents");
|
|
Assert.assertTrue(documents.length() == 1);
|
|
Assert.assertEquals(document1Id, documents.getJSONObject(0).getString("id"));
|
|
Assert.assertEquals("eng", documents.getJSONObject(0).getString("language"));
|
|
|
|
// Search documents with multiple criteria
|
|
documentResource = resource().path("/document/list");
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
getParams = new MultivaluedMapImpl();
|
|
getParams.putSingle("search", "after:2010 before:2040-08 tag:super shared:yes lang:eng title description full:uranium");
|
|
response = documentResource.queryParams(getParams).get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
documents = json.getJSONArray("documents");
|
|
Assert.assertTrue(documents.length() == 1);
|
|
Assert.assertEquals(document1Id, documents.getJSONObject(0).getString("id"));
|
|
|
|
// Search documents (nothing)
|
|
documentResource = resource().path("/document/list");
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
getParams = new MultivaluedMapImpl();
|
|
getParams.putSingle("search", "random");
|
|
response = documentResource.queryParams(getParams).get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
documents = json.getJSONArray("documents");
|
|
Assert.assertTrue(documents.length() == 0);
|
|
|
|
// Search documents (nothing)
|
|
documentResource = resource().path("/document/list");
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
getParams = new MultivaluedMapImpl();
|
|
getParams.putSingle("search", "full:random");
|
|
response = documentResource.queryParams(getParams).get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
documents = json.getJSONArray("documents");
|
|
Assert.assertTrue(documents.length() == 0);
|
|
|
|
// Search documents (nothing)
|
|
documentResource = resource().path("/document/list");
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
getParams = new MultivaluedMapImpl();
|
|
getParams.putSingle("search", "after:2010 before:2011-05-20");
|
|
response = documentResource.queryParams(getParams).get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
documents = json.getJSONArray("documents");
|
|
Assert.assertTrue(documents.length() == 0);
|
|
|
|
// Search documents (nothing)
|
|
documentResource = resource().path("/document/list");
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
getParams = new MultivaluedMapImpl();
|
|
getParams.putSingle("search", "tag:Nop");
|
|
response = documentResource.queryParams(getParams).get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
documents = json.getJSONArray("documents");
|
|
Assert.assertTrue(documents.length() == 0);
|
|
|
|
// Search documents (nothing)
|
|
documentResource = resource().path("/document/list");
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
getParams = new MultivaluedMapImpl();
|
|
getParams.putSingle("search", "lang:fra");
|
|
response = documentResource.queryParams(getParams).get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
documents = json.getJSONArray("documents");
|
|
Assert.assertTrue(documents.length() == 0);
|
|
|
|
// Get a document
|
|
documentResource = resource().path("/document/" + document1Id);
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
response = documentResource.get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
Assert.assertEquals(document1Id, json.getString("id"));
|
|
tags = json.getJSONArray("tags");
|
|
Assert.assertEquals(1, tags.length());
|
|
Assert.assertEquals(tag1Id, tags.getJSONObject(0).getString("id"));
|
|
|
|
// Create a tag
|
|
tagResource = resource().path("/tag");
|
|
tagResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
postParams = new MultivaluedMapImpl();
|
|
postParams.add("name", "SuperTag2");
|
|
postParams.add("color", "#00ffff");
|
|
response = tagResource.put(ClientResponse.class, postParams);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
json = response.getEntity(JSONObject.class);
|
|
String tag2Id = json.optString("id");
|
|
Assert.assertNotNull(tag1Id);
|
|
|
|
// Update a document
|
|
documentResource = resource().path("/document/" + document1Id);
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
postParams = new MultivaluedMapImpl();
|
|
postParams.add("title", "My new super document 1");
|
|
postParams.add("description", "My new super description for document 1");
|
|
postParams.add("tags", tag2Id);
|
|
response = documentResource.post(ClientResponse.class, postParams);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(document1Id, json.getString("id"));
|
|
|
|
// Search documents by query
|
|
documentResource = resource().path("/document/list");
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
getParams = new MultivaluedMapImpl();
|
|
getParams.putSingle("search", "super");
|
|
response = documentResource.queryParams(getParams).get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
|
|
// Get a document
|
|
documentResource = resource().path("/document/" + document1Id);
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
response = documentResource.get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
Assert.assertTrue(json.getString("title").contains("new"));
|
|
Assert.assertTrue(json.getString("description").contains("new"));
|
|
tags = json.getJSONArray("tags");
|
|
Assert.assertEquals(1, tags.length());
|
|
Assert.assertEquals(tag2Id, tags.getJSONObject(0).getString("id"));
|
|
|
|
// Deletes a document
|
|
documentResource = resource().path("/document/" + document1Id);
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
response = documentResource.delete(ClientResponse.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals("ok", json.getString("status"));
|
|
|
|
// Get a document (KO)
|
|
documentResource = resource().path("/document/" + document1Id);
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document1Token));
|
|
response = documentResource.get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.BAD_REQUEST, Status.fromStatusCode(response.getStatus()));
|
|
}
|
|
|
|
/**
|
|
* Test PDF extraction.
|
|
*
|
|
* @throws Exception
|
|
*/
|
|
@Test
|
|
public void testPdfExtraction() throws Exception {
|
|
// Login document2
|
|
clientUtil.createUser("document2");
|
|
String document2Token = clientUtil.login("document2");
|
|
|
|
// Create a document
|
|
WebResource documentResource = resource().path("/document");
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document2Token));
|
|
MultivaluedMapImpl postParams = new MultivaluedMapImpl();
|
|
postParams.add("title", "My super title document 1");
|
|
postParams.add("description", "My super description for document 1");
|
|
postParams.add("language", "eng");
|
|
long create1Date = new Date().getTime();
|
|
postParams.add("create_date", create1Date);
|
|
ClientResponse response = documentResource.put(ClientResponse.class, postParams);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
JSONObject json = response.getEntity(JSONObject.class);
|
|
String document1Id = json.optString("id");
|
|
Assert.assertNotNull(document1Id);
|
|
|
|
// Add a PDF file
|
|
WebResource fileResource = resource().path("/file");
|
|
fileResource.addFilter(new CookieAuthenticationFilter(document2Token));
|
|
FormDataMultiPart form = new FormDataMultiPart();
|
|
InputStream file = this.getClass().getResourceAsStream("/file/wikipedia.pdf");
|
|
FormDataBodyPart fdp = new FormDataBodyPart("file",
|
|
new BufferedInputStream(file),
|
|
MediaType.APPLICATION_OCTET_STREAM_TYPE);
|
|
form.bodyPart(fdp);
|
|
form.field("id", document1Id);
|
|
response = fileResource.type(MediaType.MULTIPART_FORM_DATA).put(ClientResponse.class, form);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
json = response.getEntity(JSONObject.class);
|
|
String file1Id = json.getString("id");
|
|
|
|
// Search documents by query in full content
|
|
documentResource = resource().path("/document/list");
|
|
documentResource.addFilter(new CookieAuthenticationFilter(document2Token));
|
|
MultivaluedMapImpl getParams = new MultivaluedMapImpl();
|
|
getParams.putSingle("search", "full:vrandecic");
|
|
response = documentResource.queryParams(getParams).get(ClientResponse.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
Assert.assertTrue(json.getJSONArray("documents").length() == 1);
|
|
|
|
// Get the file thumbnail data
|
|
fileResource = resource().path("/file/" + file1Id + "/data");
|
|
fileResource.addFilter(new CookieAuthenticationFilter(document2Token));
|
|
getParams = new MultivaluedMapImpl();
|
|
getParams.putSingle("size", "thumb");
|
|
response = fileResource.queryParams(getParams).get(ClientResponse.class);
|
|
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
|
|
InputStream is = response.getEntityInputStream();
|
|
byte[] fileBytes = ByteStreams.toByteArray(is);
|
|
Assert.assertEquals(3457, fileBytes.length);
|
|
}
|
|
} |