/**
* 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.model.CardLabelValue.LabelValue;
import io.lavagna.service.config.TestServiceConfig;
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.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 CardLabelRepositoryTest {
private final int SYSTEM_LABELS = 4;
@Autowired
private BoardRepository boardRepository;
@Autowired
private UserRepository userRepository;
@Autowired
private BoardColumnRepository boardColumnRepository;
@Autowired
private CardService cardService;
@Autowired
private ProjectService projectService;
@Autowired
private CardLabelRepository cardLabelRepository;
private Project project;
private Board board;
private BoardColumn column;
private User user;
private Card card;
@Before
public void setUpBoard() {
Helper.createUser(userRepository, "test", "label");
user = userRepository.findUserByName("test", "label");
project = projectService.create("test", "TEST", "desc");
board = boardRepository.createNewBoard("test-label", "LABEL", "label", projectService.findByShortName("TEST")
.getId());
List<BoardColumnDefinition> definitions = projectService.findColumnDefinitionsByProjectId(project.getId());
column = boardColumnRepository.addColumnToBoard("label-column", definitions.get(0).getId(),
BoardColumn.BoardColumnLocation.BOARD, board.getId());
card = cardService.createCard("card", column.getId(), new Date(), user);
}
@Test
public void testFindLabelByName() {
String milestoneName = SYSTEM_LABEL_MILESTONE;
Assert.assertEquals(milestoneName,
cardLabelRepository.findLabelByName(project.getId(), milestoneName, CardLabel.LabelDomain.SYSTEM)
.getName());
}
@Test
public void testFindLabelByNameWith2Projects() {
projectService.create("test2", "TEST2", "desc");
String milestoneName = SYSTEM_LABEL_MILESTONE;
Assert.assertEquals(milestoneName,
cardLabelRepository.findLabelByName(project.getId(), milestoneName, CardLabel.LabelDomain.SYSTEM)
.getName());
}
@Test(expected = DuplicateKeyException.class)
public void testAddDuplicateNameLabel() {
cardLabelRepository.addLabel(project.getId(), false, CardLabel.LabelType.STRING, CardLabel.LabelDomain.USER,
"label1", 0);
cardLabelRepository.addLabel(project.getId(), false, CardLabel.LabelType.STRING, CardLabel.LabelDomain.USER,
"label1", 0);
}
@Test
public void testRemoveLabel() {
Assert.assertEquals(SYSTEM_LABELS, cardLabelRepository.findLabelsByProject(project.getId()).size());
CardLabel inserted = cardLabelRepository.addLabel(project.getId(), false, CardLabel.LabelType.STRING,
CardLabel.LabelDomain.USER, "label1", 0);
Assert.assertEquals(SYSTEM_LABELS + 1, cardLabelRepository.findLabelsByProject(project.getId()).size());
cardLabelRepository.removeLabel(inserted.getId());
Assert.assertEquals(SYSTEM_LABELS, cardLabelRepository.findLabelsByProject(project.getId()).size());
}
@Test
public void testUpdateLabel() {
CardLabel inserted = cardLabelRepository.addLabel(project.getId(), false, CardLabel.LabelType.STRING,
CardLabel.LabelDomain.USER, "label1", 0);
Assert.assertEquals("label1", inserted.getName());
Assert.assertEquals(0, inserted.getColor());
Label label = new Label("label-new", false, inserted.getType(), 0xffffff);
cardLabelRepository.updateLabel(inserted.getId(), label);
CardLabel cl2 = cardLabelRepository.findLabelById(inserted.getId());
Assert.assertEquals("label-new", cl2.getName());
Assert.assertEquals(0xffffff, cl2.getColor());
}
@Test(expected = IllegalArgumentException.class)
public void testWrongUpdateSystemLabel() {
CardLabel randomSystemLabel = cardLabelRepository.findLabelsByProject(project.getId()).get(0);
Label label = new Label("label-new", false, randomSystemLabel.getType(), 0xffffff);
cardLabelRepository.updateLabel(randomSystemLabel.getId(), label);
}
@Test
public void testUpdateSystemLabel() {
CardLabel randomSystemLabel = cardLabelRepository.findLabelsByProject(project.getId()).get(0);
Label label = new Label("label-new", false, randomSystemLabel.getType(), 0xffffff);
cardLabelRepository.updateSystemLabel(randomSystemLabel.getId(), label);
CardLabel cl2 = cardLabelRepository.findLabelById(randomSystemLabel.getId());
Assert.assertEquals("label-new", cl2.getName());
Assert.assertEquals(0xffffff, cl2.getColor());
}
/**
* Cannot change a label type when already defined
*/
@Test(expected = IllegalArgumentException.class)
public void testUpdateLabelWithValuesAndNewType() {
CardLabel inserted = cardLabelRepository.addLabel(project.getId(), false, CardLabel.LabelType.STRING,
CardLabel.LabelDomain.USER, "label1", 0);
Assert.assertEquals(0, cardLabelRepository.findCardLabelValuesByCardId(card.getId()).size());
Assert.assertEquals(0, cardLabelRepository.labelUsedCount(inserted.getId()));
cardLabelRepository.addLabelValueToCard(inserted, card.getId(), new CardLabelValue.LabelValue("my string"));
Assert.assertEquals(1, cardLabelRepository.labelUsedCount(inserted.getId()));
Assert.assertEquals(1, cardLabelRepository.findCardLabelValuesByCardId(card.getId()).size());
Label label = new Label("label-new", false, inserted.getType(), inserted.getColor());
cardLabelRepository.updateLabel(inserted.getId(), label);
Assert.assertEquals(1, cardLabelRepository.findCardLabelValuesByCardId(card.getId()).size());
label = new Label("label-new-2", false, CardLabel.LabelType.TIMESTAMP, inserted.getColor());
cardLabelRepository.updateLabel(inserted.getId(), label);
}
@Test
public void testFindLabelValueByLabelAndValue() {
CardLabel label = cardLabelRepository.addLabel(project.getId(), false, CardLabel.LabelType.STRING,
CardLabel.LabelDomain.USER, "label1", 0);
CardLabelValue value = cardLabelRepository.addLabelValueToCard(label, card.getId(), new CardLabelValue.LabelValue("my string"));
List<CardLabelValue> found = cardLabelRepository.findLabelValueByLabelAndValue(card.getId(), label, new CardLabelValue.LabelValue("my string"));
Assert.assertEquals(1, found.size());
Assert.assertEquals(value.getCardLabelValueId(), found.get(0).getCardLabelValueId());
Assert.assertEquals(value.getValue(), found.get(0).getValue());
}
@Test
public void testFindUserLabelNameByGlobalRead() {
CardLabel label = cardLabelRepository.addLabel(project.getId(), false, CardLabel.LabelType.STRING,
CardLabel.LabelDomain.USER, "label1", 0);
UserWithPermission uwpGlobalRead = new UserWithPermission(user, EnumSet.of(Permission.READ),
Collections.<String, Set<Permission>>emptyMap(), Collections.<Integer, Set<Permission>>emptyMap());
List<CardLabel> foundLabels = cardLabelRepository.findUserLabelNameBy("label1", project.getId(), uwpGlobalRead);
Assert.assertEquals(1, foundLabels.size());
Assert.assertEquals(label.getName(), foundLabels.get(0).getName());
List<CardLabel> foundLabels2 = cardLabelRepository.findUserLabelNameBy("label1", null, uwpGlobalRead);
Assert.assertEquals(1, foundLabels2.size());
Assert.assertEquals(label.getName(), foundLabels2.get(0).getName());
}
@Test
public void testFindUserLabelNameByProjectRead() {
CardLabel label = cardLabelRepository.addLabel(project.getId(), false, CardLabel.LabelType.STRING,
CardLabel.LabelDomain.USER, "label1", 0);
UserWithPermission uwpProjectRead = new UserWithPermission(user, EnumSet.noneOf(Permission.class),
Collections.<String, Set<Permission>>singletonMap(project.getShortName(), EnumSet.of(Permission.READ)),
Collections.<Integer, Set<Permission>>singletonMap(project.getId(), EnumSet.of(Permission.READ)));
List<CardLabel> foundLabels1 = cardLabelRepository.findUserLabelNameBy("label1", project.getId(), uwpProjectRead);
Assert.assertEquals(1, foundLabels1.size());
Assert.assertEquals(label.getName(), foundLabels1.get(0).getName());
List<CardLabel> foundLabels2 = cardLabelRepository.findUserLabelNameBy("label1", null, uwpProjectRead);
Assert.assertEquals(1, foundLabels2.size());
Assert.assertEquals(label.getName(), foundLabels2.get(0).getName());
}
@Test(expected = IllegalArgumentException.class)
public void testFindUserLabelNameByProjectNoReadWithProjectId() {
cardLabelRepository.addLabel(project.getId(), false, CardLabel.LabelType.STRING, CardLabel.LabelDomain.USER, "label1", 0);
UserWithPermission noRead = new UserWithPermission(user, EnumSet.noneOf(Permission.class),
Collections.<String, Set<Permission>>emptyMap(), Collections.<Integer, Set<Permission>>emptyMap());
cardLabelRepository.findUserLabelNameBy("label1", project.getId(), noRead);
}
//TODO: check use and correctness for this case
@Test
public void testFindUserLabelNameByProjectNoReadWithProjectIdNull() {
cardLabelRepository.addLabel(project.getId(), false, CardLabel.LabelType.STRING, LabelDomain.USER, "label1", 0);
UserWithPermission noRead = new UserWithPermission(user, EnumSet.noneOf(Permission.class),
Collections.<String, Set<Permission>>emptyMap(), Collections.<Integer, Set<Permission>>emptyMap());
Assert.assertEquals(1, cardLabelRepository.findUserLabelNameBy("label1", null, noRead).size());
}
@Test
public void testAddLabelListValue() {
CardLabel label = cardLabelRepository.addLabel(project.getId(), false, CardLabel.LabelType.LIST, LabelDomain.USER, "listlabel", 0);
Assert.assertEquals(0, cardLabelRepository.findListValuesByLabelId(label.getId()).size());
LabelListValue llv = cardLabelRepository.addLabelListValue(label.getId(), "123");
cardLabelRepository.addLabelValueToCard(label, card.getId(), new CardLabelValue.LabelValue(null, null, null,
null, null, llv.getId()));
cardLabelRepository.createLabelListMetadata(llv.getId(), "MY_KEY", "MY_METADATA");
Assert.assertEquals(1, cardLabelRepository.findListValuesByLabelId(label.getId()).size());
Assert.assertEquals("123", cardLabelRepository.findListValuesByLabelId(label.getId()).get(0).getValue());
Assert.assertEquals("MY_METADATA", cardLabelRepository.findListValuesByLabelId(label.getId()).get(0).getMetadata().get("MY_KEY"));
cardLabelRepository.updateLabelListValue(llv.newValue("MY_NEW_VALUE"));
Assert.assertEquals("MY_NEW_VALUE", cardLabelRepository.findListValuesByLabelId(label.getId()).get(0).getValue());
//
UserWithPermission uwpGlobalRead = new UserWithPermission(user, EnumSet.of(Permission.READ),
Collections.<String, Set<Permission>>emptyMap(), Collections.<Integer, Set<Permission>>emptyMap());
Assert.assertEquals(1, cardLabelRepository.findListValuesBy(LabelDomain.USER, "listlabel", "MY_NEW_VALUE", project.getId(), uwpGlobalRead).size());
Assert.assertEquals("MY_NEW_VALUE", cardLabelRepository.findListValuesBy(LabelDomain.USER, "listlabel", "MY_NEW_VALUE", project.getId(), uwpGlobalRead).get(0));
Assert.assertEquals(1, cardLabelRepository.findListValuesBy(LabelDomain.USER, "listlabel", "MY_NEW_VALUE", null, uwpGlobalRead).size());
Assert.assertEquals("MY_NEW_VALUE", cardLabelRepository.findListValuesBy(LabelDomain.USER, "listlabel", "MY_NEW_VALUE", null, uwpGlobalRead).get(0));
}
@Test
public void testFindListValueById() {
CardLabel label = cardLabelRepository.addLabel(project.getId(), false, CardLabel.LabelType.LIST,
CardLabel.LabelDomain.USER, "listlabel", 0);
LabelListValue llv = cardLabelRepository.addLabelListValue(label.getId(), "1");
Assert.assertEquals("1", cardLabelRepository.findListValueById(llv.getId()).getValue());
}
@Test(expected = EmptyResultDataAccessException.class)
public void testFindListValueByIdWithBadId() {
Assert.assertEquals("1", cardLabelRepository.findListValueById(-3).getValue());
}
@Test
public void testRemoveLabelListValue() {
CardLabel label = cardLabelRepository.addLabel(project.getId(), false, CardLabel.LabelType.LIST,
CardLabel.LabelDomain.USER, "listlabel", 0);
LabelListValue v1 = cardLabelRepository.addLabelListValue(label.getId(), "1");
Assert.assertEquals(1, cardLabelRepository.findListValuesByLabelId(label.getId()).size());
cardLabelRepository.removeLabelListValue(v1.getId());
Assert.assertEquals(0, cardLabelRepository.findListValuesByLabelId(label.getId()).size());
}
@Test
public void testSwapListLabel() {
CardLabel label = cardLabelRepository.addLabel(project.getId(), false, CardLabel.LabelType.LIST,
CardLabel.LabelDomain.USER, "listlabel", 0);
LabelListValue v1 = cardLabelRepository.addLabelListValue(label.getId(), "1");
LabelListValue v2 = cardLabelRepository.addLabelListValue(label.getId(), "2");
List<LabelListValueWithMetadata> values = cardLabelRepository.findListValuesByLabelId(label.getId());
Assert.assertEquals(1, values.get(0).getOrder());
Assert.assertEquals("1", values.get(0).getValue());
Assert.assertEquals(2, values.get(1).getOrder());
Assert.assertEquals("2", values.get(1).getValue());
cardLabelRepository.swapLabelListValues(v1.getId(), v2.getId());
values = cardLabelRepository.findListValuesByLabelId(label.getId());
Assert.assertEquals(1, values.get(0).getOrder());
Assert.assertEquals("2", values.get(0).getValue());
Assert.assertEquals(2, values.get(1).getOrder());
Assert.assertEquals("1", values.get(1).getValue());
}
@Test
public void testMoveLabelListValueToOrder() {
CardLabel label = cardLabelRepository.addLabel(project.getId(), false, CardLabel.LabelType.LIST,
CardLabel.LabelDomain.USER, "listlabel", 0);
LabelListValue v1 = cardLabelRepository.addLabelListValue(label.getId(), "1");
LabelListValue v2 = cardLabelRepository.addLabelListValue(label.getId(), "2");
List<LabelListValueWithMetadata> values = cardLabelRepository.findListValuesByLabelId(label.getId());
Assert.assertEquals(1, values.get(0).getOrder());
Assert.assertEquals("1", values.get(0).getValue());
Assert.assertEquals(2, values.get(1).getOrder());
Assert.assertEquals("2", values.get(1).getValue());
cardLabelRepository.moveLabelListValueToOrder(v1.getId(), v2.getOrder());
values = cardLabelRepository.findListValuesByLabelId(label.getId());
Assert.assertEquals(1, values.get(0).getOrder());
Assert.assertEquals("2", values.get(0).getValue());
Assert.assertEquals(2, values.get(1).getOrder());
Assert.assertEquals("1", values.get(1).getValue());
}
@Test
public void testCountLabelListValueUse() {
CardLabel label = cardLabelRepository.addLabel(project.getId(), false, CardLabel.LabelType.LIST,
CardLabel.LabelDomain.USER, "listlabel", 0);
LabelListValue llv = cardLabelRepository.addLabelListValue(label.getId(), "1");
Assert.assertEquals(0, cardLabelRepository.countLabeListValueUse(llv.getId()));
cardLabelRepository.addLabelValueToCard(label, card.getId(), new LabelValue(null, null, null, null, null, llv.getId()));
Assert.assertEquals(1, cardLabelRepository.countLabeListValueUse(llv.getId()));
}
@Test
public void testLabelListValueMapping() {
CardLabel label = cardLabelRepository.addLabel(project.getId(), false, CardLabel.LabelType.LIST,
CardLabel.LabelDomain.USER, "listlabel", 0);
LabelListValue llv = cardLabelRepository.addLabelListValue(label.getId(), "listvalue");
Assert.assertTrue(cardLabelRepository.findLabelListValueMapping(Collections.<String>emptyList()).isEmpty());
Assert.assertFalse(cardLabelRepository.findLabelListValueMapping(Collections.singletonList("listvalue")).isEmpty());
cardLabelRepository.addLabelValueToCard(label, card.getId(), new LabelValue(null, null, null, null, null, llv.getId()));
Map<String, Map<Integer, Integer>> mapping = cardLabelRepository.findLabelListValueMapping(Collections.singletonList("listvalue"));
Assert.assertTrue(mapping.containsKey("listvalue"));
Assert.assertTrue(mapping.get("listvalue").containsKey(label.getId()));
Assert.assertEquals(Integer.valueOf(llv.getId()), mapping.get("listvalue").get(label.getId()));
}
@Test
public void testHandleLabelListValueMetadata() {
CardLabel label = cardLabelRepository.addLabel(project.getId(), false, CardLabel.LabelType.LIST,
CardLabel.LabelDomain.USER, "listlabel", 0);
LabelListValue llv = cardLabelRepository.addLabelListValue(label.getId(), "1");
Assert.assertTrue(cardLabelRepository.findListValueMetadataByLabelListValueId(llv.getId()).isEmpty());
//creation
cardLabelRepository.createLabelListMetadata(llv.getId(), "KEY", "VALUE");
List<ListValueMetadata> metadatas = cardLabelRepository.findListValueMetadataByLabelListValueId(llv.getId());
Assert.assertEquals(1, metadatas.size());
ListValueMetadata metadata = metadatas.get(0);
Assert.assertEquals("KEY", metadata.getKey());
Assert.assertEquals("VALUE", metadata.getValue());
//update
cardLabelRepository.updateLabelListMetadata(new ListValueMetadata(metadata.getLabelListValueId(), metadata.getKey(), "NEW_VALUE"));
List<ListValueMetadata> metadatas2 = cardLabelRepository.findListValueMetadataByLabelListValueId(llv.getId());
Assert.assertEquals(1, metadatas2.size());
ListValueMetadata metadata2 = metadatas2.get(0);
Assert.assertEquals("KEY", metadata2.getKey());
Assert.assertEquals("NEW_VALUE", metadata2.getValue());
//delete
cardLabelRepository.removeLabelListMetadata(metadata2.getLabelListValueId(), metadata2.getKey());
Assert.assertTrue(cardLabelRepository.findListValueMetadataByLabelListValueId(llv.getId()).isEmpty());
}
}