package com.zandero.rest;

import com.zandero.rest.test.TestMultiProducesRest;
import com.zandero.rest.writer.TestJsonResponseWriter;
import com.zandero.rest.writer.TestXmlResponseWriter;
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 javax.ws.rs.core.MediaType;

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

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

    @BeforeAll
    static void start() {

        before();

        Router router = new RestBuilder(vertx)
                .register(TestMultiProducesRest.class)
                .writer(MediaType.APPLICATION_XML, TestXmlResponseWriter.class)
                .writer(TestJsonResponseWriter.class) // resolve from @Produces
                .build();

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

    @Test
    void echoXmlTest(VertxTestContext context) {

        client.get(PORT, HOST, "/multi/consume").as(BodyCodec.string())
                .putHeader("Accept", "application/xml")
                .send(context.succeeding(response -> context.verify(() -> {
                    assertEquals(200, response.statusCode());
                    assertEquals("<xml>HELLO!</xml>", response.body());
                    context.completeNow();
                })));
    }

    @Test
    void echoJsonTest(VertxTestContext context) {

        client.get(PORT, HOST, "/multi/consume").as(BodyCodec.string())
                .putHeader("Accept", "application/json")
                .send(context.succeeding(response -> context.verify(() -> {
            assertEquals(200, response.statusCode());
            assertEquals("{\"text\": \"HELLO!\"}", response.body());
            context.completeNow();
        })));
    }
}