package com.zandero.rest;

import com.zandero.rest.test.ErrorThrowingRest2;
import com.zandero.rest.test.handler.BaseExceptionHandler;
import com.zandero.rest.test.handler.InheritedBaseExceptionHandler;
import com.zandero.rest.test.handler.InheritedFromInheritedExceptionHandler;
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 RouteExceptionHandlerTest extends VertxTest {

    @BeforeAll
    static void start() {

        before();

        Router router = new RestBuilder(vertx)
                .register(ErrorThrowingRest2.class)
                .errorHandler(new InheritedFromInheritedExceptionHandler())
                .errorHandler(InheritedBaseExceptionHandler.class,
                        BaseExceptionHandler.class)
                .build();

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

    @Test
    void throwOne(VertxTestContext context) {


        client.get(PORT, HOST, "/throw/exception/one").as(BodyCodec.string())
                .send(context.succeeding(response -> context.verify(() -> {
                    assertEquals("BaseExceptionHandler: BASE: first", response.body());
                    assertEquals(500, response.statusCode());
                    context.completeNow();
                })));
    }

    @Test
    void throwTwo(VertxTestContext context) {

        client.get(PORT, HOST, "/throw/exception/two").as(BodyCodec.string())
                .send(context.succeeding(response -> context.verify(() -> {
                    assertEquals("InheritedBaseExceptionHandler: BASE: INHERITED: second", response.body());
                    assertEquals(500, response.statusCode());
                    context.completeNow();
                })));
    }

    @Test
    void throwThree(VertxTestContext context) {

        client.get(PORT, HOST, "/throw/exception/three").as(BodyCodec.string())
                .send(context.succeeding(response -> context.verify(() -> {
                    assertEquals("InheritedFromInheritedExceptionHandler: BASE: INHERITED: INHERITED FROM: third", response.body());
                    assertEquals(500, response.statusCode());
                    context.completeNow();
                })));
    }

    @Test
    void throwFour(VertxTestContext context) {

        client.get(PORT, HOST, "/throw/exception/four").as(BodyCodec.string())
                .send(context.succeeding(response -> context.verify(() -> {
                    assertEquals("com.zandero.rest.test.handler.MyExceptionClass", response.body());
                    assertEquals(500, response.statusCode());
                    context.completeNow();
                })));
    }
}