/*
* Copyright 2013-2014, ApiFest project
*
* 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.
*/
package com.apifest;
import static org.mockito.BDDMockito.willReturn;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.handler.codec.http.DefaultHttpRequest;
import org.jboss.netty.handler.codec.http.HttpMethod;
import org.jboss.netty.handler.codec.http.HttpRequest;
import org.jboss.netty.handler.codec.http.HttpResponse;
import org.jboss.netty.handler.codec.http.HttpVersion;
import org.slf4j.Logger;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import com.apifest.api.MappingAction;
import com.apifest.api.MappingEndpoint;
import com.apifest.example.ReplaceCustomerIdAction;
/**
* @author Rossitsa Borissova
*/
public class HttpRequestHandlerTest {
HttpRequestHandler handler;
@BeforeTest
public void setup() {
handler = spy(new HttpRequestHandler());
HttpRequestHandler.log = mock(Logger.class);
BaseMapper.log = mock(Logger.class);
}
@Test
public void when_uri_is_apifest_reload_invoke_reload_mapping_configs() throws Exception {
// GIVEN
MessageEvent message = mock(MessageEvent.class);
HttpRequest req = mock(HttpRequest.class);
doReturn(req).when(message).getMessage();
ChannelHandlerContext ctx = mock(ChannelHandlerContext.class);
doReturn(ChannelBuffers.EMPTY_BUFFER).when(req).getContent();
doReturn(HttpRequestHandler.RELOAD_URI).when(req).getUri();
doReturn(HttpMethod.GET).when(req).getMethod();
doNothing().when(handler).reloadMappingConfig(any(Channel.class));
doNothing().when(handler).setConnectTimeout(any(Channel.class));
// WHEN
handler.messageReceived(ctx, message);
// THEN
verify(handler).reloadMappingConfig(any(Channel.class));
}
@Test
public void when_invoke_action_pass_request_uri() throws Exception {
// GIVEN
HttpRequest request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/v0.1/countries?id=BUL");
MappingEndpoint mapping = mock(MappingEndpoint.class);
willReturn("http://example.com").given(mapping).getBackendHost();
MappingConfig config = mock(MappingConfig.class);
HttpResponse validationResponse = mock(HttpResponse.class);
willReturn("/countries").given(mapping).getInternalEndpoint();
MappingAction action = mock(MappingAction.class);
willReturn(action).given(mapping).getAction();
ReplaceCustomerIdAction replaceAction = mock(ReplaceCustomerIdAction.class);
willReturn(replaceAction).given(config).getAction(action);
willReturn(request).given(replaceAction).execute(request, "/countries?id=BUL", validationResponse);
// WHEN
handler.mapRequest(request, mapping, config, validationResponse);
// THEN
verify(replaceAction).execute(request, validationResponse, mapping);
}
@Test
public void when_apifest_mappings_invoke_getLoadedMappings() throws Exception {
// GIVEN
MessageEvent message = mock(MessageEvent.class);
HttpRequest req = mock(HttpRequest.class);
doReturn(req).when(message).getMessage();
ChannelHandlerContext ctx = mock(ChannelHandlerContext.class);
doReturn(ChannelBuffers.EMPTY_BUFFER).when(req).getContent();
doReturn(HttpRequestHandler.MAPPINGS_URI).when(req).getUri();
doReturn(HttpMethod.GET).when(req).getMethod();
doNothing().when(handler).getLoadedMappings(any(Channel.class));
doNothing().when(handler).setConnectTimeout(any(Channel.class));
// WHEN
handler.messageReceived(ctx, message);
// THEN
verify(handler).getLoadedMappings(any(Channel.class));
}
@Test
public void when_apifest_global_errors_invoke_getLoadedGlobalErrors() throws Exception {
// GIVEN
MessageEvent message = mock(MessageEvent.class);
HttpRequest req = mock(HttpRequest.class);
doReturn(req).when(message).getMessage();
ChannelHandlerContext ctx = mock(ChannelHandlerContext.class);
doReturn(ChannelBuffers.EMPTY_BUFFER).when(req).getContent();
doReturn(HttpRequestHandler.GLOBAL_ERRORS_URI).when(req).getUri();
doReturn(HttpMethod.GET).when(req).getMethod();
doNothing().when(handler).getLoadedGlobalErrors(any(Channel.class));
doNothing().when(handler).setConnectTimeout(any(Channel.class));
// WHEN
handler.messageReceived(ctx, message);
// THEN
verify(handler).getLoadedGlobalErrors(any(Channel.class));
}
}