package dev.snowdrop.vertx.http.test;

import dev.snowdrop.vertx.http.client.VertxClientHttpConnector;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.reactive.server.WebTestClient;
import org.springframework.test.web.reactive.server.WebTestClientConfigurer;

import static org.assertj.core.api.Assertions.assertThat;

@RunWith(SpringRunner.class)
@SpringBootTest(
    webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
    classes = { TestApplication.class, CustomWebTestClientIT.CustomWebTestClientConfiguration.class }
)
public class CustomWebTestClientIT {

    @Autowired
    private WebTestClient client;

    @Test
    public void shouldInjectCustomClient() {
        assertThat(client).isInstanceOf(CustomWebTestClient.class);
    }

    @Configuration
    static class CustomWebTestClientConfiguration {
        @Bean
        public WebTestClient customWebTestClient(VertxClientHttpConnector connector) {
            return new CustomWebTestClient();
        }
    }

    private static class CustomWebTestClient implements WebTestClient {
        @Override
        public RequestHeadersUriSpec<?> get() {
            return null;
        }

        @Override
        public RequestHeadersUriSpec<?> head() {
            return null;
        }

        @Override
        public RequestBodyUriSpec post() {
            return null;
        }

        @Override
        public RequestBodyUriSpec put() {
            return null;
        }

        @Override
        public RequestBodyUriSpec patch() {
            return null;
        }

        @Override
        public RequestHeadersUriSpec<?> delete() {
            return null;
        }

        @Override
        public RequestHeadersUriSpec<?> options() {
            return null;
        }

        @Override
        public RequestBodyUriSpec method(HttpMethod method) {
            return null;
        }

        @Override
        public Builder mutate() {
            return null;
        }

        @Override
        public WebTestClient mutateWith(WebTestClientConfigurer configurer) {
            return null;
        }
    }
}