using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using WireMock.Matchers; using WireMock.Matchers.Request; using WireMock.Validation; namespace WireMock.RequestBuilders { /// /// The requests. /// public partial 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 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; } } }