package com.zandero.rest;

import com.zandero.rest.test.TestRegExRest;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.codec.BodyCodec;
import io.vertx.junit5.VertxExtension;
import io.vertx.junit5.VertxTestContext;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

import static org.junit.jupiter.api.Assertions.assertEquals;

@ExtendWith(VertxExtension.class)
class RouteWithRegExTest extends VertxTest {

    @BeforeAll
    static void start() {

        before();

        TestRegExRest testRest = new TestRegExRest();
        Router router = RestRouter.register(vertx, testRest);
        router = router.mountSubRouter("/sub", router);

        vertx.createHttpServer()
                .requestHandler(router)
                .listen(PORT);
    }

    @Test
    void testSimpleRegEx(VertxTestContext context) {

        client.get(PORT, HOST, "/regEx/123").as(BodyCodec.string())
                .send(context.succeeding(response -> context.verify(() -> {
                    assertEquals(200, response.statusCode());
                    assertEquals("123", response.body());
                    context.completeNow();
                })));
    }

    @Test
    void testSubSimpleRegEx(VertxTestContext context) {

        client.get(PORT, HOST, "/sub/regEx/231").as(BodyCodec.string())
                .send(context.succeeding(response -> context.verify(() -> {
                    assertEquals(200, response.statusCode());
                    assertEquals("231", response.body());
                    context.completeNow();
                })));
    }

    @Test
    void testRegEx(VertxTestContext context) {

        client.get(PORT, HOST, "/regEx/1/minus/2").as(BodyCodec.string())
                .send(context.succeeding(response -> context.verify(() -> {
                    assertEquals(200, response.statusCode());
                    assertEquals("-1", response.body());
                    context.completeNow();
                })));
    }

    @Test
    void testSubRegEx(VertxTestContext context) {

        client.get(PORT, HOST, "/sub/regEx/2/minus/1").as(BodyCodec.string())
                .send(context.succeeding(response -> context.verify(() -> {
                    assertEquals(200, response.statusCode());
                    assertEquals("1", response.body());
                    context.completeNow();
                })));
    }

    @Test
    void testSimpleRegExWithMultipleVariables(VertxTestContext context) {

        client.get(PORT, HOST, "/regEx/ena/2/tri").as(BodyCodec.string())
                .send(context.succeeding(response -> context.verify(() -> {
                    assertEquals(200, response.statusCode());
                    assertEquals("{one=ena, two=2, three=tri}", response.body());
                    context.completeNow();
                })));
    }

    @Test
    void testSubSimpleRegExWithMultipleVariables(VertxTestContext context) {

        client.get(PORT, HOST, "/sub/regEx/ena/2/tri").as(BodyCodec.string())
                .send(context.succeeding(response -> context.verify(() -> {
                    assertEquals(200, response.statusCode());
                    assertEquals("{one=ena, two=2, three=tri}", response.body());
                    context.completeNow();
                })));
    }

    @Test
    void testAllButApi(VertxTestContext context) {

        client.get(PORT, HOST, "/regEx/api/a").as(BodyCodec.string())
                .send(context.succeeding(response -> context.verify(() -> {
                    assertEquals(200, response.statusCode());
                    assertEquals("api - last", response.body());
                    context.completeNow();
                })));
    }

    @Test
    void testAllButApi2(VertxTestContext context) {

        client.get(PORT, HOST, "/regEx/test").as(BodyCodec.string())
                .send(context.succeeding(response -> context.verify(() -> {
                    assertEquals(200, response.statusCode());
                    assertEquals("test - not /api", response.body());
                    context.completeNow();
                })));
    }
}