/*
* 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.dao;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import org.finra.herd.model.jpa.JobDefinitionEntity;
import org.finra.herd.model.jpa.NamespaceEntity;
public class JobDefinitionDaoTest extends AbstractDaoTest
{
@Test
public void testGetJobDefinitionByAltKey()
{
// Create a namespace database entity.
NamespaceEntity namespaceEntity = namespaceDaoTestHelper.createNamespaceEntity(NAMESPACE);
// Create and persist a job definition entity.
JobDefinitionEntity jobDefinitionEntity = jobDefinitionDaoTestHelper.createJobDefinitionEntity(namespaceEntity, JOB_NAME, JOB_DESCRIPTION, ACTIVITI_ID);
// Retrieve the job definition by its key.
assertEquals(jobDefinitionEntity, jobDefinitionDao.getJobDefinitionByAltKey(NAMESPACE, JOB_NAME));
// Retrieve the job definition by its key in uppercase.
assertEquals(jobDefinitionEntity, jobDefinitionDao.getJobDefinitionByAltKey(NAMESPACE.toUpperCase(), JOB_NAME.toUpperCase()));
// Retrieve the job definition by its key in lowercase.
assertEquals(jobDefinitionEntity, jobDefinitionDao.getJobDefinitionByAltKey(NAMESPACE.toLowerCase(), JOB_NAME.toLowerCase()));
// Try to retrieve a job definition for a non-existing namespace.
assertNull(jobDefinitionDao.getJobDefinitionByAltKey("I_DO_NOT_EXIST", JOB_NAME));
// Try to retrieve a job definition for a non-existing job name.
assertNull(jobDefinitionDao.getJobDefinitionByAltKey(NAMESPACE, "I_DO_NOT_EXIST"));
}
@Test
public void testGetJobDefinitionByAltKeyMultipleRecordsFound()
{
// Create a namespace database entity.
NamespaceEntity namespaceEntity = namespaceDaoTestHelper.createNamespaceEntity(NAMESPACE);
// Create duplicate job definitions. Please note that we need to pass unique activity ID value.
for (String jobName : Arrays.asList(JOB_NAME.toUpperCase(), JOB_NAME.toLowerCase()))
{
jobDefinitionDaoTestHelper.createJobDefinitionEntity(namespaceEntity, jobName, JOB_DESCRIPTION, jobName + ACTIVITI_ID);
}
// Try to retrieve a job definition.
try
{
jobDefinitionDao.getJobDefinitionByAltKey(NAMESPACE, JOB_NAME);
fail();
}
catch (IllegalArgumentException e)
{
assertEquals(String.format("Found more than one Activiti job definition with parameters {namespace=\"%s\", jobName=\"%s\"}.", NAMESPACE, JOB_NAME),
e.getMessage());
}
}
@Test
public void testGetJobDefinitionByProcessDefinitionId()
{
// Create a namespace database entity.
NamespaceEntity namespaceEntity = namespaceDaoTestHelper.createNamespaceEntity(NAMESPACE);
// Create and persist a job definition entity.
JobDefinitionEntity jobDefinitionEntity = jobDefinitionDaoTestHelper.createJobDefinitionEntity(namespaceEntity, JOB_NAME, JOB_DESCRIPTION, ACTIVITI_ID);
// Retrieve the job definition by its process definition id.
assertEquals(jobDefinitionEntity, jobDefinitionDao.getJobDefinitionByProcessDefinitionId(ACTIVITI_ID));
// Try to retrieve a job definition by its process definition id in uppercase.
assertNull(jobDefinitionDao.getJobDefinitionByProcessDefinitionId(ACTIVITI_ID.toUpperCase()));
// Try to retrieve a job definition by its process definition id in lowercase.
assertNull(jobDefinitionDao.getJobDefinitionByProcessDefinitionId(ACTIVITI_ID.toLowerCase()));
// Try to retrieve a job definition for a non-existing process definition id.
assertNull(jobDefinitionDao.getJobDefinitionByProcessDefinitionId("I_DO_NOT_EXIST"));
}
@Test
public void testGetJobDefinitionByProcessDefinitionIdMultipleRecordsFound()
{
// Create a namespace database entity.
NamespaceEntity namespaceEntity = namespaceDaoTestHelper.createNamespaceEntity(NAMESPACE);
// Create two job definitions with the same process definition id.
for (String jobName : Arrays.asList(JOB_NAME, JOB_NAME_2))
{
jobDefinitionDaoTestHelper.createJobDefinitionEntity(namespaceEntity, jobName, JOB_DESCRIPTION, ACTIVITI_ID);
}
// Try to retrieve a job definition by its process definition id.
try
{
jobDefinitionDao.getJobDefinitionByProcessDefinitionId(ACTIVITI_ID);
fail();
}
catch (IllegalArgumentException e)
{
assertEquals(String.format("Found more than one Activiti job definition with processDefinitionId = \"%s\".", ACTIVITI_ID), e.getMessage());
}
}
@Test
public void testGetJobDefinitionsByFilterWithMultipleNamespaces()
{
// Create and persist job definition entities with namespaces and job names in reverse order to validate the order by clause.
List<JobDefinitionEntity> jobDefinitionEntities = Arrays
.asList(jobDefinitionDaoTestHelper.createJobDefinitionEntity(JOB_NAMESPACE_2, JOB_NAME_2, JOB_DESCRIPTION, ACTIVITI_ID),
jobDefinitionDaoTestHelper.createJobDefinitionEntity(JOB_NAMESPACE_2, JOB_NAME, JOB_DESCRIPTION, ACTIVITI_ID_2),
jobDefinitionDaoTestHelper.createJobDefinitionEntity(JOB_NAMESPACE, JOB_NAME_2, JOB_DESCRIPTION, ACTIVITI_ID_3),
jobDefinitionDaoTestHelper.createJobDefinitionEntity(JOB_NAMESPACE, JOB_NAME, JOB_DESCRIPTION, ACTIVITI_ID_4));
// Retrieve job definitions by specifying both namespaces and a job name.
assertEquals(Arrays.asList(jobDefinitionEntities.get(3), jobDefinitionEntities.get(1)),
jobDefinitionDao.getJobDefinitionsByFilter(Arrays.asList(JOB_NAMESPACE, JOB_NAMESPACE_2), JOB_NAME));
// Retrieve job definitions by specifying a job name in uppercase.
assertEquals(Arrays.asList(jobDefinitionEntities.get(3), jobDefinitionEntities.get(1)),
jobDefinitionDao.getJobDefinitionsByFilter(Arrays.asList(JOB_NAMESPACE, JOB_NAMESPACE_2), JOB_NAME.toUpperCase()));
// Try to retrieve job definitions by specifying namespaces in uppercase.
assertTrue(jobDefinitionDao.getJobDefinitionsByFilter(Arrays.asList(JOB_NAMESPACE.toUpperCase(), JOB_NAMESPACE_2.toUpperCase()), JOB_NAME).isEmpty());
// Retrieve job definitions by specifying a job name in lowercase.
assertEquals(Arrays.asList(jobDefinitionEntities.get(3), jobDefinitionEntities.get(1)),
jobDefinitionDao.getJobDefinitionsByFilter(Arrays.asList(JOB_NAMESPACE, JOB_NAMESPACE_2), JOB_NAME.toLowerCase()));
// Try to retrieve job definitions by specifying namespaces in lowercase.
assertTrue(jobDefinitionDao.getJobDefinitionsByFilter(Arrays.asList(JOB_NAMESPACE.toLowerCase(), JOB_NAMESPACE_2.toLowerCase()), JOB_NAME).isEmpty());
// Retrieve job definitions by specifying a job name without a namespace.
assertEquals(Arrays.asList(jobDefinitionEntities.get(3), jobDefinitionEntities.get(1)),
jobDefinitionDao.getJobDefinitionsByFilter(new ArrayList<>(), JOB_NAME));
// Retrieve job definitions by specifying a namespace without a job name.
assertEquals(Arrays.asList(jobDefinitionEntities.get(3), jobDefinitionEntities.get(2)),
jobDefinitionDao.getJobDefinitionsByFilter(Arrays.asList(JOB_NAMESPACE), NO_JOB_NAME));
// Try to retrieve job definitions by specifying a non-existing namespace.
assertTrue(jobDefinitionDao.getJobDefinitionsByFilter(Arrays.asList("I_DO_NOT_EXIST"), JOB_NAME).isEmpty());
// Try to retrieve job definitions by specifying a non-existing job name.
assertTrue(jobDefinitionDao.getJobDefinitionsByFilter(Arrays.asList(JOB_NAMESPACE), "I_DO_NOT_EXIST").isEmpty());
}
@Test
public void testGetJobDefinitionsByFilterWithSingleNamespace()
{
// Create and persist job definition entities with namespaces and job names in reverse order to validate the order by clause.
List<JobDefinitionEntity> jobDefinitionEntities = Arrays
.asList(jobDefinitionDaoTestHelper.createJobDefinitionEntity(JOB_NAMESPACE_2, JOB_NAME_2, JOB_DESCRIPTION, ACTIVITI_ID),
jobDefinitionDaoTestHelper.createJobDefinitionEntity(JOB_NAMESPACE_2, JOB_NAME, JOB_DESCRIPTION, ACTIVITI_ID_2),
jobDefinitionDaoTestHelper.createJobDefinitionEntity(JOB_NAMESPACE, JOB_NAME_2, JOB_DESCRIPTION, ACTIVITI_ID_3),
jobDefinitionDaoTestHelper.createJobDefinitionEntity(JOB_NAMESPACE, JOB_NAME, JOB_DESCRIPTION, ACTIVITI_ID_4));
// Retrieve job definitions by specifying both a namespace and a job name.
assertEquals(Arrays.asList(jobDefinitionEntities.get(3)), jobDefinitionDao.getJobDefinitionsByFilter(JOB_NAMESPACE, JOB_NAME));
// Retrieve job definitions by specifying both a namespace and a job name in uppercase.
assertEquals(Arrays.asList(jobDefinitionEntities.get(3)),
jobDefinitionDao.getJobDefinitionsByFilter(JOB_NAMESPACE.toUpperCase(), JOB_NAME.toUpperCase()));
// Retrieve job definitions by specifying both a namespace and a job name in lowercase.
assertEquals(Arrays.asList(jobDefinitionEntities.get(3)),
jobDefinitionDao.getJobDefinitionsByFilter(JOB_NAMESPACE.toLowerCase(), JOB_NAME.toLowerCase()));
// Retrieve job definitions by specifying a job name without a namespace.
assertEquals(Arrays.asList(jobDefinitionEntities.get(3), jobDefinitionEntities.get(1)),
jobDefinitionDao.getJobDefinitionsByFilter(NO_NAMESPACE, JOB_NAME));
// Retrieve job definitions by specifying a namespace without a job name.
assertEquals(Arrays.asList(jobDefinitionEntities.get(3), jobDefinitionEntities.get(2)),
jobDefinitionDao.getJobDefinitionsByFilter(JOB_NAMESPACE, NO_JOB_NAME));
// Try to retrieve job definitions by specifying a non-existing namespace.
assertTrue(jobDefinitionDao.getJobDefinitionsByFilter("I_DO_NOT_EXIST", JOB_NAME).isEmpty());
// Try to retrieve job definitions by specifying a non-existing job name.
assertTrue(jobDefinitionDao.getJobDefinitionsByFilter(JOB_NAMESPACE, "I_DO_NOT_EXIST").isEmpty());
}
}