package test_locally;

import com.slack.api.bolt.AppConfig;
import com.slack.api.bolt.micronaut.SlackAppMicronautAdapter;
import com.slack.api.bolt.request.Request;
import com.slack.api.bolt.response.Response;
import io.micronaut.core.convert.DefaultConversionService;
import io.micronaut.http.HttpRequest;
import io.micronaut.http.HttpResponse;
import io.micronaut.http.simple.SimpleHttpHeaders;
import io.micronaut.http.simple.SimpleHttpParameters;
import org.junit.Test;

import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class AdapterTest {

    @Test
    public void toSlackRequest() {
        AppConfig config = AppConfig.builder().build();
        SlackAppMicronautAdapter adapter = new SlackAppMicronautAdapter(config);

        HttpRequest<String> req = mock(HttpRequest.class);
        Map<String, String> rawHeaders = new HashMap<>();
        rawHeaders.put("X-Slack-Signature", "xxxxxxx");
        SimpleHttpHeaders headers = new SimpleHttpHeaders(rawHeaders, new DefaultConversionService());
        when(req.getHeaders()).thenReturn(headers);
        Map<CharSequence, List<String>> params = new HashMap<>();
        params.put("foo", Arrays.asList("bar", "baz"));
        SimpleHttpParameters parameters = new SimpleHttpParameters(params, new DefaultConversionService());
        when(req.getParameters()).thenReturn(parameters);

        Request<?> slackRequest = adapter.toSlackRequest(req, "token=random&ssl_check=1");

        assertNotNull(slackRequest);
        assertEquals("token=random&ssl_check=1", slackRequest.getRequestBodyAsString());
        assertEquals("xxxxxxx", slackRequest.getHeaders().getFirstValue("X-Slack-Signature"));
        assertEquals("bar", slackRequest.getQueryString().get("foo").get(0));
    }

    @Test
    public void toSlackRequest_with_remote_address() throws UnknownHostException {
        AppConfig config = AppConfig.builder().build();
        SlackAppMicronautAdapter adapter = new SlackAppMicronautAdapter(config);

        HttpRequest<String> req = mock(HttpRequest.class);

        InetSocketAddress isa = new InetSocketAddress("localhost", 443);
        when(req.getRemoteAddress()).thenReturn(isa);

        Request<?> slackRequest = adapter.toSlackRequest(req, "token=random&ssl_check=1");

        assertNotNull(slackRequest);
        assertEquals("127.0.0.1", slackRequest.getClientIpAddress());
    }

    @Test
    public void toMicronautResponse() {
        AppConfig config = AppConfig.builder().build();
        SlackAppMicronautAdapter adapter = new SlackAppMicronautAdapter(config);

        String body = "{\"text\":\"Hi there!\"}";
        Response slackResponse = Response.json(200, body);
        Map<String, List<String>> headers = new HashMap<>();
        headers.put("Set-Cookie", Arrays.asList("foo=bar", "id=123"));
        slackResponse.setHeaders(headers);
        HttpResponse<String> response = adapter.toMicronautResponse(slackResponse);
        assertNotNull(response);
        assertEquals(200, response.getStatus().getCode());
        assertEquals(body.length(), response.getContentLength());
        assertEquals("application/json; charset=utf-8", response.getHeaders().getContentType().get());
    }

}