/**
* Copyright (c) 2013-2016, The SeedStack authors <http://seedstack.org>
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.seedstack.seed.core.internal.dependency;
import io.nuun.kernel.api.plugin.context.InitContext;
import mockit.Expectations;
import mockit.Mocked;
import org.assertj.core.api.Assertions;
import org.junit.Before;
import org.junit.Test;
import org.seedstack.coffig.Coffig;
import org.seedstack.seed.Application;
import org.seedstack.seed.SeedException;
import org.seedstack.seed.spi.ApplicationProvider;
import org.seedstack.seed.spi.DependencyProvider;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class DependencyPluginTest {
private DependencyPlugin dependencyPlugin;
@Before
public void before() {
dependencyPlugin = new DependencyPlugin();
}
@Test
public void verify_nativeUnitModule_instance() {
Object object = dependencyPlugin.nativeUnitModule();
Assertions.assertThat(object).isInstanceOf(DependencyModule.class);
}
@Test
public void nameTest() {
Assertions.assertThat(dependencyPlugin.name()).isNotNull();
}
private InitContext mockInitContextForCore(Class<?> dependencyClass) {
InitContext initContext = mock(InitContext.class);
Application application = mock(Application.class);
Map<Class<?>, Collection<Class<?>>> scannedSubTypesByParentClass = new HashMap<>();
Collection<Class<?>> providerClasses = new ArrayList<>();
if (dependencyClass != null) {
providerClasses.add(dependencyClass);
}
scannedSubTypesByParentClass.put(DependencyProvider.class, providerClasses);
when(application.getConfiguration()).thenReturn(Coffig.builder().build());
when(initContext.dependency(ApplicationProvider.class)).thenReturn(() -> application);
when(initContext.scannedSubTypesByParentClass()).thenReturn(scannedSubTypesByParentClass);
return initContext;
}
@Test
public void checkOptionalDependency(@Mocked final DependencyProvider myProvider) {
new Expectations() {
{
myProvider.getClassToCheck();
result = "java.lang.String";
}
};
InitContext initContext = mockInitContextForCore(myProvider.getClass());
dependencyPlugin.init(initContext);
Optional<?> optionalDependency = dependencyPlugin.getDependency(myProvider.getClass());
Assertions.assertThat(optionalDependency).isNotNull();
Assertions.assertThat(optionalDependency.isPresent()).isTrue();
}
@Test
public void checkOptionalDependencyNOK(@Mocked final DependencyProvider myProvider) {
new Expectations() {
{
myProvider.getClassToCheck();
result = "xxxxx";
}
};
InitContext initContext = mockInitContextForCore(myProvider.getClass());
dependencyPlugin.init(initContext);
Optional<?> optionalDependency = dependencyPlugin.getDependency(myProvider.getClass());
Assertions.assertThat(optionalDependency).isNotNull();
Assertions.assertThat(optionalDependency.isPresent()).isFalse();
}
@Test(expected = SeedException.class)
public void checkOptionalDependencyWithInstantiationError() {
InitContext initContext = mockInitContextForCore(DependencyProvider.class);
dependencyPlugin.init(initContext);
}
}