org.sonar.db.permission.UserWithPermissionDaoTest.java Source code

Java tutorial

Introduction

Here is the source code for org.sonar.db.permission.UserWithPermissionDaoTest.java

Source

/*
 * SonarQube
 * Copyright (C) 2009-2016 SonarSource SA
 * mailto:contact AT sonarsource DOT com
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
package org.sonar.db.permission;

import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.annotation.Nullable;
import org.apache.ibatis.session.ResultContext;
import org.apache.ibatis.session.ResultHandler;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.utils.System2;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.user.UserDto;
import org.sonar.db.user.UserRoleDto;

import static org.assertj.core.api.Assertions.assertThat;
import static org.sonar.api.web.UserRole.ADMIN;
import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
import static org.sonar.api.web.UserRole.USER;
import static org.sonar.db.user.UserTesting.newUserDto;

public class UserWithPermissionDaoTest {

    private static final long COMPONENT_ID = 100L;

    @Rule
    public DbTester dbTester = DbTester.create(System2.INSTANCE);
    DbSession session = dbTester.getSession();

    PermissionDao underTest = new PermissionDao(dbTester.myBatis());

    @Test
    public void select_all_users_for_project_permission() {
        dbTester.prepareDbUnit(getClass(), "users_with_permissions.xml");

        PermissionQuery query = PermissionQuery.builder().permission("user").build();
        List<UserWithPermissionDto> result = selectUsers(session, query, COMPONENT_ID);
        assertThat(result).hasSize(3);

        UserWithPermissionDto user1 = result.get(0);
        assertThat(user1.getLogin()).isEqualTo("user1");
        assertThat(user1.getName()).isEqualTo("User1");
        assertThat(user1.getPermission()).isNotNull();

        UserWithPermissionDto user2 = result.get(1);
        assertThat(user2.getLogin()).isEqualTo("user2");
        assertThat(user2.getName()).isEqualTo("User2");
        assertThat(user2.getPermission()).isNotNull();

        UserWithPermissionDto user3 = result.get(2);
        assertThat(user3.getLogin()).isEqualTo("user3");
        assertThat(user3.getName()).isEqualTo("User3");
        assertThat(user3.getPermission()).isNull();
    }

    @Test
    public void select_all_users_for_global_permission() {
        dbTester.prepareDbUnit(getClass(), "users_with_permissions.xml");

        PermissionQuery query = PermissionQuery.builder().permission("admin").build();
        List<UserWithPermissionDto> result = selectUsers(session, query, null);
        assertThat(result).hasSize(3);

        UserWithPermissionDto user1 = result.get(0);
        assertThat(user1.getName()).isEqualTo("User1");
        assertThat(user1.getPermission()).isNotNull();

        UserWithPermissionDto user2 = result.get(1);
        assertThat(user2.getName()).isEqualTo("User2");
        assertThat(user2.getPermission()).isNull();

        UserWithPermissionDto user3 = result.get(2);
        assertThat(user3.getName()).isEqualTo("User3");
        assertThat(user3.getPermission()).isNull();
    }

    @Test
    public void select_only_user_with_permission() {
        dbTester.prepareDbUnit(getClass(), "users_with_permissions.xml");

        // user1 and user2 have permission user
        assertThat(selectUsers(session,
                PermissionQuery.builder().permission("user").membership(PermissionQuery.IN).build(), COMPONENT_ID))
                        .hasSize(2);
    }

    @Test
    public void select_only_user_without_permission() {
        dbTester.prepareDbUnit(getClass(), "users_with_permissions.xml");

        // Only user3 has not the user permission
        assertThat(selectUsers(session,
                PermissionQuery.builder().permission("user").membership(PermissionQuery.OUT).build(), COMPONENT_ID))
                        .hasSize(1);
    }

    @Test
    public void search_by_user_name() {
        dbTester.prepareDbUnit(getClass(), "users_with_permissions.xml");

        List<UserWithPermissionDto> result = selectUsers(session,
                PermissionQuery.builder().permission("user").search("SEr1").build(), COMPONENT_ID);
        assertThat(result).hasSize(1);
        assertThat(result.get(0).getName()).isEqualTo("User1");

        result = selectUsers(session, PermissionQuery.builder().permission("user").search("user").build(),
                COMPONENT_ID);
        assertThat(result).hasSize(3);
    }

    @Test
    public void select_only_enable_users() {
        dbTester.prepareDbUnit(getClass(), "select_only_enable_users.xml");

        PermissionQuery query = PermissionQuery.builder().permission("user").build();
        List<UserWithPermissionDto> result = selectUsers(session, query, COMPONENT_ID);
        assertThat(result).hasSize(3);

        // Disabled user should not be returned
        assertThat(Iterables.find(result, new Predicate<UserWithPermissionDto>() {
            @Override
            public boolean apply(@Nullable UserWithPermissionDto input) {
                return input.getLogin().equals("disabledUser");
            }
        }, null)).isNull();
    }

    @Test
    public void should_be_sorted_by_user_name() {
        dbTester.prepareDbUnit(getClass(), "users_with_permissions_should_be_sorted_by_user_name.xml");

        List<UserWithPermissionDto> result = selectUsers(session,
                PermissionQuery.builder().permission("user").build(), COMPONENT_ID);
        assertThat(result).hasSize(3);
        assertThat(result.get(0).getName()).isEqualTo("User1");
        assertThat(result.get(1).getName()).isEqualTo("User2");
        assertThat(result.get(2).getName()).isEqualTo("User3");
    }

    @Test
    public void should_be_paginated() {
        dbTester.prepareDbUnit(getClass(), "users_with_permissions.xml");

        List<UserWithPermissionDto> result = underTest.selectUsers(session,
                PermissionQuery.builder().permission("user").build(), COMPONENT_ID, 0, 2);
        assertThat(result).hasSize(2);
        assertThat(result.get(0).getName()).isEqualTo("User1");
        assertThat(result.get(1).getName()).isEqualTo("User2");

        result = underTest.selectUsers(session, PermissionQuery.builder().permission("user").build(), COMPONENT_ID,
                1, 2);
        assertThat(result).hasSize(2);
        assertThat(result.get(0).getName()).isEqualTo("User2");
        assertThat(result.get(1).getName()).isEqualTo("User3");

        result = underTest.selectUsers(session, PermissionQuery.builder().permission("user").build(), COMPONENT_ID,
                2, 1);
        assertThat(result).hasSize(1);
        assertThat(result.get(0).getName()).isEqualTo("User3");
    }

    @Test
    public void user_count_by_component_and_permission() {
        UserDto user1 = insertUser(newUserDto());
        UserDto user2 = insertUser(newUserDto());
        UserDto user3 = insertUser(newUserDto());

        insertUserRole(ISSUE_ADMIN, user1.getId(), 42L);
        insertUserRole(ADMIN, user1.getId(), 123L);
        insertUserRole(ADMIN, user2.getId(), 123L);
        insertUserRole(ADMIN, user3.getId(), 123L);
        insertUserRole(USER, user1.getId(), 123L);
        insertUserRole(USER, user1.getId(), 456L);
        commit();

        final List<CountByProjectAndPermissionDto> result = new ArrayList<>();
        underTest.usersCountByComponentIdAndPermission(dbTester.getSession(), Arrays.asList(123L, 456L, 789L),
                new ResultHandler() {
                    @Override
                    public void handleResult(ResultContext context) {
                        result.add((CountByProjectAndPermissionDto) context.getResultObject());
                    }
                });
        assertThat(result).hasSize(3);
        assertThat(result).extracting("permission").containsOnly(ADMIN, USER);
        assertThat(result).extracting("componentId").containsOnly(123L, 456L);
        assertThat(result).extracting("count").containsOnly(3, 1);
    }

    private List<UserWithPermissionDto> selectUsers(DbSession session, PermissionQuery query,
            @Nullable Long componentId) {
        return underTest.selectUsers(session, query, componentId, 0, Integer.MAX_VALUE);
    }

    private UserDto insertUser(UserDto userDto) {
        return dbTester.getDbClient().userDao().insert(dbTester.getSession(), userDto.setActive(true));
    }

    private void insertUserRole(String permission, long userId, long resourceId) {
        dbTester.getDbClient().roleDao().insertUserRole(dbTester.getSession(),
                new UserRoleDto().setRole(permission).setUserId(userId).setResourceId(resourceId));
    }

    private void commit() {
        dbTester.getSession().commit();
    }
}