package com.nicusa.controller; import com.nicusa.assembler.PortfolioAssembler; import com.nicusa.converter.PortfolioResourceToDomainConverter; import com.nicusa.domain.Drug; import com.nicusa.domain.Portfolio; import com.nicusa.domain.UserProfile; import com.nicusa.resource.PortfolioResource; import com.nicusa.resource.UserProfileResource; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.persistence.EntityManager; import java.util.ArrayList; import java.util.Collection; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class PortfolioControllerTest { @Mock private EntityManager entityManager; @Mock private PortfolioAssembler portfolioAssembler; @Mock private SecurityController securityController; @Mock public PortfolioResourceToDomainConverter portfolioResourceToDomainConverter; @InjectMocks private PortfolioController portfolioController; @Before public void before() { RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(new MockHttpServletRequest())); } @After public void after() { RequestContextHolder.setRequestAttributes(null); } @Test public void testGetPortfolio() throws Exception { Portfolio portfolio = new Portfolio(); when(entityManager.find(Portfolio.class, 1L)).thenReturn(portfolio); PortfolioResource portfolioResource = new PortfolioResource(); when(portfolioAssembler.toResource(portfolio)).thenReturn(portfolioResource); ResponseEntity<PortfolioResource> portfolioResourceResponseEntity = portfolioController.getPortfolio(1L); assertThat(HttpStatus.OK, is(portfolioResourceResponseEntity.getStatusCode())); assertThat(portfolioResource, is(portfolioResourceResponseEntity.getBody())); } @Test public void testGetPortfolioNotFound() { when(entityManager.find(Portfolio.class, 1L)).thenReturn(null); ResponseEntity<PortfolioResource> portfolioResourceResponseEntity = portfolioController.getPortfolio(1L); assertThat(HttpStatus.NOT_FOUND, is(portfolioResourceResponseEntity.getStatusCode())); assertThat(portfolioResourceResponseEntity.getBody(), is(nullValue())); } @Test public void testCreatePortfolio() { PortfolioResource portfolioResource = new PortfolioResource(); Portfolio portfolio = new Portfolio(); portfolio.setId(1L); when(securityController.getAuthenticatedUserProfileId()).thenReturn(1L); when(portfolioResourceToDomainConverter.convert(portfolioResource)).thenReturn(portfolio); ResponseEntity<?> responseEntity = portfolioController.create(portfolioResource); assertThat(responseEntity.getStatusCode(), is(HttpStatus.CREATED)); } @Test public void testCreateAnonymousShouldReturnUnAuthorized() { PortfolioResource portfolioResource = new PortfolioResource(); when(securityController.getAuthenticatedUserProfileId()).thenReturn(UserProfileResource.ANONYMOUS_USER_PROFILE_ID); ResponseEntity<?> responseEntity = portfolioController.create(portfolioResource); assertThat(responseEntity.getStatusCode(), is(HttpStatus.UNAUTHORIZED)); } @Test public void testUpdatePortfolioResourceAnonymousUnAuthorized() { PortfolioResource portfolioResource = new PortfolioResource(); when(securityController.getAuthenticatedUserProfileId()).thenReturn(UserProfileResource.ANONYMOUS_USER_PROFILE_ID); ResponseEntity<?> responseEntity = portfolioController.updatePortfolio(1L, portfolioResource); assertThat(responseEntity.getStatusCode(), is(HttpStatus.UNAUTHORIZED)); } @Test public void testUpdatePortfolioNoContent() { PortfolioResource portfolioResource = new PortfolioResource(); when(securityController.getAuthenticatedUserProfileId()).thenReturn(1L); when(entityManager.find(Portfolio.class, 1L)).thenReturn(null); ResponseEntity<?> responseEntity = portfolioController.updatePortfolio(1L, portfolioResource); assertThat(responseEntity.getStatusCode(), is(HttpStatus.NO_CONTENT)); } @Test public void testUpdatePortfolioForADifferentUserProfile() { PortfolioResource portfolioResource = new PortfolioResource(); UserProfile userProfile = new UserProfile(); userProfile.setId(2L); Portfolio portfolio = new Portfolio(); portfolio.setId(1L); when(securityController.getAuthenticatedUserProfileId()).thenReturn(1L); when(entityManager.find(Portfolio.class, 1L)).thenReturn(portfolio); ResponseEntity<?> responseEntity = portfolioController.updatePortfolio(1L, portfolioResource); assertThat(responseEntity.getStatusCode(), is(HttpStatus.UNAUTHORIZED)); } @Test public void testUpdatePortfolio() { Drug drug = new Drug(); drug.setName("cotton candy"); drug.setUnii("cotton candy"); Collection<Drug> drugCollection = new ArrayList<Drug>(); drugCollection.add(drug); PortfolioResource portfolioResource = new PortfolioResource(); UserProfile userProfile = new UserProfile(); userProfile.setId(1L); Portfolio portfolio = new Portfolio(); portfolio.setId(1L); portfolio.setName("unikitty"); portfolio.setUserProfile(userProfile); portfolio.setDrugs(drugCollection); when(securityController.getAuthenticatedUserProfileId()).thenReturn(1L); when(entityManager.find(Portfolio.class, 1L)).thenReturn(portfolio); when(portfolioResourceToDomainConverter.convert(portfolioResource)).thenReturn(portfolio); ResponseEntity<?> responseEntity = portfolioController.updatePortfolio(1L, portfolioResource); assertThat(responseEntity.getStatusCode(), is(HttpStatus.OK)); } @Test public void testDeletePortfolioAsAnonymousUser() { when(securityController.getAuthenticatedUserProfileId()).thenReturn(UserProfileResource.ANONYMOUS_USER_PROFILE_ID); ResponseEntity<?> responseEntity = portfolioController.delete(1L); assertThat(responseEntity.getStatusCode(), is(HttpStatus.UNAUTHORIZED)); } @Test public void testDeletePortfolioNoContent() { when(securityController.getAuthenticatedUserProfileId()).thenReturn(1L); when(entityManager.find(Portfolio.class, 1L)).thenReturn(null); ResponseEntity<?> responseEntity = portfolioController.delete(1L); assertThat(responseEntity.getStatusCode(), is(HttpStatus.NO_CONTENT)); } @Test public void testDeletePortfolioForAnotherUserProfile() { UserProfile userProfile = new UserProfile(); userProfile.setId(2L); Portfolio portfolio = new Portfolio(); portfolio.setId(1L); portfolio.setUserProfile(userProfile); when(securityController.getAuthenticatedUserProfileId()).thenReturn(1L); when(entityManager.find(Portfolio.class, 1L)).thenReturn(portfolio); ResponseEntity<?> responseEntity = portfolioController.delete(1L); assertThat(responseEntity.getStatusCode(), is(HttpStatus.UNAUTHORIZED)); } @Test public void testDeletePortfolio() { UserProfile userProfile = new UserProfile(); userProfile.setId(1L); Portfolio portfolio = new Portfolio(); portfolio.setId(1L); portfolio.setUserProfile(userProfile); when(securityController.getAuthenticatedUserProfileId()).thenReturn(1L); when(entityManager.find(Portfolio.class, 1L)).thenReturn(portfolio); ResponseEntity<?> responseEntity = portfolioController.delete(1L); assertThat(responseEntity.getStatusCode(), is(HttpStatus.OK)); } }