diff --git a/build.gradle b/build.gradle index 8b23d03..aa2edb8 100644 --- a/build.gradle +++ b/build.gradle @@ -36,6 +36,7 @@ dependencies { compile (group: 'ch.qos.logback', name: 'logback-classic', version: '1.1.3') testCompile group: 'junit', name: 'junit', version: '4.+' + testCompile group: 'org.mockito', name: 'mockito-core', version: '1.10.19' } license { diff --git a/src/main/java/com/kenzan/karyon/rxnetty/resource/ExampleRouteInterceptor.java b/src/main/java/com/kenzan/karyon/rxnetty/ExampleRouteInterceptor.java similarity index 97% rename from src/main/java/com/kenzan/karyon/rxnetty/resource/ExampleRouteInterceptor.java rename to src/main/java/com/kenzan/karyon/rxnetty/ExampleRouteInterceptor.java index ffdee2c..6f89da2 100644 --- a/src/main/java/com/kenzan/karyon/rxnetty/resource/ExampleRouteInterceptor.java +++ b/src/main/java/com/kenzan/karyon/rxnetty/ExampleRouteInterceptor.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.kenzan.karyon.rxnetty.resource; +package com.kenzan.karyon.rxnetty; import io.netty.buffer.ByteBuf; import io.reactivex.netty.protocol.http.server.HttpServerRequest; diff --git a/src/main/java/com/kenzan/karyon/rxnetty/resource/ExampleRouter.java b/src/main/java/com/kenzan/karyon/rxnetty/ExampleRouter.java similarity index 94% rename from src/main/java/com/kenzan/karyon/rxnetty/resource/ExampleRouter.java rename to src/main/java/com/kenzan/karyon/rxnetty/ExampleRouter.java index b127891..32be899 100644 --- a/src/main/java/com/kenzan/karyon/rxnetty/resource/ExampleRouter.java +++ b/src/main/java/com/kenzan/karyon/rxnetty/ExampleRouter.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.kenzan.karyon.rxnetty.resource; +package com.kenzan.karyon.rxnetty; import io.netty.buffer.ByteBuf; import io.reactivex.netty.protocol.http.server.HttpServerRequest; @@ -24,6 +24,7 @@ import rx.Observable; import com.kenzan.karyon.rxnetty.health.HealthCheck; +import com.kenzan.karyon.rxnetty.resource.HelloResource; public class ExampleRouter implements RequestHandler{ @@ -38,6 +39,7 @@ public ExampleRouter() { .addUri("/hello/*", new HelloResource()) .addUri("/healthcheck", new HealthCheckEndpoint(healthCheckHandler)); } + @Override public Observable handle(HttpServerRequest request, HttpServerResponse response) { diff --git a/src/main/java/com/kenzan/karyon/rxnetty/KaryonRxNettyExample.java b/src/main/java/com/kenzan/karyon/rxnetty/KaryonRxNettyExample.java index 761078b..2d1fd41 100644 --- a/src/main/java/com/kenzan/karyon/rxnetty/KaryonRxNettyExample.java +++ b/src/main/java/com/kenzan/karyon/rxnetty/KaryonRxNettyExample.java @@ -15,8 +15,6 @@ */ package com.kenzan.karyon.rxnetty; -import com.kenzan.karyon.rxnetty.resource.ExampleRouteInterceptor; - import netflix.adminresources.resources.KaryonWebAdminModule; import netflix.karyon.Karyon; import netflix.karyon.ShutdownModule; diff --git a/src/main/java/com/kenzan/karyon/rxnetty/endpoint/HelloEndpoint.java b/src/main/java/com/kenzan/karyon/rxnetty/endpoint/HelloEndpoint.java new file mode 100644 index 0000000..76a32b5 --- /dev/null +++ b/src/main/java/com/kenzan/karyon/rxnetty/endpoint/HelloEndpoint.java @@ -0,0 +1,24 @@ +package com.kenzan.karyon.rxnetty.endpoint; + +import io.netty.buffer.ByteBuf; +import io.reactivex.netty.protocol.http.server.HttpServerRequest; + +import java.util.regex.Pattern; + +import com.sun.jersey.api.uri.UriPattern; + +import rx.Observable; + +public class HelloEndpoint { + + public Observable getHello() { + return Observable.just("Hello"); + } + + public Observable getHelloName(HttpServerRequest request) { + UriPattern pattern = new UriPattern(Pattern.compile("/hello/(.*)")); + String name = pattern.match(request.getUri()).group(1); + + return Observable.just("Hello " + name); + } +} diff --git a/src/main/java/com/kenzan/karyon/rxnetty/resource/HelloResource.java b/src/main/java/com/kenzan/karyon/rxnetty/resource/HelloResource.java index df2f013..3149970 100644 --- a/src/main/java/com/kenzan/karyon/rxnetty/resource/HelloResource.java +++ b/src/main/java/com/kenzan/karyon/rxnetty/resource/HelloResource.java @@ -15,23 +15,23 @@ */ package com.kenzan.karyon.rxnetty.resource; -import java.util.regex.Pattern; - -import netflix.karyon.transport.http.SimpleUriRouter; - -import com.sun.jersey.api.uri.UriPattern; - -import rx.Observable; import io.netty.buffer.ByteBuf; import io.reactivex.netty.protocol.http.server.HttpServerRequest; import io.reactivex.netty.protocol.http.server.HttpServerResponse; import io.reactivex.netty.protocol.http.server.RequestHandler; +import netflix.karyon.transport.http.SimpleUriRouter; +import rx.Observable; +import rx.functions.Func1; + +import com.kenzan.karyon.rxnetty.endpoint.HelloEndpoint; public class HelloResource implements RequestHandler{ private final SimpleUriRouter delegate; + private final HelloEndpoint endpoint; public HelloResource() { + endpoint = new HelloEndpoint(); delegate = new SimpleUriRouter<>(); delegate @@ -40,19 +40,29 @@ public HelloResource() { public Observable handle(HttpServerRequest request, HttpServerResponse response) { - response.writeString("Hello"); - return response.close(); + return endpoint.getHello() + .flatMap(new Func1>() { + @Override + public Observable call(String body) { + response.writeString(body); + return response.close(); + } + }); } }) .addUriRegex("/hello/(.*)", new RequestHandler() { @Override public Observable handle(HttpServerRequest request, HttpServerResponse response) { - UriPattern pattern = new UriPattern(Pattern.compile("/hello/(.*)")); - String name = pattern.match(request.getUri()).group(1); - response.writeString("Hello " + name); - return response.close(); + return endpoint.getHelloName(request) + .flatMap(new Func1>() { + @Override + public Observable call(String body) { + response.writeString(body); + return response.close(); + } + }); } }); } diff --git a/src/test/java/com/kenzan/karyon/rxnetty/endpoint/HelloEndpointTest.java b/src/test/java/com/kenzan/karyon/rxnetty/endpoint/HelloEndpointTest.java new file mode 100644 index 0000000..a8aaa44 --- /dev/null +++ b/src/test/java/com/kenzan/karyon/rxnetty/endpoint/HelloEndpointTest.java @@ -0,0 +1,40 @@ +package com.kenzan.karyon.rxnetty.endpoint; + +import io.netty.buffer.ByteBuf; +import io.reactivex.netty.protocol.http.server.HttpServerRequest; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.runners.MockitoJUnitRunner; + +import rx.Observable; + +@RunWith(MockitoJUnitRunner.class) +public class HelloEndpointTest { + + @Mock + private HttpServerRequest request; + + @Test + public void helloTest() { + HelloEndpoint helloEndpoint = new HelloEndpoint(); + + Observable hello = helloEndpoint.getHello(); + + Assert.assertEquals("Hello", hello.toBlocking().first()); + } + + @Test + public void helloNameTest() { + HelloEndpoint helloEndpoint = new HelloEndpoint(); + + Mockito.when(request.getUri()).thenReturn("/hello/name"); + + Observable hello = helloEndpoint.getHelloName(request); + + Assert.assertEquals("Hello name", hello.toBlocking().first()); + } +} diff --git a/src/test/java/com/kenzan/karyon/rxnetty/resource/HelloResourceTest.java b/src/test/java/com/kenzan/karyon/rxnetty/resource/HelloResourceTest.java new file mode 100644 index 0000000..f93570c --- /dev/null +++ b/src/test/java/com/kenzan/karyon/rxnetty/resource/HelloResourceTest.java @@ -0,0 +1,57 @@ +package com.kenzan.karyon.rxnetty.resource; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; +import io.netty.util.Attribute; +import io.reactivex.netty.protocol.http.server.HttpServerRequest; +import io.reactivex.netty.protocol.http.server.HttpServerResponse; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Matchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.runners.MockitoJUnitRunner; + +import com.kenzan.karyon.rxnetty.resource.HelloResource; + +@RunWith(MockitoJUnitRunner.class) +public class HelloResourceTest { + + @Mock + private HttpServerRequest request; + + @Mock + private HttpServerResponse response; + + @Mock + private Attribute attribute; + + @Mock + private Channel channel; + + @Before + public void setup() { + Mockito.when(channel.attr(Matchers.any())).thenReturn(attribute); + Mockito.when(response.getChannel()).thenReturn(channel); + } + + @Test + public void helloTest() { + HelloResource helloResource = new HelloResource(); + + Mockito.when(request.getUri()).thenReturn("/hello"); + + helloResource.handle(request, response); + } + + @Test + public void helloNameTest() { + HelloResource helloResource = new HelloResource(); + + Mockito.when(request.getUri()).thenReturn("/hello/name"); + + helloResource.handle(request, response); + } +}