package com.elibom.jogger.middleware.statik; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.text.SimpleDateFormat; import java.util.Date; import com.elibom.jogger.MiddlewareChain; import com.elibom.jogger.asset.Asset; import com.elibom.jogger.asset.AssetLoader; import com.elibom.jogger.http.Request; import com.elibom.jogger.http.Response; import com.elibom.jogger.middleware.statik.StaticMiddleware; import org.testng.annotations.Test; public class StaticMiddlewareTest { @Test public void shouldFindExistingAsset() throws Exception { Asset asset = new Asset(null, "test.css", "text/css", 34); AssetLoader assetLoader = mock(AssetLoader.class); when(assetLoader.load("test.css")).thenReturn(asset); StaticMiddleware middleware = new StaticMiddleware(assetLoader, "assets"); Request request = mockRequest("get", "/assets/test.css"); Response response = mock(Response.class); middleware.handle(request, response, mock(MiddlewareChain.class)); verify(assetLoader).load("test.css"); verify(response).write(asset); } @Test public void shouldFindExistingAssetWithEmptyPrefix() throws Exception { Asset asset = new Asset(null, "test.css", "text/css", 34); AssetLoader assetLoader = mock(AssetLoader.class); when(assetLoader.load("assets/test.css")).thenReturn(asset); StaticMiddleware middleware = new StaticMiddleware(assetLoader, ""); Request request = mockRequest("get", "/assets/test.css"); Response response = mock(Response.class); middleware.handle(request, response, mock(MiddlewareChain.class)); verify(assetLoader).load("assets/test.css"); verify(response).write(asset); } private Request mockRequest(String httpMethod, String path) { Request request = mock(Request.class); when(request.getMethod()).thenReturn(httpMethod); when(request.getPath()).thenReturn(path); return request; } @Test public void shouldNotFindMissingAsset() throws Exception { AssetLoader assetLoader = mock(AssetLoader.class); StaticMiddleware middleware = new StaticMiddleware(assetLoader, "assets"); Request request = mockRequest("get", "/assets/test.css"); Response response = mock(Response.class); MiddlewareChain chain = mock(MiddlewareChain.class); middleware.handle(request, response, chain); verify(response, never()).write(any(Asset.class)); verify(chain).next(); } @Test public void shouldNotFindAssetWithInvalidHttpMethod() throws Exception { Asset asset = new Asset(null, "test.css", "text/css", 34); AssetLoader assetLoader = mock(AssetLoader.class); when(assetLoader.load("test.css")).thenReturn(asset); StaticMiddleware middleware = new StaticMiddleware(assetLoader, "assets"); Request request = mockRequest("post", "/assets/test.css"); Response response = mock(Response.class); MiddlewareChain chain = mock(MiddlewareChain.class); middleware.handle(request, response, chain); verify(response, never()).write(any(Asset.class)); verify(chain).next(); } @Test public void should304WithCorrectIfModifiedSinceHeader() throws Exception { String dateString = "Wed, 09 Apr 2008 23:55:38 GMT"; SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz"); Date d = format.parse(dateString); Asset asset = new Asset(null, "test.css", "text/css", 34, d.getTime()); AssetLoader assetLoader = mock(AssetLoader.class); when(assetLoader.load("test.css")).thenReturn(asset); StaticMiddleware middleware = new StaticMiddleware(assetLoader, "assets"); Request request = mockRequest("get", "/assets/test.css"); when(request.getHeader("If-Modified-Since")).thenReturn(dateString); Response response = mock(Response.class); middleware.handle(request, response, mock(MiddlewareChain.class)); verify(response).status(Response.NOT_MODIFIED); } @Test public void shouldReturnModifiedAsset() throws Exception { String dateString = "Wed, 09 Apr 2008 23:55:38 GMT"; SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz"); Date d = format.parse(dateString); Asset asset = new Asset(null, "test.css", "text/css", 34, d.getTime() + 3600); AssetLoader assetLoader = mock(AssetLoader.class); when(assetLoader.load("test.css")).thenReturn(asset); StaticMiddleware middleware = new StaticMiddleware(assetLoader, "assets"); Request request = mockRequest("get", "/assets/test.css"); when(request.getHeader("If-Modified-Since")).thenReturn(dateString); Response response = mock(Response.class); middleware.handle(request, response, mock(MiddlewareChain.class)); verify(assetLoader).load("test.css"); verify(response).write(asset); } }