using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using WireMock.Matchers; using WireMock.Matchers.Request; using WireMock.Util; using WireMock.Validation; namespace WireMock.RequestBuilders { /// /// The requests. /// public class Request : RequestMessageCompositeMatcher, IRequestBuilder { private readonly IList _requestMatchers; /// /// Creates this instance. /// /// The . public static IRequestBuilder Create() { return new Request(new List()); } /// /// Initializes a new instance of the class. /// /// The request matchers. private Request(IList requestMatchers) : base(requestMatchers) { _requestMatchers = requestMatchers; } /// /// Gets the request message matchers. /// /// Type of IRequestMatcher /// A List{T} public IList GetRequestMessageMatchers() where T : IRequestMatcher { return new ReadOnlyCollection(_requestMatchers.Where(rm => rm is T).Cast().ToList()); } /// /// Gets the request message matcher. /// /// Type of IRequestMatcher /// A RequestMatcher public T GetRequestMessageMatcher() where T : IRequestMatcher { return _requestMatchers.Where(rm => rm is T).Cast().FirstOrDefault(); } /// public IRequestBuilder WithClientIP(params IStringMatcher[] matchers) { Check.NotNullOrEmpty(matchers, nameof(matchers)); _requestMatchers.Add(new RequestMessageClientIPMatcher(matchers)); return this; } /// public IRequestBuilder WithClientIP(params string[] clientIPs) { return WithClientIP(MatchBehaviour.AcceptOnMatch, clientIPs); } /// public IRequestBuilder WithClientIP(MatchBehaviour matchBehaviour, params string[] clientIPs) { Check.NotNullOrEmpty(clientIPs, nameof(clientIPs)); _requestMatchers.Add(new RequestMessageClientIPMatcher(matchBehaviour, clientIPs)); return this; } /// public IRequestBuilder WithClientIP(params Func[] funcs) { Check.NotNullOrEmpty(funcs, nameof(funcs)); _requestMatchers.Add(new RequestMessageClientIPMatcher(funcs)); return this; } /// public IRequestBuilder WithPath(params IStringMatcher[] matchers) { Check.NotNullOrEmpty(matchers, nameof(matchers)); _requestMatchers.Add(new RequestMessagePathMatcher(matchers)); return this; } /// public IRequestBuilder WithPath(params string[] paths) { return WithPath(MatchBehaviour.AcceptOnMatch, paths); } /// public IRequestBuilder WithPath(MatchBehaviour matchBehaviour, params string[] paths) { Check.NotNullOrEmpty(paths, nameof(paths)); _requestMatchers.Add(new RequestMessagePathMatcher(matchBehaviour, paths)); return this; } /// public IRequestBuilder WithPath(params Func[] funcs) { Check.NotNullOrEmpty(funcs, nameof(funcs)); _requestMatchers.Add(new RequestMessagePathMatcher(funcs)); return this; } /// public IRequestBuilder WithUrl(params IStringMatcher[] matchers) { Check.NotNullOrEmpty(matchers, nameof(matchers)); _requestMatchers.Add(new RequestMessageUrlMatcher(matchers)); return this; } /// public IRequestBuilder WithUrl(params string[] urls) { return WithUrl(MatchBehaviour.AcceptOnMatch, urls); } /// public IRequestBuilder WithUrl(MatchBehaviour matchBehaviour, params string[] urls) { Check.NotNullOrEmpty(urls, nameof(urls)); _requestMatchers.Add(new RequestMessageUrlMatcher(matchBehaviour, urls)); return this; } /// public IRequestBuilder WithUrl(params Func[] funcs) { Check.NotNullOrEmpty(funcs, nameof(funcs)); _requestMatchers.Add(new RequestMessageUrlMatcher(funcs)); return this; } /// public IRequestBuilder UsingDelete(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) { _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, "delete")); return this; } /// public IRequestBuilder UsingGet(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) { _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, "get")); return this; } /// public IRequestBuilder UsingHead(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) { _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, "head")); return this; } /// public IRequestBuilder UsingPost(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) { _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, "post")); return this; } /// public IRequestBuilder UsingPatch(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) { _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, "patch")); return this; } /// public IRequestBuilder UsingPut(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) { _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, "put")); return this; } /// public IRequestBuilder UsingAnyMethod() { var matchers = _requestMatchers.Where(m => m is RequestMessageMethodMatcher).ToList(); foreach (var matcher in matchers) { _requestMatchers.Remove(matcher); } return this; } /// public IRequestBuilder UsingAnyVerb() { return UsingAnyMethod(); } /// public IRequestBuilder UsingMethod(params string[] methods) { return UsingMethod(MatchBehaviour.AcceptOnMatch, methods); } /// public IRequestBuilder UsingVerb(params string[] verbs) { return UsingMethod(verbs); } /// public IRequestBuilder UsingMethod(MatchBehaviour matchBehaviour, params string[] methods) { Check.NotNullOrEmpty(methods, nameof(methods)); _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, methods)); return this; } /// public IRequestBuilder WithBody(string body, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) { _requestMatchers.Add(new RequestMessageBodyMatcher(matchBehaviour, body)); return this; } /// public IRequestBuilder WithBody(byte[] body, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) { _requestMatchers.Add(new RequestMessageBodyMatcher(matchBehaviour, body)); return this; } /// public IRequestBuilder WithBody(object body, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) { _requestMatchers.Add(new RequestMessageBodyMatcher(matchBehaviour, body)); return this; } /// public IRequestBuilder WithBody(IMatcher matcher) { Check.NotNull(matcher, nameof(matcher)); _requestMatchers.Add(new RequestMessageBodyMatcher(matcher)); return this; } /// public IRequestBuilder WithBody(Func func) { Check.NotNull(func, nameof(func)); _requestMatchers.Add(new RequestMessageBodyMatcher(func)); return this; } /// public IRequestBuilder WithBody(Func func) { Check.NotNull(func, nameof(func)); _requestMatchers.Add(new RequestMessageBodyMatcher(func)); return this; } /// public IRequestBuilder WithBody(Func func) { Check.NotNull(func, nameof(func)); _requestMatchers.Add(new RequestMessageBodyMatcher(func)); return this; } /// public IRequestBuilder WithParam(string key, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) { Check.NotNull(key, nameof(key)); _requestMatchers.Add(new RequestMessageParamMatcher(matchBehaviour, key)); return this; } /// public IRequestBuilder WithParam(string key, params string[] values) { return WithParam(key, MatchBehaviour.AcceptOnMatch, values); } /// public IRequestBuilder WithParam(string key, MatchBehaviour matchBehaviour, params string[] values) { Check.NotNull(key, nameof(key)); _requestMatchers.Add(new RequestMessageParamMatcher(matchBehaviour, key, values)); return this; } /// public IRequestBuilder WithParam(params Func>, bool>[] funcs) { Check.NotNullOrEmpty(funcs, nameof(funcs)); _requestMatchers.Add(new RequestMessageParamMatcher(funcs)); return this; } /// public IRequestBuilder WithHeader(string name, string pattern, MatchBehaviour matchBehaviour) { return WithHeader(name, pattern, true, matchBehaviour); } /// public IRequestBuilder WithHeader(string name, string pattern, bool ignoreCase = true, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) { Check.NotNull(name, nameof(name)); Check.NotNull(pattern, nameof(pattern)); _requestMatchers.Add(new RequestMessageHeaderMatcher(matchBehaviour, name, pattern, ignoreCase)); return this; } /// public IRequestBuilder WithHeader(string name, string[] patterns, MatchBehaviour matchBehaviour) { return WithHeader(name, patterns, true, matchBehaviour); } /// public IRequestBuilder WithHeader(string name, string[] patterns, bool ignoreCase = true, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) { Check.NotNull(name, nameof(name)); Check.NotNull(patterns, nameof(patterns)); _requestMatchers.Add(new RequestMessageHeaderMatcher(matchBehaviour, name, patterns, ignoreCase)); return this; } /// public IRequestBuilder WithHeader(string name, params IStringMatcher[] matchers) { Check.NotNull(name, nameof(name)); Check.NotNullOrEmpty(matchers, nameof(matchers)); _requestMatchers.Add(new RequestMessageHeaderMatcher(name, matchers)); return this; } /// public IRequestBuilder WithHeader(params Func, bool>[] funcs) { Check.NotNullOrEmpty(funcs, nameof(funcs)); _requestMatchers.Add(new RequestMessageHeaderMatcher(funcs)); return this; } /// public IRequestBuilder WithCookie(string name, string pattern, bool ignoreCase = true, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) { _requestMatchers.Add(new RequestMessageCookieMatcher(matchBehaviour, name, pattern, ignoreCase)); return this; } /// public IRequestBuilder WithCookie(string name, params IStringMatcher[] matchers) { Check.NotNullOrEmpty(matchers, nameof(matchers)); _requestMatchers.Add(new RequestMessageCookieMatcher(name, matchers)); return this; } /// public IRequestBuilder WithCookie(params Func, bool>[] funcs) { Check.NotNullOrEmpty(funcs, nameof(funcs)); _requestMatchers.Add(new RequestMessageCookieMatcher(funcs)); return this; } } }