package au.com.dius.pact.consumer; import au.com.dius.pact.consumer.dsl.DslPart; import au.com.dius.pact.model.Consumer; import au.com.dius.pact.model.InvalidPactException; import au.com.dius.pact.model.OptionalBody; import au.com.dius.pact.model.Provider; import au.com.dius.pact.model.v3.messaging.Message; import au.com.dius.pact.model.v3.messaging.MessagePact; import org.apache.http.entity.ContentType; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * PACT DSL builder for v3 specification */ public class MessagePactBuilder { /** * String constant "Content-type". */ private static final String CONTENT_TYPE = "Content-Type"; /** * The consumer for the pact. */ private Consumer consumer; /** * The producer for the pact. */ private Provider provider; /** * Producer state */ private String providerState; /** * Messages for the pact */ private List<Message> messages; /** * Creates a new instance of {@link MessagePactBuilder} * * @param consumer */ private MessagePactBuilder(String consumer) { this.consumer = new Consumer(consumer); } /** * Name the consumer of the pact * * @param consumer Consumer name */ public static MessagePactBuilder consumer(String consumer) { return new MessagePactBuilder(consumer); } /** * Name the provider that the consumer has a pact with. * * @param provider provider name * @return this builder. */ public MessagePactBuilder hasPactWith(String provider) { this.provider = new Provider(provider); return this; } /** * Sets the provider state. * * @param providerState state of the provider * @return this builder. */ public MessagePactBuilder given(String providerState) { this.providerState = providerState; return this; } /** * Adds a message expectation in the pact. * * @param description message description. */ public MessagePactBuilder expectsToReceive(String description) { Message message = new Message(description, providerState); if (messages == null) { messages = new ArrayList<Message>(); } messages.add(message); return this; } /** * */ public MessagePactBuilder withMetadata(Map<String, String> metadata) { if (messages == null || messages.isEmpty()) { throw new InvalidPactException("expectsToReceive is required before withMetaData"); } messages.get(messages.size() - 1).setMetaData(metadata); return this; } public MessagePactBuilder withContent(DslPart body) { if (messages == null || messages.isEmpty()) { throw new InvalidPactException("expectsToReceive is required before withMetaData"); } Message message = messages.get(messages.size() - 1); @SuppressWarnings("unchecked") Map<String, String> metadata = message.getMetaData(); if (metadata == null) { metadata = new HashMap<String, String>(1); metadata.put(CONTENT_TYPE, ContentType.APPLICATION_JSON.toString()); } else if (!metadata.containsKey(CONTENT_TYPE)) { metadata.put(CONTENT_TYPE, ContentType.APPLICATION_JSON.toString()); } message.setContents(OptionalBody.body(body.toString())); message.setMatchingRules(body.getMatchers()); return this; } public MessagePact toPact() { return new MessagePact(provider, consumer, messages); } }