/** * Copyright (C) 2011 JTalks.org Team * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ package org.jtalks.jcommune.web.controller; import org.jtalks.common.model.entity.Component; import org.jtalks.common.model.entity.Group; import org.jtalks.common.model.permissions.BranchPermission; import org.jtalks.jcommune.model.dto.*; import org.jtalks.jcommune.model.entity.Branch; import org.jtalks.jcommune.model.entity.ComponentInformation; import org.jtalks.jcommune.service.BranchService; import org.jtalks.jcommune.service.ComponentService; import org.jtalks.jcommune.plugin.api.exceptions.NotFoundException; import org.jtalks.jcommune.service.GroupService; import org.jtalks.jcommune.service.SpamProtectionService; import org.jtalks.jcommune.service.nontransactional.ImageService; import org.jtalks.jcommune.service.security.PermissionManager; import org.jtalks.jcommune.web.dto.BranchDto; import org.jtalks.jcommune.web.dto.BranchPermissionDto; import org.jtalks.jcommune.web.dto.PermissionGroupsDto; import org.jtalks.jcommune.plugin.api.web.dto.json.JsonResponse; import org.jtalks.jcommune.plugin.api.web.dto.json.JsonResponseStatus; import org.jtalks.jcommune.web.util.ImageControllerUtils; import org.mockito.Mock; import org.springframework.context.MessageSource; import org.springframework.http.MediaType; import org.springframework.mock.web.MockHttpSession; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.ObjectError; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.util.*; import static org.mockito.Mockito.*; import static org.mockito.MockitoAnnotations.initMocks; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNull; import static org.testng.AssertJUnit.assertTrue; /** * @author Andrei Alikov */ public class AdministrationControllerTest { @Mock ComponentService componentService; @Mock MessageSource messageSource; @Mock ImageControllerUtils logoControllerUtils; @Mock ImageControllerUtils favIconPngControllerUtils; @Mock ImageControllerUtils favIconIcoControllerUtils; @Mock ImageService iconImageService; @Mock BranchService branchService; @Mock PermissionManager permissionManager; @Mock GroupService groupService; @Mock private SpamProtectionService spamProtectionService; private MockMvc mockMvc; // private AdministrationController administrationController; @BeforeMethod public void init() { initMocks(this); administrationController = new AdministrationController(componentService, messageSource, branchService, permissionManager,groupService, spamProtectionService); } @Test public void enterAdminModeShouldSetSessionAttributeAndReturnPreviousPageRedirect() { HttpServletRequest request = mock(HttpServletRequest.class); String initialPage = "/topics/2"; when(request.getHeader("Referer")).thenReturn(initialPage); HttpSession session = new MockHttpSession(); when(request.getSession()).thenReturn(session); String resultUrl = administrationController.enterAdministrationMode(request); Boolean attr = (Boolean) session.getAttribute(AdministrationController.ADMIN_ATTRIBUTE_NAME); assertTrue(attr); assertEquals(resultUrl, "redirect:" + initialPage); } @Test public void exitAdminModeShouldRemoveSessionAttributeAndReturnPreviousPageRedirect() { HttpServletRequest request = mock(HttpServletRequest.class); String initialPage = "/topics/2"; when(request.getHeader("Referer")).thenReturn(initialPage); HttpSession session = new MockHttpSession(); when(request.getSession()).thenReturn(session); String resultUrl = administrationController.exitAdministrationMode(request); Object attr = session.getAttribute(AdministrationController.ADMIN_ATTRIBUTE_NAME); assertNull(attr); assertEquals(resultUrl, "redirect:" + initialPage); } @Test public void validForumInformationShouldProduceSuccessResponse() { Component component = setupComponentMock(); BeanPropertyBindingResult bindingResult = new BeanPropertyBindingResult(new Object(), ""); ComponentInformation ci = new ComponentInformation(); when(favIconIcoControllerUtils.getImageService()).thenReturn(iconImageService); JsonResponse response = administrationController.setForumInformation(ci, bindingResult, Locale.UK); verify(componentService).setComponentInformation(ci); assertEquals(response.getStatus(), JsonResponseStatus.SUCCESS); } @Test public void invalidForumInformationShouldProduceFailResponse() { BeanPropertyBindingResult bindingResult = new BeanPropertyBindingResult(new Object(), ""); bindingResult.addError(new ObjectError("name", "message")); JsonResponse response = administrationController.setForumInformation(new ComponentInformation(), bindingResult, Locale.UK); assertEquals(response.getStatus(), JsonResponseStatus.FAIL); } @Test public void validBranchInformationShouldProduceSuccessResponse() throws NotFoundException { Component component = setupComponentMock(); BeanPropertyBindingResult bindingResult = new BeanPropertyBindingResult(new Object(), ""); BranchDto branchDto = new BranchDto(); JsonResponse response = administrationController.setBranchInformation(branchDto, bindingResult, Locale.UK); assertEquals(response.getStatus(), JsonResponseStatus.SUCCESS); } @Test public void invalidBranchInformationShouldProduceFailResponse() throws NotFoundException { BeanPropertyBindingResult bindingResult = new BeanPropertyBindingResult(new Object(), ""); bindingResult.addError(new ObjectError("name", "message")); BranchDto branchDto = new BranchDto(); JsonResponse response = administrationController.setBranchInformation(branchDto, bindingResult, Locale.UK); assertEquals(response.getStatus(), JsonResponseStatus.FAIL); } @Test public void showBranchPermissionsShouldReturnModelAndViewWithBranchAndPermissionsInformation() throws Exception { long branchId = 42; Component component = setupComponentMock(); GroupsPermissions expectedPermissions = new GroupsPermissions(); Branch expectedBranch = new Branch("name", "description"); when(branchService.getBranchOfComponent(component.getId(), branchId)).thenReturn(expectedBranch); doReturn(expectedPermissions).when(branchService).getPermissionsFor(component.getId(), branchId); mockMvc = MockMvcBuilders.standaloneSetup(administrationController).build(); this.mockMvc.perform(get("/branch/permissions/42").accept(MediaType.TEXT_HTML)) .andExpect(model().attribute("branch", expectedBranch)) .andExpect(model().attribute("permissions", expectedPermissions)); } @Test public void getGroupsForBranchPermissionShouldReturnFailIfBranchWasNotFound() throws Exception { Component component = setupComponentMock(); BranchPermission targetPermission = BranchPermission.CREATE_POSTS; BranchPermissionDto dto = createBranchPermissionDto(targetPermission); when(permissionManager.findBranchPermissionByMask(targetPermission.getMask())).thenReturn(targetPermission); when(branchService.getPermissionGroupsFor(component.getId(), dto.getBranchId(), dto.isAllowed(), targetPermission)) .thenThrow(new NotFoundException()); JsonResponse jsonResponse = administrationController.getGroupsForBranchPermission(dto); assertEquals(jsonResponse.getStatus(), JsonResponseStatus.FAIL); } @Test public void getGroupsForBranchPermissionShouldReturnSuccessIfBranchExistsAndPermissionHasNoGroups() throws Exception { Component component = setupComponentMock(); BranchPermission targetPermission = BranchPermission.CREATE_POSTS; BranchPermissionDto dto = createBranchPermissionDto(targetPermission); when(branchService.getPermissionGroupsFor(component.getId(), dto.getBranchId(), dto.isAllowed(), targetPermission)) .thenReturn(Collections.EMPTY_LIST); when(permissionManager.findBranchPermissionByMask(targetPermission.getMask())).thenReturn(targetPermission); when(permissionManager.getAllGroupsWithoutExcluded(anyList(), eq(targetPermission))).thenReturn(Collections.EMPTY_LIST); JsonResponse jsonResponse = administrationController.getGroupsForBranchPermission(dto); assertEquals(jsonResponse.getStatus(), JsonResponseStatus.SUCCESS); } @Test public void getGroupsForBranchPermissionShouldReturnSuccessIfBranchExists() throws Exception { Component component = setupComponentMock(); BranchPermission targetPermission = BranchPermission.CREATE_POSTS; BranchPermissionDto dto = createBranchPermissionDto(targetPermission); List<Group> selectedGroupList = Arrays.asList(new Group("1"), new Group("2"), new Group("3")); when(branchService.getPermissionGroupsFor(component.getId(), dto.getBranchId(), dto.isAllowed(), targetPermission)) .thenReturn(selectedGroupList); List<Group> allGroupList = Arrays.asList(new Group("4"), new Group("5"), new Group("6")); when(permissionManager.getAllGroupsWithoutExcluded(selectedGroupList, targetPermission)).thenReturn(allGroupList); when(permissionManager.findBranchPermissionByMask(targetPermission.getMask())).thenReturn(targetPermission); JsonResponse jsonResponse = administrationController.getGroupsForBranchPermission(dto); assertEquals(jsonResponse.getStatus(), JsonResponseStatus.SUCCESS); assertTrue(jsonResponse.getResult() instanceof PermissionGroupsDto); PermissionGroupsDto result = (PermissionGroupsDto)jsonResponse.getResult(); assertEquals(result.getAvailableGroups().size(), 3); assertEquals(result.getSelectedGroups().size(), 3); } @Test public void editBranchPermissionsShouldReturnSuccessIfBranchExist() throws Exception { Component component = setupComponentMock(); BranchPermission targetPermission = BranchPermission.CREATE_POSTS; BranchPermissionDto dto = createBranchPermissionDto(targetPermission); dto.setNewlyAddedGroupIds(Arrays.asList(1L, 2L)); dto.setRemovedGroupIds(Arrays.asList(1L, 2L)); when(permissionManager.findBranchPermissionByMask(targetPermission.getMask())).thenReturn(targetPermission); JsonResponse response = administrationController.editBranchPermissions(dto); assertEquals(response.getStatus(), JsonResponseStatus.SUCCESS); verify(branchService).changeBranchPermissions(anyLong(), eq(dto.getBranchId()), eq(dto.isAllowed()), any(PermissionChanges.class)); } @Test public void editBranchPermissionsShouldReturnFailIfBranchNotFound() throws Exception { Component component = setupComponentMock(); BranchPermission targetPermission = BranchPermission.CREATE_POSTS; BranchPermissionDto dto = createBranchPermissionDto(targetPermission); dto.setNewlyAddedGroupIds(Arrays.asList(1L, 2L)); dto.setRemovedGroupIds(Arrays.asList(1L, 2L)); when(permissionManager.findBranchPermissionByMask(targetPermission.getMask())).thenReturn(targetPermission); doThrow(new NotFoundException()).when(branchService).changeBranchPermissions(anyLong(), eq(dto.getBranchId()), eq(dto.isAllowed()), any(PermissionChanges.class)); JsonResponse response = administrationController.editBranchPermissions(dto); assertEquals(response.getStatus(), JsonResponseStatus.FAIL); } private Component setupComponentMock() { Component component = new Component(); component.setId(1L); when(componentService.getComponentOfForum()).thenReturn(component); return component; } private BranchPermissionDto createBranchPermissionDto(BranchPermission targetPermission) { BranchPermissionDto dto = new BranchPermissionDto(); dto.setAllowed(true); dto.setBranchId(42L); dto.setPermissionMask(targetPermission.getMask()); return dto; } @Test public void groupAdministrationPageShouldContainListOfGroups() throws Exception { setupComponentMock(); List<GroupAdministrationDto> expected = new ArrayList<>(); expected.add(new GroupAdministrationDto("group",0)); expected.add(new GroupAdministrationDto("group1",0)); expected.add(new GroupAdministrationDto("group2",0)); mockMvc = MockMvcBuilders.standaloneSetup(administrationController).build(); when(groupService.getGroupNamesWithCountOfUsers()).thenReturn(expected); this.mockMvc.perform(get("/group/list").accept(MediaType.TEXT_HTML)) .andExpect(model().attribute("groups", expected)); } }