package hello.filters.pre;

import com.netflix.zuul.context.RequestContext;
import org.apache.catalina.servlet4preview.http.HttpServletRequest;
import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.springframework.boot.test.rule.OutputCapture;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class SimpleFilterTest {

    private SimpleFilter filter;

    @Rule
    public OutputCapture outputCapture = new OutputCapture();

    @Before
    public void setup() {
        this.filter = new SimpleFilter();
    }

    @Test
    public void testFilterType() {
        assertThat(filter.filterType()).isEqualTo("pre");
    }

    @Test
    public void testFilterOrder() {
        assertThat(filter.filterOrder()).isEqualTo(1);
    }

    @Test
    public void testShouldFilter() {
        assertThat(filter.shouldFilter()).isTrue();
    }

    @Test
    public void testRun() {
        HttpServletRequest req = mock(HttpServletRequest.class);
        when(req.getMethod()).thenReturn("GET");
        when(req.getRequestURL()).thenReturn(new StringBuffer("http://foo"));
        RequestContext context = mock(RequestContext.class);
        when(context.getRequest()).thenReturn(req);
        RequestContext.testSetCurrentContext(context);
        filter.run();
        this.outputCapture.expect(Matchers.containsString("GET request to http://foo"));
    }
}