/*
* Copyright 2015 herd contributors
*
* 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 org.finra.herd.service;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Sets;
import org.junit.Test;
import org.finra.herd.core.HerdDateUtils;
import org.finra.herd.model.AlreadyExistsException;
import org.finra.herd.model.ObjectNotFoundException;
import org.finra.herd.model.api.xml.Tag;
import org.finra.herd.model.api.xml.TagChild;
import org.finra.herd.model.api.xml.TagCreateRequest;
import org.finra.herd.model.api.xml.TagKey;
import org.finra.herd.model.api.xml.TagListResponse;
import org.finra.herd.model.api.xml.TagSearchFilter;
import org.finra.herd.model.api.xml.TagSearchKey;
import org.finra.herd.model.api.xml.TagSearchRequest;
import org.finra.herd.model.api.xml.TagSearchResponse;
import org.finra.herd.model.api.xml.TagUpdateRequest;
import org.finra.herd.model.dto.ConfigurationValue;
import org.finra.herd.model.jpa.TagEntity;
import org.finra.herd.model.jpa.TagTypeEntity;
import org.finra.herd.service.impl.TagServiceImpl;
public class TagServiceTest extends AbstractServiceTest
{
@Test
public void testCreateTag()
{
// Create and persist a tag type entity.
tagTypeDaoTestHelper.createTagTypeEntity(TAG_TYPE, TAG_TYPE_DISPLAY_NAME, TAG_TYPE_ORDER, TAG_TYPE_DESCRIPTION);
// Create a tag key.
TagKey tagKey = new TagKey(TAG_TYPE, TAG_CODE);
// Create a tag.
Tag tag = tagService.createTag(new TagCreateRequest(tagKey, TAG_DISPLAY_NAME, TAG_DESCRIPTION, NO_PARENT_TAG_KEY));
// Get the tag entity.
TagEntity tagEntity = tagDao.getTagByKey(tagKey);
assertNotNull(tagEntity);
// Validate the response object.
assertEquals(
new Tag(tagEntity.getId(), new TagKey(TAG_TYPE, TAG_CODE), TAG_DISPLAY_NAME, TAG_DESCRIPTION, tagEntity.getCreatedBy(), tagEntity.getUpdatedBy(),
HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG), tag);
}
@Test
public void testCreateTagDisplayNameAlreadyExists()
{
// Create and persist a tag entity.
tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE, TAG_DISPLAY_NAME.toUpperCase(), TAG_DESCRIPTION);
// Try to create a tag with a duplicate tag display name.
try
{
tagService.createTag(new TagCreateRequest(new TagKey(TAG_TYPE, TAG_CODE_2), TAG_DISPLAY_NAME.toLowerCase(), TAG_DESCRIPTION, NO_PARENT_TAG_KEY));
fail();
}
catch (AlreadyExistsException e)
{
assertEquals(String
.format("Display name \"%s\" already exists for a tag with tag type \"%s\" and tag code \"%s\".", TAG_DISPLAY_NAME.toLowerCase(), TAG_TYPE,
TAG_CODE), e.getMessage());
}
}
@Test
public void testCreateTagInvalidParameters()
{
// Try to create a tag when tag type contains a forward slash character.
try
{
tagService.createTag(new TagCreateRequest(new TagKey(addSlash(TAG_TYPE), TAG_CODE), TAG_DISPLAY_NAME, TAG_DESCRIPTION, NO_PARENT_TAG_KEY));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("Tag type code can not contain a forward slash character.", e.getMessage());
}
// Try to create a tag when tag code contains a forward slash character.
try
{
tagService.createTag(new TagCreateRequest(new TagKey(TAG_TYPE, addSlash(TAG_CODE)), TAG_DISPLAY_NAME, TAG_DESCRIPTION, NO_PARENT_TAG_KEY));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("Tag code can not contain a forward slash character.", e.getMessage());
}
// Try to create a tag with parent tag type is not the same as the requested.
try
{
tagService.createTag(new TagCreateRequest(new TagKey(TAG_TYPE, TAG_CODE), TAG_DISPLAY_NAME, TAG_DESCRIPTION, new TagKey(TAG_TYPE_2, TAG_CODE_2)));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("Tag type code in parent tag key must match the tag type code in the request.", e.getMessage());
}
}
@Test
public void testCreateTagLowerCaseParameters()
{
// Create and persist a tag type entity.
tagTypeDaoTestHelper.createTagTypeEntity(TAG_TYPE, TAG_TYPE_DISPLAY_NAME, TAG_TYPE_ORDER, TAG_TYPE_DESCRIPTION);
// Create a tag key.
TagKey tagKey = new TagKey(TAG_TYPE, TAG_CODE);
// Create a tag using lowercase input parameters.
Tag resultTag = tagService.createTag(
new TagCreateRequest(new TagKey(TAG_TYPE.toLowerCase(), TAG_CODE.toLowerCase()), TAG_DISPLAY_NAME.toLowerCase(), TAG_DESCRIPTION.toLowerCase(),
NO_PARENT_TAG_KEY));
// Get the tag entity.
TagEntity tagEntity = tagDao.getTagByKey(tagKey);
assertNotNull(tagEntity);
// Validate the returned object.
assertEquals(new Tag(tagEntity.getId(), new TagKey(TAG_TYPE, TAG_CODE.toLowerCase()), TAG_DISPLAY_NAME.toLowerCase(), TAG_DESCRIPTION.toLowerCase(),
tagEntity.getCreatedBy(), tagEntity.getUpdatedBy(), HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY,
NO_TAG_HAS_CHILDREN_FLAG), resultTag);
}
@Test
public void testCreateTagMissingOptionalParametersPassedAsNulls()
{
// Create and persist a tag type entity.
tagTypeDaoTestHelper.createTagTypeEntity(TAG_TYPE, TAG_TYPE_DISPLAY_NAME, TAG_TYPE_ORDER, TAG_TYPE_DESCRIPTION);
// Create a tag key.
TagKey tagKey = new TagKey(TAG_TYPE, TAG_CODE);
// Create a tag with description passed in as null.
Tag tag = tagService.createTag(new TagCreateRequest(tagKey, TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, NO_PARENT_TAG_KEY));
// Get the tag entity.
TagEntity tagEntity = tagDao.getTagByKey(tagKey);
assertNotNull(tagEntity);
// Validate the response object.
assertEquals(new Tag(tagEntity.getId(), tagKey, TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, tagEntity.getCreatedBy(), tagEntity.getUpdatedBy(),
HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG), tag);
}
@Test
public void testCreateTagMissingOptionalParametersPassedAsWhitespace()
{
// Create and persist a tag type entity.
tagTypeDaoTestHelper.createTagTypeEntity(TAG_TYPE, TAG_TYPE_DISPLAY_NAME, TAG_TYPE_ORDER, TAG_TYPE_DESCRIPTION);
// Create a tag key.
TagKey tagKey = new TagKey(TAG_TYPE, TAG_CODE);
// Create a tag with description passed in as whitespace.
Tag tag = tagService.createTag(new TagCreateRequest(tagKey, TAG_DISPLAY_NAME, BLANK_TEXT, NO_PARENT_TAG_KEY));
// Get the tag entity.
TagEntity tagEntity = tagDao.getTagByKey(tagKey);
assertNotNull(tagEntity);
// Validate the response object.
assertEquals(new Tag(tagEntity.getId(), tagKey, TAG_DISPLAY_NAME, BLANK_TEXT, tagEntity.getCreatedBy(), tagEntity.getUpdatedBy(),
HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG), tag);
}
@Test
public void testCreateTagMissingRequiredParams()
{
// Missing tag key.
try
{
tagService.createTag(new TagCreateRequest(null, TAG_DISPLAY_NAME, TAG_DESCRIPTION, NO_PARENT_TAG_KEY));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("A tag key must be specified.", e.getMessage());
}
// Missing tag type code in the key.
try
{
tagService.createTag(new TagCreateRequest(new TagKey(null, TAG_CODE), TAG_DISPLAY_NAME, TAG_DESCRIPTION, NO_PARENT_TAG_KEY));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("A tag type code must be specified.", e.getMessage());
}
// Missing tag code in the key.
try
{
tagService.createTag(new TagCreateRequest(new TagKey(TAG_TYPE, null), TAG_DISPLAY_NAME, TAG_DESCRIPTION, NO_PARENT_TAG_KEY));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("A tag code must be specified.", e.getMessage());
}
// Missing display name in the request.
try
{
tagService.createTag(new TagCreateRequest(new TagKey(TAG_TYPE, TAG_CODE), null, TAG_DESCRIPTION, NO_PARENT_TAG_KEY));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("A display name must be specified.", e.getMessage());
}
}
@Test
public void testCreateTagParentTagNoExists()
{
// Create and persist a tag type entity.
tagTypeDaoTestHelper.createTagTypeEntity(TAG_TYPE, TAG_TYPE_DISPLAY_NAME, TAG_TYPE_ORDER, TAG_TYPE_DESCRIPTION);
// Try to create a tag with a non-existing parent tag.
try
{
tagService.createTag(new TagCreateRequest(new TagKey(TAG_TYPE, TAG_CODE), TAG_DISPLAY_NAME, TAG_DESCRIPTION, new TagKey(TAG_TYPE, TAG_CODE_2)));
fail();
}
catch (ObjectNotFoundException e)
{
assertEquals(String.format("Tag with code \"%s\" doesn't exist for tag type \"%s\".", TAG_CODE_2, TAG_TYPE), e.getMessage());
}
}
@Test
public void testCreateTagTagAlreadyExists()
{
// Create and persist a tag entity.
tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE.toUpperCase(), TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Try to create a duplicate tag (uses the same tag type and tag name).
try
{
tagService.createTag(new TagCreateRequest(new TagKey(TAG_TYPE, TAG_CODE.toLowerCase()), TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_2, NO_PARENT_TAG_KEY));
fail();
}
catch (AlreadyExistsException e)
{
assertEquals(String
.format("Unable to create tag with tag type code \"%s\" and tag code \"%s\" because it already exists.", TAG_TYPE, TAG_CODE.toLowerCase()),
e.getMessage());
}
}
@Test
public void testCreateTagTagTypeNoExists()
{
// Try to create a tag using non-existing tag type.
try
{
tagService.createTag(new TagCreateRequest(new TagKey(TAG_TYPE, TAG_CODE), TAG_DISPLAY_NAME, TAG_DESCRIPTION, NO_PARENT_TAG_KEY));
fail();
}
catch (ObjectNotFoundException e)
{
assertEquals(String.format("Tag type with code \"%s\" doesn't exist.", TAG_TYPE), e.getMessage());
}
}
@Test
public void testCreateTagTrimParameters()
{
// Create and persist a tag type entity.
tagTypeDaoTestHelper.createTagTypeEntity(TAG_TYPE, TAG_TYPE_DISPLAY_NAME, TAG_TYPE_ORDER, TAG_TYPE_DESCRIPTION);
// Create a tag key.
TagKey tagKey = new TagKey(TAG_TYPE, TAG_CODE);
// Create a tag with parameters padded with whitespace.
Tag tag = tagService.createTag(
new TagCreateRequest(new TagKey(addWhitespace(TAG_TYPE), addWhitespace(TAG_CODE)), addWhitespace(TAG_DISPLAY_NAME), addWhitespace(TAG_DESCRIPTION),
NO_PARENT_TAG_KEY));
// Get the tag entity.
TagEntity tagEntity = tagDao.getTagByKey(tagKey);
assertNotNull(tagEntity);
// Validate the response object.
assertEquals(new Tag(tagEntity.getId(), new TagKey(TAG_TYPE, TAG_CODE), TAG_DISPLAY_NAME, addWhitespace(TAG_DESCRIPTION), tagEntity.getCreatedBy(),
tagEntity.getUpdatedBy(), HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG), tag);
}
@Test
public void testCreateTagUpperCaseParameters()
{
// Create and persist a tag type entity.
tagTypeDaoTestHelper.createTagTypeEntity(TAG_TYPE, TAG_TYPE_DISPLAY_NAME, TAG_TYPE_ORDER, TAG_TYPE_DESCRIPTION);
// Create a tag key.
TagKey tagKey = new TagKey(TAG_TYPE, TAG_CODE);
// Create a tag using uppercase input parameters.
Tag resultTag = tagService.createTag(
new TagCreateRequest(new TagKey(TAG_TYPE.toUpperCase(), TAG_CODE.toUpperCase()), TAG_DISPLAY_NAME.toUpperCase(), TAG_DESCRIPTION.toUpperCase(),
NO_PARENT_TAG_KEY));
// Get the tag entity.
TagEntity tagEntity = tagDao.getTagByKey(tagKey);
assertNotNull(tagEntity);
// Validate the returned object.
assertEquals(new Tag(resultTag.getId(), new TagKey(TAG_TYPE, TAG_CODE.toUpperCase()), TAG_DISPLAY_NAME.toUpperCase(), TAG_DESCRIPTION.toUpperCase(),
tagEntity.getCreatedBy(), tagEntity.getUpdatedBy(), HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY,
NO_TAG_HAS_CHILDREN_FLAG), resultTag);
}
@Test
public void testCreateTagWithParent()
{
// Create and persist a tag type entity.
tagTypeDaoTestHelper.createTagTypeEntity(TAG_TYPE, TAG_TYPE_DISPLAY_NAME, TAG_TYPE_ORDER, TAG_TYPE_DESCRIPTION);
// Create a tag key.
TagKey parentTagKey = new TagKey(TAG_TYPE, TAG_CODE);
// Create a parent tag.
Tag parentTag = tagService.createTag(new TagCreateRequest(parentTagKey, TAG_DISPLAY_NAME, TAG_DESCRIPTION, NO_PARENT_TAG_KEY));
// Get the parent tag entity.
TagEntity parentTagEntity = tagDao.getTagByKey(parentTagKey);
assertNotNull(parentTagEntity);
// Validate the response object.
assertEquals(new Tag(parentTagEntity.getId(), new TagKey(TAG_TYPE, TAG_CODE), TAG_DISPLAY_NAME, TAG_DESCRIPTION, parentTagEntity.getCreatedBy(),
parentTagEntity.getUpdatedBy(), HerdDateUtils.getXMLGregorianCalendarValue(parentTagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY,
NO_TAG_HAS_CHILDREN_FLAG), parentTag);
// Create a tag key.
TagKey childTagKey = new TagKey(TAG_TYPE, TAG_CODE_2);
// Create a child tag.
Tag childTag = tagService.createTag(new TagCreateRequest(childTagKey, TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_2, parentTagKey));
// Get the child tag entity.
TagEntity childTagEntity = tagDao.getTagByKey(childTagKey);
assertNotNull(childTagEntity);
assertEquals(
new Tag(childTagEntity.getId(), childTagKey, TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_2, childTagEntity.getCreatedBy(), childTagEntity.getUpdatedBy(),
HerdDateUtils.getXMLGregorianCalendarValue(childTagEntity.getUpdatedOn()), parentTagKey, NO_TAG_HAS_CHILDREN_FLAG), childTag);
}
@Test
public void testDeleteTag()
{
// Create a tag key.
TagKey tagKey = new TagKey(TAG_TYPE, TAG_CODE);
// Create and persist a tag entity.
tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Validate that this tag exists.
TagEntity tagEntity = tagDao.getTagByKey(tagKey);
assertNotNull(tagEntity);
// Delete this tag.
Tag deletedTag = tagService.deleteTag(new TagKey(TAG_TYPE, TAG_CODE));
// Validate the returned object.
assertEquals(new Tag(tagEntity.getId(), tagKey, TAG_DISPLAY_NAME, TAG_DESCRIPTION, tagEntity.getCreatedBy(), tagEntity.getUpdatedBy(),
HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG), deletedTag);
// Ensure that this tag is no longer there.
assertNull(tagDao.getTagByKey(tagKey));
}
@Test
public void testDeleteTagLowerCaseParameters()
{
// Create a tag key.
TagKey tagKey = new TagKey(TAG_TYPE, TAG_CODE);
// Create and persist a tag entity.
tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Validate that this tag exists.
TagEntity tagEntity = tagDao.getTagByKey(tagKey);
assertNotNull(tagEntity);
// Delete this tag using uppercase input parameters.
Tag deletedTag = tagService.deleteTag(new TagKey(TAG_TYPE.toLowerCase(), TAG_CODE.toLowerCase()));
// Validate the returned object.
assertEquals(new Tag(tagEntity.getId(), tagKey, TAG_DISPLAY_NAME, TAG_DESCRIPTION, tagEntity.getCreatedBy(), tagEntity.getUpdatedBy(),
HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG), deletedTag);
// Ensure that this tag is no longer there.
assertNull(tagDao.getTagByKey(tagKey));
}
@Test
public void testDeleteTagMissingRequiredParameters()
{
// Try to delete a tag when tag type is not specified.
try
{
tagService.deleteTag(new TagKey(BLANK_TEXT, TAG_CODE));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("A tag type code must be specified.", e.getMessage());
}
// Try to delete a tag when tag code is not specified.
try
{
tagService.deleteTag(new TagKey(TAG_TYPE, BLANK_TEXT));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("A tag code must be specified.", e.getMessage());
}
}
@Test
public void testDeleteTagTagNoExists()
{
// Try to delete a non-existing tag.
try
{
tagService.deleteTag(new TagKey(TAG_TYPE, TAG_CODE));
fail();
}
catch (ObjectNotFoundException e)
{
assertEquals(String.format("Tag with code \"%s\" doesn't exist for tag type \"%s\".", TAG_CODE, TAG_TYPE), e.getMessage());
}
}
@Test
public void testDeleteTagTrimParameters()
{
// Create a tag key.
TagKey tagKey = new TagKey(TAG_TYPE, TAG_CODE);
// Create and persist a tag entity.
tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Validate that this tag exists.
TagEntity tagEntity = tagDao.getTagByKey(tagKey);
assertNotNull(tagEntity);
// Delete this tag using input parameters with leading and trailing empty spaces.
Tag deletedTag = tagService.deleteTag(new TagKey(addWhitespace(TAG_TYPE), addWhitespace(TAG_CODE)));
// Validate the returned object.
assertEquals(new Tag(tagEntity.getId(), tagKey, TAG_DISPLAY_NAME, TAG_DESCRIPTION, tagEntity.getCreatedBy(), tagEntity.getUpdatedBy(),
HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG), deletedTag);
// Ensure that this tag is no longer there.
assertNull(tagDao.getTagByKey(tagKey));
}
@Test
public void testDeleteTagUpperCaseParameters()
{
// Create a tag key.
TagKey tagKey = new TagKey(TAG_TYPE, TAG_CODE);
// Create and persist a tag entity.
tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Validate that this tag exists.
TagEntity tagEntity = tagDao.getTagByKey(tagKey);
assertNotNull(tagEntity);
// Delete this tag using uppercase input parameters.
Tag deletedTag = tagService.deleteTag(new TagKey(TAG_TYPE.toUpperCase(), TAG_CODE.toUpperCase()));
// Validate the returned object.
assertEquals(new Tag(tagEntity.getId(), tagKey, TAG_DISPLAY_NAME, TAG_DESCRIPTION, tagEntity.getCreatedBy(), tagEntity.getUpdatedBy(),
HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG), deletedTag);
// Ensure that this tag is no longer there.
assertNull(tagDao.getTagByKey(tagKey));
}
@Test
public void testDeleteTagWithParent()
{
// Create and persist a tag type entity.
tagTypeDaoTestHelper.createTagTypeEntity(TAG_TYPE, TAG_TYPE_DISPLAY_NAME, TAG_TYPE_ORDER, TAG_TYPE_DESCRIPTION);
// Create a tag key.
TagKey parentTagKey = new TagKey(TAG_TYPE, TAG_CODE);
// Create a parent tag.
Tag parentTag = tagService.createTag(new TagCreateRequest(parentTagKey, TAG_DISPLAY_NAME, TAG_DESCRIPTION, NO_PARENT_TAG_KEY));
// Get the parent tag entity.
TagEntity parentTagEntity = tagDao.getTagByKey(parentTagKey);
assertNotNull(parentTagEntity);
// Validate the response object.
assertEquals(new Tag(parentTagEntity.getId(), new TagKey(TAG_TYPE, TAG_CODE), TAG_DISPLAY_NAME, TAG_DESCRIPTION, parentTagEntity.getCreatedBy(),
parentTagEntity.getUpdatedBy(), HerdDateUtils.getXMLGregorianCalendarValue(parentTagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY,
NO_TAG_HAS_CHILDREN_FLAG), parentTag);
// Create a tag key.
TagKey childTagKey = new TagKey(TAG_TYPE, TAG_CODE_2);
// Create a child tag.
Tag childTag = tagService.createTag(new TagCreateRequest(childTagKey, TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_2, parentTagKey));
// Get the child tag entity.
TagEntity childTagEntity = tagDao.getTagByKey(childTagKey);
assertNotNull(childTagEntity);
assertEquals(
new Tag(childTagEntity.getId(), childTagKey, TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_2, childTagEntity.getCreatedBy(), childTagEntity.getUpdatedBy(),
HerdDateUtils.getXMLGregorianCalendarValue(childTagEntity.getUpdatedOn()), parentTagKey, NO_TAG_HAS_CHILDREN_FLAG), childTag);
// Delete this tag.
Tag deletedTag = tagService.deleteTag(childTagKey);
// Validate the returned object.
assertEquals(new Tag(childTagEntity.getId(), childTagKey, TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_2, childTagEntity.getCreatedBy(),
childTagEntity.getUpdatedBy(), HerdDateUtils.getXMLGregorianCalendarValue(childTagEntity.getUpdatedOn()), parentTagKey,
NO_TAG_HAS_CHILDREN_FLAG), deletedTag);
// Ensure that this tag is no longer there.
assertNull(tagDao.getTagByKey(childTagKey));
}
@Test
public void testGetTag()
{
// Create and persist a tag entity.
TagEntity tagEntity = tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Retrieve the tag.
Tag resultTag = tagService.getTag(new TagKey(TAG_TYPE, TAG_CODE));
// Validate the returned object.
assertEquals(
new Tag(tagEntity.getId(), new TagKey(TAG_TYPE, TAG_CODE), TAG_DISPLAY_NAME, TAG_DESCRIPTION, tagEntity.getCreatedBy(), tagEntity.getUpdatedBy(),
HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG), resultTag);
}
@Test
public void testGetTagLowerCaseParameters()
{
// Create and persist a tag entity.
TagEntity tagEntity = tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Get the tag using lower case input parameters.
Tag resultTag = tagService.getTag(new TagKey(TAG_TYPE.toLowerCase(), TAG_CODE.toLowerCase()));
// Validate the returned object.
assertEquals(
new Tag(tagEntity.getId(), new TagKey(TAG_TYPE, TAG_CODE), TAG_DISPLAY_NAME, TAG_DESCRIPTION, tagEntity.getCreatedBy(), tagEntity.getUpdatedBy(),
HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG), resultTag);
}
@Test
public void testGetTagMissingRequiredParameters()
{
// Try to get a tag when tag type is not specified.
try
{
tagService.getTag(new TagKey(BLANK_TEXT, TAG_CODE));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("A tag type code must be specified.", e.getMessage());
}
// Try to get a tag when tag code is not specified.
try
{
tagService.getTag(new TagKey(TAG_TYPE, BLANK_TEXT));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("A tag code must be specified.", e.getMessage());
}
}
@Test
public void testGetTagTagNoExists()
{
// Try to get a non-existing tag.
try
{
tagService.getTag(new TagKey(TAG_TYPE, TAG_CODE));
fail();
}
catch (ObjectNotFoundException e)
{
assertEquals(String.format("Tag with code \"%s\" doesn't exist for tag type \"%s\".", TAG_CODE, TAG_TYPE), e.getMessage());
}
}
@Test
public void testGetTagTrimParameters()
{
// Create and persist a tag entity.
TagEntity tagEntity = tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Retrieve the tag using input parameters with leading and trailing empty spaces.
Tag resultTag = tagService.getTag(new TagKey(addWhitespace(TAG_TYPE), addWhitespace(TAG_CODE)));
// Validate the returned object.
assertEquals(
new Tag(tagEntity.getId(), new TagKey(TAG_TYPE, TAG_CODE), TAG_DISPLAY_NAME, TAG_DESCRIPTION, tagEntity.getCreatedBy(), tagEntity.getUpdatedBy(),
HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG), resultTag);
}
@Test
public void testGetTagUpperCaseParameters()
{
// Create and persist a tag entity.
TagEntity tagEntity = tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Get the tag using uppercase input parameters.
Tag resultTag = tagService.getTag(new TagKey(TAG_TYPE.toUpperCase(), TAG_CODE.toUpperCase()));
// Validate the returned object.
assertEquals(
new Tag(tagEntity.getId(), new TagKey(TAG_TYPE, TAG_CODE), TAG_DISPLAY_NAME, TAG_DESCRIPTION, tagEntity.getCreatedBy(), tagEntity.getUpdatedBy(),
HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG), resultTag);
}
@Test
public void testGetTags()
{
// Create and persist a tag type entity.
TagTypeEntity tagTypeEntity = tagTypeDaoTestHelper.createTagTypeEntity(TAG_TYPE, TAG_TYPE_DISPLAY_NAME, TAG_TYPE_ORDER, TAG_TYPE_DESCRIPTION);
// Create and persist two tag entities for the same tag type.
tagDaoTestHelper.createTagEntity(tagTypeEntity, TAG_CODE, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
tagDaoTestHelper.createTagEntity(tagTypeEntity, TAG_CODE_2, TAG_TYPE_DISPLAY_NAME_2, TAG_DESCRIPTION_2);
// Retrieve a list of tag keys.
TagListResponse resultTagKeys = tagService.getTags(TAG_TYPE, NO_PARENT_TAG_CODE);
// Validate the returned object.
assertNotNull(resultTagKeys);
assertEquals(Arrays
.asList(new TagChild(new TagKey(TAG_TYPE, TAG_CODE), TAG_HAS_NO_CHILDREN), new TagChild(new TagKey(TAG_TYPE, TAG_CODE_2), TAG_HAS_NO_CHILDREN)),
resultTagKeys.getTagChildren());
}
@Test
public void testGetTagsLowerCaseParameters()
{
// Create and persist a tag type entity.
TagTypeEntity tagTypeEntity = tagTypeDaoTestHelper.createTagTypeEntity(TAG_TYPE, TAG_TYPE_DISPLAY_NAME, TAG_TYPE_ORDER, TAG_TYPE_DESCRIPTION);
// Create and persist two tag entities for the same tag type.
tagDaoTestHelper.createTagEntity(tagTypeEntity, TAG_CODE, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
tagDaoTestHelper.createTagEntity(tagTypeEntity, TAG_CODE_2, TAG_TYPE_DISPLAY_NAME_2, TAG_DESCRIPTION_2);
// Retrieve a list of tag keys using lowercase input parameters.
TagListResponse resultTagKeys = tagService.getTags(addWhitespace(TAG_TYPE), NO_PARENT_TAG_CODE);
// Validate the returned object.
assertNotNull(resultTagKeys);
assertEquals(Arrays
.asList(new TagChild(new TagKey(TAG_TYPE, TAG_CODE), TAG_HAS_NO_CHILDREN), new TagChild(new TagKey(TAG_TYPE, TAG_CODE_2), TAG_HAS_NO_CHILDREN)),
resultTagKeys.getTagChildren());
}
@Test
public void testGetTagsMissingRequiredParameters()
{
// Try to get a tag when tag type is not specified.
try
{
tagService.getTags(BLANK_TEXT, NO_PARENT_TAG_CODE);
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("A tag type code must be specified.", e.getMessage());
}
}
@Test
public void testGetTagsTagTypeNoExists()
{
// Try to retrieve a list of tag keys for a non-existing tag type.
try
{
tagService.getTags(TAG_TYPE, NO_PARENT_TAG_CODE);
fail();
}
catch (ObjectNotFoundException e)
{
assertEquals(String.format("Tag type with code \"%s\" doesn't exist.", TAG_TYPE), e.getMessage());
}
}
@Test
public void testGetTagsTagsNoExist()
{
// Create and persist a tag type entity.
tagTypeDaoTestHelper.createTagTypeEntity(TAG_TYPE, TAG_TYPE_DISPLAY_NAME, TAG_TYPE_ORDER, TAG_TYPE_DESCRIPTION);
// Retrieve a list of tag keys, when none of the tags exist for the tag type.
TagListResponse resultTagKeys = tagService.getTags(TAG_TYPE, NO_PARENT_TAG_CODE);
// Validate the returned object.
assertNotNull(resultTagKeys);
assertEquals(0, resultTagKeys.getTagChildren().size());
}
@Test
public void testGetTagsTrimParameters()
{
// Create and persist a tag type entity.
TagTypeEntity tagTypeEntity = tagTypeDaoTestHelper.createTagTypeEntity(TAG_TYPE, TAG_TYPE_DISPLAY_NAME, TAG_TYPE_ORDER, TAG_TYPE_DESCRIPTION);
// Create and persist two tag entities for the same tag type.
tagDaoTestHelper.createTagEntity(tagTypeEntity, TAG_CODE, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
tagDaoTestHelper.createTagEntity(tagTypeEntity, TAG_CODE_2, TAG_TYPE_DISPLAY_NAME_2, TAG_DESCRIPTION_2);
// Retrieve a list of tag keys using input parameters with leading and trailing empty spaces.
TagListResponse resultTagKeys = tagService.getTags(addWhitespace(TAG_TYPE), NO_PARENT_TAG_CODE);
// Validate the returned object.
assertNotNull(resultTagKeys);
assertEquals(Arrays
.asList(new TagChild(new TagKey(TAG_TYPE, TAG_CODE), TAG_HAS_NO_CHILDREN), new TagChild(new TagKey(TAG_TYPE, TAG_CODE_2), TAG_HAS_NO_CHILDREN)),
resultTagKeys.getTagChildren());
}
@Test
public void testGetTagsUpperCaseParameters()
{
// Create and persist a tag type entity.
TagTypeEntity tagTypeEntity = tagTypeDaoTestHelper.createTagTypeEntity(TAG_TYPE, TAG_TYPE_DISPLAY_NAME, TAG_TYPE_ORDER, TAG_TYPE_DESCRIPTION);
// Create and persist two tag entities for the same tag type.
tagDaoTestHelper.createTagEntity(tagTypeEntity, TAG_CODE, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
tagDaoTestHelper.createTagEntity(tagTypeEntity, TAG_CODE_2, TAG_TYPE_DISPLAY_NAME_2, TAG_DESCRIPTION);
// Retrieve a list of tag keys using uppercase input parameters.
TagListResponse resultTagKeys = tagService.getTags(TAG_TYPE.toUpperCase(), NO_PARENT_TAG_CODE);
// Validate the returned object.
assertNotNull(resultTagKeys);
assertEquals(Arrays
.asList(new TagChild(new TagKey(TAG_TYPE, TAG_CODE), TAG_HAS_NO_CHILDREN), new TagChild(new TagKey(TAG_TYPE, TAG_CODE_2), TAG_HAS_NO_CHILDREN)),
resultTagKeys.getTagChildren());
}
@Test
public void testGetTagsWithParent()
{
// Create and persist a tag entity.
TagEntity root = tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
TagEntity child = tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE_2, TAG_DISPLAY_NAME + "x", TAG_DESCRIPTION_2 + "x", root);
tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE_2 + "y", TAG_DISPLAY_NAME_2 + "y", TAG_DESCRIPTION_2 + "y", child);
//only the root
TagListResponse resultTagKeys = tagService.getTags(TAG_TYPE, NO_PARENT_TAG_CODE);
assertNull(resultTagKeys.getParentTagKey());
assertNull(resultTagKeys.getTagKey());
assertEquals(resultTagKeys.getTagChildren().size(), 1);
resultTagKeys = tagService.getTags(TAG_TYPE, TAG_CODE);
assertNull(resultTagKeys.getParentTagKey());
assertEquals(resultTagKeys.getTagChildren().size(), 1);
assertEquals(resultTagKeys.getTagKey(), new TagKey(TAG_TYPE, TAG_CODE));
//the lower case should be the same
resultTagKeys = tagService.getTags(TAG_TYPE, TAG_CODE.toLowerCase() + " ");
assertNull(resultTagKeys.getParentTagKey());
assertEquals(resultTagKeys.getTagChildren().size(), 1);
assertEquals(resultTagKeys.getTagKey(), new TagKey(TAG_TYPE, TAG_CODE));
resultTagKeys = tagService.getTags(TAG_TYPE, TAG_CODE_2.toLowerCase() + " ");
assertNotNull(resultTagKeys.getParentTagKey());
assertEquals(resultTagKeys.getParentTagKey(), new TagKey(TAG_TYPE, TAG_CODE));
assertEquals(resultTagKeys.getTagChildren().size(), 1);
assertEquals(resultTagKeys.getTagKey(), new TagKey(TAG_TYPE, TAG_CODE_2));
}
@Test
public void testSearchTags()
{
// Create and persist database entities required for testing.
createDatabaseEntitiesForTagSearchTesting();
// Search the tags.
TagSearchResponse tagSearchResponse = tagService.searchTags(
new TagSearchRequest(Arrays.asList(new TagSearchFilter(Arrays.asList(new TagSearchKey(TAG_TYPE, TAG_CODE, NO_IS_PARENT_TAG_NULL_FLAG))))),
Sets.newHashSet(TagServiceImpl.DISPLAY_NAME_FIELD, TagServiceImpl.DESCRIPTION_FIELD, TagServiceImpl.PARENT_TAG_KEY_FIELD,
TagServiceImpl.HAS_CHILDREN_FIELD));
// Validate the returned object.
assertEquals(new TagSearchResponse(Arrays.asList(
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_3), TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_3, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME,
new TagKey(TAG_TYPE, TAG_CODE), TAG_HAS_NO_CHILDREN),
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_2), TAG_DISPLAY_NAME_3, TAG_DESCRIPTION_2, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME,
new TagKey(TAG_TYPE, TAG_CODE), TAG_HAS_NO_CHILDREN))), tagSearchResponse);
}
@Test
public void testSearchTagsInvalidParameters()
{
// Try to search tags when there are more than one tag search filter is specified.
try
{
tagService.searchTags(new TagSearchRequest(Arrays.asList(new TagSearchFilter(), new TagSearchFilter())), NO_SEARCH_RESPONSE_FIELDS);
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("At most one tag search filter must be specified.", e.getMessage());
}
// Try to search tags when there are more than one tag search key is specified.
try
{
tagService.searchTags(new TagSearchRequest(Arrays.asList(new TagSearchFilter(Arrays.asList(new TagSearchKey(), new TagSearchKey())))),
NO_SEARCH_RESPONSE_FIELDS);
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("Exactly one tag search key must be specified.", e.getMessage());
}
// Try to search tags for a non-existing tag type.
try
{
tagService.searchTags(new TagSearchRequest(
Arrays.asList(new TagSearchFilter(Arrays.asList(new TagSearchKey("I_DO_NOT_EXIST", NO_PARENT_TAG_CODE, NO_IS_PARENT_TAG_NULL_FLAG))))),
NO_SEARCH_RESPONSE_FIELDS);
fail();
}
catch (ObjectNotFoundException e)
{
assertEquals("Tag type with code \"I_DO_NOT_EXIST\" doesn't exist.", e.getMessage());
}
// Try to search tags using a un-supported search response field option.
try
{
tagService.searchTags(new TagSearchRequest(
Arrays.asList(new TagSearchFilter(Arrays.asList(new TagSearchKey(TAG_TYPE, NO_PARENT_TAG_CODE, NO_IS_PARENT_TAG_NULL_FLAG))))),
Sets.newHashSet("INVALID_FIELD_OPTION"));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("Search response field \"invalid_field_option\" is not supported.", e.getMessage());
}
// Try to search tags when parent tag code is specified along with "is parent tag null" flag set to true.
try
{
tagService
.searchTags(new TagSearchRequest(Arrays.asList(new TagSearchFilter(Arrays.asList(new TagSearchKey(TAG_TYPE, TAG_CODE, PARENT_TAG_IS_NULL))))),
NO_SEARCH_RESPONSE_FIELDS);
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("A parent tag code can not be specified when isParentTagNull flag is set to true.", e.getMessage());
}
}
@Test
public void testSearchTagsLowerCaseParameters()
{
// Create and persist database entities required for testing.
createDatabaseEntitiesForTagSearchTesting();
// Search the tags using lower case input parameters.
TagSearchResponse tagSearchResponse = tagService.searchTags(new TagSearchRequest(
Arrays.asList(new TagSearchFilter(Arrays.asList(new TagSearchKey(TAG_TYPE.toLowerCase(), TAG_CODE.toLowerCase(), NO_IS_PARENT_TAG_NULL_FLAG))))),
Sets.newHashSet(TagServiceImpl.DISPLAY_NAME_FIELD.toLowerCase(), TagServiceImpl.DESCRIPTION_FIELD.toLowerCase(),
TagServiceImpl.PARENT_TAG_KEY_FIELD.toLowerCase(), TagServiceImpl.HAS_CHILDREN_FIELD.toLowerCase()));
// Validate the returned object.
assertEquals(new TagSearchResponse(Arrays.asList(
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_3), TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_3, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME,
new TagKey(TAG_TYPE, TAG_CODE), TAG_HAS_NO_CHILDREN),
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_2), TAG_DISPLAY_NAME_3, TAG_DESCRIPTION_2, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME,
new TagKey(TAG_TYPE, TAG_CODE), TAG_HAS_NO_CHILDREN))), tagSearchResponse);
}
@Test
public void testSearchTagsMissingOptionalParameters()
{
// Create and persist database entities required for testing.
createDatabaseEntitiesForTagSearchTesting();
// Search tags without specifying an optional tag search filter.
assertEquals(new TagSearchResponse(Arrays.asList(
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE), NO_TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME, NO_PARENT_TAG_KEY,
NO_TAG_HAS_CHILDREN_FLAG),
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_3), NO_TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME,
NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG),
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_2), NO_TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME,
NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG))), tagService.searchTags(new TagSearchRequest(), NO_SEARCH_RESPONSE_FIELDS));
// Search tags when an optional tag search filter is set to null.
List<TagSearchFilter> tagSearchFilters = new ArrayList<>();
tagSearchFilters.add(null);
assertEquals(new TagSearchResponse(Arrays.asList(
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE), NO_TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME, NO_PARENT_TAG_KEY,
NO_TAG_HAS_CHILDREN_FLAG),
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_3), NO_TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME,
NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG),
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_2), NO_TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME,
NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG))), tagService.searchTags(new TagSearchRequest(tagSearchFilters), NO_SEARCH_RESPONSE_FIELDS));
// Search tags without specifying optional parameters inside the tag search filter.
assertEquals(new TagSearchResponse(Arrays.asList(
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE), NO_TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME, NO_PARENT_TAG_KEY,
NO_TAG_HAS_CHILDREN_FLAG),
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_3), NO_TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME,
NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG),
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_2), NO_TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME,
NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG))), tagService.searchTags(
new TagSearchRequest(Arrays.asList(new TagSearchFilter(Arrays.asList(new TagSearchKey(TAG_TYPE, BLANK_TEXT, NO_IS_PARENT_TAG_NULL_FLAG))))),
NO_SEARCH_RESPONSE_FIELDS));
// Search tags without specifying optional parameters except for the display name field option.
assertEquals(new TagSearchResponse(Arrays.asList(
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE), TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME, NO_PARENT_TAG_KEY,
NO_TAG_HAS_CHILDREN_FLAG),
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_3), TAG_DISPLAY_NAME_2, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME, NO_PARENT_TAG_KEY,
NO_TAG_HAS_CHILDREN_FLAG),
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_2), TAG_DISPLAY_NAME_3, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME, NO_PARENT_TAG_KEY,
NO_TAG_HAS_CHILDREN_FLAG))), tagService.searchTags(
new TagSearchRequest(Arrays.asList(new TagSearchFilter(Arrays.asList(new TagSearchKey(TAG_TYPE, BLANK_TEXT, NO_IS_PARENT_TAG_NULL_FLAG))))),
Sets.newHashSet(TagServiceImpl.DISPLAY_NAME_FIELD)));
// Search tags without specifying optional parameters except for the description field option.
assertEquals(new TagSearchResponse(Arrays.asList(
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE), NO_TAG_DISPLAY_NAME, TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME, NO_PARENT_TAG_KEY,
NO_TAG_HAS_CHILDREN_FLAG),
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_3), NO_TAG_DISPLAY_NAME, TAG_DESCRIPTION_3, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME, NO_PARENT_TAG_KEY,
NO_TAG_HAS_CHILDREN_FLAG),
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_2), NO_TAG_DISPLAY_NAME, TAG_DESCRIPTION_2, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME, NO_PARENT_TAG_KEY,
NO_TAG_HAS_CHILDREN_FLAG))), tagService.searchTags(
new TagSearchRequest(Arrays.asList(new TagSearchFilter(Arrays.asList(new TagSearchKey(TAG_TYPE, BLANK_TEXT, NO_IS_PARENT_TAG_NULL_FLAG))))),
Sets.newHashSet(TagServiceImpl.DESCRIPTION_FIELD)));
// Search tags without specifying optional parameters except for the parent tag key field option.
assertEquals(new TagSearchResponse(Arrays.asList(
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE), NO_TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME, NO_PARENT_TAG_KEY,
NO_TAG_HAS_CHILDREN_FLAG),
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_3), NO_TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME,
new TagKey(TAG_TYPE, TAG_CODE), NO_TAG_HAS_CHILDREN_FLAG),
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_2), NO_TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME,
new TagKey(TAG_TYPE, TAG_CODE), NO_TAG_HAS_CHILDREN_FLAG))), tagService.searchTags(
new TagSearchRequest(Arrays.asList(new TagSearchFilter(Arrays.asList(new TagSearchKey(TAG_TYPE, BLANK_TEXT, NO_IS_PARENT_TAG_NULL_FLAG))))),
Sets.newHashSet(TagServiceImpl.PARENT_TAG_KEY_FIELD)));
// Search tags without specifying optional parameters except for the "has children" field option.
assertEquals(new TagSearchResponse(Arrays.asList(
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE), NO_TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME, NO_PARENT_TAG_KEY,
TAG_HAS_CHILDREN),
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_3), NO_TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME,
NO_PARENT_TAG_KEY, TAG_HAS_NO_CHILDREN),
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_2), NO_TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME,
NO_PARENT_TAG_KEY, TAG_HAS_NO_CHILDREN))), tagService.searchTags(
new TagSearchRequest(Arrays.asList(new TagSearchFilter(Arrays.asList(new TagSearchKey(TAG_TYPE, BLANK_TEXT, NO_IS_PARENT_TAG_NULL_FLAG))))),
Sets.newHashSet(TagServiceImpl.HAS_CHILDREN_FIELD)));
}
@Test
public void testSearchTagsMissingRequiredParameters()
{
// Try to search tags when tag search request is not specified.
try
{
tagService.searchTags(null, NO_SEARCH_RESPONSE_FIELDS);
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("A tag search request must be specified.", e.getMessage());
}
// Try to search tags when tag search key is not specified.
try
{
tagService.searchTags(new TagSearchRequest(Arrays.asList(new TagSearchFilter())), NO_SEARCH_RESPONSE_FIELDS);
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("Exactly one tag search key must be specified.", e.getMessage());
}
// Try to search tags when tag search key is set to null.
try
{
List<TagSearchKey> tagSearchKeys = new ArrayList<>();
tagSearchKeys.add(null);
tagService.searchTags(new TagSearchRequest(Arrays.asList(new TagSearchFilter(tagSearchKeys))), NO_SEARCH_RESPONSE_FIELDS);
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("Exactly one tag search key must be specified.", e.getMessage());
}
// Try to search tags when tag type code is not specified.
try
{
tagService.searchTags(new TagSearchRequest(
Arrays.asList(new TagSearchFilter(Arrays.asList(new TagSearchKey(BLANK_TEXT, NO_PARENT_TAG_CODE, NO_IS_PARENT_TAG_NULL_FLAG))))),
NO_SEARCH_RESPONSE_FIELDS);
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("A tag type code must be specified.", e.getMessage());
}
}
@Test
public void testSearchTagsTrimParameters()
{
// Create and persist database entities required for testing.
createDatabaseEntitiesForTagSearchTesting();
// Search the tags by using input parameters with leading and trailing empty spaces.
TagSearchResponse tagSearchResponse = tagService.searchTags(new TagSearchRequest(
Arrays.asList(new TagSearchFilter(Arrays.asList(new TagSearchKey(addWhitespace(TAG_TYPE), addWhitespace(TAG_CODE), NO_IS_PARENT_TAG_NULL_FLAG))))),
Sets.newHashSet(addWhitespace(TagServiceImpl.DISPLAY_NAME_FIELD), addWhitespace(TagServiceImpl.DESCRIPTION_FIELD),
addWhitespace(TagServiceImpl.PARENT_TAG_KEY_FIELD), addWhitespace(TagServiceImpl.HAS_CHILDREN_FIELD)));
// Validate the returned object.
assertEquals(new TagSearchResponse(Arrays.asList(
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_3), TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_3, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME,
new TagKey(TAG_TYPE, TAG_CODE), TAG_HAS_NO_CHILDREN),
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_2), TAG_DISPLAY_NAME_3, TAG_DESCRIPTION_2, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME,
new TagKey(TAG_TYPE, TAG_CODE), TAG_HAS_NO_CHILDREN))), tagSearchResponse);
}
@Test
public void testSearchTagsUpperCaseParameters()
{
// Create and persist database entities required for testing.
createDatabaseEntitiesForTagSearchTesting();
// Search the tags using upper case input parameters.
TagSearchResponse tagSearchResponse = tagService.searchTags(new TagSearchRequest(
Arrays.asList(new TagSearchFilter(Arrays.asList(new TagSearchKey(TAG_TYPE.toUpperCase(), TAG_CODE.toUpperCase(), NO_IS_PARENT_TAG_NULL_FLAG))))),
Sets.newHashSet(TagServiceImpl.DISPLAY_NAME_FIELD.toUpperCase(), TagServiceImpl.DESCRIPTION_FIELD.toUpperCase(),
TagServiceImpl.PARENT_TAG_KEY_FIELD.toUpperCase(), TagServiceImpl.HAS_CHILDREN_FIELD.toUpperCase()));
// Validate the returned object.
assertEquals(new TagSearchResponse(Arrays.asList(
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_3), TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_3, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME,
new TagKey(TAG_TYPE, TAG_CODE), TAG_HAS_NO_CHILDREN),
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_2), TAG_DISPLAY_NAME_3, TAG_DESCRIPTION_2, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME,
new TagKey(TAG_TYPE, TAG_CODE), TAG_HAS_NO_CHILDREN))), tagSearchResponse);
}
@Test
public void testSearchTagsWithIsParentTagNullFlag()
{
// Create and persist database entities required for testing.
createDatabaseEntitiesForTagSearchTesting();
// Get root tag entities (parent tag must not be set).
assertEquals(new TagSearchResponse(Arrays.asList(
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE), NO_TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME, NO_PARENT_TAG_KEY,
NO_TAG_HAS_CHILDREN_FLAG))), tagService.searchTags(
new TagSearchRequest(Arrays.asList(new TagSearchFilter(Arrays.asList(new TagSearchKey(TAG_TYPE, NO_PARENT_TAG_CODE, PARENT_TAG_IS_NULL))))),
NO_SEARCH_RESPONSE_FIELDS));
// Get all non-root tag entities (parent tag must be set).
assertEquals(new TagSearchResponse(Arrays.asList(
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_3), NO_TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME,
NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG),
new Tag(NO_ID, new TagKey(TAG_TYPE, TAG_CODE_2), NO_TAG_DISPLAY_NAME, NO_TAG_DESCRIPTION, NO_USER_ID, NO_USER_ID, NO_UPDATED_TIME,
NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG))), tagService.searchTags(
new TagSearchRequest(Arrays.asList(new TagSearchFilter(Arrays.asList(new TagSearchKey(TAG_TYPE, NO_PARENT_TAG_CODE, PARENT_TAG_IS_NOT_NULL))))),
NO_SEARCH_RESPONSE_FIELDS));
}
@Test
public void testUpdateTag()
{
// Create a parent tag key.
TagKey parentTagKey = new TagKey(TAG_TYPE, TAG_CODE);
// Create a parent tag entity.
tagDaoTestHelper.createTagEntity(parentTagKey, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Create a tag key.
TagKey tagKey = new TagKey(TAG_TYPE, TAG_CODE_2);
// Create and persist a tag entity without a parent tag.
TagEntity tagEntity = tagDaoTestHelper.createTagEntity(tagKey, TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_2);
// Update the tag.
Tag updatedTag = tagService.updateTag(tagKey, new TagUpdateRequest(TAG_DISPLAY_NAME_3, TAG_DESCRIPTION_3, parentTagKey));
// Validate the returned object.
assertEquals(new Tag(tagEntity.getId(), tagKey, TAG_DISPLAY_NAME_3, TAG_DESCRIPTION_3, tagEntity.getCreatedBy(), tagEntity.getUpdatedBy(),
HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), parentTagKey, NO_TAG_HAS_CHILDREN_FLAG), updatedTag);
}
@Test
public void testUpdateTagDisplayNameAlreadyExistsForOtherTagType()
{
// Create and persist a tag entity.
TagEntity tagEntity = tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Create and persist a second tag entity for the another tag type that would have the display name to be updated to.
tagDaoTestHelper.createTagEntity(TAG_TYPE_2, TAG_CODE_2, TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_2);
// Update the tag.
Tag updatedTag = tagService.updateTag(new TagKey(TAG_TYPE, TAG_CODE), new TagUpdateRequest(TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_3, NO_PARENT_TAG_KEY));
// Validate the returned object.
assertEquals(new Tag(tagEntity.getId(), new TagKey(TAG_TYPE, TAG_CODE), TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_3, tagEntity.getCreatedBy(),
tagEntity.getUpdatedBy(), HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG),
updatedTag);
}
@Test
public void testUpdateTagDisplayNameAlreadyExistsForThisTagType()
{
// Create and persist a tag entity.
tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Create and persist a second tag entity for the same tag type that would have the display name to be updated to.
tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE_2, TAG_DISPLAY_NAME_2.toUpperCase(), TAG_DESCRIPTION);
// Try to update a tag with an already existing display name.
try
{
tagService.updateTag(new TagKey(TAG_TYPE, TAG_CODE), new TagUpdateRequest(TAG_DISPLAY_NAME_2.toLowerCase(), TAG_DESCRIPTION, NO_PARENT_TAG_KEY));
fail();
}
catch (AlreadyExistsException e)
{
assertEquals(String
.format("Display name \"%s\" already exists for a tag with tag type \"%s\" and tag code \"%s\".", TAG_DISPLAY_NAME_2.toLowerCase(), TAG_TYPE,
TAG_CODE_2), e.getMessage());
}
}
@Test
public void testUpdateTagInvalidParameters()
{
// Try to update a tag using a parent tag with a different tag type code.
try
{
tagService
.updateTag(new TagKey(TAG_TYPE, TAG_CODE), new TagUpdateRequest(TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_2, new TagKey(TAG_TYPE_2, TAG_CODE_2)));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("Tag type code in parent tag key must match the tag type code in the request.", e.getMessage());
}
}
@Test
public void testUpdateTagLowerCaseParameters()
{
// Create a parent tag key.
TagKey parentTagKey = new TagKey(TAG_TYPE, TAG_CODE);
// Create a parent tag entity.
tagDaoTestHelper.createTagEntity(parentTagKey, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Create a tag key.
TagKey tagKey = new TagKey(TAG_TYPE, TAG_CODE_2);
// Create and persist a tag entity without a parent tag.
TagEntity tagEntity = tagDaoTestHelper.createTagEntity(tagKey, TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_2);
// Update the tag using lowercase input parameters.
Tag updatedTag = tagService.updateTag(new TagKey(TAG_TYPE.toLowerCase(), TAG_CODE_2.toLowerCase()),
new TagUpdateRequest(TAG_DISPLAY_NAME_3.toLowerCase(), TAG_DESCRIPTION_3.toLowerCase(),
new TagKey(TAG_TYPE.toLowerCase(), TAG_CODE.toLowerCase())));
// Validate the returned object.
assertEquals(new Tag(tagEntity.getId(), tagKey, TAG_DISPLAY_NAME_3.toLowerCase(), TAG_DESCRIPTION_3.toLowerCase(), tagEntity.getCreatedBy(),
tagEntity.getUpdatedBy(), HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), parentTagKey, NO_TAG_HAS_CHILDREN_FLAG),
updatedTag);
}
@Test
public void testUpdateTagMissingOptionalParametersPassedAsNulls()
{
// Create a parent tag key.
TagKey parentTagKey = new TagKey(TAG_TYPE, TAG_CODE);
// Create a parent tag entity.
TagEntity parentTagEntity = tagDaoTestHelper.createTagEntity(parentTagKey, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Create a tag key.
TagKey tagKey = new TagKey(TAG_TYPE, TAG_CODE_2);
// Create and persist a tag entity with a parent tag.
TagEntity tagEntity = tagDaoTestHelper.createTagEntity(tagKey, TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_2, parentTagEntity);
// Update the tag with description and parent tag passed in as nulls.
Tag updatedTag = tagService.updateTag(tagKey, new TagUpdateRequest(TAG_DISPLAY_NAME_3, NO_TAG_DESCRIPTION, NO_PARENT_TAG_KEY));
// Validate the returned object.
assertEquals(new Tag(tagEntity.getId(), tagKey, TAG_DISPLAY_NAME_3, NO_TAG_DESCRIPTION, tagEntity.getCreatedBy(), tagEntity.getUpdatedBy(),
HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG), updatedTag);
}
@Test
public void testUpdateTagMissingOptionalParametersPassedAsWhitespace()
{
// Create a parent tag key.
TagKey parentTagKey = new TagKey(TAG_TYPE, TAG_CODE);
// Create a parent tag entity.
TagEntity parentTagEntity = tagDaoTestHelper.createTagEntity(parentTagKey, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Create a tag key.
TagKey tagKey = new TagKey(TAG_TYPE, TAG_CODE_2);
// Create and persist a tag entity with a parent tag.
TagEntity tagEntity = tagDaoTestHelper.createTagEntity(tagKey, TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_2, parentTagEntity);
// Update the tag with description passed as whitespace.
Tag updatedTag = tagService.updateTag(tagKey, new TagUpdateRequest(TAG_DISPLAY_NAME_3, BLANK_TEXT, NO_PARENT_TAG_KEY));
// Validate the returned object.
assertEquals(new Tag(tagEntity.getId(), tagKey, TAG_DISPLAY_NAME_3, BLANK_TEXT, tagEntity.getCreatedBy(), tagEntity.getUpdatedBy(),
HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG), updatedTag);
}
@Test
public void testUpdateTagMissingRequiredParameters()
{
// Try to update a tag when tag type is not specified.
try
{
tagService.updateTag(new TagKey(BLANK_TEXT, TAG_CODE), new TagUpdateRequest(TAG_DISPLAY_NAME, TAG_DESCRIPTION, NO_PARENT_TAG_KEY));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("A tag type code must be specified.", e.getMessage());
}
// Try to update a tag when tag code is not specified.
try
{
tagService.updateTag(new TagKey(TAG_TYPE, BLANK_TEXT), new TagUpdateRequest(TAG_DISPLAY_NAME, TAG_DESCRIPTION, NO_PARENT_TAG_KEY));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("A tag code must be specified.", e.getMessage());
}
// Try to update a tag when tag display name is not specified.
try
{
tagService.updateTag(new TagKey(TAG_TYPE, TAG_CODE), new TagUpdateRequest(BLANK_TEXT, TAG_DESCRIPTION, NO_PARENT_TAG_KEY));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("A display name must be specified.", e.getMessage());
}
// Try to update a tag when parent tag type is not specified.
try
{
tagService.updateTag(new TagKey(TAG_TYPE, TAG_CODE_2), new TagUpdateRequest(TAG_DISPLAY_NAME, TAG_DESCRIPTION, new TagKey(BLANK_TEXT, TAG_CODE)));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("A tag type code must be specified.", e.getMessage());
}
// Try to update a tag when parent tag code is not specified.
try
{
tagService.updateTag(new TagKey(TAG_TYPE, TAG_CODE_2), new TagUpdateRequest(TAG_DISPLAY_NAME, TAG_DESCRIPTION, new TagKey(TAG_TYPE, BLANK_TEXT)));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("A tag code must be specified.", e.getMessage());
}
}
@Test
public void testUpdateTagNoChangesToDisplayName()
{
// Create a tag key.
TagKey tagKey = new TagKey(TAG_TYPE, TAG_CODE);
// Create and persist a tag entity.
TagEntity tagEntity = tagDaoTestHelper.createTagEntity(tagKey, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Update the tag without changing it's display name except for the case.
Tag updatedTag = tagService.updateTag(tagKey, new TagUpdateRequest(TAG_DISPLAY_NAME, TAG_DESCRIPTION_2, NO_PARENT_TAG_KEY));
// Validate the returned object.
assertEquals(new Tag(tagEntity.getId(), tagKey, TAG_DISPLAY_NAME, TAG_DESCRIPTION_2, tagEntity.getCreatedBy(), tagEntity.getUpdatedBy(),
HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG), updatedTag);
}
@Test
public void testUpdateTagNoChangesToDisplayNameExceptForCase()
{
// Create a tag key.
TagKey tagKey = new TagKey(TAG_TYPE, TAG_CODE);
// Create and persist a tag entity.
TagEntity tagEntity = tagDaoTestHelper.createTagEntity(tagKey, TAG_DISPLAY_NAME.toUpperCase(), TAG_DESCRIPTION);
// Update the tag without changing it's display name except for the case.
Tag updatedTag = tagService.updateTag(tagKey, new TagUpdateRequest(TAG_DISPLAY_NAME.toLowerCase(), TAG_DESCRIPTION_2, NO_PARENT_TAG_KEY));
// Validate the returned object.
assertEquals(new Tag(tagEntity.getId(), tagKey, TAG_DISPLAY_NAME.toLowerCase(), TAG_DESCRIPTION_2, tagEntity.getCreatedBy(), tagEntity.getUpdatedBy(),
HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), NO_PARENT_TAG_KEY, NO_TAG_HAS_CHILDREN_FLAG), updatedTag);
}
@Test
public void testUpdateTagParentTagIsChild()
{
// Create and persist a root tag entity.
TagEntity rootTagEntity = tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Create a child tag entity.
TagEntity childTagEntity = tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE_2, TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_2, rootTagEntity);
// Create a grandchild tag entity.
TagEntity grandchildTagEntity = tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE_3, TAG_DISPLAY_NAME_3, TAG_DESCRIPTION_3, childTagEntity);
// Try to update the root tag using a parent tag set to the tag itself and it's children.
for (TagEntity tagEntity : Arrays.asList(rootTagEntity, childTagEntity, grandchildTagEntity))
{
try
{
tagService.updateTag(new TagKey(TAG_TYPE, TAG_CODE),
new TagUpdateRequest(TAG_DISPLAY_NAME_4, TAG_DESCRIPTION_4, new TagKey(tagEntity.getTagType().getCode(), tagEntity.getTagCode())));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("Parent tag key cannot be the requested tag key or any of its children’s tag keys.", e.getMessage());
}
}
}
@Test
public void testUpdateTagParentTagMaxAllowedNestingExceeds() throws Exception
{
// Create and persist a root tag entity.
TagEntity rootTagEntity = tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Create a child tag entity.
TagEntity childTagEntity = tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE_2, TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_2, rootTagEntity);
// Create a grandchild tag entity.
TagEntity grandchildTagEntity = tagDaoTestHelper.createTagEntity(TAG_TYPE, TAG_CODE_3, TAG_DISPLAY_NAME_3, TAG_DESCRIPTION_3, childTagEntity);
// Override the configuration to set max allowed tag nesting to 1.
Map<String, Object> overrideMap = new HashMap<>();
overrideMap.put(ConfigurationValue.MAX_ALLOWED_TAG_NESTING.getKey(), 1);
modifyPropertySourceInEnvironment(overrideMap);
try
{
// Try to update the tag using it's child as a parent tag.
try
{
tagService.updateTag(new TagKey(TAG_TYPE, TAG_CODE), new TagUpdateRequest(TAG_DISPLAY_NAME_4, TAG_DESCRIPTION_4,
new TagKey(childTagEntity.getTagType().getCode(), childTagEntity.getTagCode())));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("Parent tag key cannot be the requested tag key or any of its children’s tag keys.", e.getMessage());
}
// Try to update the tag using it's grandchild as a parent tag.
try
{
tagService.updateTag(new TagKey(TAG_TYPE, TAG_CODE), new TagUpdateRequest(TAG_DISPLAY_NAME_4, TAG_DESCRIPTION_4,
new TagKey(grandchildTagEntity.getTagType().getCode(), grandchildTagEntity.getTagCode())));
fail();
}
catch (IllegalArgumentException e)
{
assertEquals("Exceeds maximum allowed tag nesting level of 1", e.getMessage());
}
}
finally
{
// Restore the property sources so we don't affect other tests.
restorePropertySourceInEnvironment();
}
}
@Test
public void testUpdateTagParentTagNoExists()
{
// Create a tag key.
TagKey tagKey = new TagKey(TAG_TYPE, TAG_CODE_2);
// Create and persist a tag entity without a parent tag.
tagDaoTestHelper.createTagEntity(tagKey, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Try to update a tag using a non-existing parent tag.
try
{
tagService.updateTag(tagKey, new TagUpdateRequest(TAG_DISPLAY_NAME, TAG_DESCRIPTION, new TagKey(TAG_TYPE, TAG_CODE)));
fail();
}
catch (ObjectNotFoundException e)
{
assertEquals(String.format("Tag with code \"%s\" doesn't exist for tag type \"%s\".", TAG_CODE, TAG_TYPE), e.getMessage());
}
}
@Test
public void testUpdateTagTagNoExists()
{
// Try to update a non-existing tag.
try
{
tagService.updateTag(new TagKey(TAG_TYPE, TAG_CODE_2), new TagUpdateRequest(TAG_DISPLAY_NAME, TAG_DESCRIPTION, new TagKey(TAG_TYPE, TAG_CODE)));
fail();
}
catch (ObjectNotFoundException e)
{
assertEquals(String.format("Tag with code \"%s\" doesn't exist for tag type \"%s\".", TAG_CODE_2, TAG_TYPE), e.getMessage());
}
}
@Test
public void testUpdateTagTrimParameters()
{
// Create a parent tag key.
TagKey parentTagKey = new TagKey(TAG_TYPE, TAG_CODE);
// Create a parent tag entity.
tagDaoTestHelper.createTagEntity(parentTagKey, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Create a tag key.
TagKey tagKey = new TagKey(TAG_TYPE, TAG_CODE_2);
// Create and persist a tag entity without a parent tag.
TagEntity tagEntity = tagDaoTestHelper.createTagEntity(tagKey, TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_2);
// Update the tag using input parameters with leading and trailing empty spaces.
Tag updatedTag = tagService.updateTag(new TagKey(addWhitespace(TAG_TYPE), addWhitespace(TAG_CODE_2)),
new TagUpdateRequest(addWhitespace(TAG_DISPLAY_NAME_3), addWhitespace(TAG_DESCRIPTION_3),
new TagKey(addWhitespace(TAG_TYPE), addWhitespace(TAG_CODE.toLowerCase()))));
// Validate the returned object.
assertEquals(
new Tag(tagEntity.getId(), tagKey, TAG_DISPLAY_NAME_3, addWhitespace(TAG_DESCRIPTION_3), tagEntity.getCreatedBy(), tagEntity.getUpdatedBy(),
HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), parentTagKey, NO_TAG_HAS_CHILDREN_FLAG), updatedTag);
}
@Test
public void testUpdateTagUpperCaseParameters()
{
// Create a parent tag key.
TagKey parentTagKey = new TagKey(TAG_TYPE, TAG_CODE);
// Create a parent tag entity.
tagDaoTestHelper.createTagEntity(parentTagKey, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Create a tag key.
TagKey tagKey = new TagKey(TAG_TYPE, TAG_CODE_2);
// Create and persist a tag entity without a parent tag.
TagEntity tagEntity = tagDaoTestHelper.createTagEntity(tagKey, TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_2);
// Update the tag using uppercase input parameters.
Tag updatedTag = tagService.updateTag(new TagKey(TAG_TYPE.toUpperCase(), TAG_CODE_2.toUpperCase()),
new TagUpdateRequest(TAG_DISPLAY_NAME_3.toUpperCase(), TAG_DESCRIPTION_3.toUpperCase(),
new TagKey(TAG_TYPE.toUpperCase(), TAG_CODE.toUpperCase())));
// Validate the returned object.
assertEquals(new Tag(tagEntity.getId(), tagKey, TAG_DISPLAY_NAME_3.toUpperCase(), TAG_DESCRIPTION_3.toUpperCase(), tagEntity.getCreatedBy(),
tagEntity.getUpdatedBy(), HerdDateUtils.getXMLGregorianCalendarValue(tagEntity.getUpdatedOn()), parentTagKey, NO_TAG_HAS_CHILDREN_FLAG),
updatedTag);
}
/**
* Creates database entities required for the tag search service unit tests.
*/
private void createDatabaseEntitiesForTagSearchTesting()
{
// Create and persist a tag type entity.
TagTypeEntity tagTypeEntity = tagTypeDaoTestHelper.createTagTypeEntity(TAG_TYPE, TAG_TYPE_DISPLAY_NAME, TAG_TYPE_ORDER, TAG_TYPE_DESCRIPTION);
// Create a root tag entity for the tag type.
TagEntity rootTagEntity = tagDaoTestHelper.createTagEntity(tagTypeEntity, TAG_CODE, TAG_DISPLAY_NAME, TAG_DESCRIPTION);
// Create two children for the root tag with tag display name in reverse order.
tagDaoTestHelper.createTagEntity(tagTypeEntity, TAG_CODE_2, TAG_DISPLAY_NAME_3, TAG_DESCRIPTION_2, rootTagEntity);
tagDaoTestHelper.createTagEntity(tagTypeEntity, TAG_CODE_3, TAG_DISPLAY_NAME_2, TAG_DESCRIPTION_3, rootTagEntity);
}
}