package com.xebialabs.restito.semantics;
import org.glassfish.grizzly.http.server.Response;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.function.Function;
import static com.xebialabs.restito.semantics.Action.*;
import static com.xebialabs.restito.semantics.ActionSequence.sequence;
import static org.glassfish.grizzly.http.util.HttpStatus.*;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
public class StubTest {
@Mock
Response response;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
private static Condition ALWAYS_TRUE = Condition.custom(Predicates.<Call>alwaysTrue());
@Test
public void shouldBeApplicableWhenConditionIsTrue() {
Stub stub = new Stub(ALWAYS_TRUE, ok());
assertTrue(stub.isApplicable(mock(Call.class)));
}
@Test
public void shouldBeNotApplicableWhenConditionIsFalse() {
Stub stub = new Stub(Condition.custom(Predicates.<Call>alwaysFalse()), ok());
assertFalse(stub.isApplicable(mock(Call.class)));
}
@Test
public void shouldExecuteApplyFunctionOnResponse() {
new Stub(mock(Condition.class), contentType("boo")).apply(response);
verify(response, times(1)).setContentType("boo");
}
@Test
public void shouldComposeConditionsNegative() {
Stub stub = new Stub(Condition.custom(Predicates.<Call>alwaysTrue()), ok());
assertTrue(stub.isApplicable(mock(Call.class)));
stub.alsoWhen(Condition.custom(Predicates.<Call>alwaysFalse()));
assertFalse(stub.isApplicable(mock(Call.class)));
}
@Test
public void shouldComposeConditionsPositive() {
Stub stub = new Stub(Condition.custom(Predicates.<Call>alwaysTrue()), ok());
assertTrue(stub.isApplicable(mock(Call.class)));
stub.alsoWhen(Condition.custom(Predicates.<Call>alwaysTrue()));
assertTrue(stub.isApplicable(mock(Call.class)));
}
@Test
public void shouldComposeMutationsNegative() {
Stub stub = new Stub(Condition.custom(Predicates.<Call>alwaysTrue()), contentType("myType"));
stub.withExtraAction(Action.custom(new Function<Response, Response>() {
@Override
public Response apply(Response input) {
input.setCharacterEncoding("UTF-9");
return input;
}
}));
stub.apply(response);
verify(response).setContentType("myType");
verify(response).setCharacterEncoding("UTF-9");
}
@Test
public void shouldIncreaseAppliedTimesCounter() {
Stub stub = new Stub(
Condition.custom(Predicates.<Call>alwaysTrue()),
Action.custom(new Function<Response, Response>() {
@Override
public Response apply(Response input) {
return input;
}
})
);
assertEquals(0, stub.getAppliedTimes());
stub.apply(mock(Response.class));
assertEquals(1, stub.getAppliedTimes());
}
@Test
public void shouldCreateStubsWithSequenceActions() throws Exception {
ActionSequence action = sequence(status(OK_200), status(CREATED_201), status(ACCEPTED_202));
Stub stub = new Stub(Condition.custom(Predicates.<Call>alwaysTrue()), action);
stub.apply(response);
verify(response).setStatus(OK_200);
stub.apply(response);
verify(response).setStatus(CREATED_201);
stub.apply(response);
verify(response).setStatus(ACCEPTED_202);
}
@Test
public void shouldCreateStubFromASequenceWithASingleAction() throws Exception {
Stub stub = new Stub(ALWAYS_TRUE, sequence(status(CREATED_201)));
stub.apply(response);
verify(response).setStatus(CREATED_201);
}
@Test
@SuppressWarnings("unchecked")
public void shouldAccumulateSequencedActions() {
Function<Response, Response> f1 = mock(Function.class);
Function<Response, Response> f2 = mock(Function.class);
Stub stub = new Stub(ALWAYS_TRUE)
.withSequenceItem(Action.custom(f1))
.withSequenceItem(Action.custom(f2));
stub.apply(response);
assertEquals(1, stub.getAppliedTimes());
verify(f1, times(1)).apply(response);
verify(f2, never()).apply(response);
stub.apply(response);
assertEquals(2, stub.getAppliedTimes());
verify(f2, times(1)).apply(response);
}
}