Search in sources :

Example 1 with MultiPartBuilder

use of org.alfresco.rest.api.tests.util.MultiPartBuilder in project alfresco-remote-api by Alfresco.

the class NodeApiTest method testUploadToMyFiles.

/**
 * Tests Multipart upload to user's home (a.k.a My Files).
 * <p>POST:</p>
 * {@literal <host>:<port>/alfresco/api/-default-/public/alfresco/versions/1/nodes/<nodeId>/children}
 */
@Test
public void testUploadToMyFiles() throws Exception {
    setRequestContext(user1);
    // create folder f0
    String folder0Name = "f0-testUploadToMyFiles-" + RUNID;
    Folder folderResp = createFolder(Nodes.PATH_MY, folder0Name);
    String f0Id = folderResp.getId();
    final String fileName = "quick.pdf";
    final File file = getResourceFile(fileName);
    Paging paging = getPaging(0, Integer.MAX_VALUE);
    HttpResponse response = getAll(getNodeChildrenUrl(f0Id), paging, 200);
    PublicApiClient.ExpectedPaging pagingResult = parsePaging(response.getJsonResponse());
    assertNotNull(paging);
    final int numOfNodes = pagingResult.getCount();
    MultiPartBuilder multiPartBuilder = MultiPartBuilder.create().setFileData(new FileData(fileName, file));
    MultiPartRequest reqBody = multiPartBuilder.build();
    // Try to upload into a non-existent folder
    post(getNodeChildrenUrl(UUID.randomUUID().toString()), reqBody.getBody(), null, reqBody.getContentType(), 404);
    // Upload
    response = post(getNodeChildrenUrl(f0Id), reqBody.getBody(), null, reqBody.getContentType(), 201);
    Document document = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
    // Check the upload response
    assertEquals(fileName, document.getName());
    ContentInfo contentInfo = document.getContent();
    assertNotNull(contentInfo);
    assertEquals(MimetypeMap.MIMETYPE_PDF, contentInfo.getMimeType());
    // Default encoding
    assertEquals("UTF-8", contentInfo.getEncoding());
    // Check there is no path info returned.
    // The path info should only be returned when it is requested via a include statement.
    assertNull(document.getPath());
    // Retrieve the uploaded file
    response = getSingle(NodesEntityResource.class, document.getId(), null, 200);
    document = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
    assertEquals(fileName, document.getName());
    contentInfo = document.getContent();
    assertNotNull(contentInfo);
    assertEquals(MimetypeMap.MIMETYPE_PDF, contentInfo.getMimeType());
    // Check 'get children' is confirming the upload
    response = getAll(getNodeChildrenUrl(f0Id), paging, 200);
    pagingResult = parsePaging(response.getJsonResponse());
    assertNotNull(paging);
    assertEquals(numOfNodes + 1, pagingResult.getCount().intValue());
    // Upload the same file again to check the name conflicts handling
    post(getNodeChildrenUrl(f0Id), reqBody.getBody(), null, reqBody.getContentType(), 409);
    response = getAll(getNodeChildrenUrl(f0Id), paging, 200);
    pagingResult = parsePaging(response.getJsonResponse());
    assertNotNull(paging);
    assertEquals("Duplicate file name. The file shouldn't have been uploaded.", numOfNodes + 1, pagingResult.getCount().intValue());
    // Set autoRename=true and upload the same file again
    reqBody = MultiPartBuilder.copy(multiPartBuilder).setAutoRename(true).build();
    response = post(getNodeChildrenUrl(f0Id), reqBody.getBody(), null, reqBody.getContentType(), 201);
    document = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
    // Check the upload response
    assertEquals("quick-1.pdf", document.getName());
    // upload the same file again, and request the path info to be present in the response
    response = post(getNodeChildrenUrl(f0Id), reqBody.getBody(), "?include=path", reqBody.getContentType(), 201);
    document = jacksonUtil.parseEntry(response.getJsonResponse(), Document.class);
    // Check the upload response
    assertEquals("quick-2.pdf", document.getName());
    assertNotNull(document.getPath());
    response = getAll(getNodeChildrenUrl(f0Id), paging, 200);
    pagingResult = parsePaging(response.getJsonResponse());
    assertNotNull(paging);
    assertEquals(numOfNodes + 3, pagingResult.getCount().intValue());
    // upload without specifying content type or without overriding filename - hence guess mimetype and use file's name
    final String fileName1 = "quick-1.txt";
    final File file1 = getResourceFile(fileName1);
    reqBody = MultiPartBuilder.create().setFileData(new FileData(null, file1)).build();
    response = post(getNodeChildrenUrl(f0Id), reqBody.getBody(), null, reqBody.getContentType(), 201);
    document = jacksonUtil.parseEntry(response.getJsonResponse(), Document.class);
    // Check the upload response
    assertEquals(fileName1, document.getName());
    assertEquals(MimetypeMap.MIMETYPE_TEXT_PLAIN, document.getContent().getMimeType());
    // upload with "default" binary content type and override filename - hence guess mimetype & use overridden name
    final String fileName2 = "quick-2.txt";
    final String fileName2b = "quick-2b.txt";
    final File file2 = getResourceFile(fileName2);
    reqBody = MultiPartBuilder.create().setFileData(new FileData(fileName2b, file2)).build();
    response = post(getNodeChildrenUrl(f0Id), reqBody.getBody(), null, reqBody.getContentType(), 201);
    document = jacksonUtil.parseEntry(response.getJsonResponse(), Document.class);
    // Check the upload response
    assertEquals(fileName2b, document.getName());
    assertEquals(MimetypeMap.MIMETYPE_TEXT_PLAIN, document.getContent().getMimeType());
    response = getSingle(NodesEntityResource.class, Nodes.PATH_MY, null, 200);
    Folder user1Home = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Folder.class);
    // User2 tries to upload a new file into the user1's home folder.
    setRequestContext(user2);
    final File file3 = getResourceFile(fileName2);
    reqBody = MultiPartBuilder.create().setFileData(new FileData(fileName2, file3)).build();
    post(getNodeChildrenUrl(user1Home.getId()), reqBody.getBody(), null, reqBody.getContentType(), 403);
    post(getNodeChildrenUrl(f0Id), reqBody.getBody(), null, reqBody.getContentType(), 403);
    setRequestContext(user1);
    response = getAll(getNodeChildrenUrl(f0Id), paging, 200);
    pagingResult = parsePaging(response.getJsonResponse());
    assertNotNull(paging);
    assertEquals("Access Denied. The file shouldn't have been uploaded.", numOfNodes + 5, pagingResult.getCount().intValue());
    // User1 tries to upload a file into a document rather than a folder!
    post(getNodeChildrenUrl(document.getId()), reqBody.getBody(), null, reqBody.getContentType(), 400);
    // Try to upload a file without defining the required formData
    reqBody = MultiPartBuilder.create().setAutoRename(true).build();
    post(getNodeChildrenUrl(f0Id), reqBody.getBody(), null, reqBody.getContentType(), 400);
    // Test unsupported node type
    reqBody = MultiPartBuilder.create().setFileData(new FileData(fileName2, file2)).setAutoRename(true).setNodeType("cm:link").build();
    post(getNodeChildrenUrl(f0Id), reqBody.getBody(), null, reqBody.getContentType(), 400);
    // User1 uploads a new file
    reqBody = MultiPartBuilder.create().setFileData(new FileData(fileName2, file2)).build();
    response = post(getNodeChildrenUrl(f0Id), reqBody.getBody(), null, reqBody.getContentType(), 201);
    document = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
    // Check the upload response
    assertEquals(fileName2, document.getName());
    contentInfo = document.getContent();
    assertNotNull(contentInfo);
    assertEquals(MimetypeMap.MIMETYPE_TEXT_PLAIN, contentInfo.getMimeType());
    assertEquals("ISO-8859-1", contentInfo.getEncoding());
    // Test content size limit
    final SimpleFixedLimitProvider limitProvider = applicationContext.getBean("defaultContentLimitProvider", SimpleFixedLimitProvider.class);
    final long defaultSizeLimit = limitProvider.getSizeLimit();
    // 20 KB
    limitProvider.setSizeLimitString("20000");
    try {
        // quick.pdf size is about 23 KB
        reqBody = MultiPartBuilder.create().setFileData(new FileData(fileName, file)).setAutoRename(true).build();
        // Try to upload a file larger than the configured size limit
        post(getNodeChildrenUrl(f0Id), reqBody.getBody(), null, reqBody.getContentType(), 413);
    } finally {
        limitProvider.setSizeLimitString(Long.toString(defaultSizeLimit));
    }
}
Also used : ExpectedPaging(org.alfresco.rest.api.tests.client.PublicApiClient.ExpectedPaging) RestApiUtil.parsePaging(org.alfresco.rest.api.tests.util.RestApiUtil.parsePaging) Paging(org.alfresco.rest.api.tests.client.PublicApiClient.Paging) ExpectedPaging(org.alfresco.rest.api.tests.client.PublicApiClient.ExpectedPaging) HttpResponse(org.alfresco.rest.api.tests.client.HttpResponse) MultiPartRequest(org.alfresco.rest.api.tests.util.MultiPartBuilder.MultiPartRequest) NodesEntityResource(org.alfresco.rest.api.nodes.NodesEntityResource) Folder(org.alfresco.rest.api.tests.client.data.Folder) Document(org.alfresco.rest.api.tests.client.data.Document) SimpleFixedLimitProvider(org.alfresco.repo.content.ContentLimitProvider.SimpleFixedLimitProvider) MultiPartBuilder(org.alfresco.rest.api.tests.util.MultiPartBuilder) ContentInfo(org.alfresco.rest.api.tests.client.data.ContentInfo) PublicApiClient(org.alfresco.rest.api.tests.client.PublicApiClient) File(java.io.File) FileData(org.alfresco.rest.api.tests.util.MultiPartBuilder.FileData) Test(org.junit.Test) AbstractSingleNetworkSiteTest(org.alfresco.rest.AbstractSingleNetworkSiteTest)

Example 2 with MultiPartBuilder

use of org.alfresco.rest.api.tests.util.MultiPartBuilder in project alfresco-remote-api by Alfresco.

the class RenditionsTest method testDownloadRendition.

/**
 * Tests download rendition.
 * <p>GET:</p>
 * {@literal <host>:<port>/alfresco/api/<networkId>/public/alfresco/versions/1/nodes/<nodeId>/renditions/<renditionId>/content}
 */
@Test
public void testDownloadRendition() throws Exception {
    setRequestContext(networkN1.getId(), userOneN1.getId(), null);
    // Create a folder within the site document's library
    String folderName = "folder" + System.currentTimeMillis();
    String folder_Id = addToDocumentLibrary(userOneN1Site, folderName, TYPE_CM_FOLDER, userOneN1.getId());
    // Create multipart request
    String fileName = "quick.pdf";
    File file = getResourceFile(fileName);
    MultiPartBuilder multiPartBuilder = MultiPartBuilder.create().setFileData(new FileData(fileName, file));
    MultiPartRequest reqBody = multiPartBuilder.build();
    // Upload quick.pdf file into 'folder'
    HttpResponse response = post(getNodeChildrenUrl(folder_Id), reqBody.getBody(), null, reqBody.getContentType(), 201);
    Document document = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
    String contentNodeId = document.getId();
    // pause briefly
    Thread.sleep(DELAY_IN_MS);
    // Get rendition (not created yet) information for node
    response = getSingle(getNodeRenditionsUrl(contentNodeId), "doclib", 200);
    Rendition rendition = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Rendition.class);
    assertNotNull(rendition);
    assertEquals(RenditionStatus.NOT_CREATED, rendition.getStatus());
    // Download placeholder - by default with Content-Disposition header
    Map<String, String> params = new HashMap<>();
    params.put("placeholder", "true");
    response = getSingle(getNodeRenditionsUrl(contentNodeId), ("doclib/content"), params, 200);
    assertNotNull(response.getResponseAsBytes());
    Map<String, String> responseHeaders = response.getHeaders();
    assertNotNull(responseHeaders);
    String contentDisposition = responseHeaders.get("Content-Disposition");
    assertNotNull(contentDisposition);
    assertTrue(contentDisposition.contains("filename=\"doclib\""));
    String contentType = responseHeaders.get("Content-Type");
    assertNotNull(contentType);
    assertTrue(contentType.startsWith(MimetypeMap.MIMETYPE_IMAGE_PNG));
    // Download placeholder - without Content-Disposition header (attachment=false)
    params.put("attachment", "false");
    response = getSingle(getNodeRenditionsUrl(contentNodeId), ("doclib/content"), params, 200);
    assertNotNull(response.getResponseAsBytes());
    responseHeaders = response.getHeaders();
    assertNotNull(responseHeaders);
    String cacheControl = responseHeaders.get("Cache-Control");
    assertNotNull(cacheControl);
    assertTrue(cacheControl.contains("must-revalidate"));
    assertNull(responseHeaders.get("Content-Disposition"));
    contentType = responseHeaders.get("Content-Type");
    assertNotNull(contentType);
    assertTrue(contentType.startsWith(MimetypeMap.MIMETYPE_IMAGE_PNG));
    // Test 304 response - placeholder=true&attachment=false
    String lastModifiedHeader = responseHeaders.get(LAST_MODIFIED_HEADER);
    assertNotNull(lastModifiedHeader);
    Map<String, String> headers = Collections.singletonMap(IF_MODIFIED_SINCE_HEADER, lastModifiedHeader);
    // Currently the placeholder file is not cached.
    // As the placeholder is not a NodeRef, so we can't get the ContentModel.PROP_MODIFIED date.
    getSingle(getNodeRenditionsUrl(contentNodeId), "doclib/content", params, headers, 200);
    // Create and get 'doclib' rendition
    rendition = createAndGetRendition(contentNodeId, "doclib");
    assertNotNull(rendition);
    assertEquals(RenditionStatus.CREATED, rendition.getStatus());
    // Download rendition - by default with Content-Disposition header
    response = getSingle(getNodeRenditionsUrl(contentNodeId), "doclib/content", 200);
    assertNotNull(response.getResponseAsBytes());
    responseHeaders = response.getHeaders();
    assertNotNull(responseHeaders);
    contentDisposition = responseHeaders.get("Content-Disposition");
    assertNotNull(contentDisposition);
    assertTrue(contentDisposition.contains("filename=\"doclib\""));
    contentType = responseHeaders.get("Content-Type");
    assertNotNull(contentType);
    assertTrue(contentType.startsWith(MimetypeMap.MIMETYPE_IMAGE_PNG));
    // Download rendition - without Content-Disposition header (attachment=false)
    params = Collections.singletonMap("attachment", "false");
    response = getSingle(getNodeRenditionsUrl(contentNodeId), "doclib/content", params, 200);
    assertNotNull(response.getResponseAsBytes());
    responseHeaders = response.getHeaders();
    assertNotNull(responseHeaders);
    assertNull(responseHeaders.get("Content-Disposition"));
    contentType = responseHeaders.get("Content-Type");
    assertNotNull(contentType);
    assertTrue(contentType.startsWith(MimetypeMap.MIMETYPE_IMAGE_PNG));
    // Download rendition - with Content-Disposition header (attachment=true) same as default
    params = Collections.singletonMap("attachment", "true");
    response = getSingle(getNodeRenditionsUrl(contentNodeId), "doclib/content", params, 200);
    assertNotNull(response.getResponseAsBytes());
    responseHeaders = response.getHeaders();
    assertNotNull(responseHeaders);
    // Check the cache settings which have been set in the RenditionsImpl#getContent()
    cacheControl = responseHeaders.get("Cache-Control");
    assertNotNull(cacheControl);
    assertFalse(cacheControl.contains("must-revalidate"));
    assertTrue(cacheControl.contains("max-age=31536000"));
    contentDisposition = responseHeaders.get("Content-Disposition");
    assertNotNull(contentDisposition);
    assertTrue(contentDisposition.contains("filename=\"doclib\""));
    contentType = responseHeaders.get("Content-Type");
    assertNotNull(contentType);
    assertTrue(contentType.startsWith(MimetypeMap.MIMETYPE_IMAGE_PNG));
    // Test 304 response - doclib rendition (attachment=true)
    lastModifiedHeader = responseHeaders.get(LAST_MODIFIED_HEADER);
    assertNotNull(lastModifiedHeader);
    headers = Collections.singletonMap(IF_MODIFIED_SINCE_HEADER, lastModifiedHeader);
    getSingle(getNodeRenditionsUrl(contentNodeId), "doclib/content", params, headers, 304);
    // Here we want to overwrite/update the existing content in order to force a new rendition creation,
    // so the ContentModel.PROP_MODIFIED date would be different. Hence, we use the multipart upload by providing
    // the old fileName and setting overwrite field to true
    file = getResourceFile("quick-2.pdf");
    multiPartBuilder = MultiPartBuilder.create().setFileData(new FileData(fileName, file)).setOverwrite(true);
    reqBody = multiPartBuilder.build();
    // Update quick.pdf
    post(getNodeChildrenUrl(folder_Id), reqBody.getBody(), null, reqBody.getContentType(), 201);
    // The requested "If-Modified-Since" date is older than rendition modified date
    response = getSingleWithDelayRetry(getNodeRenditionsUrl(contentNodeId), "doclib/content", params, headers, MAX_RETRY, PAUSE_TIME, 200);
    assertNotNull(response);
    responseHeaders = response.getHeaders();
    assertNotNull(responseHeaders);
    String newLastModifiedHeader = responseHeaders.get(LAST_MODIFIED_HEADER);
    assertNotNull(newLastModifiedHeader);
    assertNotEquals(lastModifiedHeader, newLastModifiedHeader);
    // -ve tests
    // nodeId in the path parameter does not represent a file
    getSingle(getNodeRenditionsUrl(folder_Id), "doclib/content", 400);
    // nodeId in the path parameter does not exist
    getSingle(getNodeRenditionsUrl(UUID.randomUUID().toString()), "doclib/content", 404);
    // renditionId in the path parameter is not registered/available
    getSingle(getNodeRenditionsUrl(contentNodeId), ("renditionId" + System.currentTimeMillis() + "/content"), 404);
    InputStream inputStream = new ByteArrayInputStream("The quick brown fox jumps over the lazy dog".getBytes());
    file = TempFileProvider.createTempFile(inputStream, "RenditionsTest-", ".abcdef");
    reqBody = MultiPartBuilder.create().setFileData(new FileData(file.getName(), file)).build();
    // Upload temp file into 'folder'
    response = post(getNodeChildrenUrl(folder_Id), reqBody.getBody(), null, reqBody.getContentType(), 201);
    document = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
    contentNodeId = document.getId();
    // The content of the rendition does not exist and the placeholder parameter is not present
    getSingle(getNodeRenditionsUrl(contentNodeId), "doclib/content", 404);
    // The content of the rendition does not exist and the placeholder parameter has a value of "false"
    params = Collections.singletonMap("placeholder", "false");
    getSingle(getNodeRenditionsUrl(contentNodeId), "doclib/content", params, 404);
    // The rendition does not exist, a placeholder is not available and the placeholder parameter has a value of "true"
    params = Collections.singletonMap("placeholder", "true");
    getSingle(getNodeRenditionsUrl(contentNodeId), ("renditionId" + System.currentTimeMillis() + "/content"), params, 404);
    // Create a node without any content
    String emptyContentNodeId = addToDocumentLibrary(userOneN1Site, "emptyDoc.txt", TYPE_CM_CONTENT, userOneN1.getId());
    getSingle(getNodeRenditionsUrl(emptyContentNodeId), "doclib/content", params, 200);
}
Also used : MultiPartBuilder(org.alfresco.rest.api.tests.util.MultiPartBuilder) HashMap(java.util.HashMap) ByteArrayInputStream(java.io.ByteArrayInputStream) Rendition(org.alfresco.rest.api.tests.client.data.Rendition) ByteArrayInputStream(java.io.ByteArrayInputStream) InputStream(java.io.InputStream) HttpResponse(org.alfresco.rest.api.tests.client.HttpResponse) MultiPartRequest(org.alfresco.rest.api.tests.util.MultiPartBuilder.MultiPartRequest) RestApiUtil.toJsonAsString(org.alfresco.rest.api.tests.util.RestApiUtil.toJsonAsString) Document(org.alfresco.rest.api.tests.client.data.Document) File(java.io.File) FileData(org.alfresco.rest.api.tests.util.MultiPartBuilder.FileData) Test(org.junit.Test)

Example 3 with MultiPartBuilder

use of org.alfresco.rest.api.tests.util.MultiPartBuilder in project alfresco-remote-api by Alfresco.

the class SharedLinkApiTest method testSharedLinkCreateGetDelete.

/**
 * Tests shared links to file (content)
 *
 * <p>POST:</p>
 * {@literal <host>:<port>/alfresco/api/<networkId>/public/alfresco/versions/1/shared-links}
 *
 * <p>DELETE:</p>
 * {@literal <host>:<port>/alfresco/api/<networkId>/public/alfresco/versions/1/shared-links/<sharedId>}
 *
 * <p>GET:</p>
 * The following do not require authentication
 * {@literal <host>:<port>/alfresco/api/<networkId>/public/alfresco/versions/1/shared-links/<sharedId>}
 * {@literal <host>:<port>/alfresco/api/<networkId>/public/alfresco/versions/1/shared-links/<sharedId>/content}
 * {@literal <host>:<port>/alfresco/api/<networkId>/public/alfresco/versions/1/shared-links/<sharedId>/renditions}
 * {@literal <host>:<port>/alfresco/api/<networkId>/public/alfresco/versions/1/shared-links/<sharedId>/renditions/<renditionId>}
 * {@literal <host>:<port>/alfresco/api/<networkId>/public/alfresco/versions/1/shared-links/<sharedId>/renditions/<renditionId>/content}
 */
@Test
public void testSharedLinkCreateGetDelete() throws Exception {
    // As user 1 ...
    setRequestContext(user1);
    // create doc d1 - pdf
    String sharedFolderNodeId = getSharedNodeId();
    String fileName1 = "quick" + RUNID + "_1.pdf";
    File file1 = getResourceFile("quick.pdf");
    byte[] file1_originalBytes = Files.readAllBytes(Paths.get(file1.getAbsolutePath()));
    String file1_MimeType = MimetypeMap.MIMETYPE_PDF;
    MultiPartBuilder multiPartBuilder = MultiPartBuilder.create().setFileData(new MultiPartBuilder.FileData(fileName1, file1, file1_MimeType));
    MultiPartBuilder.MultiPartRequest reqBody = multiPartBuilder.build();
    HttpResponse response = post(getNodeChildrenUrl(sharedFolderNodeId), reqBody.getBody(), null, reqBody.getContentType(), 201);
    Document doc1 = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
    String d1Id = doc1.getId();
    // create doc d2 - plain text
    String myFolderNodeId = getMyNodeId();
    String content2Text = "The quick brown fox jumps over the lazy dog 2.";
    String fileName2 = "content" + RUNID + "_2.txt";
    Document doc2 = createTextFile(myFolderNodeId, fileName2, content2Text);
    String d2Id = doc2.getId();
    String file2_MimeType = MimetypeMap.MIMETYPE_TEXT_PLAIN;
    // As user 2 ...
    setRequestContext(user2);
    response = getSingle(NodesEntityResource.class, d1Id, null, 200);
    Node nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class);
    Date docModifiedAt = nodeResp.getModifiedAt();
    String docModifiedBy = nodeResp.getModifiedByUser().getId();
    assertEquals(user1, docModifiedBy);
    // create shared link to document 1
    Map<String, String> body = new HashMap<>();
    body.put("nodeId", d1Id);
    response = post(URL_SHARED_LINKS, toJsonAsStringNonNull(body), 201);
    QuickShareLink resp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), QuickShareLink.class);
    String shared1Id = resp.getId();
    assertNotNull(shared1Id);
    assertEquals(d1Id, resp.getNodeId());
    assertEquals(fileName1, resp.getName());
    assertEquals("The quick brown fox jumps over the lazy dog", resp.getTitle());
    assertEquals("Gym class featuring a brown fox and lazy dog", resp.getDescription());
    assertEquals(file1_MimeType, resp.getContent().getMimeType());
    assertEquals("Adobe PDF Document", resp.getContent().getMimeTypeName());
    assertEquals(new Long(file1_originalBytes.length), resp.getContent().getSizeInBytes());
    assertEquals("UTF-8", resp.getContent().getEncoding());
    // not changed
    assertEquals(docModifiedAt.getTime(), resp.getModifiedAt().getTime());
    // not changed (ie. not user2)
    assertEquals(docModifiedBy, resp.getModifiedByUser().getId());
    assertEquals(UserInfo.getTestDisplayName(docModifiedBy), resp.getModifiedByUser().getDisplayName());
    assertEquals(user2, resp.getSharedByUser().getId());
    assertEquals(UserInfo.getTestDisplayName(user2), resp.getSharedByUser().getDisplayName());
    // -ve test - try to create again (same user) - already exists
    post(URL_SHARED_LINKS, toJsonAsStringNonNull(body), 409);
    // As user 1 ...
    setRequestContext(user1);
    // create shared link to document 2
    body = new HashMap<>();
    body.put("nodeId", d2Id);
    response = post(URL_SHARED_LINKS, toJsonAsStringNonNull(body), 201);
    resp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), QuickShareLink.class);
    String shared2Id = resp.getId();
    // currently passing auth should make no difference (irrespective of MT vs non-MY enb)
    // access to get shared link info - pass user1 (but ignore in non-MT)
    Map<String, String> params = Collections.singletonMap("include", "allowableOperations");
    response = getSingle(QuickShareLinkEntityResource.class, shared1Id, params, 200);
    resp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), QuickShareLink.class);
    assertEquals(shared1Id, resp.getId());
    assertEquals(fileName1, resp.getName());
    assertEquals("The quick brown fox jumps over the lazy dog", resp.getTitle());
    assertEquals("Gym class featuring a brown fox and lazy dog", resp.getDescription());
    assertEquals(d1Id, resp.getNodeId());
    // include is ignored
    assertNull(resp.getAllowableOperations());
    // include is ignored
    assertNull(resp.getAllowableOperationsOnTarget());
    // userId not returned
    assertNull(resp.getModifiedByUser().getId());
    assertEquals(UserInfo.getTestDisplayName(user1), resp.getModifiedByUser().getDisplayName());
    // userId not returned
    assertNull(resp.getSharedByUser().getId());
    assertEquals(UserInfo.getTestDisplayName(user2), resp.getSharedByUser().getDisplayName());
    // access to get shared link info - pass user2 (but ignore in non-MT)
    params = Collections.singletonMap("include", "allowableOperations");
    response = getSingle(QuickShareLinkEntityResource.class, shared1Id, params, 200);
    resp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), QuickShareLink.class);
    assertEquals(shared1Id, resp.getId());
    assertEquals(fileName1, resp.getName());
    assertEquals(d1Id, resp.getNodeId());
    // include is ignored
    assertNull(resp.getAllowableOperations());
    // include is ignored
    assertNull(resp.getAllowableOperationsOnTarget());
    // userId not returned
    assertNull(resp.getModifiedByUser().getId());
    assertEquals(UserInfo.getTestDisplayName(user1), resp.getModifiedByUser().getDisplayName());
    // userId not returned
    assertNull(resp.getSharedByUser().getId());
    assertEquals(UserInfo.getTestDisplayName(user2), resp.getSharedByUser().getDisplayName());
    // allowable operations not included - no params
    response = getSingle(QuickShareLinkEntityResource.class, shared1Id, null, 200);
    resp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), QuickShareLink.class);
    assertNull(resp.getAllowableOperations());
    assertNull(resp.getAllowableOperationsOnTarget());
    setRequestContext(null);
    // unauth access to get shared link info
    // note: this will be ignore for unauth access
    params = Collections.singletonMap("include", "allowableOperations");
    response = getSingle(QuickShareLinkEntityResource.class, shared1Id, params, 200);
    resp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), QuickShareLink.class);
    assertEquals(shared1Id, resp.getId());
    assertEquals(fileName1, resp.getName());
    assertEquals(d1Id, resp.getNodeId());
    // include is ignored
    assertNull(resp.getAllowableOperations());
    // include is ignored
    assertNull(resp.getAllowableOperationsOnTarget());
    // userId not returned
    assertNull(resp.getModifiedByUser().getId());
    assertEquals(UserInfo.getTestDisplayName(user1), resp.getModifiedByUser().getDisplayName());
    // userId not returned
    assertNull(resp.getSharedByUser().getId());
    assertEquals(UserInfo.getTestDisplayName(user2), resp.getSharedByUser().getDisplayName());
    // unauth access to file 1 content (via shared link)
    response = getSingle(QuickShareLinkEntityResource.class, shared1Id + "/content", null, 200);
    assertArrayEquals(file1_originalBytes, response.getResponseAsBytes());
    Map<String, String> responseHeaders = response.getHeaders();
    assertNotNull(responseHeaders);
    assertEquals(file1_MimeType + ";charset=UTF-8", responseHeaders.get("Content-Type"));
    assertNotNull(responseHeaders.get("Expires"));
    assertEquals("attachment; filename=\"" + fileName1 + "\"; filename*=UTF-8''" + fileName1 + "", responseHeaders.get("Content-Disposition"));
    String lastModifiedHeader = responseHeaders.get(LAST_MODIFIED_HEADER);
    assertNotNull(lastModifiedHeader);
    // Test 304 response
    Map<String, String> headers = Collections.singletonMap(IF_MODIFIED_SINCE_HEADER, lastModifiedHeader);
    getSingle(URL_SHARED_LINKS, shared1Id + "/content", null, headers, 304);
    // unauth access to file 1 content (via shared link) - without Content-Disposition header (attachment=false)
    params = new HashMap<>();
    params.put("attachment", "false");
    response = getSingle(QuickShareLinkEntityResource.class, shared1Id + "/content", params, 200);
    assertArrayEquals(file1_originalBytes, response.getResponseAsBytes());
    responseHeaders = response.getHeaders();
    assertNotNull(responseHeaders);
    assertEquals(file1_MimeType + ";charset=UTF-8", responseHeaders.get("Content-Type"));
    assertNotNull(responseHeaders.get(LAST_MODIFIED_HEADER));
    assertNotNull(responseHeaders.get("Expires"));
    assertNull(responseHeaders.get("Content-Disposition"));
    // unauth access to file 2 content (via shared link)
    response = getSingle(QuickShareLinkEntityResource.class, shared2Id + "/content", null, 200);
    assertArrayEquals(content2Text.getBytes(), response.getResponseAsBytes());
    responseHeaders = response.getHeaders();
    assertNotNull(responseHeaders);
    assertEquals(file2_MimeType + ";charset=ISO-8859-1", responseHeaders.get("Content-Type"));
    assertNotNull(responseHeaders.get("Expires"));
    assertNotNull(responseHeaders.get(LAST_MODIFIED_HEADER));
    assertEquals("attachment; filename=\"" + fileName2 + "\"; filename*=UTF-8''" + fileName2 + "", responseHeaders.get("Content-Disposition"));
    // -ve test - unauth access to get shared link file content - without Content-Disposition header (attachment=false) - header ignored (plain text is not in white list)
    params = new HashMap<>();
    params.put("attachment", "false");
    response = getSingle(QuickShareLinkEntityResource.class, shared2Id + "/content", params, 200);
    assertEquals("attachment; filename=\"" + fileName2 + "\"; filename*=UTF-8''" + fileName2 + "", response.getHeaders().get("Content-Disposition"));
    // -ve shared link rendition tests
    {
        // -ve test - try to get non-existent rendition content
        getSingle(QuickShareLinkEntityResource.class, shared1Id + "/renditions/doclib/content", null, 404);
        // -ve test - try to get unregistered rendition content
        getSingle(QuickShareLinkEntityResource.class, shared1Id + "/renditions/dummy/content", null, 404);
    }
    // unauth access to get rendition info for a shared link (available => CREATED rendition only)
    // -ve shared link rendition tests
    {
        // -ve test - try to get not created rendition for the given shared link
        getSingle(QuickShareLinkEntityResource.class, shared1Id + "/renditions/doclib", null, 404);
        // -ve test - try to get unregistered rendition
        getSingle(QuickShareLinkEntityResource.class, shared1Id + "/renditions/dummy", null, 404);
    }
    // unauth access to get shared link renditions info (available => CREATED renditions only)
    response = getAll(URL_SHARED_LINKS + "/" + shared1Id + "/renditions", null, 200);
    List<Rendition> renditions = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Rendition.class);
    assertEquals(0, renditions.size());
    // create rendition of pdf doc - note: for some reason create rendition of txt doc fail on build m/c (TBC) ?
    setRequestContext(user2);
    Rendition rendition = createAndGetRendition(d1Id, "doclib");
    assertNotNull(rendition);
    assertEquals(Rendition.RenditionStatus.CREATED, rendition.getStatus());
    setRequestContext(null);
    // unauth access to get shared link renditions info (available => CREATED renditions only)
    response = getAll(URL_SHARED_LINKS + "/" + shared1Id + "/renditions", null, 200);
    renditions = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Rendition.class);
    assertEquals(1, renditions.size());
    assertEquals(Rendition.RenditionStatus.CREATED, renditions.get(0).getStatus());
    assertEquals("doclib", renditions.get(0).getId());
    {
        // try to get a created rendition for the given shared link
        getSingle(QuickShareLinkEntityResource.class, shared1Id + "/renditions/doclib", null, 200);
    }
    // unauth access to get shared link file rendition content
    response = getSingle(QuickShareLinkEntityResource.class, shared1Id + "/renditions/doclib/content", null, 200);
    assertTrue(response.getResponseAsBytes().length > 0);
    responseHeaders = response.getHeaders();
    assertNotNull(responseHeaders);
    assertEquals(MimetypeMap.MIMETYPE_IMAGE_PNG + ";charset=UTF-8", responseHeaders.get("Content-Type"));
    assertNotNull(responseHeaders.get(LAST_MODIFIED_HEADER));
    assertNotNull(responseHeaders.get("Expires"));
    String docName = "doclib";
    assertEquals("attachment; filename=\"" + docName + "\"; filename*=UTF-8''" + docName + "", responseHeaders.get("Content-Disposition"));
    // unauth access to get shared link file rendition content - without Content-Disposition header (attachment=false)
    params = new HashMap<>();
    params.put("attachment", "false");
    response = getSingle(QuickShareLinkEntityResource.class, shared1Id + "/renditions/doclib/content", params, 200);
    assertTrue(response.getResponseAsBytes().length > 0);
    responseHeaders = response.getHeaders();
    assertNotNull(responseHeaders);
    assertEquals(MimetypeMap.MIMETYPE_IMAGE_PNG + ";charset=UTF-8", responseHeaders.get("Content-Type"));
    assertNotNull(responseHeaders.get("Expires"));
    assertNull(responseHeaders.get("Content-Disposition"));
    lastModifiedHeader = responseHeaders.get(LAST_MODIFIED_HEADER);
    assertNotNull(lastModifiedHeader);
    // Test 304 response
    headers = Collections.singletonMap(IF_MODIFIED_SINCE_HEADER, lastModifiedHeader);
    getSingle(URL_SHARED_LINKS, shared1Id + "/renditions/doclib/content", null, headers, 304);
    // -ve delete tests
    {
        // -ve test - unauthenticated
        setRequestContext(null);
        deleteSharedLink(shared1Id, 401);
        setRequestContext(user1);
        // -ve test - user1 cannot delete shared link
        deleteSharedLink(shared1Id, 403);
        // -ve test - delete - cannot delete non-existent link
        deleteSharedLink("dummy", 404);
    }
    // -ve create tests
    {
        // As user 1 ...
        // -ve test - try to create again (different user, that has read permission) - already exists
        body = new HashMap<>();
        body.put("nodeId", d1Id);
        post(URL_SHARED_LINKS, toJsonAsStringNonNull(body), 409);
        // -ve - create - missing nodeId
        body = new HashMap<>();
        post(URL_SHARED_LINKS, toJsonAsStringNonNull(body), 400);
        // -ve - create - unknown nodeId
        body = new HashMap<>();
        body.put("nodeId", "dummy");
        post(URL_SHARED_LINKS, toJsonAsStringNonNull(body), 404);
        // -ve - create - try to link to folder (ie. not a file)
        String f1Id = createFolder(myFolderNodeId, "f1 " + RUNID).getId();
        body = new HashMap<>();
        body.put("nodeId", f1Id);
        post(URL_SHARED_LINKS, toJsonAsStringNonNull(body), 400);
        // -ve test - cannot create if user does not have permission to read
        setRequestContext(user2);
        body = new HashMap<>();
        body.put("nodeId", d2Id);
        post(URL_SHARED_LINKS, toJsonAsStringNonNull(body), 403);
        // -ve test - unauthenticated
        setRequestContext(null);
        body = new HashMap<>();
        body.put("nodeId", d1Id);
        post(URL_SHARED_LINKS, toJsonAsStringNonNull(body), 401);
    }
    // delete shared link
    setRequestContext(user2);
    deleteSharedLink(shared1Id);
    // -ve test - delete - cannot delete non-existent link
    setRequestContext(user1);
    deleteSharedLink(shared1Id, 404);
    setRequestContext(user2);
    response = getSingle(NodesEntityResource.class, d1Id, null, 200);
    nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class);
    // not changed
    assertEquals(docModifiedAt.getTime(), nodeResp.getModifiedAt().getTime());
    // not changed (ie. not user2)
    assertEquals(docModifiedBy, nodeResp.getModifiedByUser().getId());
    // -ve get tests
    {
        // try to get link that has been deleted (see above)
        getSingle(QuickShareLinkEntityResource.class, shared1Id, null, 404);
        getSingle(QuickShareLinkEntityResource.class, shared1Id + "/content", null, 404);
        // try to get non-existent link
        getSingle(QuickShareLinkEntityResource.class, "dummy", null, 404);
        getSingle(QuickShareLinkEntityResource.class, "dummy/content", null, 404);
    }
    // TODO if and when these tests are optionally runnable via remote env then we could skip this part of the test
    // (else need to verify test mechanism for enterprise admin via jmx ... etc)
    QuickShareLinksImpl quickShareLinks = applicationContext.getBean("quickShareLinks", QuickShareLinksImpl.class);
    try {
        quickShareLinks.setEnabled(false);
        setRequestContext(user1);
        // -ve - disabled service tests
        body.put("nodeId", "dummy");
        post(URL_SHARED_LINKS, toJsonAsStringNonNull(body), 501);
        setRequestContext(null);
        getSingle(QuickShareLinkEntityResource.class, "dummy", null, 501);
        getSingle(QuickShareLinkEntityResource.class, "dummy/content", null, 501);
        setRequestContext(user1);
        deleteSharedLink("dummy", 501);
    } finally {
        quickShareLinks.setEnabled(true);
    }
}
Also used : HashMap(java.util.HashMap) Rendition(org.alfresco.rest.api.tests.client.data.Rendition) Node(org.alfresco.rest.api.tests.client.data.Node) HttpResponse(org.alfresco.rest.api.tests.client.HttpResponse) NodesEntityResource(org.alfresco.rest.api.nodes.NodesEntityResource) Document(org.alfresco.rest.api.tests.client.data.Document) QuickShareLinksImpl(org.alfresco.rest.api.impl.QuickShareLinksImpl) Date(java.util.Date) QuickShareLinkEntityResource(org.alfresco.rest.api.quicksharelinks.QuickShareLinkEntityResource) MultiPartBuilder(org.alfresco.rest.api.tests.util.MultiPartBuilder) File(java.io.File) QuickShareLink(org.alfresco.rest.api.model.QuickShareLink) Test(org.junit.Test)

Example 4 with MultiPartBuilder

use of org.alfresco.rest.api.tests.util.MultiPartBuilder in project alfresco-remote-api by Alfresco.

the class DeletedNodesTest method testListRenditions.

/**
 * Test retrieve renditions for deleted nodes
 * <p>post:</p>
 * {@literal <host>:<port>/alfresco/api/-default-/public/alfresco/versions/1/deleted-nodes/<nodeId>/renditions}
 * {@literal <host>:<port>/alfresco/api/-default-/public/alfresco/versions/1/deleted-nodes/<nodeId>/rendition/<renditionId>}
 */
@Test
public void testListRenditions() throws Exception {
    setRequestContext(user1);
    Date now = new Date();
    String folder1 = "folder" + now.getTime() + "_1";
    Folder createdFolder = createFolder(tDocLibNodeId, folder1, null);
    assertNotNull(createdFolder);
    String f1Id = createdFolder.getId();
    // Create multipart request
    String fileName = "quick.pdf";
    File file = getResourceFile(fileName);
    MultiPartBuilder multiPartBuilder = MultiPartBuilder.create().setFileData(new MultiPartBuilder.FileData(fileName, file));
    MultiPartBuilder.MultiPartRequest reqBody = multiPartBuilder.build();
    // Upload quick.pdf file into the folder previously created
    HttpResponse response = post(getNodeChildrenUrl(f1Id), reqBody.getBody(), null, reqBody.getContentType(), 201);
    Document document = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
    String contentNodeId = document.getId();
    // create doclib rendition and move node to trashcan
    createAndGetRendition(contentNodeId, "doclib");
    deleteNode(contentNodeId);
    // List all renditions and check for results
    PublicApiClient.Paging paging = getPaging(0, 50);
    response = getAll(getDeletedNodeRenditionsUrl(contentNodeId), paging, 200);
    List<Rendition> renditions = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Rendition.class);
    assertTrue(renditions.size() >= 3);
    // +ve test - get previously created 'doclib' rendition
    response = getSingle(getDeletedNodeRenditionsUrl(contentNodeId), "doclib", 200);
    Rendition doclibRendition = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Rendition.class);
    assertNotNull(doclibRendition);
    assertEquals(Rendition.RenditionStatus.CREATED, doclibRendition.getStatus());
    ContentInfo contentInfo = doclibRendition.getContent();
    assertNotNull(contentInfo);
    assertEquals(MimetypeMap.MIMETYPE_IMAGE_PNG, contentInfo.getMimeType());
    assertEquals("PNG Image", contentInfo.getMimeTypeName());
    assertNotNull(contentInfo.getEncoding());
    assertTrue(contentInfo.getSizeInBytes() > 0);
    // +ve test - Add a filter on rendition 'status' and list only 'NOT_CREATED' renditions
    Map<String, String> params = new HashMap<>(1);
    params.put("where", "(status='NOT_CREATED')");
    response = getAll(getDeletedNodeRenditionsUrl(contentNodeId), paging, params, 200);
    renditions = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Rendition.class);
    assertTrue(renditions.size() >= 2);
    // +ve test - Add a filter on rendition 'status' and list only the CREATED renditions
    params.put("where", "(status='CREATED')");
    response = getAll(getDeletedNodeRenditionsUrl(contentNodeId), paging, params, 200);
    renditions = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Rendition.class);
    assertEquals("Only 'doclib' rendition should be returned.", 1, renditions.size());
    // SkipCount=0,MaxItems=2
    paging = getPaging(0, 2);
    // List all available renditions
    response = getAll(getDeletedNodeRenditionsUrl(contentNodeId), paging, 200);
    renditions = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Rendition.class);
    assertEquals(2, renditions.size());
    PublicApiClient.ExpectedPaging expectedPaging = RestApiUtil.parsePaging(response.getJsonResponse());
    assertEquals(2, expectedPaging.getCount().intValue());
    assertEquals(0, expectedPaging.getSkipCount().intValue());
    assertEquals(2, expectedPaging.getMaxItems().intValue());
    assertTrue(expectedPaging.getTotalItems() >= 3);
    assertTrue(expectedPaging.getHasMoreItems());
    // SkipCount=1,MaxItems=3
    paging = getPaging(1, 3);
    // List all available renditions
    response = getAll(getDeletedNodeRenditionsUrl(contentNodeId), paging, 200);
    renditions = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Rendition.class);
    assertEquals(3, renditions.size());
    expectedPaging = RestApiUtil.parsePaging(response.getJsonResponse());
    assertEquals(3, expectedPaging.getCount().intValue());
    assertEquals(1, expectedPaging.getSkipCount().intValue());
    assertEquals(3, expectedPaging.getMaxItems().intValue());
    assertTrue(expectedPaging.getTotalItems() >= 3);
    // +ve test - Test returned renditions are ordered (natural sort order)
    response = getAll(getDeletedNodeRenditionsUrl(contentNodeId), paging, params, 200);
    renditions = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Rendition.class);
    assertTrue(Ordering.natural().isOrdered(renditions));
    // Check again to make sure the ordering wasn't coincidental
    response = getAll(getDeletedNodeRenditionsUrl(contentNodeId), paging, params, 200);
    renditions = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Rendition.class);
    assertTrue(Ordering.natural().isOrdered(renditions));
    // -ve - nodeId in the path parameter does not exist
    getAll(getDeletedNodeRenditionsUrl(UUID.randomUUID().toString()), paging, params, 404);
    // -ve test - Create an empty text file
    Document emptyDoc = createEmptyTextFile(f1Id, "d1.txt");
    getAll(getDeletedNodeRenditionsUrl(emptyDoc.getId()), paging, params, 404);
    // -ve - nodeId in the path parameter does not represent a file
    deleteNode(f1Id);
    getAll(getDeletedNodeRenditionsUrl(f1Id), paging, params, 400);
    // -ve - Invalid status value
    params.put("where", "(status='WRONG')");
    getAll(getDeletedNodeRenditionsUrl(contentNodeId), paging, params, 400);
    // -ve - Invalid filter (only 'status' is supported)
    params.put("where", "(id='doclib')");
    getAll(getDeletedNodeRenditionsUrl(contentNodeId), paging, params, 400);
    // -ve test - Authentication failed
    setRequestContext(null);
    getAll(getDeletedNodeRenditionsUrl(contentNodeId), paging, params, 401);
    // -ve - Current user does not have permission for nodeId
    setRequestContext(user2);
    getAll(getDeletedNodeRenditionsUrl(contentNodeId), paging, params, 403);
    // Test get single node rendition
    setRequestContext(user1);
    // -ve - nodeId in the path parameter does not exist
    getSingle(getDeletedNodeRenditionsUrl(UUID.randomUUID().toString()), "doclib", 404);
    // -ve - renditionId in the path parameter is not registered/available
    getSingle(getNodeRenditionsUrl(contentNodeId), ("renditionId" + System.currentTimeMillis()), 404);
    // -ve - nodeId in the path parameter does not represent a file
    getSingle(getDeletedNodeRenditionsUrl(f1Id), "doclib", 400);
    // -ve test - Authentication failed
    setRequestContext(null);
    getSingle(getDeletedNodeRenditionsUrl(contentNodeId), "doclib", 401);
    // -ve - Current user does not have permission for nodeId
    setRequestContext(user2);
    getSingle(getDeletedNodeRenditionsUrl(contentNodeId), "doclib", 403);
}
Also used : HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Rendition(org.alfresco.rest.api.tests.client.data.Rendition) HttpResponse(org.alfresco.rest.api.tests.client.HttpResponse) Folder(org.alfresco.rest.api.tests.client.data.Folder) Document(org.alfresco.rest.api.tests.client.data.Document) Date(java.util.Date) MultiPartBuilder(org.alfresco.rest.api.tests.util.MultiPartBuilder) ContentInfo(org.alfresco.rest.api.tests.client.data.ContentInfo) PublicApiClient(org.alfresco.rest.api.tests.client.PublicApiClient) File(java.io.File) Test(org.junit.Test)

Example 5 with MultiPartBuilder

use of org.alfresco.rest.api.tests.util.MultiPartBuilder in project alfresco-remote-api by Alfresco.

the class DeletedNodesTest method testDownloadFileContent.

/**
 * Tests download of file/content.
 * <p>GET:</p>
 * {@literal <host>:<port>/alfresco/api/-default-/public/alfresco/versions/1/deleted-nodes/<nodeId>/content}
 */
@Test
public void testDownloadFileContent() throws Exception {
    setRequestContext(user1);
    // Use existing test file
    String fileName = "quick-1.txt";
    File file = getResourceFile(fileName);
    MultiPartBuilder multiPartBuilder = MultiPartBuilder.create().setFileData(new MultiPartBuilder.FileData(fileName, file));
    MultiPartBuilder.MultiPartRequest reqBody = multiPartBuilder.build();
    // Upload text content
    HttpResponse response = post(getNodeChildrenUrl(Nodes.PATH_MY), reqBody.getBody(), null, reqBody.getContentType(), 201);
    Document document = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
    String contentNodeId = document.getId();
    // Check the upload response
    assertEquals(fileName, document.getName());
    ContentInfo contentInfo = document.getContent();
    assertNotNull(contentInfo);
    assertEquals(MimetypeMap.MIMETYPE_TEXT_PLAIN, contentInfo.getMimeType());
    // move the node to Trashcan
    deleteNode(document.getId());
    // Download text content - by default with Content-Disposition header
    response = getSingle(TrashcanEntityResource.class, contentNodeId + "/content", null, 200);
    String textContent = response.getResponse();
    assertEquals("The quick brown fox jumps over the lazy dog", textContent);
    Map<String, String> responseHeaders = response.getHeaders();
    assertNotNull(responseHeaders);
    assertEquals("attachment; filename=\"quick-1.txt\"; filename*=UTF-8''quick-1.txt", responseHeaders.get("Content-Disposition"));
    String cacheControl = responseHeaders.get("Cache-Control");
    assertNotNull(cacheControl);
    assertTrue(cacheControl.contains("must-revalidate"));
    assertTrue(cacheControl.contains("max-age=0"));
    assertNotNull(responseHeaders.get("Expires"));
    String lastModifiedHeader = responseHeaders.get(LAST_MODIFIED_HEADER);
    assertNotNull(lastModifiedHeader);
    Map<String, String> headers = Collections.singletonMap(IF_MODIFIED_SINCE_HEADER, lastModifiedHeader);
    // Test 304 response
    getSingle(URL_DELETED_NODES + "/" + contentNodeId + "/content", null, null, headers, 304);
    // Use existing pdf test file
    fileName = "quick.pdf";
    file = getResourceFile(fileName);
    byte[] originalBytes = Files.readAllBytes(Paths.get(file.getAbsolutePath()));
    multiPartBuilder = MultiPartBuilder.create().setFileData(new MultiPartBuilder.FileData(fileName, file));
    reqBody = multiPartBuilder.build();
    // Upload binary content
    response = post(getNodeChildrenUrl(Nodes.PATH_MY), reqBody.getBody(), null, reqBody.getContentType(), 201);
    document = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
    // move the node to Trashcan
    deleteNode(document.getId());
    contentNodeId = document.getId();
    // Check the upload response
    assertEquals(fileName, document.getName());
    contentInfo = document.getContent();
    assertNotNull(contentInfo);
    assertEquals(MimetypeMap.MIMETYPE_PDF, contentInfo.getMimeType());
    // Download binary content (as bytes) - without Content-Disposition
    // header (attachment=false)
    Map<String, String> params = new LinkedHashMap<>();
    params.put("attachment", "false");
    response = getSingle(TrashcanEntityResource.class, contentNodeId + "/content", params, 200);
    byte[] bytes = response.getResponseAsBytes();
    assertArrayEquals(originalBytes, bytes);
    responseHeaders = response.getHeaders();
    assertNotNull(responseHeaders);
    assertNull(responseHeaders.get("Content-Disposition"));
    assertNotNull(responseHeaders.get("Cache-Control"));
    assertNotNull(responseHeaders.get("Expires"));
    lastModifiedHeader = responseHeaders.get(LAST_MODIFIED_HEADER);
    assertNotNull(lastModifiedHeader);
    headers = Collections.singletonMap(IF_MODIFIED_SINCE_HEADER, lastModifiedHeader);
    // Test 304 response
    getSingle(URL_DELETED_NODES + "/" + contentNodeId + "/content", null, null, headers, 304);
    // -ve - nodeId in the path parameter does not exist
    getSingle(TrashcanEntityResource.class, UUID.randomUUID().toString() + "/content", params, 404);
    // -ve test - Authentication failed
    setRequestContext(null);
    getSingle(TrashcanEntityResource.class, contentNodeId + "/content", params, 401);
    // -ve - Current user does not have permission for nodeId
    setRequestContext(user2);
    getSingle(TrashcanEntityResource.class, contentNodeId + "/content", params, 403);
}
Also used : HttpResponse(org.alfresco.rest.api.tests.client.HttpResponse) TrashcanEntityResource(org.alfresco.rest.api.trashcan.TrashcanEntityResource) Document(org.alfresco.rest.api.tests.client.data.Document) LinkedHashMap(java.util.LinkedHashMap) MultiPartBuilder(org.alfresco.rest.api.tests.util.MultiPartBuilder) ContentInfo(org.alfresco.rest.api.tests.client.data.ContentInfo) File(java.io.File) Test(org.junit.Test)

Aggregations

File (java.io.File)13 HttpResponse (org.alfresco.rest.api.tests.client.HttpResponse)13 Document (org.alfresco.rest.api.tests.client.data.Document)13 MultiPartBuilder (org.alfresco.rest.api.tests.util.MultiPartBuilder)13 Test (org.junit.Test)13 ContentInfo (org.alfresco.rest.api.tests.client.data.ContentInfo)9 FileData (org.alfresco.rest.api.tests.util.MultiPartBuilder.FileData)9 MultiPartRequest (org.alfresco.rest.api.tests.util.MultiPartBuilder.MultiPartRequest)9 HashMap (java.util.HashMap)7 Rendition (org.alfresco.rest.api.tests.client.data.Rendition)7 LinkedHashMap (java.util.LinkedHashMap)5 AbstractSingleNetworkSiteTest (org.alfresco.rest.AbstractSingleNetworkSiteTest)5 NodesEntityResource (org.alfresco.rest.api.nodes.NodesEntityResource)5 Folder (org.alfresco.rest.api.tests.client.data.Folder)4 RestApiUtil.toJsonAsString (org.alfresco.rest.api.tests.util.RestApiUtil.toJsonAsString)4 Date (java.util.Date)3 PublicApiClient (org.alfresco.rest.api.tests.client.PublicApiClient)3 ExpectedPaging (org.alfresco.rest.api.tests.client.PublicApiClient.ExpectedPaging)3 Paging (org.alfresco.rest.api.tests.client.PublicApiClient.Paging)3 ByteArrayInputStream (java.io.ByteArrayInputStream)2