package org.finra.herd.service; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import java.util.Arrays; import java.util.List; import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.finra.herd.dao.GlobalAttributeDefinitionDao; import org.finra.herd.dao.GlobalAttributeDefinitionLevelDao; import org.finra.herd.model.api.xml.GlobalAttributeDefinition; import org.finra.herd.model.api.xml.GlobalAttributeDefinitionCreateRequest; import org.finra.herd.model.api.xml.GlobalAttributeDefinitionKey; import org.finra.herd.model.api.xml.GlobalAttributeDefinitionKeys; import org.finra.herd.model.jpa.GlobalAttributeDefinitionEntity; import org.finra.herd.model.jpa.GlobalAttributeDefinitionLevelEntity; import org.finra.herd.service.helper.GlobalAttributeDefinitionDaoHelper; import org.finra.herd.service.helper.GlobalAttributeDefinitionHelper; import org.finra.herd.service.impl.GlobalAttributeDefinitionServiceImpl; /** * This class tests the functionality of global attribute definition service. */ public class GlobalAttributeDefinitionServiceTest extends AbstractServiceTest { @Mock private GlobalAttributeDefinitionDao globalAttributeDefinitionDao; @Mock private GlobalAttributeDefinitionDaoHelper globalAttributeDefinitionDaoHelper; @Mock private GlobalAttributeDefinitionHelper globalAttributeDefinitionHelper; @Mock private GlobalAttributeDefinitionLevelDao globalAttributeDefinitionLevelDao; @InjectMocks private GlobalAttributeDefinitionServiceImpl globalAttributeDefinitionService; @Before public void before() { MockitoAnnotations.initMocks(this); } @Test public void testCreateGlobalAttributeDefinition() { // Create a global attribute definition key. GlobalAttributeDefinitionKey globalAttributeDefinitionKey = new GlobalAttributeDefinitionKey(GLOBAL_ATTRIBUTE_DEFINITON_LEVEL, GLOBAL_ATTRIBUTE_DEFINITON_NAME); // Create a global attribute definition create request. GlobalAttributeDefinitionCreateRequest request = new GlobalAttributeDefinitionCreateRequest(globalAttributeDefinitionKey); // Create a global attribute definition level entity. GlobalAttributeDefinitionLevelEntity globalAttributeDefinitionLevelEntity = new GlobalAttributeDefinitionLevelEntity(); globalAttributeDefinitionLevelEntity.setGlobalAttributeDefinitionLevel(GLOBAL_ATTRIBUTE_DEFINITON_LEVEL); // Create a global attribute definition entity. GlobalAttributeDefinitionEntity globalAttributeDefinitionEntity = new GlobalAttributeDefinitionEntity(); globalAttributeDefinitionEntity.setId(GLOBAL_ATTRIBUTE_DEFINITON_ID); globalAttributeDefinitionEntity.setGlobalAttributeDefinitionLevel(globalAttributeDefinitionLevelEntity); globalAttributeDefinitionEntity.setGlobalAttributeDefinitionName(GLOBAL_ATTRIBUTE_DEFINITON_NAME); // Mock calls to external methods. when(globalAttributeDefinitionLevelDao.getGlobalAttributeDefinitionLevel(GLOBAL_ATTRIBUTE_DEFINITON_LEVEL)) .thenReturn(globalAttributeDefinitionLevelEntity); when(globalAttributeDefinitionDao.saveAndRefresh(any(GlobalAttributeDefinitionEntity.class))).thenReturn(globalAttributeDefinitionEntity); // Call the method under test. GlobalAttributeDefinition response = globalAttributeDefinitionService.createGlobalAttributeDefinition(request); // Verify the external calls. verify(globalAttributeDefinitionHelper).validateGlobalAttributeDefinitionKey(globalAttributeDefinitionKey); verify(globalAttributeDefinitionDaoHelper).validateGlobalAttributeDefinitionNoExists(globalAttributeDefinitionKey); verify(globalAttributeDefinitionLevelDao).getGlobalAttributeDefinitionLevel(GLOBAL_ATTRIBUTE_DEFINITON_LEVEL); verify(globalAttributeDefinitionDao).saveAndRefresh(any(GlobalAttributeDefinitionEntity.class)); verifyNoMoreInteractionsHelper(); // Validate the response. assertEquals(new GlobalAttributeDefinition(GLOBAL_ATTRIBUTE_DEFINITON_ID, globalAttributeDefinitionKey), response); } @Test public void testCreateGlobalAttributeDefinitionMissingRequiredParameters() { // Try to call the method under test. try { globalAttributeDefinitionService.createGlobalAttributeDefinition(null); fail(); } catch (IllegalArgumentException e) { assertEquals("A global attribute definition create request must be specified.", e.getMessage()); } // Verify the external calls. verifyNoMoreInteractionsHelper(); } @Test public void testCreateGlobalAttributeDefinitionInvalidGlobalAttributeDefinitionLevel() { // Create a global attribute definition key with an unsupported global attribute definition level. GlobalAttributeDefinitionKey globalAttributeDefinitionKey = new GlobalAttributeDefinitionKey(GLOBAL_ATTRIBUTE_DEFINITON_INVALID_LEVEL, GLOBAL_ATTRIBUTE_DEFINITON_NAME); // Create a global attribute definition create request. GlobalAttributeDefinitionCreateRequest request = new GlobalAttributeDefinitionCreateRequest(globalAttributeDefinitionKey); // Try to call the method under test. try { globalAttributeDefinitionService.createGlobalAttributeDefinition(request); fail(); } catch (IllegalArgumentException e) { assertEquals(String.format("Global attribute definition with level \"%s\" is not supported.", GLOBAL_ATTRIBUTE_DEFINITON_INVALID_LEVEL), e.getMessage()); } // Verify the external calls. verify(globalAttributeDefinitionHelper).validateGlobalAttributeDefinitionKey(globalAttributeDefinitionKey); verifyNoMoreInteractionsHelper(); } @Test public void testDeleteGlobalAttributeDefinition() { // Create a global attribute definition key. GlobalAttributeDefinitionKey globalAttributeDefinitionKey = new GlobalAttributeDefinitionKey(GLOBAL_ATTRIBUTE_DEFINITON_LEVEL, GLOBAL_ATTRIBUTE_DEFINITON_NAME); // Create a global attribute definition entity. GlobalAttributeDefinitionEntity globalAttributeDefinitionEntity = globalAttributeDefinitionDaoTestHelper.createGlobalAttributeDefinitionEntity(GLOBAL_ATTRIBUTE_DEFINITON_LEVEL, GLOBAL_ATTRIBUTE_DEFINITON_NAME); // Mock calls to external methods. when(globalAttributeDefinitionDaoHelper.getGlobalAttributeDefinitionEntity(globalAttributeDefinitionKey)).thenReturn(globalAttributeDefinitionEntity); // Call the method under test. GlobalAttributeDefinition response = globalAttributeDefinitionService.deleteGlobalAttributeDefinition(globalAttributeDefinitionKey); // Verify the external calls. verify(globalAttributeDefinitionHelper).validateGlobalAttributeDefinitionKey(globalAttributeDefinitionKey); verify(globalAttributeDefinitionDaoHelper).getGlobalAttributeDefinitionEntity(globalAttributeDefinitionKey); verify(globalAttributeDefinitionDao).delete(globalAttributeDefinitionEntity); verifyNoMoreInteractionsHelper(); // Validate. assertEquals(new GlobalAttributeDefinition(response.getId(), globalAttributeDefinitionKey), response); } @Test public void testGetGlobalAttributeDefinitions() { // Create a list of global attribute definitions keys. List<GlobalAttributeDefinitionKey> globalAttributeDefinitionKeys = Arrays .asList(new GlobalAttributeDefinitionKey(GLOBAL_ATTRIBUTE_DEFINITON_LEVEL, GLOBAL_ATTRIBUTE_DEFINITON_NAME), new GlobalAttributeDefinitionKey(GLOBAL_ATTRIBUTE_DEFINITON_LEVEL, GLOBAL_ATTRIBUTE_DEFINITON_NAME_2)); // Mock calls to external methods. when(globalAttributeDefinitionDao.getAllGlobalAttributeDefinitionKeys()).thenReturn(globalAttributeDefinitionKeys); // Call the method under test. GlobalAttributeDefinitionKeys response = globalAttributeDefinitionService.getGlobalAttributeDefinitionKeys(); // Verify the external calls. verify(globalAttributeDefinitionDao).getAllGlobalAttributeDefinitionKeys(); verifyNoMoreInteractionsHelper(); // Validate the response. assertEquals(new GlobalAttributeDefinitionKeys(globalAttributeDefinitionKeys), response); } /** * Checks if any of the mocks has any interaction. */ private void verifyNoMoreInteractionsHelper() { verifyNoMoreInteractions(globalAttributeDefinitionDao, globalAttributeDefinitionDaoHelper, globalAttributeDefinitionHelper, globalAttributeDefinitionLevelDao); } }