/**
* Copyright (C) 2015 Orange
* 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 com.francetelecom.clara.cloud.core.service;
import com.francetelecom.clara.cloud.TestHelper;
import com.francetelecom.clara.cloud.commons.AuthorizationException;
import com.francetelecom.clara.cloud.commons.BusinessException;
import com.francetelecom.clara.cloud.core.service.exception.ApplicationReleaseNotFoundException;
import com.francetelecom.clara.cloud.core.service.exception.EnvironmentNotFoundException;
import com.francetelecom.clara.cloud.core.service.exception.ObjectNotFoundException;
import com.francetelecom.clara.cloud.coremodel.*;
import com.francetelecom.clara.cloud.environment.impl.EnvironmentMapper;
import com.francetelecom.clara.cloud.environment.impl.ManageEnvironmentImpl;
import com.francetelecom.clara.cloud.environment.impl.ManageEnvironmentImplUtils;
import com.francetelecom.clara.cloud.model.*;
import com.francetelecom.clara.cloud.paas.activation.ManagePaasActivation;
import com.francetelecom.clara.cloud.paas.activation.TaskStatusActivation;
import com.francetelecom.clara.cloud.paas.projection.UnsupportedProjectionException;
import com.francetelecom.clara.cloud.services.dto.EnvironmentDetailsDto;
import com.francetelecom.clara.cloud.services.dto.EnvironmentDto;
import com.francetelecom.clara.cloud.services.dto.EnvironmentDto.EnvironmentStatusEnum;
import com.francetelecom.clara.cloud.services.dto.EnvironmentDto.EnvironmentTypeEnum;
import org.junit.*;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.MalformedURLException;
import java.util.Date;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyListOf;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
/**
* Test Business implementation for ManageEnvironment component
*
* @author lzxv3002
*/
@RunWith(MockitoJUnitRunner.class)
public class ManageEnvironmentImplTest {
private static final PaasUser JOHN_LENNON = new PaasUser("john", "Lennon", new SSOId("john123"), "john@orange.com");
protected static Logger LOG = LoggerFactory.getLogger(ManageEnvironmentImplTest.class);
@Spy
SecurityUtils securityUtils;
@Spy
SecurityContextUtilImpl securityContextUtil;
@Spy
EnvironmentMapper environmentMapper;
@InjectMocks
ManageEnvironmentImpl manageEnvironment = new ManageEnvironmentImpl();
@Mock
ManageEnvironmentImplUtils manageEnvironmentImplUtilsMock;
@Mock
ManagePaasActivation managePaasActivationMock;
@Mock
TechnicalDeploymentRepository technicalDeploymentRepository;
@Mock
EnvironmentRepository environnementRepository;
@Mock
ApplicationReleaseRepository releaseRepository;
Environment environment;
private final String generatedEnvUid = "generatedEnvUid";
private final String environmentName = "environmentName";
private ApplicationRelease release;
@Before
public void setup() throws ObjectNotFoundException, MalformedURLException, UnsupportedProjectionException {
Application app = new Application("app", "basicat");
release = new ApplicationRelease(app, "1.1");
TechnicalDeploymentTestFactory technicalDeploymentTestFactory = new TechnicalDeploymentTestFactory();
TechnicalDeployment td = technicalDeploymentTestFactory.createWicketJpaTD("foo", "foo.groupid:foo.artifactid:foo.version");
td.setLogicalModelId("td");
TechnicalDeploymentTemplate tdt = new TechnicalDeploymentTemplate(td, DeploymentProfileEnum.DEVELOPMENT, "releaseId", MiddlewareProfile.DEFAULT_PROFILE);
TechnicalDeploymentInstance tdi = new TechnicalDeploymentInstance(tdt, td);
// create jonas
// create db
// create apache
environment = new Environment(DeploymentProfileEnum.DEVELOPMENT, "My env", release, JOHN_LENNON, tdi);
when(environnementRepository.findOne(Mockito.anyInt())).thenReturn(environment);
when(environnementRepository.findByUid(Mockito.matches(environment.getUID()))).thenReturn(environment);
when(manageEnvironmentImplUtilsMock.createTDI(anyString(), any(DeploymentProfileEnum.class), anyString(), anyString(), anyListOf(String.class))).thenReturn(
generatedEnvUid);
when(managePaasActivationMock.activate(anyInt())).thenReturn(new TaskStatusActivation());
when(releaseRepository.findByUID(release.getUID())).thenReturn(release);
securityUtils.setSecurityContextUtil(securityContextUtil);
environmentMapper.setSecurityUtils(securityUtils);
}
@After
public void teardown() {
// logout
TestHelper.logout();
}
@Test
public void testEnvironmentDto() throws EnvironmentNotFoundException {
TestHelper.loginAsAdmin();
EnvironmentDto dto = manageEnvironment.findEnvironmentByUID(environment.getUID());
Assert.assertEquals(environment.getUID(), dto.getUid());
Assert.assertEquals(environment.getLabel(), dto.getLabel());
Assert.assertEquals(EnvironmentTypeEnum.DEVELOPMENT, dto.getType());
Assert.assertEquals(EnvironmentStatusEnum.CREATING, dto.getStatus());
Assert.assertEquals("john123", dto.getOwnerId()); // SSOID
}
@Test(expected = EnvironmentNotFoundException.class)
public void fail_to_find_unknown_environment() throws EnvironmentNotFoundException {
TestHelper.loginAsAdmin();
Mockito.when(environnementRepository.findByUid(environment.getUID())).thenReturn(null);
manageEnvironment.findEnvironmentByUID(environment.getUID());
}
@Test(expected = ApplicationReleaseNotFoundException.class)
public void fail_to_find_environments_by_unknown_release() throws ApplicationReleaseNotFoundException {
TestHelper.loginAsAdmin();
Mockito.when(releaseRepository.findByUID(release.getUID())).thenReturn(null);
manageEnvironment.findEnvironmentsByAppRelease(release.getUID());
}
@Test
public void non_admin_user_should_see_details_of_environment_of_public_application_he_is_not_a_member_of() throws EnvironmentNotFoundException {
TestHelper.loginAsUser();
Mockito.when(environnementRepository.findByUid(environment.getUID())).thenReturn(environment);
manageEnvironment.findEnvironmentByUID(environment.getUID());
}
@Test(expected = AuthorizationException.class)
@Ignore
public void non_admin_user_fails_to_see_details_of_environment_of_private_application_he_is_not_a_member_of() throws EnvironmentNotFoundException {
TestHelper.loginAsUser();
Mockito.when(environnementRepository.findByUid(environment.getUID())).thenReturn(environment);
manageEnvironment.findEnvironmentByUID(environment.getUID());
}
@Test
@Ignore
public void non_admin_user_should_see_ops_details_of_environment_of_public_application_he_is_not_a_member_of() throws EnvironmentNotFoundException {
TestHelper.loginAsUser();
Mockito.when(environnementRepository.findByUid(environment.getUID())).thenReturn(environment);
manageEnvironment.findEnvironmentOpsDetailsByUID(environment.getUID());
}
@Test(expected = AuthorizationException.class)
@Ignore
public void non_admin_user_fails_to_see_ops_details_of_environment_of_private_application_he_is_not_a_member_of() throws EnvironmentNotFoundException {
TestHelper.loginAsUser();
Mockito.when(environnementRepository.findByUid(environment.getUID())).thenReturn(environment);
manageEnvironment.findEnvironmentOpsDetailsByUID(environment.getUID());
}
@Test
public void admin_user_should_update_environment_comment() {
TestHelper.loginAsAdmin();
EnvironmentDetailsDto environmentDetailsDto = new EnvironmentDetailsDto(environment.getUID(), environment.getInternalName(), "label", "applicationLabel",
"releaseUid", "releaseVersion", "ownerId", "ownerName", new Date(), EnvironmentTypeEnum.DEVELOPMENT,
EnvironmentStatusEnum.CREATED, "statusMessage", 100, "comment", "tdiTdName");
Environment updated = manageEnvironment.update(environmentDetailsDto);
Assert.assertEquals(updated.getComment(), "comment");
}
@Test(expected = AuthorizationException.class)
public void non_admin_user_fails_to_update_environment_comment() {
TestHelper.loginAsUser();
EnvironmentDetailsDto environmentDetailsDto = new EnvironmentDetailsDto(environment.getUID(), environment.getInternalName(), "label", "applicationLabel",
"releaseUid", "releaseVersion", "ownerId", "ownerName", new Date(), EnvironmentTypeEnum.DEVELOPMENT,
EnvironmentStatusEnum.CREATED, "statusMessage", 100, "comment", "tdiTdName");
Environment updated = manageEnvironment.update(environmentDetailsDto);
Assert.assertEquals(updated.getComment(), "comment");
}
private Environment createEnvMock() {
TechnicalDeployment td = new TechnicalDeployment("tdTest");
TechnicalDeploymentInstance envTdiStub = new TechnicalDeploymentInstance(new TechnicalDeploymentTemplate(td, DeploymentProfileEnum.DEVELOPMENT, "releaseId", MiddlewareProfile.DEFAULT_PROFILE), td);
envTdiStub.setName(environmentName);
Environment justCreatedEnvMock = mock(Environment.class);
when(justCreatedEnvMock.getTechnicalDeploymentInstance()).thenReturn(envTdiStub);
when(justCreatedEnvMock.getUID()).thenReturn(generatedEnvUid);
when(environnementRepository.findByUid(generatedEnvUid)).thenReturn(justCreatedEnvMock);
return justCreatedEnvMock;
}
@Test(expected = UnsupportedProjectionException.class)
public void shouldFailToCreateEnvironmentWhenProjectionIsNotSupported() throws BusinessException {
ManageEnvironmentImpl manageEnvironment = new ManageEnvironmentImpl();
manageEnvironment.setEnvironmentRepository(environnementRepository);
manageEnvironment.setUtils(manageEnvironmentImplUtilsMock);
// Given tdi cannot be created due to projection error
doThrow(new UnsupportedProjectionException()).when(manageEnvironmentImplUtilsMock).createTDI("releaseUid", DeploymentProfileEnum.DEVELOPMENT,
"ownerSsoId", "label", null);
// When I create environment of type development with label for release
// releaseUid for owner ownerSsoId,
manageEnvironment.createEnvironment("releaseUid", EnvironmentTypeEnum.DEVELOPMENT, "ownerSsoId", "label");
}
@Test(expected = RuntimeException.class)
public void testCreateEnvironment_rejectsNullReleaseId_arg() throws BusinessException {
// complete setup
createEnvMock();
// run test
manageEnvironment.createEnvironment(null, EnvironmentTypeEnum.DEVELOPMENT, "user", "label");
}
@Test
public void testCreateEnvironment_development_is_mapped_to_development() throws BusinessException {
// complete setup
createEnvMock();
// run test
manageEnvironment.createEnvironment("aRelease", EnvironmentTypeEnum.DEVELOPMENT, "user", "label");
// assert
verify(manageEnvironmentImplUtilsMock).createTDI(anyString(), eq(DeploymentProfileEnum.DEVELOPMENT), anyString(), anyString(), anyListOf(String.class));
}
@Test
public void testCreateEnvironment_production_is_mapped_to_production() throws BusinessException {
// complete setup
createEnvMock();
// run test
manageEnvironment.createEnvironment("aRelease", EnvironmentTypeEnum.PRODUCTION, "user", "label");
// assert
verify(manageEnvironmentImplUtilsMock).createTDI(anyString(), eq(DeploymentProfileEnum.PRODUCTION), anyString(), anyString(), anyListOf(String.class));
}
@Test
public void testCreateEnvironment_preprod_is_mapped_to_production() throws BusinessException {
// complete setup
createEnvMock();
// run test
manageEnvironment.createEnvironment("aRelease", EnvironmentTypeEnum.PRE_PROD, "user", "label");
// assert
verify(manageEnvironmentImplUtilsMock).createTDI(anyString(), eq(DeploymentProfileEnum.PRODUCTION), anyString(), anyString(), anyListOf(String.class));
}
@Test
public void testCreateEnvironment_test_is_mapped_to_production() throws BusinessException {
// complete setup
createEnvMock();
// run test
manageEnvironment.createEnvironment("aRelease", EnvironmentTypeEnum.TEST, "user", "label");
// assert
verify(manageEnvironmentImplUtilsMock).createTDI(anyString(), eq(DeploymentProfileEnum.PRODUCTION), anyString(), anyString(), anyListOf(String.class));
}
@Test
public void testCreateEnvironment_loadtest_is_mapped_to_production() throws BusinessException {
// complete setup
createEnvMock();
// run test
manageEnvironment.createEnvironment("aRelease", EnvironmentTypeEnum.LOAD_TEST, "user", "label");
// assert
verify(manageEnvironmentImplUtilsMock).createTDI(anyString(), eq(DeploymentProfileEnum.PRODUCTION), anyString(), anyString(), anyListOf(String.class));
}
@Test
public void admin_users_see_all_environments() {
TestHelper.loginAsAdmin();
manageEnvironment.findEnvironments();
Mockito.verify(environnementRepository).findAllActive();
}
@Test
public void admin_users_see_all_environments_of_a_given_release() throws ApplicationReleaseNotFoundException {
TestHelper.loginAsAdmin();
manageEnvironment.findEnvironmentsByAppRelease(release.getUID());
Mockito.verify(environnementRepository).findAllActiveByApplicationReleaseUid(release.getUID());
}
@Test
public void non_admin_users_see_environments_he_is_member_of() {
// given Bob is authenticated
TestHelper.loginAsUser();
manageEnvironment.findEnvironments();
Mockito.verify(environnementRepository).findAllPublicOrPrivateByMember(TestHelper.USER_WITH_USER_ROLE_SSOID.getValue());
}
@Test
public void non_admin_users_see_all_environments_of_a_given_release() throws ApplicationReleaseNotFoundException {
TestHelper.loginAsUser();
manageEnvironment.findEnvironmentsByAppRelease(release.getUID());
Mockito.verify(environnementRepository).findAllPublicOrPrivateByMemberAndByApplicationRelease(release.getUID(), TestHelper.USER_WITH_USER_ROLE_SSOID.getValue());
}
@Test
public void admin_users_see_its_environments() {
TestHelper.loginAsAdmin();
manageEnvironment.findMyEnvironments();
Mockito.verify(environnementRepository).findAllActiveByApplicationMember(TestHelper.USER_WITH_ADMIN_ROLE_SSOID.getValue());
}
@Test
public void non_admin_users_see_its_environments() {
// given Bob is authenticated
TestHelper.loginAsUser();
manageEnvironment.findMyEnvironments();
Mockito.verify(environnementRepository).findAllActiveByApplicationMember(TestHelper.USER_WITH_USER_ROLE_SSOID.getValue());
}
@Test
public void admin_users_count_all_environments() {
TestHelper.loginAsAdmin();
manageEnvironment.countEnvironments();
Mockito.verify(environnementRepository).countActive();
}
@Test
public void non_admin_users_count_environments_he_is_member_of() {
// given Bob is authenticated
TestHelper.loginAsUser();
manageEnvironment.countEnvironments();
Mockito.verify(environnementRepository).countPublicOrPrivateByMember(TestHelper.USER_WITH_USER_ROLE_SSOID.getValue());
}
@Test
public void admin_users_count_its_environments() {
TestHelper.loginAsAdmin();
manageEnvironment.countMyEnvironments();
Mockito.verify(environnementRepository).countActiveByApplicationMember(TestHelper.USER_WITH_ADMIN_ROLE_SSOID.getValue());
}
@Test
public void non_admin_users_count_its_environments() {
TestHelper.loginAsUser();
manageEnvironment.countMyEnvironments();
Mockito.verify(environnementRepository).countActiveByApplicationMember(TestHelper.USER_WITH_USER_ROLE_SSOID.getValue());
}
@Test
public void admin_users_count_environments_of_a_release() throws ApplicationReleaseNotFoundException {
TestHelper.loginAsAdmin();
Mockito.when(releaseRepository.findByUID("uid")).thenReturn(release);
manageEnvironment.countEnvironmentsByApplicationRelease("uid");
Mockito.verify(environnementRepository).countActiveByApplicationReleaseUid("uid");
}
@Test
public void non_admin_users_count_environments_of_a_release() throws ApplicationReleaseNotFoundException {
TestHelper.loginAsUser();
Mockito.when(releaseRepository.findByUID("uid")).thenReturn(release);
manageEnvironment.countEnvironmentsByApplicationRelease("uid");
Mockito.verify(environnementRepository).countAllPublicOrPrivateByMemberAndByApplicationRelease("uid", TestHelper.USER_WITH_USER_ROLE_SSOID.getValue());
}
}