package act.handler.builtin; /*- * #%L * ACT Framework * %% * Copyright (C) 2014 - 2017 ActFramework * %% * 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. * #L% */ import act.MockResponse; import act.RequestImplBase; import act.TestBase; import act.app.ActionContext; import act.controller.ParamNames; import org.junit.Before; import org.junit.Test; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.osgl.http.H; import java.io.ByteArrayOutputStream; import java.io.File; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class StaticFileGetterTest extends TestBase { ActionContext ctx; MockResponse resp; StaticFileGetter pathHandler; StaticFileGetter fileHandler; @Before public void prepare() throws Exception { super.setup(); resp = new MockResponse(); when(mockApp.file(anyString())).thenAnswer(new Answer<File>() { @Override public File answer(InvocationOnMock invocation) throws Throwable { Object[] args = invocation.getArguments(); String path = (String) args[0]; return new File("target/test-classes", path); } }); when(mockAppConfig.errorTemplatePathResolver()).thenCallRealMethod(); RequestImplBase req = mock(RequestImplBase.class); when(req.method()).thenReturn(H.Method.GET); ctx = ActionContext.create(mockApp, req, resp); when(req.context()).thenReturn(ctx); pathHandler = new StaticFileGetter("/public", mockApp); fileHandler = new StaticFileGetter("/public/foo/bar.txt", mockApp); } @Test public void invokePathHandlerOnNonExistingResource() { when(ctx.accept()).thenReturn(H.Format.HTML); ctx.param(ParamNames.PATH, "/some/where/non_exists.txt"); pathHandler.handle(ctx); eq(resp.status, 404); } @Test public void invokePathHandlerOnExistingResource() { ctx.param(ParamNames.PATH, "/foo/bar.txt"); pathHandler.handle(ctx); ByteArrayOutputStream baos = (ByteArrayOutputStream)resp.outputStream(); String s = new String(baos.toByteArray()); ceq("foo/bar.txt", s); } @Test public void invokePathHandlerOnExistingResource2() { // this time use relative path ctx.param(ParamNames.PATH, "foo/bar.txt"); pathHandler.handle(ctx); ByteArrayOutputStream baos = (ByteArrayOutputStream)resp.outputStream(); String s = new String(baos.toByteArray()); ceq("foo/bar.txt", s); } @Test public void pathHandlerShallSupportPartialPath() { yes(pathHandler.supportPartialPath()); } @Test public void fileHandlerShallNotSupportPartialPath() { no(fileHandler.supportPartialPath()); } @Test public void invokeFileHandler() { fileHandler.handle(ctx); ByteArrayOutputStream baos = (ByteArrayOutputStream)resp.outputStream(); String s = new String(baos.toByteArray()); ceq("foo/bar.txt", s); } @Test public void pathParameterShallBeIgnoredWhenBaseIsFile() { ctx.param(ParamNames.PATH, "some/thing/should/be/ignored.txt"); fileHandler.handle(ctx); ByteArrayOutputStream baos = (ByteArrayOutputStream)resp.outputStream(); String s = new String(baos.toByteArray()); ceq("foo/bar.txt", s); } }