/**
* 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.coremodel;
import org.apache.commons.lang3.StringUtils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import static com.francetelecom.clara.cloud.coremodel.ApplicationSpecifications.*;
import static org.fest.assertions.Assertions.assertThat;
import static org.springframework.data.jpa.domain.Specifications.where;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/com/francetelecom/clara/cloud/coremodel/application-context.xml" })
@TransactionConfiguration(defaultRollback = true)
@DirtiesContext(classMode= DirtiesContext.ClassMode.AFTER_CLASS)
public class ApplicationRepositoryTest {
@Autowired
private ApplicationRepository applicationRepository;
@Test
@Transactional
public void shouldPersistApplication() {
// test setup
Application toBePersited = new Application("application-test-1", "code1");
// test run
applicationRepository.save(toBePersited);
// assertions
Assert.assertNotNull("entity does not exist", applicationRepository.findOne(toBePersited.getId()));
applicationRepository.flush();
}
@Test
@Transactional
public void shouldPersistPrivateApplication() {
// test setup
Application application = new Application("application-test-1", "code1");
HashSet<SSOId> members = new HashSet<>();
members.add(new SSOId("bob123"));
members.add(new SSOId("alice123"));
application.setAsPrivate();
application.setMembers(members);
// test run
applicationRepository.save(application);
// assertions
Assert.assertNotNull("entity does not exist", applicationRepository.findOne(application.getId()));
applicationRepository.flush();
}
@Test
@Transactional
public void shouldRemoveApplication() {
// test setup
Application toBePersited = new Application("application-test-1", "code1");
applicationRepository.save(toBePersited);
Assert.assertNotNull("entity does not exist", applicationRepository.findOne(toBePersited.getId()));
// test run
applicationRepository.delete(toBePersited);
// assertions
Assert.assertNull("entity should not exist", applicationRepository.findOne(toBePersited.getId()));
applicationRepository.flush();
}
@Test
@Transactional
public void shouldFindApplicationByLabel() {
// given an removed application with label aLabel and code aCode
Application application1 = new Application("aLabel", "aCode");
application1.markAsRemoved();
applicationRepository.save(application1);
// given an application with label aLabel and code aCode
Application application2 = new Application("aLabel", "aCode");
applicationRepository.save(application2);
// when I find application with label aLabel
Application result = applicationRepository.findOne(where(isActive()).and(hasLabel("aLabel")));
// then I should get application with label aLabel and code aCode
Assert.assertEquals(application2, result);
}
@Test
@Transactional
public void shouldFailToFindApplicationByUnknownLabel() {
// when I find application with label unknown
Application result = applicationRepository.findOne(hasCode("unknown"));
// then I should get no application
Assert.assertNull(result);
}
@Test
@Transactional
public void shouldFindApplicationByCode() {
// given an removed application with label aLabel and code aCode
Application application1 = new Application("aLabel", "aCode");
application1.markAsRemoved();
applicationRepository.save(application1);
// given an existing application with label aLabel and code aCode
Application application2 = new Application("aLabel", "aCode");
applicationRepository.save(application2);
// when I find application with code aCode
Application result = applicationRepository.findOne(where(isActive()).and(hasCode("aCode")));
// then I should get application with label aLabel and code aCode
Assert.assertEquals(application2, result);
}
@Test
@Transactional
public void shouldFailToFindApplicationByUnknownCode() {
// when I find application with label unknown
Application result = applicationRepository.findOne(hasCode("unknown"));
// then I should get no application
Assert.assertNull(result);
}
@Test
@Transactional
public void shouldFindApplicationByUID() {
// given an existing application with label aLabel and code aCode
Application application = new Application("alabel", "aCode");
applicationRepository.save(application);
applicationRepository.flush();
// when I find this application by its uid
Application result = applicationRepository.findByUid(application.getUID());
// then I should get application with label aLabel and code aCode
Assert.assertEquals(application, result);
}
@Test
@Transactional
public void shouldFailToFindApplicationByUnknownUID() {
// when I find application with uid unknown
Application result = applicationRepository.findByUid("unknown");
// then I should get no application
Assert.assertNull(result);
}
@Test
@Transactional
public void should_only_find_active_applications() {
// given an existing application with label aLabel and code aCode
Application application1 = new Application("aLabel", "aCode");
// given a removed application with label anotherLabel and code
// anotherCode
Application application2 = new Application("anotherLabel", "anotherCode");
application2.markAsRemoved();
// given an existing application with label anotherLabel and code
// anotherCode
Application application3 = new Application("anotherLabel", "anotherCode");
applicationRepository.save(application1);
applicationRepository.save(application2);
applicationRepository.save(application3);
// when I find all active applications
Collection<Application> result = applicationRepository.findAll(isActive());
// then I should get 2 applications
Assert.assertEquals("there should be 2 entities", 2, result.size());
applicationRepository.flush();
}
@Test
@Transactional
public void should_only_count_active_applications() {
// given an existing application with label aLabel and code aCode
Application application1 = new Application("aLabel", "aCode");
// given a removed application with label anotherLabel and code
// anotherCode
Application application2 = new Application("anotherLabel", "anotherCode");
application2.markAsRemoved();
// given an existing application with label anotherLabel and code
// anotherCode
Application application3 = new Application("anotherLabel", "anotherCode");
applicationRepository.save(application1);
applicationRepository.save(application2);
applicationRepository.save(application3);
// when I find all active applications
long result = applicationRepository.count(isActive());
// then I should get 2 applications
Assert.assertEquals("there should be 2 entities", 2, result);
applicationRepository.flush();
}
@Test
@Transactional
public void should_count_active_private_application_for_given_member() {
// given joyn private application
Application joyn = new Application("joyn", "joyn");
HashSet<SSOId> joynMembers = new HashSet<>();
joynMembers.add(new SSOId("bob123"));
joynMembers.add(new SSOId("alice123"));
joyn.setAsPrivate();
joyn.setMembers(joynMembers);
applicationRepository.save(joyn);
// given myOrange private application
Application myOrange = new Application("myOrange", "myOrange");
HashSet<SSOId> myOrangeMembers = new HashSet<>();
myOrangeMembers.add(new SSOId("bob123"));
myOrange.setAsPrivate();
myOrange.setMembers(myOrangeMembers);
applicationRepository.save(myOrange);
// given elpaaso public application
Application elpaaso = new Application("elpaaso", "elpaaso");
applicationRepository.save(elpaaso);
// assertions
// when I count all active applications
Assert.assertEquals("there should be 0 entities", 0, applicationRepository.count(where(isActive()).and(hasForMember(new SSOId("jdalton")))));
Assert.assertEquals("there should be 1 entities", 1, applicationRepository.count(where(isActive()).and(hasForMember(new SSOId("alice123")))));
Assert.assertEquals("there should be 2 entities", 2, applicationRepository.count(where(isActive()).and(hasForMember(new SSOId("bob123")))));
}
@Test
@Transactional
public void should_find_accessible_applications_for_given_member() {
// given joyn private application
Application joyn = new Application("joyn", "joyn");
HashSet<SSOId> joynMembers = new HashSet<>();
joynMembers.add(new SSOId("bob123"));
joynMembers.add(new SSOId("alice123"));
joyn.setAsPrivate();
joyn.setMembers(joynMembers);
applicationRepository.save(joyn);
// given myOrange private application
Application myOrange = new Application("myOrange", "myOrange");
HashSet<SSOId> myOrangeMembers = new HashSet<>();
myOrangeMembers.add(new SSOId("bob123"));
myOrange.setAsPrivate();
myOrange.setMembers(myOrangeMembers);
applicationRepository.save(myOrange);
// given elpaaso public application
Application elpaaso = new Application("elpaaso", "elpaaso");
applicationRepository.save(elpaaso);
// assertions
// when I find all active applications
Assert.assertEquals("there should be 1 entities", 1, applicationRepository.count(where(isActive()).and(isPublicOrHasForMember(new SSOId("jdalton")))));
Assert.assertEquals("there should be 2 entities", 2, applicationRepository.count(where(isActive()).and(isPublicOrHasForMember(new SSOId("alice123")))));
Assert.assertEquals("there should be 3 entities", 3, applicationRepository.count(where(isActive()).and(isPublicOrHasForMember(new SSOId("bob123")))));
}
@Test
@Transactional
public void should_find_ordered_active_applications_for_given_member() throws Exception {
// given joyn application
Application joyn = new Application("joyn", "joyn");
HashSet<SSOId> joynMembers = new HashSet<>();
joynMembers.add(new SSOId("bob123"));
joynMembers.add(new SSOId("alice123"));
joyn.setAsPrivate();
joyn.setMembers(joynMembers);
applicationRepository.save(joyn);
// given myOrange application
Application myOrange = new Application("myOrange", "myOrange");
HashSet<SSOId> myOrangeMembers = new HashSet<>();
myOrangeMembers.add(new SSOId("bob123"));
myOrange.setAsPrivate();
myOrange.setMembers(myOrangeMembers);
applicationRepository.save(myOrange);
// given elpaaso public application
Application elpaaso = new Application("elpaaso", "elpaaso");
applicationRepository.save(elpaaso);
// assertions
// when I find all active applications
Assert.assertEquals("there should be 0 entities", 0, applicationRepository.count(where(isActive()).and(hasForMember(new SSOId("jdalton")))));
Assert.assertEquals("there should be 1 entities", 1, applicationRepository.count(where(isActive()).and(hasForMember(new SSOId("alice123")))));
Assert.assertEquals("there should be 2 entities", 2, applicationRepository.count(where(isActive()).and(hasForMember(new SSOId("bob123")))));
}
@Test
public void application_with_config_role_should_be_valid() {
// Given
Application application = new Application("application label","Application code");
ConfigRole configRole = new ConfigRole("myapp");
configRole.setLastModificationComment("Modified by Guillaume.");
configRole.setValues(Arrays.asList(new ConfigValue("myconfigset", "mykey", "myvalue", "update mykey to its new value")));
application.addConfigRole(configRole);
// When
applicationRepository.save(application);
Application retrievedApplication = applicationRepository.findOne(application.getId());
// Then
assertThat(retrievedApplication.getCode()).isEqualTo(application.getCode());
assertThat(retrievedApplication.getLabel()).isEqualTo(application.getLabel());
assertThat(retrievedApplication.isPublic()).isEqualTo(application.isPublic());
}
@Test
@Transactional
public void application_with_valid_large_config_role_should_properly_persist() {
// Given
Application application = new Application("application label","Application code");
ConfigRole configRole = new ConfigRole("myapp");
configRole.setLastModificationComment("Modified by Guillaume.");
String long300CharsComment= StringUtils.leftPad("comment", 300, 'X');
configRole.setValues(Arrays.asList(new ConfigValue("myconfigset", "mykey", "myvalue", long300CharsComment)));
application.addConfigRole(configRole);
// When
applicationRepository.save(application);
Application retrievedApplication = applicationRepository.findOne(application.getId());
// Then
List<ConfigRole> reloadedConfigRoles = retrievedApplication.listConfigRoles();
assertThat(reloadedConfigRoles.size()).isEqualTo(1);
ConfigRole reloadedConfigRole = reloadedConfigRoles.get(0);
List<ConfigValue> reloadedConfigValues = reloadedConfigRole.listValues();
assertThat(reloadedConfigValues.size()).isEqualTo(1);
ConfigValue reloadedConfigValue = reloadedConfigValues.get(0);
assertThat(reloadedConfigValue.getConfigSet()).isEqualTo("myconfigset");
assertThat(reloadedConfigValue.getKey()).isEqualTo("mykey");
assertThat(reloadedConfigValue.getValue()).isEqualTo("myvalue");
assertThat(reloadedConfigValue.getComment()).isEqualTo(long300CharsComment);
}
}