/** * This file is part of lavagna. * * lavagna 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. * * lavagna 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 lavagna. If not, see <http://www.gnu.org/licenses/>. */ package io.lavagna.service; import io.lavagna.config.PersistenceAndServiceConfig; import io.lavagna.model.*; import io.lavagna.model.CardLabel.LabelDomain; import io.lavagna.service.config.TestServiceConfig; import org.apache.commons.lang3.tuple.Pair; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DuplicateKeyException; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.namedparam.EmptySqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; import java.util.*; import static io.lavagna.common.Constants.SYSTEM_LABEL_MILESTONE; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { TestServiceConfig.class, PersistenceAndServiceConfig.class }) @Transactional public class ProjectServiceTest { private static final String TEST_BOARD = "TEST-BRD"; @Autowired private ProjectService projectService; @Autowired private UserRepository userRepository; @Autowired private PermissionService permissionService; @Autowired private CardService cardService; @Autowired private BoardColumnRepository boardColumnRepository; @Autowired private BoardRepository boardRepository; @Autowired private CardLabelRepository cardLabelRepository; @Autowired private NamedParameterJdbcTemplate jdbc; @Before public void prepare() { jdbc.update("DELETE FROM LA_PROJECT_ROLE_PERMISSION", new EmptySqlParameterSource()); jdbc.update("DELETE FROM LA_PROJECT_ROLE", new EmptySqlParameterSource()); jdbc.update("DELETE FROM LA_CARD_LABEL_VALUE", new EmptySqlParameterSource()); jdbc.update("DELETE FROM LA_CARD_LABEL_LIST_VALUE", new EmptySqlParameterSource()); jdbc.update("DELETE FROM LA_CARD_LABEL", new EmptySqlParameterSource()); jdbc.update("DELETE FROM LA_BOARD_COLUMN_DEFINITION", new EmptySqlParameterSource()); jdbc.update("DELETE FROM LA_PROJECT", new EmptySqlParameterSource()); } @Test public void createTest() { Assert.assertEquals("test", projectService.create("test", "TEST", "desc").getName()); } @Test public void updateProjectTest() { Project p = projectService.create("test", "TEST", "desc"); Project newProject = projectService.updateProject(p.getId(), "new name", p.getDescription(), p.getArchived()); Assert.assertEquals(p.getId(), newProject.getId()); Assert.assertEquals(p.getDescription(), newProject.getDescription()); Assert.assertNotEquals(p.getName(), newProject.getName()); Assert.assertEquals("new name", newProject.getName()); } @Test(expected = DuplicateKeyException.class) public void uniquenessTest() { Assert.assertEquals("test", projectService.create("test", "TEST", "desc").getName()); // Throw DuplicateKeyException on double create projectService.create("test", "TEST", "desc"); } @Test public void findAllTest() { Assert.assertEquals(0, projectService.findAll().size()); Assert.assertEquals("test1", projectService.create("test1", "TEST1", "desc").getName()); Assert.assertEquals("test2", projectService.create("test2", "TEST2", "desc").getName()); Assert.assertEquals(2, projectService.findAll().size()); } @Test public void findByIdTest() { Assert.assertEquals("test1", projectService.create("test1", "TEST1", "desc").getName()); Project found = projectService.findById(projectService.findAll().get(0).getId()); Assert.assertEquals("test1", found.getName()); Assert.assertEquals("desc", found.getDescription()); } @Test(expected = EmptyResultDataAccessException.class) public void findByIdNotFoundTest() { projectService.findById(42); } @Test public void testFindAllForUser() { Helper.createUser(userRepository, "test", "user-test"); User user = userRepository.findUserByName("test", "user-test"); projectService.create("test", "TEST", "desc"); Project project = projectService.findByShortName("TEST"); // empty because the user don't have the correct role READ Assert.assertTrue(projectService.findAllForUserWithPermissionInProject(user).isEmpty()); // empty, because the role is system wide and not attached to the // specific project Role role = new Role("HAS_READ"); permissionService.createRole(role); permissionService.updatePermissionsToRole(role, EnumSet.of(Permission.READ)); permissionService.assignRoleToUsers(role, Collections.singleton(user.getId())); Assert.assertEquals(EnumSet.of(Permission.READ), permissionService.findBasePermissionByUserId(user.getId())); Assert.assertEquals(0, projectService.findAllForUserWithPermissionInProject(user).size()); // Role projectRole = new Role("PROJECT_HAS_READ"); permissionService.createRoleInProjectId(projectRole, project.getId()); permissionService.updatePermissionsToRoleInProjectId(projectRole, EnumSet.of(Permission.READ), project.getId()); permissionService.assignRoleToUsersInProjectId(projectRole, Collections.singleton(user.getId()), project.getId()); Assert.assertEquals(1, projectService.findAllForUserWithPermissionInProject(user).size()); Assert.assertEquals("test", projectService.findAllForUserWithPermissionInProject(user).get(0).getName()); } @Test public void updateColumnDefinition() { Project project = projectService.create("test1", "TEST1", "desc"); Map<ColumnDefinition, BoardColumnDefinition> definitions = projectService .findMappedColumnDefinitionsByProjectId(project.getId()); Assert.assertEquals(ColumnDefinition.OPEN.getDefaultColor(), definitions.get(ColumnDefinition.OPEN).getColor()); Assert.assertEquals(ColumnDefinition.CLOSED.getDefaultColor(), definitions.get(ColumnDefinition.CLOSED) .getColor()); Assert.assertEquals(ColumnDefinition.BACKLOG.getDefaultColor(), definitions.get(ColumnDefinition.BACKLOG) .getColor()); Assert.assertEquals(ColumnDefinition.DEFERRED.getDefaultColor(), definitions.get(ColumnDefinition.DEFERRED) .getColor()); projectService.updateColumnDefinition(project.getId(), definitions.get(ColumnDefinition.OPEN).getId(), 1234); definitions = projectService.findMappedColumnDefinitionsByProjectId(project.getId()); Assert.assertEquals(1234, definitions.get(ColumnDefinition.OPEN).getColor()); Assert.assertEquals(ColumnDefinition.CLOSED.getDefaultColor(), definitions.get(ColumnDefinition.CLOSED) .getColor()); Assert.assertEquals(ColumnDefinition.BACKLOG.getDefaultColor(), definitions.get(ColumnDefinition.BACKLOG) .getColor()); Assert.assertEquals(ColumnDefinition.DEFERRED.getDefaultColor(), definitions.get(ColumnDefinition.DEFERRED) .getColor()); } private Pair<Project, User> prepareOneActivity() { Helper.createUser(userRepository, "test", "test-user"); User user = userRepository.findUserByName("test", "test-user"); projectService.create("test", "TEST", "desc"); Project project = projectService.findByShortName("TEST"); boardRepository.createNewBoard("TEST", TEST_BOARD, "TEST", project.getId()); Board board = boardRepository.findBoardByShortName(TEST_BOARD); List<BoardColumnDefinition> definitions = projectService.findColumnDefinitionsByProjectId(project.getId()); BoardColumn bc = boardColumnRepository.addColumnToBoard("col1", definitions.get(0).getId(), BoardColumn.BoardColumnLocation.BOARD, board.getId()); cardService.createCard("card1", bc.getId(), new Date(), user); return Pair.of(project, user); } @Test public void testFindBoardsByUserActivityWithGlobalPermissions() { Pair<Project, User> prep = prepareOneActivity(); List<ProjectWithEventCounts> projects = projectService.findProjectsActivityByUser(prep.getRight().getId()); Assert.assertEquals(1, projects.size()); } @Test public void testFindBoardsByUserActivityWithPermissionsOnTest() { Pair<Project, User> prep = prepareOneActivity(); List<ProjectWithEventCounts> projects = projectService.findProjectsActivityByUserInProjects(prep.getRight().getId(), Arrays.asList(prep.getLeft().getId())); Assert.assertEquals(1, projects.size()); } @Test public void testFindBoardsByUserActivityWithNoPermissionsOnTest() { Helper.createUser(userRepository, "test", "test-user"); User user = userRepository.findUserByName("test", "test-user"); List<ProjectWithEventCounts> projects = projectService.findProjectsActivityByUserInProjects(user.getId(), Collections.<Integer>emptyList()); Assert.assertEquals(0, projects.size()); } @Test public void testExistsWithShortName() { Assert.assertFalse(projectService.existsWithShortName(null)); Assert.assertFalse(projectService.existsWithShortName("")); Assert.assertFalse(projectService.existsWithShortName("PROJECT")); projectService.create("PROJECT", "PROJECT", "desc"); Assert.assertTrue(projectService.existsWithShortName("PROJECT")); } @Test public void testProjectMetadata() { projectService.create("test", "TEST", "desc"); ProjectMetadata metadata = projectService.getMetadata("TEST"); Assert.assertEquals(4, metadata.getColumnsDefinition().size()); //4 system labels Assert.assertEquals(4, metadata.getLabels().size()); CardLabel milestoneLabel = null; for (CardLabel cl : metadata.getLabels().values()) { if (SYSTEM_LABEL_MILESTONE.equals(cl.getName()) && cl.getDomain() == LabelDomain.SYSTEM) { milestoneLabel = cl; } } Assert.assertTrue(metadata.getLabelListValues().isEmpty()); cardLabelRepository.addLabelListValue(milestoneLabel.getId(), "1.0.0"); ProjectMetadata metadata2 = projectService.getMetadata("TEST"); Assert.assertEquals(1, metadata2.getLabelListValues().size()); LabelListValueWithMetadata llval = metadata2.getLabelListValues().values().iterator().next(); Assert.assertEquals("1.0.0", llval.getValue()); Assert.assertTrue(llval.getMetadata().isEmpty()); cardLabelRepository.createLabelListMetadata(llval.getId(), "muh", "perfs"); ProjectMetadata metadata3 = projectService.getMetadata("TEST"); LabelListValueWithMetadata llval3 = metadata3.getLabelListValues().get(llval.getId()); Assert.assertFalse(llval3.getMetadata().isEmpty()); Assert.assertEquals("perfs", llval3.getMetadata().get("muh")); } }