de.hska.ld.content.service.DocumentServiceIntegrationTest.java Source code

Java tutorial

Introduction

Here is the source code for de.hska.ld.content.service.DocumentServiceIntegrationTest.java

Source

/**
 * Code contributed to the Learning Layers project
 * http://www.learning-layers.eu
 * Development is partly funded by the FP7 Programme of the European
 * Commission under Grant Agreement FP7-ICT-318209.
 * Copyright (c) 2014, Karlsruhe University of Applied Sciences.
 * For a list of contributors see the AUTHORS file at the top-level directory
 * of this distribution.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package de.hska.ld.content.service;

import de.hska.ld.content.dto.DiscussionSectionDto;
import de.hska.ld.content.persistence.domain.*;
import de.hska.ld.core.AbstractIntegrationTest;
import de.hska.ld.core.exception.UserNotAuthorizedException;
import de.hska.ld.core.persistence.domain.User;
import de.hska.ld.core.service.UserService;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.transaction.annotation.Transactional;

import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.stream.Collectors;

import static de.hska.ld.content.ContentFixture.*;
import static de.hska.ld.core.util.CoreUtil.newUser;

public class DocumentServiceIntegrationTest extends AbstractIntegrationTest {

    static final String TEST_PDF = "test.pdf";

    @Autowired
    DocumentService documentService;

    @Autowired
    TagService tagService;

    @Autowired
    UserService userService;

    @Override
    @Before
    public void setUp() throws Exception {
        super.setUp();
        setAuthentication(testUser);
    }

    @Test
    public void testSaveDocument() {
        Document document = new Document();
        document.setTitle("Title");
        document.setDescription("Description");

        InputStream in = DocumentServiceIntegrationTest.class.getResourceAsStream("/" + TEST_PDF);
        Attachment attachment = new Attachment(in, TEST_PDF);
        document.getAttachmentList().add(attachment);

        document = documentService.save(document);

        Assert.assertNotNull(document);
        Assert.assertNotNull(document.getId());
        Assert.assertNotNull(document.getCreator());
        Assert.assertNotNull(document.getCreatedAt());
        String documentTitle = document.getTitle() + " (updated)";
        document.setTitle(documentTitle);
        document = documentService.save(document);

        Assert.assertEquals(documentTitle, document.getTitle());
        Assert.assertNotNull(document.getModifiedAt());
    }

    @Test
    public void testMarkDocumentAsDeleted() {
        Document document = documentService.save(newDocument());
        Assert.assertFalse(document.isDeleted());
        documentService.markAsDeleted(document.getId());
        document = documentService.findById(document.getId());
        Assert.assertTrue(document.isDeleted());
    }

    @Test
    public void testAddComment() {
        Document document = documentService.save(newDocument());
        Assert.assertNotNull(document);

        Comment comment = documentService.addComment(document.getId(), newComment());

        document = documentService.findById(document.getId());
        Assert.assertNotNull(document);

        document = documentService.loadContentCollection(document, Comment.class);
        Assert.assertTrue(document.getCommentList().contains(comment));
    }

    @Test
    public void testAddTag() {
        setAuthentication(testUser);
        Document document = documentService.save(newDocument());
        Assert.assertNotNull(document);

        Tag tag = tagService.save(newTag());

        User userWithoutAccess = userService.save(newUser());
        setAuthentication(userWithoutAccess);
        UserNotAuthorizedException userNotAuthorizedException = null;
        try {
            documentService.addTag(document.getId(), tag.getId());
        } catch (UserNotAuthorizedException e) {
            userNotAuthorizedException = e;
        }
        Assert.assertNotNull(userNotAuthorizedException);
        document = documentService.loadContentCollection(document, Tag.class);
        Assert.assertTrue(!document.getTagList().contains(tag));

        setAuthentication(testUser);
        document = documentService.addTag(document.getId(), tag.getId());
        Assert.assertTrue(document.getTagList().contains(tag));

        document = documentService.findById(document.getId());
        Assert.assertNotNull(document);

        document = documentService.loadContentCollection(document, Tag.class);
        Assert.assertTrue(document.getTagList().contains(tag));
    }

    @Test
    public void testDocumentPageAccessControl() {
        User userWithAccess = userService.save(newUser());
        User userWithoutAccess = userService.save(newUser());

        Document document = documentService.save(newDocument());

        documentService.addAccess(document.getId(), userWithAccess, Access.Permission.READ);

        setAuthentication(userWithAccess);
        Page<Document> documentPage = documentService.getDocumentsPage(0, 10, "DESC", "createdAt");

        Assert.assertNotNull(documentPage);
        Assert.assertTrue(documentPage.getNumberOfElements() == 1);

        setAuthentication(userWithoutAccess);
        documentPage = documentService.getDocumentsPage(0, 10, "DESC", "createdAt");

        Assert.assertNotNull(documentPage);
        Assert.assertTrue(documentPage.getNumberOfElements() == 0);
    }

    @Test
    public void testAddAndRemoveAccessFromDocument() {
        Document document = documentService.save(newDocument());

        User user = userService.save(newUser());
        setAuthentication(user);

        Page<Document> documentPage = documentService.getDocumentsPage(0, 10, "DESC", "createdAt");
        Assert.assertTrue(documentPage.getNumberOfElements() == 0);

        setAuthentication(testUser);
        document = documentService.addAccess(document.getId(), user, Access.Permission.READ);

        setAuthentication(user);
        documentPage = documentService.getDocumentsPage(0, 10, "DESC", "createdAt");
        Assert.assertTrue(documentPage.getNumberOfElements() == 1);

        setAuthentication(testUser);
        document = documentService.removeAccess(document.getId(), user, Access.Permission.READ);

        setAuthentication(user);
        documentPage = documentService.getDocumentsPage(0, 10, "DESC", "createdAt");
        Assert.assertTrue(documentPage.getNumberOfElements() == 0);

        document.setTitle(document.getTitle() + "(updated)");
        UserNotAuthorizedException userNotAuthorizedException = null;
        try {
            documentService.save(document);
        } catch (UserNotAuthorizedException e) {
            userNotAuthorizedException = e;
        }
        Assert.assertNotNull(userNotAuthorizedException);

        setAuthentication(testUser);
        document = documentService.addAccess(document.getId(), user, Access.Permission.READ,
                Access.Permission.WRITE);

        setAuthentication(user);
        document.setTitle(document.getTitle() + "(updated)");
        document = documentService.save(document);

        Assert.assertTrue(document.getTitle().contains("(updated)"));
    }

    @Test
    public void testAddAndRemoveSubscription() {
        Document document = documentService.save(newDocument());

        userService.save(newUser());
        document = documentService.addSubscription(document.getId(), Subscription.Type.COMMENT,
                Subscription.Type.DISCUSSION);

        Assert.assertNotNull(document.getSubscriptionList());
        Assert.assertTrue(document.getSubscriptionList().size() == 1);
        Assert.assertTrue(document.getSubscriptionList().get(0).getTypeList().size() == 2);
        Assert.assertEquals(document.getSubscriptionList().get(0).getTypeList().get(0), Subscription.Type.COMMENT);
        Assert.assertEquals(document.getSubscriptionList().get(0).getTypeList().get(1),
                Subscription.Type.DISCUSSION);

        document = documentService.removeSubscription(document.getId(), Subscription.Type.COMMENT);
        Assert.assertNotNull(document.getSubscriptionList());
        Assert.assertTrue(document.getSubscriptionList().size() == 1);
        Assert.assertTrue(document.getSubscriptionList().get(0).getTypeList().size() == 1);
        Assert.assertEquals(document.getSubscriptionList().get(0).getTypeList().get(0),
                Subscription.Type.DISCUSSION);
    }

    @Test
    public void testGetDocumentTagsPage() {
        for (int i = 0; i < 21; i++) {
            tagService.save(newTag());
        }
        Page<Tag> tagPage = tagService.getTagsPage(0, 10, "DESC", "createdAt");
        Assert.assertNotNull(tagPage);
        Assert.assertTrue(tagPage.getTotalElements() > 0);
        Assert.assertTrue(tagPage.getSize() == 10);

        Document document = documentService.save(newDocument());
        documentService.addTag(document.getId(), tagPage.getContent().get(0).getId());

        Page<Tag> documentTagsPage = documentService.getDocumentTagsPage(document.getId(), 0, 10, "DESC",
                "createdAt");
        Assert.assertNotNull(documentTagsPage);
        Assert.assertTrue(documentTagsPage.getTotalElements() == 1);
    }

    @Test
    public void testAddDiscussionToExistingDocument() {
        Document document = documentService.save(newDocument());
        Document discussion = newDocument();

        document = documentService.addDiscussionToDocument(document.getId(), discussion);

        Assert.assertNotNull(document.getDiscussionList());
        Assert.assertTrue(document.getDiscussionList().size() > 0);
        Assert.assertNotNull(document.getDiscussionList().get(0).getParent());
    }

    @Test
    public void testThatSubscriptionIsCreated() {
        Document document = documentService.save(newDocument());
        document = documentService.addSubscription(document.getId(), Subscription.Type.MAIN_CONTENT);
        Assert.assertNotNull(document.getSubscriptionList());
        Assert.assertTrue(document.getSubscriptionList().size() == 1);
        Assert.assertTrue(document.getSubscriptionList().get(0).getTypeList().size() == 1);
        Assert.assertTrue(
                document.getSubscriptionList().get(0).getTypeList().get(0) == Subscription.Type.MAIN_CONTENT);

        document = documentService.addSubscription(document.getId(), Subscription.Type.ATTACHMENT);
        document = documentService.addSubscription(document.getId(), Subscription.Type.MAIN_CONTENT);
        Assert.assertNotNull(document.getSubscriptionList());
        Assert.assertTrue(document.getSubscriptionList().size() == 1);
        Assert.assertTrue(document.getSubscriptionList().get(0).getTypeList().size() == 2);
        Assert.assertTrue(
                document.getSubscriptionList().get(0).getTypeList().get(0) == Subscription.Type.ATTACHMENT);
        Assert.assertTrue(
                document.getSubscriptionList().get(0).getTypeList().get(1) == Subscription.Type.MAIN_CONTENT);
    }

    @Test
    @Transactional
    public void testAddDocumentAccessOneUser() {
        Document document = documentService.save(newDocument());

        User user = userService.findByUsername("user");
        Access.Permission[] permissionArray = new Access.Permission[1];
        permissionArray[0] = Access.Permission.READ;
        documentService.addAccess(document.getId(), user, permissionArray);

        boolean found = false;
        for (Access access : document.getAccessList()) {
            if (access.getUser().getId().equals(user.getId())
                    && access.getPermissionList().contains(Access.Permission.READ)) {
                found = true;
            }
        }
        Assert.assertTrue(found);
    }

    @Test
    @Transactional
    public void testAddDocumentAccessMultiplesUsers() {
        Document document = documentService.save(newDocument());

        User user = userService.findByUsername("user");
        User user2 = userService.save(newUser());
        String combinedUserIdString = user.getId().toString() + ";" + user2.getId().toString();
        String combinedPermissionString = "READ;WRITE";
        documentService.addAccess(document.getId(), combinedUserIdString, combinedPermissionString);

        int count = 0;
        for (Access access : document.getAccessList()) {
            if (access.getUser().getId().equals(user.getId())
                    && access.getPermissionList().contains(Access.Permission.READ)) {
                count++;
            }
            if (access.getUser().getId().equals(user.getId())
                    && access.getPermissionList().contains(Access.Permission.WRITE)) {
                count++;
            }
            if (access.getUser().getId().equals(user2.getId())
                    && access.getPermissionList().contains(Access.Permission.READ)) {
                count++;
            }
            if (access.getUser().getId().equals(user2.getId())
                    && access.getPermissionList().contains(Access.Permission.WRITE)) {
                count++;
            }
        }
        Assert.assertTrue(count == 4);
    }

    @Test
    @Transactional
    public void testGetUsersByDocumentPermission() {
        Document document = documentService.save(newDocument());

        User user = userService.findByUsername("user");
        Access.Permission[] permissionArray = new Access.Permission[1];
        permissionArray[0] = Access.Permission.READ;
        document = documentService.addAccess(document.getId(), user, permissionArray);

        boolean found = false;
        for (Access access : document.getAccessList()) {
            if (access.getUser().getId().equals(user.getId())
                    && access.getPermissionList().contains(Access.Permission.READ)) {
                found = true;
            }
        }
        Assert.assertTrue(found);

        String combinedPermissionString = "READ";
        List<Access> userList = documentService.getUsersByPermissions(document.getId(), combinedPermissionString);
        Assert.assertTrue(userList.size() == 1);
    }

    @Test
    @Transactional
    public void testGetCurrentUserPermissions() {
        Document document = documentService.save(newDocument());

        User user = userService.findByUsername("user");
        Access.Permission[] permissionArray = new Access.Permission[1];
        permissionArray[0] = Access.Permission.READ;
        document = documentService.addAccess(document.getId(), user, permissionArray);

        boolean found = false;
        for (Access access : document.getAccessList()) {
            if (access.getUser().getId().equals(user.getId())
                    && access.getPermissionList().contains(Access.Permission.READ)) {
                found = true;
            }
        }
        Assert.assertTrue(found);

        setAuthentication(user);

        Access access = documentService.getCurrentUserPermissions(document.getId(), "all");
        Assert.assertNotNull(access);
    }

    @Test
    @Transactional
    public void testPublicFlagForDocumentsPage() {
        // 1. Create a document with testUser
        Document document = documentService.save(newDocument());

        // 2. Switch to user "user"
        User user = userService.findByUsername("user");
        setAuthentication(user);

        // 3. Try to retrieve the document (expected is that the user doesn't see it now)
        Page<Document> documentsPage = documentService.getDocumentsPage(0, Integer.MAX_VALUE, "DESC", "createdAt");
        List<Document> documentList = documentsPage.getContent();
        final Document tempDocument = document;
        List<Document> documentFoundResult = documentList.stream()
                .filter(d -> tempDocument.getTitle().equals(d.getTitle())).collect(Collectors.toList());
        Assert.assertTrue(documentFoundResult.size() == 0);

        // 4. Switch back to the testUser
        setAuthentication(testUser);
        // 5. Make the document public
        document = documentService.setAccessAll(document.getId(), true);

        // 6. Switch back to user
        setAuthentication(user);

        // 7. Try to retrieve the document again (expected is that the user does have access now)
        Page<Document> documentsPage2 = documentService.getDocumentsPage(0, Integer.MAX_VALUE, "DESC", "createdAt");
        Assert.assertTrue(documentsPage2.getTotalElements() > 0);
        List<Document> documentList2 = documentsPage2.getContent();
        final Document tempDocument2 = document;
        List<Document> documentFoundResult2 = documentList2.stream()
                .filter(d -> tempDocument2.getTitle().equals(d.getTitle())).collect(Collectors.toList());
        Assert.assertTrue(documentFoundResult2.size() > 0);
    }

    @Test
    @Transactional
    public void testPublicFlagUserCanRetrieveDocument() {
        // 1. Create a document with testUser
        Document document = documentService.save(newDocument());

        // 2. Switch to user "user"
        User user = userService.findByUsername("user");
        setAuthentication(user);

        // 3. Try to retrieve the document (expected is that the user doesn't see it now)
        documentService.findById(document.getId());
        try {
            documentService.checkPermission(document, Access.Permission.READ);
        } catch (UserNotAuthorizedException e) {
            // expected
        }

        // 4. Switch back to the testUser
        setAuthentication(testUser);
        // 5. Make the document public
        document = documentService.setAccessAll(document.getId(), true);

        // 6. Switch to user "user"
        setAuthentication(user);

        // 7. Try to retrieve the document (expected is that the user can see it now)
        document = documentService.findById(document.getId());
        boolean exception = false;
        Assert.assertTrue(document.isAccessAll());
        try {
            documentService.checkPermission(document, Access.Permission.READ);
        } catch (UserNotAuthorizedException e) {
            exception = true;
        }
        Assert.assertTrue(!exception);
    }

    @Test
    @Transactional
    public void testPublicFlagUserCanAddComment() {
        // 1. Create a document with testUser
        Document document = documentService.save(newDocument());

        // 2. Switch to user "user"
        User user = userService.findByUsername("user");
        setAuthentication(user);

        // 3. Retrieve the document
        document = documentService.findById(document.getId());

        // 4. Add a comment to the document (should fail due to missing access rights)
        Comment comment = new Comment();
        comment.setText("CommentText");
        boolean expectedException = false;
        try {
            documentService.addComment(document.getId(), comment);
        } catch (UserNotAuthorizedException e) {
            expectedException = true;
        }
        Assert.assertTrue(expectedException);

        // 5. Make the document public
        setAuthentication(testUser);
        document = documentService.setAccessAll(document.getId(), true);

        // 6. Check again if the user can now add a comment
        setAuthentication(user);
        Comment commentCreated = documentService.addComment(document.getId(), comment);
        document = documentService.findById(document.getId());
        document.getCommentList().size();
        Assert.assertTrue(document.getCommentList().contains(commentCreated));
    }

    // TODO fix
    /*@Test
    public void testSearchForDocumentTitle() {
    String title = "Search document";
        
    Document document = newDocument();
    document.setTitle(title);
    documentService.save(document);
        
    // Create a second document which should not be part of the page result
    documentService.save(newDocument());
        
    Page<Document> page = documentService.getDocumentsPage(0, 10, "DESC", "title", title);
        
    Assert.assertTrue(page.getContent().size() > 1);
    Assert.assertEquals(title, page.getContent().get(0).getTitle());
    }*/

    @Test
    public void testDiscussSection() throws UnsupportedEncodingException {
        Document document = documentService.save(newDocument());

        DiscussionSectionDto discussionSectionDto = new DiscussionSectionDto();
        discussionSectionDto.setDocument(newDocument());
        discussionSectionDto.setSectionText("Test");
        Document discussion = documentService.addDiscussionToDocument(document.getId(), discussionSectionDto);

        Assert.assertTrue(discussion.getAttachmentList().size() > 0);
        boolean found = false;
        for (Attachment a : discussion.getAttachmentList()) {
            if ("Test".equals(new String(a.getSource(), "UTF-8"))) {
                found = true;
            }
        }
        if (!found) {
            Assert.fail();
        }
    }
}