package edu.asu.spring.quadriga.mapper;
import static org.junit.Assert.assertEquals;
import java.util.Date;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import edu.asu.spring.quadriga.domain.IUser;
import edu.asu.spring.quadriga.domain.impl.User;
import edu.asu.spring.quadriga.domain.impl.projectblog.ProjectBlogEntry;
import edu.asu.spring.quadriga.domain.projectblog.IProjectBlogEntry;
import edu.asu.spring.quadriga.dto.ProjectBlogEntryDTO;
import edu.asu.spring.quadriga.dto.QuadrigaUserDTO;
import edu.asu.spring.quadriga.exceptions.QuadrigaStorageException;
import edu.asu.spring.quadriga.service.IUserManager;
import edu.asu.spring.quadriga.service.impl.UserManager;
/**
* This class tests the mapper functionality for {@linkplain IProjectBlogEntry}
* and {@linkplain ProjectBlogEntryDTO}.
*
* @author PawanMahalle
*
*/
public class ProjectBlogEntryDTOMapperTest {
// Mocked variable values
public static final String ID = "BLGE_ID_DUMMY";
public static final String TITLE = "TITLE_DUMMY";
private static final String DESCRIPTION = "DESCRIPTION_DUMMY";
private static final String AUTHOR_NAME = "AUTHOR_NAME";
private static final Date CREATED_DATE = new Date();
private static final String PROJECT_ID = "PROJ_ID_DUMMY";
@Mock
IUserManager userManager = Mockito.mock(UserManager.class);
@InjectMocks
ProjectBlogEntryDTOMapper projectBlogEntryDTOMapperUnderTest;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
/**
* tests
* {@linkplain ProjectBlogEntryDTOMapper#getProjectBlogEntry(ProjectBlogEntryDTO)}
* method responsible for mapping {@linkplain ProjectBlogEntryDTO} to
* {@linkplain IProjectBlogEntry} instance
*
* @throws QuadrigaStorageException
*/
@Test
public void getProjectBlogEntry() throws QuadrigaStorageException {
// Creating an instance of ProjectBlogEntryDTO which is passes as
// argument
// to the getProjectBlogEntry method
ProjectBlogEntryDTO projectBlogEntryDTO = new ProjectBlogEntryDTO();
projectBlogEntryDTO.setProjectBlogEntryId(ID);
projectBlogEntryDTO.setTitle(TITLE);
projectBlogEntryDTO.setDescription(DESCRIPTION);
projectBlogEntryDTO.setAuthor(AUTHOR_NAME);
projectBlogEntryDTO.setCreatedDate(CREATED_DATE);
projectBlogEntryDTO.setProjectid(PROJECT_ID);
// IUser instance which should be returned by mocked userManager
// instance when getUser() method is called
IUser author = new User();
author.setName(AUTHOR_NAME);
Mockito.when(userManager.getUser(AUTHOR_NAME)).thenReturn(author);
// Calling getProjectBlogEntry method with dummy ProjectBlogEntryDTO
// instance
IProjectBlogEntry projectBlogEntry = projectBlogEntryDTOMapperUnderTest
.getProjectBlogEntry(projectBlogEntryDTO);
assertProjectBlogEntryMapping(projectBlogEntry);
}
private void assertProjectBlogEntryMapping(IProjectBlogEntry projectBlogEntry) {
assertEquals(ID, projectBlogEntry.getProjectBlogEntryId());
assertEquals(TITLE, projectBlogEntry.getTitle());
assertEquals(DESCRIPTION, projectBlogEntry.getDescription());
assertEquals(AUTHOR_NAME, projectBlogEntry.getAuthor().getName());
assertEquals(CREATED_DATE, projectBlogEntry.getCreatedDate());
assertEquals(PROJECT_ID, projectBlogEntry.getProjectId());
}
/**
* creates an instance of {@linkplain ProjectBlogEntryDTOMapper} which
* overrides the {@linkplain BaseMapper#getUserDTO(String)} method to return
* mocked instance of {@linkplain QuadrigaUserDTO} with username as name of
* author i.e <code>AUTHOR_NAME</code>.
*
* Mockito does not support mocking base class methods.
*
* Reference: 1. Mocking base class method i.e. getUserDTO is not possible
* [http://stackoverflow.com/questions/3467801/mockito-how-to-mock-only-the-
* call-of-a-method-of-the-superclass] 2. Solution to the problem. Used
* first approach from page -
* https://www.tildedave.com/2011/03/06/pattern-stubbing-legacy-superclasses
* -with-mockito-spies.html.
*
* @return instance of {@linkplain QuadrigaUserDTO}
*/
public ProjectBlogEntryDTOMapper getProjectBlogEntryDTOMapper() {
return new ProjectBlogEntryDTOMapper() {
@Override
public QuadrigaUserDTO getUserDTO(String userName) {
// Creating an instance of QuadrigaUserDTO which should be
// returned by mocked projectBlogEntryDTOMapper object when
// getUserDTO is called.
QuadrigaUserDTO quadrigaUserDTO = new QuadrigaUserDTO();
quadrigaUserDTO.setUsername(AUTHOR_NAME);
return quadrigaUserDTO;
}
};
}
/**
* tests
* {@linkplain ProjectBlogEntryDTOMapper#getProjectBlogEntryDTO(IProjectBlogEntry)}
* method responsible for mapping {@linkplain IProjectBlogEntry} instance to
* {@linkplain ProjectBlogEntryDTO} instance
*/
@Test
public void getProjectBlogEntryDTOTest() {
// Creating an instance of IProjectBlogEntry which is passes as an
// argument to the getProjectBlogEntryDTO method
IProjectBlogEntry projectBlogEntry = new ProjectBlogEntry();
projectBlogEntry.setProjectBlogEntryId(ID);
projectBlogEntry.setTitle(TITLE);
projectBlogEntry.setDescription(DESCRIPTION);
projectBlogEntry.setCreatedDate(CREATED_DATE);
projectBlogEntry.setProjectId(PROJECT_ID);
IUser author = new User();
author.setUserName(AUTHOR_NAME);
projectBlogEntry.setAuthor(author);
// Calling getProjectBlogEntryDTO method with dummy IProjectBlogEntry
// instance
ProjectBlogEntryDTOMapper projectBlogEntryDTOMapperUnderTest = getProjectBlogEntryDTOMapper();
ProjectBlogEntryDTO projectBlogEntryDTO = projectBlogEntryDTOMapperUnderTest
.getProjectBlogEntryDTO(projectBlogEntry);
assertProjectBlogEntryDTOMapping(projectBlogEntryDTO);
}
private void assertProjectBlogEntryDTOMapping(ProjectBlogEntryDTO projectBlogEntryDTO) {
assertEquals(ID, projectBlogEntryDTO.getProjectBlogEntryId());
assertEquals(TITLE, projectBlogEntryDTO.getTitle());
assertEquals(DESCRIPTION, projectBlogEntryDTO.getDescription());
assertEquals(CREATED_DATE, projectBlogEntryDTO.getCreatedDate());
assertEquals(PROJECT_ID, projectBlogEntryDTO.getProjectid());
assertEquals(AUTHOR_NAME, projectBlogEntryDTO.getProjectBlogEntryAuthorDTO().getUsername());
}
}