/*
* Copyright 2012 Jason Miller
*
* 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 jj.resource;
import static jj.server.ServerLocation.Virtual;
import static org.junit.Assert.*;
import static org.mockito.Mockito.any;
import static org.mockito.BDDMockito.*;
import static org.hamcrest.Matchers.*;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Clock;
import java.util.Date;
import com.google.inject.*;
import jj.application.Application;
import jj.event.MockPublisher;
import jj.event.Publisher;
import jj.http.server.resource.StaticResource;
import jj.util.MockClock;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class ResourceInstanceCreatorTest {
private static final Key<ResourceIdentifier<?, ?>> RESOURCE_IDENTIFIER =
Key.get(new TypeLiteral<ResourceIdentifier<?, ?>>() {});
@Mock PathResolver pathResolver;
@Mock Location location;
@Mock Injector injector;
MockPublisher publisher;
@Captor ArgumentCaptor<AbstractModule> moduleCaptor;
ResourceInstanceCreator rimc;
@Before
public void before() {
rimc = new ResourceInstanceCreator(pathResolver, injector, publisher = new MockPublisher());
given(injector.createChildInjector(any(AbstractModule.class))).willReturn(injector);
}
@Test
public void testPathCreation() {
final String name = "name";
Path path = Paths.get("/");
given(pathResolver.resolvePath(location, name)).willReturn(path);
ResourceIdentifier<StaticResource, Void> identifier =
new MockResourceIdentifierMaker().make(StaticResource.class, location, name);
rimc.createResource(identifier);
verify(pathResolver).resolvePath(location, name);
verify(injector).createChildInjector(moduleCaptor.capture());
verify(injector).getInstance(StaticResource.class);
Injector testInjector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(Application.class).toInstance(mock(Application.class)); // ugly
bind(PathResolver.class).toInstance(pathResolver);
bind(Clock.class).toInstance(new MockClock());
bind(Publisher.class).toInstance(mock(Publisher.class));
bind(ResourceFinder.class).toInstance(mock(ResourceFinder.class));
bind(ResourceConfiguration.class).toInstance(mock(ResourceConfiguration.class));
}
}, moduleCaptor.getValue());
assertThat(testInjector.getInstance(RESOURCE_IDENTIFIER), is(identifier));
assertThat(testInjector.getInstance(Path.class), is(path));
}
final String name = "name";
final Date date = new Date();
@Test
public void testVirtualCreationAndArgs() {
ResourceIdentifier<TestDateResource, Date> identifier =
new MockResourceIdentifierMaker().make(TestDateResource.class, Virtual, name, date);
rimc.createResource(identifier);
verify(injector).createChildInjector(moduleCaptor.capture());
verify(injector).getInstance(TestDateResource.class);
Injector testInjector = Guice.createInjector(moduleCaptor.getValue());
assertThat(testInjector.getInstance(RESOURCE_IDENTIFIER), is(identifier));
assertThat(testInjector.getExistingBinding(Key.get(Path.class)), is(nullValue()));
assertThat(testInjector.getInstance(Date.class), is(date));
}
@Test
public void testCreationError() {
given(injector.getInstance(TestDateResource.class)).willThrow(new RuntimeException());
ResourceIdentifier<TestDateResource, Date> identifier =
new MockResourceIdentifierMaker().make(TestDateResource.class, Virtual, name, date);
rimc.createResource(identifier);
assertThat(publisher.events.size(), is(1));
ResourceError re = (ResourceError)publisher.events.get(0);
assertThat(re.identifier, is((Object)identifier));
}
}