package jj.resource;
import static org.hamcrest.Matchers.instanceOf;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.*;
import static org.mockito.BDDMockito.*;
import static jj.application.AppLocation.*;
import static jj.server.ServerLocation.*;
import jj.event.Publisher;
import jj.execution.CurrentTask;
import jj.http.server.resource.StaticResource;
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 ResourceFinderImplTest {
private final String name1 = "index.html";
private final String name2 = "output.html";
private @Mock ResourceCache resourceCache;
private @Mock Publisher publisher;
private @Mock CurrentTask currentTask;
private ResourceIdentifierMaker resourceIdentifierMaker = new MockResourceIdentifierMaker();
private ResourceFinderImpl rfi;
private @Mock SimpleResourceCreator<StaticResource, Void> staticResourceCreator;
private @Mock SimpleResourceCreator<Sha1Resource, Sha1ResourceTarget> sha1ResourceCreator;
private @Captor ArgumentCaptor<ResourceEvent> eventCaptor;
private @Mock StaticResource staticResource1;
private ResourceIdentifier<StaticResource, Void> sr1Key = resourceIdentifierMaker.make(StaticResource.class, Public, name1);
private @Mock StaticResource staticResource2;
private ResourceIdentifier<StaticResource, Void> sr2Key = resourceIdentifierMaker.make(StaticResource.class, Private, name2);
private @Mock Sha1Resource sha1Resource1;
private Sha1ResourceTarget sha1Target1;
private ResourceIdentifier<Sha1Resource, Sha1ResourceTarget> sh1Key;
private @Mock Sha1Resource sha1Resource2;
private Sha1ResourceTarget sha1Target2;
private ResourceIdentifier<Sha1Resource, Sha1ResourceTarget> sh2Key;
private @Mock ResourceTask task;
@SuppressWarnings("unchecked")
@Before
public void before() {
rfi = new ResourceFinderImpl(resourceCache, publisher, currentTask, resourceIdentifierMaker);
sha1Target1 = new Sha1ResourceTarget(staticResource1);
sh1Key = resourceIdentifierMaker.make(Sha1Resource.class, AppBase, name1, sha1Target1);
sha1Target2 = new Sha1ResourceTarget(staticResource2);
sh2Key = resourceIdentifierMaker.make(Sha1Resource.class, AppBase, name2, sha1Target2);
given((ResourceIdentifier<StaticResource, Void>)staticResource1.identifier()).willReturn(sr1Key);
given((ResourceIdentifier<StaticResource, Void>)staticResource2.identifier()).willReturn(sr2Key);
given((ResourceIdentifier<Sha1Resource, Sha1ResourceTarget>)sha1Resource1.identifier()).willReturn(sh1Key);
given((ResourceIdentifier<Sha1Resource, Sha1ResourceTarget>)sha1Resource2.identifier()).willReturn(sh2Key);
}
@Test
public void testFindResource() throws Exception {
given(resourceCache.get(sr1Key)).willReturn(staticResource1);
given(resourceCache.get(sh1Key)).willReturn(sha1Resource1);
assertThat(rfi.findResource(StaticResource.class, Public, name1), is(staticResource1));
assertThat(rfi.findResource(StaticResource.class, Public, name2), is(nullValue()));
assertThat(rfi.findResource(Sha1Resource.class, AppBase, name1, sha1Target1), is(sha1Resource1));
assertThat(rfi.findResource(Sha1Resource.class, AppBase, name1, sha1Target2), is(nullValue()));
assertThat(rfi.findResource(sr1Key), is(staticResource1));
assertThat(rfi.findResource(sr2Key), is(nullValue()));
assertThat(rfi.findResource(sh1Key), is(sha1Resource1));
assertThat(rfi.findResource(sh2Key), is(nullValue()));
}
@Test
public void testFindResourceWithBundle() throws Exception {
given(resourceCache.get(sr1Key)).willReturn(staticResource1);
given(resourceCache.get(sr2Key)).willReturn(staticResource2);
StaticResource sr = rfi.findResource(
StaticResource.class,
Public.and(Private).and(Assets),
name1
);
assertThat(sr, is(staticResource1));
sr = rfi.findResource(
StaticResource.class,
Public.and(Private).and(Assets),
name2
);
assertThat(sr, is(staticResource2));
}
@Test
public void testLoadResourceHappyPath() throws Exception {
given(resourceCache.getCreator(StaticResource.class)).willReturn(staticResourceCreator);
given(staticResourceCreator.type()).willReturn(StaticResource.class);
given(staticResourceCreator.create(AppBase, name1, null)).willReturn(staticResource2);
given(resourceCache.getCreator(Sha1Resource.class)).willReturn(sha1ResourceCreator);
given(sha1ResourceCreator.type()).willReturn(Sha1Resource.class);
given(sha1ResourceCreator.create(AppBase, name2, null)).willReturn(sha1Resource1);
given(currentTask.currentIs(ResourceTask.class)).willReturn(true);
given(currentTask.currentAs(ResourceTask.class)).willReturn(task);
rfi.loadResource(StaticResource.class, AppBase, name1);
rfi.loadResource(Sha1Resource.class, AppBase, name2, null);
verify(resourceCache).putIfAbsent(staticResource2);
verify(resourceCache).putIfAbsent(sha1Resource1);
verify(publisher, times(2)).publish(eventCaptor.capture());
for (ResourceEvent event : eventCaptor.getAllValues()) {
assertThat(event, is(instanceOf(ResourceLoaded.class)));
// TODO fix these details
}
}
}