/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.api.user.server; import com.google.common.collect.ImmutableMap; import com.jayway.restassured.response.Response; import org.eclipse.che.api.core.NotFoundException; import org.eclipse.che.api.core.ServerException; import org.eclipse.che.api.core.model.user.Profile; import org.eclipse.che.api.core.rest.ApiExceptionMapper; import org.eclipse.che.api.user.server.model.impl.ProfileImpl; import org.eclipse.che.api.user.shared.dto.ProfileDto; import org.eclipse.che.commons.env.EnvironmentContext; import org.eclipse.che.commons.subject.Subject; import org.eclipse.che.commons.subject.SubjectImpl; import org.eclipse.che.dto.server.DtoFactory; import org.everrest.assured.EverrestJetty; import org.everrest.core.Filter; import org.everrest.core.GenericContainerRequest; import org.everrest.core.RequestFilter; import org.mockito.Answers; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.testng.MockitoTestNGListener; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Listeners; import org.testng.annotations.Test; import static com.jayway.restassured.RestAssured.given; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static org.everrest.assured.JettyHttpServer.ADMIN_USER_NAME; import static org.everrest.assured.JettyHttpServer.ADMIN_USER_PASSWORD; import static org.everrest.assured.JettyHttpServer.SECURE_PATH; import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; /** * Tests for {@link ProfileService}. * * @author Yevhenii Voevodin */ @Listeners({EverrestJetty.class, MockitoTestNGListener.class}) public class ProfileServiceTest { @SuppressWarnings("unused") private static final ApiExceptionMapper MAPPER = new ApiExceptionMapper(); @SuppressWarnings("unused") private static final EnvironmentFilter FILTER = new EnvironmentFilter(); private static final Subject SUBJECT = new SubjectImpl("user", "user123", "token", false); @Mock(answer = Answers.RETURNS_MOCKS) private ProfileManager profileManager; @Mock private ProfileLinksInjector linksInjector; @Mock(answer = Answers.RETURNS_MOCKS) private UserManager userManager; @Captor private ArgumentCaptor<Profile> profileCaptor; @InjectMocks private ProfileService profileService; @BeforeMethod public void setUp() throws NotFoundException, ServerException { when(linksInjector.injectLinks(any(), any())).thenAnswer(inv -> inv.getArguments()[0]); when(profileManager.getById(SUBJECT.getUserId())).thenReturn(new ProfileImpl(SUBJECT.getUserId())); } @Test public void shouldGetCurrentProfile() throws Exception { final Response response = given().auth() .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD) .when() .get(SECURE_PATH + "/profile"); assertEquals(response.getStatusCode(), 200); final ProfileDto profileDto = unwrapDto(response, ProfileDto.class); assertEquals(profileDto.getUserId(), SUBJECT.getUserId()); } @Test public void shouldGetProfileById() throws Exception { final Response response = given().auth() .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD) .when() .get(SECURE_PATH + "/profile/" + SUBJECT.getUserId()); assertEquals(response.getStatusCode(), 200); final ProfileDto profileDto = unwrapDto(response, ProfileDto.class); assertEquals(profileDto.getUserId(), SUBJECT.getUserId()); } @Test public void shouldBeAbleToUpdateCurrentProfileAttributes() throws Exception { final ImmutableMap<String, String> attributes = ImmutableMap.of("attr1", "value1", "attr2", "value2", "attr3", "value3"); final Response response = given().auth() .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD) .when() .contentType("application/json") .body(attributes) .put(SECURE_PATH + "/profile/attributes"); assertEquals(response.getStatusCode(), 200); verify(profileManager).update(profileCaptor.capture()); final Profile profile = profileCaptor.getValue(); assertEquals(profile.getAttributes(), attributes); } @Test public void shouldNotUpdateCurrentProfileAttributesIfNothingSent() throws Exception { final Response response = given().auth() .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD) .when() .contentType("application/json") .put(SECURE_PATH + "/profile/attributes"); assertEquals(response.getStatusCode(), 400); } @Test public void shouldBeAbleToUpdateAttributesOfSpecifiedProfile() throws Exception { final ImmutableMap<String, String> attributes = ImmutableMap.of("attr1", "value1", "attr2", "value2", "attr3", "value3"); final Response response = given().auth() .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD) .when() .contentType("application/json") .body(attributes) .put(SECURE_PATH + "/profile/" + SUBJECT.getUserId() + "/attributes/"); assertEquals(response.getStatusCode(), 200); verify(profileManager).update(profileCaptor.capture()); final Profile profile = profileCaptor.getValue(); assertEquals(profile.getAttributes(), attributes); } @Test public void shouldNotUpdateSpecifiedProfileAttributesIfNothingSent() throws Exception { final Response response = given().auth() .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD) .when() .contentType("application/json") .put(SECURE_PATH + "/profile/" + SUBJECT.getUserId() + "/attributes/"); assertEquals(response.getStatusCode(), 400); } @Test public void shouldBeAbleToRemoveSpecifiedAttributes() throws Exception { when(profileManager.getById(SUBJECT.getUserId())) .thenReturn(new ProfileImpl(SUBJECT.getUserId(), ImmutableMap.of("attr1", "value1", "attr2", "value2", "attr3", "value3"))); final Response response = given().auth() .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD) .when() .contentType("application/json") .body(asList("attr1", "attr3")) .delete(SECURE_PATH + "/profile/attributes"); assertEquals(response.getStatusCode(), 204); verify(profileManager).update(profileCaptor.capture()); final Profile profile = profileCaptor.getValue(); assertEquals(profile.getAttributes(), ImmutableMap.of("attr2", "value2")); } @Test public void shouldRemoveAllAttributeIfNoSpecified() throws Exception { when(profileManager.getById(SUBJECT.getUserId())) .thenReturn(new ProfileImpl(SUBJECT.getUserId(), ImmutableMap.of("attr1", "value1", "attr2", "value2", "attr3", "value3"))); final Response response = given().auth() .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD) .when() .contentType("application/json") .delete(SECURE_PATH + "/profile/attributes"); assertEquals(response.getStatusCode(), 204); verify(profileManager).update(profileCaptor.capture()); final Profile profile = profileCaptor.getValue(); assertTrue(profile.getAttributes().isEmpty()); } @Filter public static class EnvironmentFilter implements RequestFilter { public void doFilter(GenericContainerRequest request) { EnvironmentContext.getCurrent().setSubject(SUBJECT); } } private static <T> T unwrapDto(Response response, Class<T> dtoClass) { return DtoFactory.getInstance().createDtoFromJson(response.body().print(), dtoClass); } }