software.coolstuff.springframework.owncloud.service.impl.rest.OwncloudRestUserServiceTest.java Source code

Java tutorial

Introduction

Here is the source code for software.coolstuff.springframework.owncloud.service.impl.rest.OwncloudRestUserServiceTest.java

Source

/*-
 * #%L
 * owncloud-spring-boot-starter
 * %%
 * Copyright (C) 2016 - 2017 by the original Authors
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public
 * License along with this program.  If not, see
 * <http://www.gnu.org/licenses/gpl-3.0.html>.
 * #L%
 */
package software.coolstuff.springframework.owncloud.service.impl.rest;

import com.google.common.collect.Lists;
import lombok.Builder;
import lombok.Data;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import software.coolstuff.springframework.owncloud.exception.auth.OwncloudGroupNotFoundException;
import software.coolstuff.springframework.owncloud.exception.auth.OwncloudUsernameAlreadyExistsException;
import software.coolstuff.springframework.owncloud.model.OwncloudModificationUser;
import software.coolstuff.springframework.owncloud.service.AbstractOwncloudUserServiceTest;

import java.io.IOException;
import java.text.Format;
import java.util.ArrayList;
import java.util.List;

import static org.springframework.http.HttpMethod.*;

@ActiveProfiles("REST-USER-SERVICE")
public class OwncloudRestUserServiceTest extends AbstractOwncloudUserServiceTest
        implements OwncloudRestServiceTest {

    @Autowired
    private OwncloudRestUserServiceExtension userService;

    @Override
    public final OwncloudRestService owncloudService() {
        return (OwncloudRestService) userService;
    }

    @Override
    protected void prepareTestSaveUser_CreateUser_OK_WithoutGroups(OwncloudModificationUser newUser)
            throws Exception {
        prepareModificationRestTest(UserModification.builder().newUser(newUser).build());
    }

    private void prepareModificationRestTest(UserModification userModification) throws IOException {
        if (userModification.getExistingUser() != null) {
            respondUser(
                    RestRequest.builder().method(GET)
                            .url("/cloud/users/" + userModification.getExistingUser().getUsername()).build(),
                    UserResponse.builder().enabled(userModification.getExistingUser().isEnabled())
                            .email(userModification.getExistingUser().getEmail())
                            .displayname(userModification.getExistingUser().getDisplayname())
                            .quota(userModification.getExistingUser().getQuota()).build());
        } else {
            respondFailure(
                    RestRequest.builder().method(GET)
                            .url("/cloud/users/" + userModification.getNewUser().getUsername()).build(),
                    998, "The requested user could not be found");

            if (userModification.isErrorCreateUser()) {
                respondFailure(RestRequest.builder().method(POST).url("/cloud/users").build(),
                        userModification.getErrorCodeCreateUser());
            } else {
                MultiValueMap<String, String> postData = new LinkedMultiValueMap<>();
                postData.put("userid", Lists.newArrayList(userModification.getNewUser().getUsername()));
                postData.put("password", Lists.newArrayList(userModification.getNewUser().getPassword()));
                respondSuccess(RestRequest.builder().method(POST).url("/cloud/users").build(), postData);
            }

            respondUser(
                    RestRequest.builder().method(GET)
                            .url("/cloud/users/" + userModification.getNewUser().getUsername()).build(),
                    UserResponse.builder().enabled(true).displayname(userModification.getNewUser().getUsername())
                            .build());
        }

        // change the Displayname
        if (userModification.getExistingUser() == null
                || !StringUtils.equals(userModification.getExistingUser().getDisplayname(),
                        userModification.getNewUser().getDisplayname())) {
            if (userModification.isErrorUpdateDisplayName()) {
                respondFailure(
                        RestRequest.builder().method(PUT)
                                .url("/cloud/users/" + userModification.getNewUser().getUsername()).build(),
                        userModification.getErrorCodeUpdateDisplayName());
            } else {
                MultiValueMap<String, String> putData = new LinkedMultiValueMap<>();
                putData.put("key", Lists.newArrayList("display"));
                putData.put("value", Lists.newArrayList(userModification.getNewUser().getDisplayname()));
                respondSuccess(
                        RestRequest.builder().method(PUT)
                                .url("/cloud/users/" + userModification.getNewUser().getUsername()).build(),
                        putData);
            }
        }

        // change the eMail
        if (userModification.getExistingUser() == null || !StringUtils
                .equals(userModification.getExistingUser().getEmail(), userModification.getNewUser().getEmail())) {
            if (userModification.isErrorUpdateEmail()) {
                respondFailure(
                        RestRequest.builder().method(PUT)
                                .url("/cloud/users/" + userModification.getNewUser().getUsername()).build(),
                        userModification.getErrorCodeUpdateEmail());
            } else {
                MultiValueMap<String, String> putData = new LinkedMultiValueMap<>();
                putData.put("key", Lists.newArrayList("email"));
                putData.put("value", Lists.newArrayList(userModification.getNewUser().getEmail()));
                respondSuccess(
                        RestRequest.builder().method(PUT)
                                .url("/cloud/users/" + userModification.getNewUser().getUsername()).build(),
                        putData);
            }
        }

        // change the Quota
        if (userModification.getExistingUser() == null
                || ObjectUtils.compare(userModification.getExistingUser().getQuota(),
                        userModification.getNewUser().getQuota()) != 0) {
            if (userModification.isErrorUpdateQuota()) {
                respondFailure(
                        RestRequest.builder().method(PUT)
                                .url("/cloud/users/" + userModification.getNewUser().getUsername()).build(),
                        userModification.getErrorCodeUpdateQuota());
            } else {
                Format quotaFormat = getQuotaFormat();
                MultiValueMap<String, String> putData = new LinkedMultiValueMap<>();
                putData.put("key", Lists.newArrayList("quota"));
                if (userModification.getNewUser().getQuota() != null) {
                    putData.put("value",
                            Lists.newArrayList(quotaFormat.format(userModification.getNewUser().getQuota())));
                } else {
                    putData.put("value", Lists.newArrayList(""));
                }
                respondSuccess(
                        RestRequest.builder().method(PUT)
                                .url("/cloud/users/" + userModification.getNewUser().getUsername()).build(),
                        putData);
            }
        }

        // change the availatility (enable/disable)
        if (userModification.getExistingUser() != null
                && userModification.getExistingUser().isEnabled() != userModification.getNewUser().isEnabled()) {
            if (userModification.isErrorEnableDisable()) {
                respondFailure(RestRequest.builder().method(PUT)
                        .url("/cloud/users/" + userModification.getNewUser().getUsername() + "/"
                                + (userModification.getNewUser().isEnabled() ? "enable" : "disable"))
                        .build(), userModification.getErrorCodeEnableDisable());
            } else {
                respondSuccess(RestRequest
                        .builder().method(PUT).url("/cloud/users/" + userModification.getNewUser().getUsername()
                                + "/" + (userModification.getNewUser().isEnabled() ? "enable" : "disable"))
                        .build());
            }
        }

        List<String> addedGroups = new ArrayList<>();
        List<String> removedGroups = new ArrayList<>();
        if (userModification.getExistingUser() != null
                && CollectionUtils.isNotEmpty(userModification.getExistingUser().getGroups())) {
            respondGroups(
                    RestRequest.builder().method(GET)
                            .url("/cloud/users/" + userModification.getNewUser().getUsername() + "/groups").build(),
                    userModification.getExistingUser().getGroups().toArray(new String[] {}));
            addedGroups.addAll(CollectionUtils.subtract(userModification.getNewUser().getGroups(),
                    userModification.getExistingUser().getGroups()));
            removedGroups.addAll(CollectionUtils.subtract(userModification.getExistingUser().getGroups(),
                    userModification.getNewUser().getGroups()));
        } else {
            respondGroups(RestRequest.builder().method(GET)
                    .url("/cloud/users/" + userModification.getNewUser().getUsername() + "/groups").build());
            addedGroups.addAll(userModification.getNewUser().getGroups());
        }

        if (userModification.isErrorAddGroup()) {
            respondFailure(
                    RestRequest.builder().method(POST)
                            .url("/cloud/users/" + userModification.getNewUser().getUsername() + "/groups").build(),
                    userModification.getErrorCodeAddGroup());
        } else {
            for (String group : addedGroups) {
                MultiValueMap<String, String> postData = new LinkedMultiValueMap<>();
                postData = new LinkedMultiValueMap<>();
                postData.put("groupid", Lists.newArrayList(group));
                respondSuccess(RestRequest.builder().method(POST)
                        .url("/cloud/users/" + userModification.getNewUser().getUsername() + "/groups").build(),
                        postData);
            }
        }

        if (userModification.isErrorRemoveGroup()) {
            respondFailure(
                    RestRequest.builder().method(DELETE)
                            .url("/cloud/users/" + userModification.getNewUser().getUsername() + "/groups").build(),
                    userModification.getErrorCodeRemoveGroup());
        } else {
            for (String group : removedGroups) {
                MultiValueMap<String, String> postData = new LinkedMultiValueMap<>();
                postData = new LinkedMultiValueMap<>();
                postData.put("groupid", Lists.newArrayList(group));
                respondSuccess(RestRequest.builder().method(DELETE)
                        .url("/cloud/users/" + userModification.getNewUser().getUsername() + "/groups").build(),
                        postData);
            }
        }

        respondUser(
                RestRequest.builder().method(GET).url("/cloud/users/" + userModification.getNewUser().getUsername())
                        .build(),
                UserResponse.builder().enabled(userModification.getNewUser().isEnabled())
                        .email(userModification.getNewUser().getEmail())
                        .displayname(userModification.getNewUser().getDisplayname())
                        .quota(userModification.getNewUser().getQuota()).build());
        respondGroups(
                RestRequest.builder().method(GET)
                        .url("/cloud/users/" + userModification.getNewUser().getUsername() + "/groups").build(),
                CollectionUtils.isEmpty(userModification.getNewUser().getGroups()) ? new String[] {}
                        : userModification.getNewUser().getGroups().toArray(new String[] {}));
    }

    @Override
    protected void prepareTestSaveUser_CreateUser_OK_WithGroups(OwncloudModificationUser newUser) throws Exception {
        prepareModificationRestTest(UserModification.builder().newUser(newUser).build());
    }

    @Override
    protected void prepareTestSaveUser_UpdateUser_OK_WithoutGroups(OwncloudModificationUser existingUser,
            OwncloudModificationUser updateUser) throws Exception {
        prepareModificationRestTest(
                UserModification.builder().existingUser(existingUser).newUser(updateUser).build());
    }

    @Override
    protected void prepareTestSaveUser_UpdateUser_OK_WithGroups(OwncloudModificationUser existingUser,
            OwncloudModificationUser updateUser) throws Exception {
        prepareModificationRestTest(
                UserModification.builder().existingUser(existingUser).newUser(updateUser).build());
    }

    @Override
    protected void prepareTestDeleteUser_OK(String username) throws Exception {
        respondSuccess(RestRequest.builder().method(DELETE).url("/cloud/users/" + username).build());
    }

    @Override
    protected void prepareTestDeleteUser_NOK_UsernameNotFoundException(String username) throws Exception {
        respondFailure(RestRequest.builder().method(DELETE).url("/cloud/users/" + username).build(), 101);
    }

    @Test(expected = IllegalArgumentException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_CreateUser_NOK_IllegalArgument() throws Exception {
        OwncloudModificationUser user = OwncloudModificationUser.builder().username("user5").password("password")
                .enabled(true).displayname("Mrs. User 5").email("user5@example.com").build();

        prepareModificationRestTest(UserModification.builder().newUser(user).errorCodeCreateUser(101).build());

        userService.save(user);
    }

    @Test(expected = OwncloudUsernameAlreadyExistsException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_CreateUser_NOK_OwncloudUsernameAlreadyExistsException() throws Exception {
        OwncloudModificationUser user = OwncloudModificationUser.builder().username("user5").password("password")
                .enabled(true).displayname("Mrs. User 5").email("user5@example.com").build();

        prepareModificationRestTest(UserModification.builder().newUser(user).errorCodeCreateUser(102).build());

        userService.save(user);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_CreateUser_NOK_IllegalStateException_102() throws Exception {
        OwncloudModificationUser user = OwncloudModificationUser.builder().username("user5").password("password")
                .enabled(true).displayname("Mrs. User 5").email("user5@example.com").build();

        prepareModificationRestTest(UserModification.builder().newUser(user).errorCodeCreateUser(103).build());

        userService.save(user);
    }

    @Test(expected = AccessDeniedException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_CreateUser_NOK_AccessDeniedException() throws Exception {
        OwncloudModificationUser user = OwncloudModificationUser.builder().username("user5").password("password")
                .enabled(true).displayname("Mrs. User 5").email("user5@example.com").build();

        prepareModificationRestTest(UserModification.builder().newUser(user).errorCodeCreateUser(997).build());

        userService.save(user);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_CreateUser_NOK_UnknownError() throws Exception {
        OwncloudModificationUser user = OwncloudModificationUser.builder().username("user5").password("password")
                .enabled(true).displayname("Mrs. User 5").email("user5@example.com").build();

        prepareModificationRestTest(UserModification.builder().newUser(user).errorCodeCreateUser(999).build());

        userService.save(user);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_UpdateDisplayName_IllegalStateException_UsernameNotFound()
            throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeUpdateDisplayName(101).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_UpdateDisplayName_IllegalStateException() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeUpdateDisplayName(102).build());

        userService.save(updateUser);
    }

    @Test(expected = AccessDeniedException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_UpdateDisplayName_AccessDenied() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeUpdateDisplayName(997).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_UpdateDisplayName_UnknownError() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeUpdateDisplayName(999).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_UpdateEmail_IllegalStateException_UsernameNotFound() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeUpdateEmail(101).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_UpdateEmail_IllegalStateException() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeUpdateEmail(102).build());

        userService.save(updateUser);
    }

    @Test(expected = AccessDeniedException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_UpdateEmail_AccessDenied() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeUpdateEmail(997).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_UpdateEmail_UnknownError() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeUpdateEmail(999).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_UpdateQuota_IllegalStateException_UsernameNotFound() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com")
                .quota(1024L).build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value")
                .quota(2048L).build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeUpdateQuota(101).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_UpdateQuota_IllegalStateException_102() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com")
                .quota(1024L).build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value")
                .quota(2048L).build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeUpdateQuota(102).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_UpdateQuota_IllegalStateException_103() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com")
                .quota(1024L).build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value")
                .quota(2048L).build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeUpdateQuota(103).build());

        userService.save(updateUser);
    }

    @Test(expected = AccessDeniedException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_UpdateQuota_AccessDenied() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com")
                .quota(1024L).build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value")
                .quota(2048L).build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeUpdateQuota(997).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_UpdateQuota_UnknownError() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com")
                .quota(1024L).build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value")
                .quota(2048L).build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeUpdateQuota(999).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_Enable_IllegalStateException_UsernameNotFound() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("Mrs. User 5").email("user5@example.com").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("changed Value").email("changed Value").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeEnableDisable(101).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_Enable_IllegalStateException() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("Mrs. User 5").email("user5@example.com").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("changed Value").email("changed Value").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeEnableDisable(102).build());

        userService.save(updateUser);
    }

    @Test(expected = AccessDeniedException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_Enable_AccessDenied() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("Mrs. User 5").email("user5@example.com").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("changed Value").email("changed Value").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeEnableDisable(997).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_Enable_UnknownError() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("Mrs. User 5").email("user5@example.com").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("changed Value").email("changed Value").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeEnableDisable(999).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_Disable_IllegalStateExcreption_UsernameNotFound() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeEnableDisable(101).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_Disable_IllegalStateException() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeEnableDisable(102).build());

        userService.save(updateUser);
    }

    @Test(expected = AccessDeniedException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_Disable_AccessDenied() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeEnableDisable(997).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_Disable_UnknownError() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeEnableDisable(999).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalArgumentException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_AddGroup_IllegalArgumentException() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com")
                .group("group1").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value")
                .group("group1").group("group2").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeAddGroup(101).build());

        userService.save(updateUser);
    }

    @Test(expected = OwncloudGroupNotFoundException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_AddGroup_OwncloudGroupNotFoundException() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com")
                .group("group1").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value")
                .group("group1").group("group2").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeAddGroup(102).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_AddGroup_IllegalStateException_UsernameNotFound() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com")
                .group("group1").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value")
                .group("group1").group("group2").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeAddGroup(103).build());

        userService.save(updateUser);
    }

    @Test(expected = AccessDeniedException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_AddGroup_AccessDeniedException_NotAllowedToAddGroup() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com")
                .group("group1").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value")
                .group("group1").group("group2").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeAddGroup(104).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_AddGroup_IllegalStateException() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com")
                .group("group1").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value")
                .group("group1").group("group2").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeAddGroup(105).build());

        userService.save(updateUser);
    }

    @Test(expected = AccessDeniedException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_AddGroup_AccessDeniedException_NoPermissions() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com")
                .group("group1").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value")
                .group("group1").group("group2").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeAddGroup(997).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_AddGroup_UnknownError() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com")
                .group("group1").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value")
                .group("group1").group("group2").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeAddGroup(999).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalArgumentException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_RemoveGroup_IllegalArgumentException() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com")
                .group("group1").group("group2").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value")
                .group("group1").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeRemoveGroup(101).build());

        userService.save(updateUser);
    }

    @Test(expected = OwncloudGroupNotFoundException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_RemoveGroup_OwncloudGroupNotFoundException() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com")
                .group("group1").group("group2").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value")
                .group("group1").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeRemoveGroup(102).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_RemoveGroup_IllegalStateException_UsernameNotFound() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com")
                .group("group1").group("group2").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value")
                .group("group1").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeRemoveGroup(103).build());

        userService.save(updateUser);
    }

    @Test(expected = AccessDeniedException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_RemoveGroup_AccessDeniedException_NotAllowedToRemoveGroup()
            throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com")
                .group("group1").group("group2").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value")
                .group("group1").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeRemoveGroup(104).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_RemoveGroup_IllegalStateException() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com")
                .group("group1").group("group2").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value")
                .group("group1").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeRemoveGroup(105).build());

        userService.save(updateUser);
    }

    @Test(expected = AccessDeniedException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_RemoveGroup_AccessDeniedException_NoPermissions() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com")
                .group("group1").group("group2").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value")
                .group("group1").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeRemoveGroup(997).build());

        userService.save(updateUser);
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testSaveUser_UpdateUser_NOK_RemoveGroup_UnknownError() throws Exception {
        OwncloudModificationUser existingUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(true).displayname("Mrs. User 5").email("user5@example.com")
                .group("group1").group("group2").build();

        OwncloudModificationUser updateUser = OwncloudModificationUser.builder().username("user5")
                .password("password").enabled(false).displayname("changed Value").email("changed Value")
                .group("group1").build();

        prepareModificationRestTest(UserModification.builder().existingUser(existingUser).newUser(updateUser)
                .errorCodeRemoveGroup(999).build());

        userService.save(updateUser);
    }

    @Test(expected = AccessDeniedException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testDeleteUser_NOK_AccessDeniedException() throws Exception {
        respondFailure(RestRequest.builder().method(DELETE).url("/cloud/users/user1").build(), 997);
        userService.delete("user1");
    }

    @Test(expected = IllegalStateException.class)
    @WithMockUser(username = "user1", password = "password")
    public void testDeleteUser_NOK_UnknownError() throws Exception {
        respondFailure(RestRequest.builder().method(DELETE).url("/cloud/users/user1").build(), 999);
        userService.delete("user1");
    }

    @Data
    @Builder
    private static class UserModification {

        private final OwncloudModificationUser existingUser;
        private final OwncloudModificationUser newUser;
        @Builder.Default
        private int errorCodeCreateUser = 0;
        @Builder.Default
        private int errorCodeUpdateDisplayName = 0;
        @Builder.Default
        private int errorCodeUpdateEmail = 0;
        @Builder.Default
        private int errorCodeUpdateQuota = 0;
        @Builder.Default
        private int errorCodeEnableDisable = 0;
        @Builder.Default
        private int errorCodeAddGroup = 0;
        @Builder.Default
        private int errorCodeRemoveGroup = 0;

        public boolean isErrorCreateUser() {
            return errorCodeCreateUser != 0;
        }

        public boolean isErrorUpdateDisplayName() {
            return errorCodeUpdateDisplayName != 0;
        }

        public boolean isErrorUpdateEmail() {
            return errorCodeUpdateEmail != 0;
        }

        public boolean isErrorUpdateQuota() {
            return errorCodeUpdateQuota != 0;
        }

        public boolean isErrorEnableDisable() {
            return errorCodeEnableDisable != 0;
        }

        public boolean isErrorAddGroup() {
            return errorCodeAddGroup != 0;
        }

        public boolean isErrorRemoveGroup() {
            return errorCodeRemoveGroup != 0;
        }
    }

}