package com.constellio.app.ui.pages.management.authorizations;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentCaptor.forClass;
import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Arrays;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import com.constellio.app.ui.entities.AuthorizationVO;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.entities.RecordVO.VIEW_MODE;
import com.constellio.app.ui.framework.builders.AuthorizationToVOBuilder;
import com.constellio.app.ui.pages.base.PresenterService;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.Group;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.security.Authorization;
import com.constellio.model.entities.security.global.AuthorizationDeleteRequest;
import com.constellio.model.entities.security.global.AuthorizationDetails;
import com.constellio.model.entities.security.global.AuthorizationModificationRequest;
import com.constellio.model.services.security.AuthorizationsServices;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.FakeSessionContext;
import com.constellio.sdk.tests.MockedFactories;
import com.constellio.sdk.tests.MockedNavigation;
public class ListPrincipalAccessAuthorizationsPresenterTest extends ConstellioTest {
public static final String ZE_PRINCIPAL = "zePrincipal";
public static final String ZENOTHER_PRINCIPAL = "zenotherPrincipal";
@Mock AuthorizationsServices authorizationsServices;
@Mock PresenterService presenterService;
@Mock ListPrincipalAccessAuthorizationsView view;
MockedNavigation navigator;
@Mock User user;
@Mock RecordVO principal;
@Mock AuthorizationVO authorizationVO;
@Mock AuthorizationVO inherited1;
@Mock AuthorizationVO inherited2;
@Mock AuthorizationVO own1;
@Mock AuthorizationVO own2;
@Mock Authorization authorization;
@Mock
AuthorizationDetails details;
MockedFactories factories = new MockedFactories();
ListAuthorizationsPresenter presenter;
@Before
public void setUp()
throws Exception {
when(authorizationVO.getAuthId()).thenReturn("zeAuth");
when(details.getId()).thenReturn("zeAuth");
navigator = new MockedNavigation();
when(view.getConstellioFactories()).thenReturn(factories.getConstellioFactories());
SessionContext context = FakeSessionContext.gandalfInCollection(zeCollection);
when(view.getSessionContext()).thenReturn(context);
when(view.getCollection()).thenReturn(zeCollection);
when(view.navigate()).thenReturn(navigator);
when(factories.getAppLayerFactory().newPresenterService()).thenReturn(presenterService);
when(presenterService.getRecordVO(ZE_PRINCIPAL, VIEW_MODE.DISPLAY, context)).thenReturn(principal);
when(presenterService.getCurrentUser(isA(SessionContext.class))).thenReturn(user);
when(factories.getModelLayerFactory().newAuthorizationsServices()).thenReturn(authorizationsServices);
presenter = spy(new ListPrincipalAccessAuthorizationsPresenter(view).forRequestParams(ZE_PRINCIPAL));
}
@Test
public void givenIdThenReturnTheCorrectPrincipal() {
assertThat(presenter.getRecordVO()).isEqualTo(principal);
}
@Test
public void givenBackButtonPressedWhenPrincipalIsGroupThenNavigateToGroup() {
presenter.backButtonClicked(Group.DEFAULT_SCHEMA);
verify(navigator.to(), times(1)).displayCollectionGroup(ZE_PRINCIPAL);
}
@Test
public void givenBackButtonPressedWhenPrincipalIsUserThenNavigateToUser() {
presenter.backButtonClicked(User.DEFAULT_SCHEMA);
verify(navigator.to(), times(1)).displayCollectionUser(ZE_PRINCIPAL);
}
@Test
public void givenAuthorizationDeletedWhenSinglePrincipalThenRemoveTheAuthorizationAndRefreshTheView() {
ArgumentCaptor<AuthorizationDeleteRequest> requestArgumentCaptor = forClass(AuthorizationDeleteRequest.class);
givenAuthorizationWithId(aString(), false);
presenter.deleteButtonClicked(authorizationVO);
verify(authorizationsServices, times(1)).execute(requestArgumentCaptor.capture());
verify(view, times(1)).removeAuthorization(authorizationVO);
assertThat(requestArgumentCaptor.getValue().getAuthId()).isEqualTo("zeAuth");
assertThat(requestArgumentCaptor.getValue().getExecutedBy()).isEqualTo(user);
}
@Test
public void givenAuthorizationDeletedWhenMultiPrincipalThenRemoveThePrincipalAndRefreshTheView() {
ArgumentCaptor<AuthorizationModificationRequest> captor = forClass(AuthorizationModificationRequest.class);
givenAuthorizationWithId(aString(), true);
presenter.deleteButtonClicked(authorizationVO);
verify(authorizationsServices, times(1)).execute(captor.capture());
verify(view, times(1)).removeAuthorization(authorizationVO);
assertThat(captor.getValue().getAuthorizationId()).isEqualTo("zeAuth");
assertThat(captor.getValue().getNewPrincipalIds()).containsOnly(ZENOTHER_PRINCIPAL);
}
private void givenPrincipalWithTwoInheritedAndTwoOwnAuthorizations() {
Authorization authorization1 = mock(Authorization.class, "Authorization1");
Authorization authorization2 = mock(Authorization.class, "Authorization2");
Authorization authorization3 = mock(Authorization.class, "Authorization3");
Authorization authorization4 = mock(Authorization.class, "Authorization4");
when(authorization1.getGrantedToPrincipals()).thenReturn(Arrays.asList(ZE_PRINCIPAL));
when(authorization2.getGrantedToPrincipals()).thenReturn(Arrays.asList(ZENOTHER_PRINCIPAL));
when(authorization3.getGrantedToPrincipals()).thenReturn(Arrays.asList(ZE_PRINCIPAL));
when(authorization4.getGrantedToPrincipals()).thenReturn(Arrays.asList(ZENOTHER_PRINCIPAL));
Record record = mock(Record.class, "Record");
when(presenterService.getRecord(ZE_PRINCIPAL)).thenReturn(record);
when(authorizationsServices.getRecordAuthorizations(record)).thenReturn(
Arrays.asList(authorization1, authorization2, authorization3, authorization4));
AuthorizationToVOBuilder builder = mock(AuthorizationToVOBuilder.class, "AuthorizationToVOBuilder");
when(builder.build(authorization1)).thenReturn(own1);
when(builder.build(authorization2)).thenReturn(inherited1);
when(builder.build(authorization3)).thenReturn(own2);
when(builder.build(authorization4)).thenReturn(inherited2);
doReturn(builder).when(presenter).newAuthorizationToVOBuilder();
}
private void givenAuthorizationWithId(String authId, boolean multiPrincipal) {
when(authorizationVO.getAuthId()).thenReturn(authId);
when(authorizationsServices.getAuthorization(zeCollection, authId)).thenReturn(authorization);
when(authorization.getGrantedToPrincipals()).thenReturn(multiPrincipal ?
new ArrayList<>(Arrays.asList(ZE_PRINCIPAL, ZENOTHER_PRINCIPAL)) :
Arrays.asList(ZE_PRINCIPAL));
when(authorization.getDetail()).thenReturn(details);
}
}