/*
* #%L
* Wisdom-Framework
* %%
* Copyright (C) 2013 - 2014 Wisdom Framework
* %%
* 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%
*/
package org.wisdom.framework.filters.test;
import com.google.common.net.HttpHeaders;
import org.junit.Test;
import org.wisdom.api.configuration.Configuration;
import org.wisdom.api.http.*;
import org.wisdom.api.interception.RequestContext;
import org.wisdom.api.router.Route;
import org.wisdom.framework.filters.RedirectFilter;
import org.wisdom.test.parents.FakeContext;
import org.wisdom.test.parents.FakeRequest;
import org.wisdom.test.parents.WisdomUnitTest;
import java.net.URI;
import java.net.URISyntaxException;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class RedirectFilterTest extends WisdomUnitTest {
@Test
public void testRedirection() throws Exception {
RedirectFilter filter = new RedirectFilter() {
@Override
protected String getRedirectTo() {
return "http://perdu.com";
}
@Override
protected String getPrefix() {
return "/";
}
};
Route route = mock(Route.class);
RequestContext rc = mock(RequestContext.class);
FakeContext context = new FakeContext();
context.setPath("/").setHeader(HttpHeaders.CONNECTION, "keep-alive");
FakeRequest request = new FakeRequest(context).method(HttpMethod.GET).uri("/");
when(rc.context()).thenReturn(context);
when(rc.request()).thenReturn(request);
Result result = filter.call(route, rc);
assertThat(result).isNotNull();
assertThat(result.getStatusCode()).isEqualTo(Status.SEE_OTHER);
assertThat(result.getHeaders().get(HeaderNames.LOCATION)).isEqualTo("http://perdu.com");
}
@Test
public void testRedirectionWithQuery() throws Exception {
RedirectFilter filter = new RedirectFilter() {
@Override
protected String getRedirectTo() {
return "http://perdu.com";
}
@Override
protected String getPrefix() {
return "/";
}
};
Route route = mock(Route.class);
RequestContext rc = mock(RequestContext.class);
FakeContext context = new FakeContext();
context.setPath("/").setHeader(HttpHeaders.CONNECTION, "keep-alive");
FakeRequest request = new FakeRequest(context).method(HttpMethod.GET).uri("/?foo=bar");
when(rc.context()).thenReturn(context);
when(rc.request()).thenReturn(request);
Result result = filter.call(route, rc);
assertThat(result).isNotNull();
assertThat(result.getStatusCode()).isEqualTo(Status.SEE_OTHER);
assertThat(result.getHeaders().get(HeaderNames.LOCATION)).isEqualTo("http://perdu.com?foo=bar");
}
@Test
public void testRedirectionForPostRequests() throws Exception {
RedirectFilter filter = new RedirectFilter() {
@Override
protected String getRedirectTo() {
return "http://perdu.com";
}
@Override
protected String getPrefix() {
return "/";
}
};
Route route = mock(Route.class);
RequestContext rc = mock(RequestContext.class);
FakeContext context = new FakeContext();
context.setPath("/").setHeader(HttpHeaders.CONNECTION, "keep-alive");
FakeRequest request = new FakeRequest(context).method(HttpMethod.POST).uri("/");
when(rc.context()).thenReturn(context);
when(rc.request()).thenReturn(request);
Result result = filter.call(route, rc);
assertThat(result).isNotNull();
assertThat(result.getStatusCode()).isEqualTo(Status.SEE_OTHER);
assertThat(result.getHeaders().get(HeaderNames.LOCATION)).isEqualTo("http://perdu.com");
}
@Test
public void testFailedRewriting() throws Exception {
RedirectFilter filter = new RedirectFilter() {
@Override
protected String getRedirectTo() {
return "http://perdu.com";
}
@Override
protected String getPrefix() {
return "/";
}
@Override
protected Result onRewriteFailed(RequestContext context) {
return Results.badRequest();
}
@Override
public URI rewriteURI(Request request) throws URISyntaxException {
// return null on purpose to simulate an error while rewriting the url.
return null;
}
};
Route route = mock(Route.class);
RequestContext rc = mock(RequestContext.class);
FakeContext context = new FakeContext();
context.setPath("/").setHeader(HttpHeaders.CONNECTION, "keep-alive");
FakeRequest request = new FakeRequest(context).method(HttpMethod.GET).uri("/");
when(rc.context()).thenReturn(context);
when(rc.request()).thenReturn(request);
Result result = filter.call(route, rc);
assertThat(result).isNotNull();
assertThat(result).isNotNull();
assertThat(result.getStatusCode()).isEqualTo(Status.BAD_REQUEST);
}
@Test
public void testConfiguration() throws Exception {
Configuration configuration = mock(Configuration.class);
when(configuration.get("prefix")).thenReturn("/redirected");
when(configuration.get("redirectTo")).thenReturn("http://perdu.com");
RedirectFilter filter = new RedirectFilter(configuration);
Route route = mock(Route.class);
RequestContext rc = mock(RequestContext.class);
FakeContext context = new FakeContext();
context.setPath("/redirected").setHeader(HttpHeaders.CONNECTION, "keep-alive");
FakeRequest request = new FakeRequest(context).method(HttpMethod.GET).uri("/redirected");
when(rc.context()).thenReturn(context);
when(rc.request()).thenReturn(request);
Result result = filter.call(route, rc);
assertThat(result).isNotNull();
assertThat(result.getStatusCode()).isEqualTo(Status.SEE_OTHER);
assertThat(result.getHeaders().get(HeaderNames.LOCATION)).isEqualTo("http://perdu.com");
}
@Test
public void testPathComputation() throws Exception {
RedirectFilter filter = new RedirectFilter() {
@Override
protected String getRedirectTo() {
return "http://perdu.com";
}
@Override
protected String getPrefix() {
return "/proxy";
}
};
RequestContext rc = mock(RequestContext.class);
FakeContext context = new FakeContext();
context.setPath("/proxy/foo/bar").setHeader(HttpHeaders.CONNECTION, "keep-alive");
FakeRequest request = new FakeRequest(context).method(HttpMethod.GET).uri("/proxy/foo/bar");
when(rc.context()).thenReturn(context);
when(rc.request()).thenReturn(request);
URI uri = filter.rewriteURI(request);
assertThat(uri.toString()).endsWith("/foo/bar");
}
}