/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * 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.uberfire.ext.security.management.client.widgets.management.list; import java.util.Collection; import java.util.List; import org.gwtbootstrap3.client.ui.constants.HeadingSize; import org.jboss.errai.security.shared.api.identity.User; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; import org.uberfire.ext.security.management.api.AbstractEntityManager; import org.uberfire.ext.security.management.client.widgets.management.AbstractSecurityManagementTest; import org.uberfire.ext.security.management.client.widgets.popup.LoadingBox; import static org.junit.Assert.*; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class EntitiesListTest extends AbstractSecurityManagementTest { protected EntitiesList<User> presenter; protected HeadingSize headingSize = HeadingSize.H3; @Mock LoadingBox loadingBox; @Mock EntitiesList.View view; @Before public void setup() { super.setup(); presenter = new EntitiesList<User>(loadingBox, view); presenter.setPageSize(5); presenter.setEntityTitleSize(headingSize); } @Test public void testClear() throws Exception { presenter.callback = mock(EntitiesList.Callback.class); presenter.paginationConstraints = mock(EntitiesList.PaginationConstraints.class); presenter.totalPages = 10; presenter.emptyEntitiesText = "empty"; presenter.clear(); assertNull(presenter.callback); assertNull(presenter.paginationConstraints); assertEquals(presenter.totalPages, -1); assertNull(presenter.emptyEntitiesText); verify(view, times(0)).configure(anyString(), any(EntitiesList.PaginationConstraints.class)); verify(view, times(0)).add(anyInt(), anyString(), anyString(), any(HeadingSize.class), anyBoolean(), anyBoolean(), anyBoolean(), anyBoolean()); verify(view, times(1)).clear(); } @Test public void testCallbacks() throws Exception { final String id = "user1"; final EntitiesList.Callback callback = mock(EntitiesList.Callback.class); ; final EntitiesList.PaginationConstraints paginationConstraints = mock(EntitiesList.PaginationConstraints.class); when(paginationConstraints.getCurrentPage()).thenReturn(5); presenter.callback = callback; presenter.paginationConstraints = paginationConstraints; presenter.totalPages = 10; presenter.getEntityType(); verify(callback, times(1)).getEntityType(); presenter.onReadEntity(id); verify(callback, times(1)).onReadEntity(id); presenter.onRemoveEntity(id); verify(callback, times(1)).onRemoveEntity(id); presenter.onGoToFirstPage(); verify(callback, times(1)).onChangePage(anyInt(), eq(1)); presenter.onGoToPrevPage(); verify(callback, times(1)).onChangePage(anyInt(), eq(4)); presenter.onGoToNextPage(); verify(callback, times(1)).onChangePage(anyInt(), eq(6)); presenter.onGoToLastPage(); verify(callback, times(1)).onChangePage(anyInt(), eq(11)); presenter.onSelectEntity(id, 0, false); verify(callback, times(1)).onSelectEntity(id, false); } @Test public void testCreatePaginationCallbackSinglePage() throws Exception { final Integer size = 10; List<User> users = buildUsersList(size); final boolean hasNextPage = false; final int page = 1; final int pageSize = 50; final AbstractEntityManager.SearchResponse<User> searchResponse = createSearchResponse(users, size, hasNextPage, "", page, pageSize); EntitiesList.PaginationConstraints constraints = presenter.createPaginationCallback(searchResponse); assertFalse(constraints.isFirstPageEnabled()); assertFalse(constraints.isFirstPageVisible()); assertFalse(constraints.isNextPageEnabled()); assertFalse(constraints.isNextPageVisible()); assertFalse(constraints.isPrevPageEnabled()); assertFalse(constraints.isPrevPageVisible()); assertFalse(constraints.isLastPageEnabled()); assertFalse(constraints.isLastPageVisible()); assertEquals(constraints.getTotal(), size); assertEquals(constraints.getCurrentPage(), page); } @Test public void testCreatePaginationCallbackMultiplePagesAtFirstPage() throws Exception { final Integer size = 10; List<User> users = buildUsersList(size); final boolean hasNextPage = false; final int page = 1; final int pageSize = 5; final AbstractEntityManager.SearchResponse<User> searchResponse = createSearchResponse(users, size, hasNextPage, "", page, pageSize); EntitiesList.PaginationConstraints constraints = presenter.createPaginationCallback(searchResponse); assertFalse(constraints.isFirstPageEnabled()); assertFalse(constraints.isFirstPageVisible()); assertTrue(constraints.isNextPageEnabled()); assertTrue(constraints.isNextPageVisible()); assertFalse(constraints.isPrevPageEnabled()); assertFalse(constraints.isPrevPageVisible()); assertTrue(constraints.isLastPageEnabled()); assertTrue(constraints.isLastPageVisible()); assertEquals(constraints.getTotal(), size); assertEquals(constraints.getCurrentPage(), page); } @Test public void testCreatePaginationCallbackMultiplePagesAtSecondPage() throws Exception { final Integer size = 10; List<User> users = buildUsersList(size); final boolean hasNextPage = false; final int page = 2; final int pageSize = 5; final AbstractEntityManager.SearchResponse<User> searchResponse = createSearchResponse(users, size, hasNextPage, "", page, pageSize); EntitiesList.PaginationConstraints constraints = presenter.createPaginationCallback(searchResponse); assertTrue(constraints.isFirstPageEnabled()); assertTrue(constraints.isFirstPageVisible()); assertFalse(constraints.isNextPageEnabled()); assertFalse(constraints.isNextPageVisible()); assertTrue(constraints.isPrevPageEnabled()); assertTrue(constraints.isPrevPageVisible()); assertFalse(constraints.isLastPageEnabled()); assertFalse(constraints.isLastPageVisible()); assertEquals(constraints.getTotal(), size); assertEquals(constraints.getCurrentPage(), page); } @Test public void testShow() throws Exception { final int size = 10; List<User> users = buildUsersList(size); final boolean hasNextPage = false; final int page = 1; final int pageSize = 50; final AbstractEntityManager.SearchResponse<User> searchResponse = createSearchResponse(users, size, hasNextPage, "", page, pageSize); final EntitiesList.Callback<User> callback = createEntitiesListCallback(users, true, true, true); // Call the public show method. presenter.show(searchResponse, callback); assertEquals(presenter.callback, callback); // Not clear verify. verify(view, times(0)).clear(); // Verify loading popup. verify(loadingBox, times(1)).show(); // Verify view configuration. verify(view, times(1)).configure(anyString(), any(EntitiesList.PaginationConstraints.class)); // Verify adding entities to the view. for (int x = 0; x < size; x++) { verify(view, times(1)).add(x, getUserIdentifier(x), getUserIdentifier(x), headingSize, true, true, true, false); } // Verify loading popup. verify(loadingBox, times(1)).hide(); } protected EntitiesList.Callback<User> createEntitiesListCallback(Collection<User> entities, boolean canRead, boolean canRemove, boolean canSelect) { EntitiesList.Callback<User> callback = mock(EntitiesList.Callback.class); when(callback.getEntityType()).thenReturn("User"); when(callback.canRead()).thenReturn(canRead); when(callback.canRemove()).thenReturn(canRemove); when(callback.canSelect()).thenReturn(canSelect); when(callback.isSelected(anyString())).thenReturn(false); when(callback.getIdentifier(any(User.class))).thenAnswer(new Answer<String>() { @Override public String answer(InvocationOnMock invocationOnMock) throws Throwable { User user = (User) invocationOnMock.getArguments()[0]; return user.getIdentifier(); } }); when(callback.getTitle(any(User.class))).thenAnswer(new Answer<String>() { @Override public String answer(InvocationOnMock invocationOnMock) throws Throwable { User user = (User) invocationOnMock.getArguments()[0]; return user.getIdentifier(); } }); return callback; } protected AbstractEntityManager.SearchResponse<User> createSearchResponse(final List<User> users, final int total, final boolean hasNextPage, final String searchPattern, final int page, final int pageSize) { AbstractEntityManager.SearchResponse<User> response = mock(AbstractEntityManager.SearchResponse.class); when(response.getResults()).thenReturn(users); when(response.getTotal()).thenReturn(total); when(response.hasNextPage()).thenReturn(hasNextPage); when(response.getSearchPattern()).thenReturn(searchPattern); when(response.getPage()).thenReturn(page); when(response.getPageSize()).thenReturn(pageSize); return response; } }