package org.jtwig.resource; import com.google.common.base.Optional; import org.jtwig.resource.exceptions.ResourceException; import org.jtwig.resource.loader.ResourceLoader; import org.jtwig.resource.loader.TypedResourceLoader; import org.jtwig.resource.reference.ResourceReference; import org.jtwig.resource.reference.ResourceReferenceExtractor; import org.jtwig.resource.resolver.RelativeResourceResolver; import org.junit.Before; import org.junit.Test; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import static junit.framework.TestCase.assertSame; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class ResourceServiceTest { private final HashMap<String, ResourceLoader> resourceLoaderMap = new HashMap<>(); private final List<TypedResourceLoader> resourceLoaderList = new ArrayList<>(); private final ArrayList<String> absoluteResourceTypes = new ArrayList<>(); private final ArrayList<RelativeResourceResolver> relativeResourceResolvers = new ArrayList<>(); private final ResourceReferenceExtractor resourceReferenceExtractor = mock(ResourceReferenceExtractor.class); private final ResourceService underTest = new ResourceService(resourceLoaderMap, resourceLoaderList, absoluteResourceTypes, relativeResourceResolvers, resourceReferenceExtractor); @Before public void setUp() throws Exception { resourceLoaderMap.clear(); resourceLoaderList.clear(); absoluteResourceTypes.clear(); relativeResourceResolvers.clear(); } @Test public void resolveAbsoluteSource() throws Exception { ResourceReference source = mock(ResourceReference.class); ResourceReference reference = mock(ResourceReference.class); absoluteResourceTypes.add("blah"); when(source.getType()).thenReturn("blah"); when(resourceReferenceExtractor.extract("path")).thenReturn(reference); ResourceReference result = underTest.resolve(source, "path"); assertSame(reference, result); } @Test public void resolveAbsoluteTarget() throws Exception { ResourceReference source = mock(ResourceReference.class); ResourceReference reference = mock(ResourceReference.class); absoluteResourceTypes.add("blah"); when(source.getType()).thenReturn("tu"); when(reference.getType()).thenReturn("blah"); when(resourceReferenceExtractor.extract("path")).thenReturn(reference); ResourceReference result = underTest.resolve(source, "path"); assertSame(reference, result); } @Test public void resolveSameTypeNonAbsolute() throws Exception { ResourceReference expected = mock(ResourceReference.class); ResourceReference source = mock(ResourceReference.class); ResourceReference reference = mock(ResourceReference.class); RelativeResourceResolver relativeResourceResolver = mock(RelativeResourceResolver.class); relativeResourceResolvers.add(relativeResourceResolver); when(source.getType()).thenReturn("blah"); when(reference.getType()).thenReturn("blah"); when(resourceReferenceExtractor.extract("path")).thenReturn(reference); when(relativeResourceResolver.resolve(source, reference)).thenReturn(Optional.of(expected)); ResourceReference result = underTest.resolve(source, "path"); assertSame(expected, result); } @Test public void resolveAnyTargetNonAbsolute() throws Exception { ResourceReference expected = mock(ResourceReference.class); ResourceReference source = mock(ResourceReference.class); ResourceReference reference = mock(ResourceReference.class); RelativeResourceResolver relativeResourceResolver = mock(RelativeResourceResolver.class); relativeResourceResolvers.add(relativeResourceResolver); when(source.getType()).thenReturn("blah"); when(reference.getType()).thenReturn("any"); when(resourceReferenceExtractor.extract("path")).thenReturn(reference); when(relativeResourceResolver.resolve(source, reference)).thenReturn(Optional.of(expected)); ResourceReference result = underTest.resolve(source, "path"); assertSame(expected, result); } @Test public void resolveSameTypeNonAbsoluteNotFound() throws Exception { ResourceReference expected = mock(ResourceReference.class); ResourceReference source = mock(ResourceReference.class); ResourceReference reference = mock(ResourceReference.class); RelativeResourceResolver relativeResourceResolver = mock(RelativeResourceResolver.class); relativeResourceResolvers.add(relativeResourceResolver); when(source.getType()).thenReturn("blah"); when(reference.getType()).thenReturn("blah"); when(resourceReferenceExtractor.extract("path")).thenReturn(reference); when(relativeResourceResolver.resolve(source, reference)).thenReturn(Optional.<ResourceReference>absent()); ResourceReference result = underTest.resolve(source, "path"); assertSame(reference, result); } @Test public void resolveRelativeSourceAnyTarget() throws Exception { ResourceReference expected = mock(ResourceReference.class); ResourceReference source = mock(ResourceReference.class); ResourceReference reference = mock(ResourceReference.class); RelativeResourceResolver relativeResourceResolver = mock(RelativeResourceResolver.class); relativeResourceResolvers.add(relativeResourceResolver); when(source.getType()).thenReturn("blah"); when(reference.getType()).thenReturn("any"); when(resourceReferenceExtractor.extract("path")).thenReturn(reference); when(relativeResourceResolver.resolve(source, reference)).thenReturn(Optional.<ResourceReference>absent()); ResourceReference result = underTest.resolve(source, "path"); assertSame(reference, result); } @Test public void resolveRelativeDistinctTypes() throws Exception { ResourceReference expected = mock(ResourceReference.class); ResourceReference source = mock(ResourceReference.class); ResourceReference reference = mock(ResourceReference.class); RelativeResourceResolver relativeResourceResolver = mock(RelativeResourceResolver.class); relativeResourceResolvers.add(relativeResourceResolver); when(source.getType()).thenReturn("blah"); when(reference.getType()).thenReturn("tu"); when(resourceReferenceExtractor.extract("path")).thenReturn(reference); when(relativeResourceResolver.resolve(source, reference)).thenReturn(Optional.<ResourceReference>absent()); ResourceReference result = underTest.resolve(source, "path"); assertSame(reference, result); } @Test(expected = ResourceException.class) public void loadMetadataNoLoader() throws Exception { underTest.loadMetadata(new ResourceReference("haha", "path")); } }