package combo; import com.google.gson.Gson; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.web.client.RestTemplate; import uk.org.fyodor.generators.RDG; import java.net.URI; import static org.springframework.test.web.client.MockRestServiceServer.createServer; import static org.springframework.test.web.client.match.MockRestRequestMatchers.*; import static org.springframework.test.web.client.response.MockRestResponseCreators.*; import static uk.org.fyodor.generators.characters.CharacterSetFilter.LettersAndDigits; final class MockHttpComboServer { private final MockRestServiceServer server; private final URI baseUri; MockHttpComboServer(final RestTemplate restTemplate, final URI baseUri) { this.baseUri = baseUri; server = createServer(restTemplate); } void expectServerWillRespondWithNextFactForSubscription(final SubscriptionId subscriptionId) { server.expect(requestTo(baseUri + "/topics/" + subscriptionId.topicName() + "/subscriptions/" + subscriptionId.comboId() + "/next")) .andExpect(method(HttpMethod.GET)) .andRespond(withSuccess(nextFactResponse(subscriptionId.topicName(), RDG.integer().next(), RDG.integer().next()), MediaType.APPLICATION_JSON)); } void expectServerWillRespondWithNextFactForSubscription(final SubscriptionId subscriptionId, final int comboTimestamp, final int comboId) { server.expect(requestTo(baseUri + "/topics/" + subscriptionId.topicName() + "/subscriptions/" + subscriptionId.comboId() + "/next")) .andExpect(method(HttpMethod.GET)) .andRespond(withSuccess(nextFactResponse(subscriptionId.topicName(), comboTimestamp, comboId), MediaType.APPLICATION_JSON)); } SubscriptionId expectServerWillAcceptSubscriptionRequestForTopic(final String topicName) { final String reference = RDG.string(10, LettersAndDigits).next(); final SubscriptionId subscriptionId = new SubscriptionId(topicName, reference); server.expect(requestTo(baseUri + "/topics/" + topicName + "/subscriptions")) .andExpect(method(HttpMethod.POST)) .andRespond(withSuccess(subscriptionResponse(subscriptionId), MediaType.APPLICATION_JSON)); return subscriptionId; } void expectServerWillRespondWithNoContent() { server.expect(anything()).andRespond(withNoContent()); } private static String subscriptionResponse(final SubscriptionId subscriptionId) { return "{ \"retrieval_url\": \"http://combo.example.com/topics/" + subscriptionId.topicName() + "/subscriptions/" + subscriptionId.comboId() + "\", \"subscription_id\": \"" + subscriptionId.comboId() + "\"}"; } private static String nextFactResponse(final String topicName, final int comboTimestamp, final int comboId) { return "{ \"comboTimestamp\": " + comboTimestamp + ", \"comboTopic\": \"" + topicName + "\", \"comboId\": " + comboId + " }"; } public void respondToPublishedFactWithAccepted(final String topicName, final Object fact) { server.expect(requestTo(baseUri + "/topics/" + topicName + "/facts")) .andExpect(method(HttpMethod.POST)) .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) .andExpect(content().string(new Gson().toJson(fact))) .andRespond(withStatus(HttpStatus.ACCEPTED)); } public void respondToPublishedFactWithBadRequest(final String topicName, final Object fact) { server.expect(requestTo(baseUri + "/topics/" + topicName + "/facts")) .andExpect(method(HttpMethod.POST)) .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) .andExpect(content().string(new Gson().toJson(fact))) .andRespond(withStatus(HttpStatus.BAD_REQUEST)); } public void verify() { server.verify(); } }