/*
* Copyright © 2017 the original authors (http://cereebro.io)
*
* 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 io.cereebro.core;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.assertj.core.api.Assertions;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import io.cereebro.core.ComponentRelationships.ComponentRelationshipsBuilder;
import nl.jqno.equalsverifier.EqualsVerifier;
import nl.jqno.equalsverifier.Warning;
/**
* {@link ComponentRelationships} unit tests.
*
* @author michaeltecourt
*/
public class ComponentRelationshipsTest {
private Component component;
private Component dependencyComponent;
private Component consumerComponent;
private Set<Dependency> dependencies;
private Set<Consumer> consumers;
@Before
public void setUp() {
component = TestHelper.componentA();
dependencyComponent = TestHelper.componentB();
consumerComponent = TestHelper.componentC();
dependencies = new HashSet<>();
dependencies.add(Dependency.on(dependencyComponent));
consumers = new HashSet<>();
consumers.add(Consumer.by(consumerComponent));
}
@Test
public void hashcodeEquals() {
EqualsVerifier.forClass(ComponentRelationships.class).usingGetClass().verify();
}
@Test
public void testToString() {
String toString = new ComponentRelationships(component, dependencies, consumers).toString();
Assert.assertTrue(toString.contains(component.getName()));
Assert.assertTrue(toString.contains(component.getType()));
}
@Test
public void allArgsConstructor() {
ComponentRelationships rels = new ComponentRelationships(component, dependencies, consumers);
Assert.assertEquals(component, rels.getComponent());
Assert.assertEquals(dependencies, rels.getDependencies());
Assert.assertEquals(consumers, rels.getConsumers());
}
@Test
public void filterDependenciesShouldReturnOnlyDependency() {
Set<Dependency> actual = ComponentRelationships
.filterDependencies(Arrays.asList(Dependency.on(dependencyComponent), Consumer.by(consumerComponent)));
Assert.assertEquals(dependencies, actual);
}
@Test
public void filterConsumersShouldReturnOnlyConsumer() {
Dependency dependencyB = Dependency.on(dependencyComponent);
Consumer consumerC = Consumer.by(consumerComponent);
Set<Consumer> expected = new HashSet<>();
expected.add(consumerC);
Set<Consumer> actual = ComponentRelationships.filterConsumers(Arrays.asList(dependencyB, consumerC));
Assert.assertEquals(expected, actual);
}
@Test
public void staticFactoryMethodUsingRelationshipsShouldReturnSameResultAsConstructor() {
Set<Dependency> dependencies = new HashSet<>();
dependencies.add(Dependency.on(dependencyComponent));
Set<Consumer> consumers = new HashSet<>();
consumers.add(Consumer.by(consumerComponent));
ComponentRelationships expected = new ComponentRelationships(component, dependencies, consumers);
ComponentRelationships actual = ComponentRelationships.of(component,
Arrays.asList(Dependency.on(dependencyComponent), Consumer.by(consumerComponent)));
Assert.assertEquals(expected, actual);
}
@Test
public void staticFactoryMethodUsingDependenciesAndConsumersShouldReturnSameResultAsConstructor() {
ComponentRelationships expected = new ComponentRelationships(component, dependencies, consumers);
ComponentRelationships actual = ComponentRelationships.of(component, dependencies, consumers);
Assert.assertEquals(expected, actual);
}
@Test
public void builderShouldReturnSameResultAsConstructor() {
ComponentRelationships expected = new ComponentRelationships(component, dependencies, consumers);
// @formatter:off
ComponentRelationships actual = ComponentRelationships.builder()
.component(component)
.dependencies(dependencies)
.consumers(consumers)
.build();
// @formatter:on
Assert.assertEquals(expected, actual);
}
@Test
public void builderAddConsumerShouldAppend() {
ComponentRelationships expected = new ComponentRelationships(component, dependencies, consumers);
// @formatter:off
ComponentRelationships actual = ComponentRelationships.builder()
.component(component)
.dependencies(dependencies)
.addConsumer(Consumer.by(consumerComponent))
.build();
// @formatter:on
Assert.assertEquals(expected, actual);
}
@Test
public void builderAddDependencyShouldAppend() {
ComponentRelationships expected = new ComponentRelationships(component, dependencies, consumers);
// @formatter:off
ComponentRelationships actual = ComponentRelationships.builder()
.component(component)
.addDependency(Dependency.on(dependencyComponent))
.consumers(consumers)
.build();
// @formatter:on
Assert.assertEquals(expected, actual);
}
@Test
public void builderAddDependenciesShouldAppendCollection() {
Dependency dep = Dependency.on(Component.of("newOne", "app"));
Set<Dependency> completeDependencies = new HashSet<Dependency>(
Arrays.asList(dep, Dependency.on(dependencyComponent)));
ComponentRelationships expected = new ComponentRelationships(component, completeDependencies, consumers);
// @formatter:off
ComponentRelationships actual = ComponentRelationships.builder()
.component(component)
.dependencies(dependencies)
.addDependencies(Arrays.asList(dep))
.consumers(consumers)
.build();
// @formatter:on
Assert.assertEquals(expected, actual);
}
@Test
public void builderAddConsumerShouldAppendCollectionWithoutDuplicated() {
Consumer newConsumer = Consumer.by(Component.of("newOne", "app"));
Set<Consumer> completeConsumers = new HashSet<Consumer>(
Arrays.asList(newConsumer, Consumer.by(consumerComponent)));
ComponentRelationships expected = new ComponentRelationships(component, dependencies, completeConsumers);
// @formatter:off
ComponentRelationships actual = ComponentRelationships.builder()
.component(component)
.dependencies(dependencies)
.consumers(consumers)
// repeat a lot
.addConsumers(Arrays.asList(newConsumer, newConsumer, Consumer.by(consumerComponent)))
.build();
// @formatter:on
Assert.assertEquals(expected, actual);
}
@Test
public void builderEquivalence() {
ComponentRelationshipsBuilder a = ComponentRelationships.builder();
ComponentRelationshipsBuilder b = ComponentRelationships.builder();
Assert.assertEquals(a, b);
Assert.assertEquals(a.component(component), b.component(component));
Assert.assertEquals(a.dependencies(dependencies), b.dependencies(dependencies));
Assert.assertEquals(a.consumers(consumers), b.consumers(consumers));
Assert.assertEquals(a.toString(), b.toString());
Assert.assertEquals(a.hashCode(), b.hashCode());
}
@Test
public void getRelationshipsShouldReturnBothConsumersAndDependencies() {
ComponentRelationships c = ComponentRelationships.builder().component(component).dependencies(dependencies)
.consumers(consumers).build();
List<Relationship> relationships = Arrays.asList(Consumer.by(consumerComponent),
Dependency.on(dependencyComponent));
HashSet<Relationship> expected = new HashSet<>(relationships);
Assert.assertEquals(expected, c.getRelationships());
}
@Test
public void builderHashcodeEquals() {
EqualsVerifier.forClass(ComponentRelationshipsBuilder.class).suppress(Warning.NONFINAL_FIELDS).usingGetClass()
.verify();
}
@Test
public void hasRelationshipsShouldReturnTrueWhenConsumerIsPresent() {
ComponentRelationships c = ComponentRelationships.builder().component(component).consumers(consumers).build();
Assertions.assertThat(c.hasRelationships()).isTrue();
}
@Test
public void hasRelationshipsShouldReturnTrueWhenDependencyIsPresent() {
ComponentRelationships c = ComponentRelationships.builder().component(component).dependencies(dependencies)
.build();
Assertions.assertThat(c.hasRelationships()).isTrue();
}
@Test
public void hasRelationshipsShouldReturnFalseWithoutRelationships() {
ComponentRelationships c = ComponentRelationships.builder().component(component).build();
Assertions.assertThat(c.hasRelationships()).isFalse();
}
}