package com.xebialabs.restito.semantics;
import java.io.OutputStream;
import org.glassfish.grizzly.http.Method;
import org.glassfish.grizzly.http.server.Response;
import org.glassfish.grizzly.http.util.HttpStatus;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import static org.glassfish.grizzly.http.util.Constants.DEFAULT_HTTP_CHARACTER_ENCODING;
import static org.junit.Assert.assertFalse;
import static org.mockito.Mockito.*;
public class ConditionWithApplicablesTest {
@Mock
private Response response;
private static final Condition trueCondition = Condition.custom(Predicates.<Call>alwaysTrue());
private static final Applicable ok200Applicable = new Applicable() {
@Override
public Response apply(final Response r) {
r.setStatus(HttpStatus.OK_200);
return r;
}
};
@Before
public void init() {
MockitoAnnotations.initMocks(this);
when(response.getCharacterEncoding()).thenReturn(DEFAULT_HTTP_CHARACTER_ENCODING);
}
@Test
public void shouldApplyApplicablesDefinedInConditionWhenConditionTrue() {
new Stub(
new ConditionWithApplicables(Predicates.<Call>alwaysTrue(), ok200Applicable),
Action.header("foo", "bar")
).apply(response);
InOrder inOrder = inOrder(response);
inOrder.verify(response).setStatus(HttpStatus.OK_200);
inOrder.verify(response).setHeader("foo", "bar");
}
@Test
public void shouldApplyApplicablesDefinedInConditionWhenConditionHadBeenComposed() {
new Stub(
Condition.composite(trueCondition, new ConditionWithApplicables(Predicates.<Call>alwaysTrue(), ok200Applicable)),
Action.header("foo", "bar")
).apply(response);
InOrder inOrder = inOrder(response);
inOrder.verify(response).setStatus(HttpStatus.OK_200);
inOrder.verify(response).setHeader("foo", "bar");
}
@Test
public void shouldDiscoverXmlByPath() throws Exception {
OutputStream os = mock(OutputStream.class);
when(response.getOutputStream()).thenReturn(os);
ConditionWithApplicables condition = Condition.get("/demo/path%20to%20data/data.xml");
condition.getApplicables().get(0).apply(response);
verify(os).write("<content>from data.xml</content>".getBytes());
verify(response).setContentType("application/xml");
}
@Test
public void shouldNotFailIfAutoDiscoveryIsNotPossible() throws Exception {
Call call = mock(Call.class);
when(call.getUri()).thenReturn("/blablabla.xml");
when(call.getMethod()).thenReturn(Method.GET);
ConditionWithApplicables condition = Condition.post("/blablabla.xml");
condition.getApplicables().get(0).apply(response);
assertFalse(condition.getPredicate().test(call));
}
}