public async Task Invoke( HttpContext httpContext, IMockacoContext mockacoContext, IOptionsSnapshot <MockacoOptions> statusCodeOptions, IMockProvider mockProvider, ILogger <ErrorHandlingMiddleware> logger) { try { await _next(httpContext); } catch (Exception ex) { logger.LogError(ex, "Error generating mocked response"); mockacoContext.Errors.Add(new Error("Error generating mocked response", ex)); } finally { if (mockacoContext.Errors.Any() && !httpContext.Response.HasStarted) { httpContext.Response.StatusCode = (int)statusCodeOptions.Value.ErrorHttpStatusCode; httpContext.Response.ContentType = HttpContentTypes.ApplicationJson; IncludeMockProviderErrors(mockacoContext, mockProvider); await httpContext.Response.WriteAsync(mockacoContext.Errors.ToJson()); } } }
public ErrorHandlingMiddlewareTest() { _next = Moq.Mock.Of <RequestDelegate>(); _statusCodeOptions = Moq.Mock.Of <IOptionsSnapshot <MockacoOptions> >(o => o.Value == new MockacoOptions()); _mockProvider = Moq.Mock.Of <IMockProvider>(); _logger = Moq.Mock.Of <ILogger <ErrorHandlingMiddleware> >(); _middleware = new ErrorHandlingMiddleware(_next); }
public async Task Invoke( HttpContext httpContext, IMockacoContext mockacoContext, IScriptContext scriptContext, IMockProvider mockProvider, ITemplateTransformer templateTransformer, IEnumerable <IRequestMatcher> requestMatchers ) { LogHttpContext(httpContext); AttachRequestToScriptContext(httpContext, mockacoContext, scriptContext); if (mockacoContext.Errors.Any()) { return; } foreach (var mock in mockProvider.GetMocks()) { if (requestMatchers.All(_ => _.IsMatch(httpContext.Request, mock))) { scriptContext.AttachRouteParameters(httpContext.Request, mock); var template = await templateTransformer.Transform(mock.RawTemplate, scriptContext); var conditionIsMatch = template.Request?.Condition ?? true; if (conditionIsMatch) { _logger.LogInformation("Incoming request matched {mock}", mock); mockacoContext.Mock = mock; mockacoContext.TransformedTemplate = template; await _next(httpContext); return; } else { _logger.LogDebug("Incoming request didn't match condition for {mock}", mock); } } else { _logger.LogDebug("Incoming request didn't match {mock}", mock); } } _logger.LogInformation("Incoming request didn't match any mock"); mockacoContext.Errors.Add(new Error("Incoming request didn't match any mock")); }
public static void UsingProvider(Func <Type, object> factoryMethod) { lock (_lock) { _instance = new FactoryMethodMockProvider(factoryMethod); } }
public static void UsingProvider(IMockProvider mockProvider) { lock (_lock) { _instance = mockProvider; } }
public ContainerContext(IContainerProfile profile, IMockProvider provider) { _profile = profile ?? throw new ArgumentNullException(nameof(profile)); _provider = provider ?? throw new ArgumentNullException(nameof(provider)); }
private static void IncludeMockProviderErrors(IMockacoContext mockacoContext, IMockProvider mockProvider) { mockacoContext.Errors .AddRange(mockProvider.GetErrors() .Select(_ => new Error($"{_.TemplateName} - {_.ErrorMessage}"))); }