示例#1
0
        public async Task <FullStubModel> Handle(AddStubCommand request, CancellationToken cancellationToken)
        {
            // Delete stub with same ID.
            await _stubContext.DeleteStubAsync(request.Stub.Id);

            return(await _stubContext.AddStubAsync(request.Stub));
        }
示例#2
0
    /// <inheritdoc />
    public async Task <Unit> Handle(UpdateStubCommand request, CancellationToken cancellationToken)
    {
        var validationResults = _stubModelValidator.ValidateStubModel(request.Stub).ToArray();

        if (validationResults.Any())
        {
            throw new ValidationException(validationResults);
        }

        // Check that the stub is not read-only.
        const string exceptionFormat = "Stub with ID '{0}' is read-only; it can not be updated through the API.";
        var          oldStub         = await _stubContext.GetStubAsync(request.StubId);

        if (oldStub?.Metadata?.ReadOnly == true)
        {
            throw new ValidationException(string.Format(exceptionFormat, request.StubId));
        }

        var newStub = await _stubContext.GetStubAsync(request.Stub.Id);

        if (newStub?.Metadata?.ReadOnly == true)
        {
            throw new ValidationException(string.Format(exceptionFormat, request.Stub.Id));
        }

        await _stubContext.DeleteStubAsync(request.StubId);

        await _stubContext.DeleteStubAsync(request.Stub.Id);

        await _stubContext.AddStubAsync(request.Stub);

        return(Unit.Value);
    }
示例#3
0
        public async Task <Unit> Handle(UpdateStubCommand request, CancellationToken cancellationToken)
        {
            // Delete stub with same ID.
            await _stubContext.DeleteStubAsync(request.StubId);

            await _stubContext.DeleteStubAsync(request.Stub.Id);

            await _stubContext.AddStubAsync(request.Stub);

            return(Unit.Value);
        }
示例#4
0
    private async Task <FullStubModel> CreateStub(bool doNotCreateStub, StubModel stub)
    {
        if (doNotCreateStub)
        {
            return(new FullStubModel {
                Stub = stub, Metadata = new StubMetadataModel()
            });
        }

        await _stubContext.DeleteStubAsync(stub.Id);

        return(await _stubContext.AddStubAsync(stub));
    }
    /// <inheritdoc />
    public async Task <FullStubModel> Handle(AddStubCommand request, CancellationToken cancellationToken)
    {
        var validationResults = _stubModelValidator.ValidateStubModel(request.Stub).ToArray();

        if (validationResults.Any())
        {
            throw new ValidationException(validationResults);
        }

        // Delete stub with same ID.
        await _stubContext.DeleteStubAsync(request.Stub.Id);

        return(await _stubContext.AddStubAsync(request.Stub));
    }
    private async Task <FullStubModel> CreateStub(bool doNotCreateStub, OpenApiServer server, OpenApiLine line, string tenant)
    {
        var stub = await _openApiToStubConverter.ConvertToStubAsync(server, line, tenant);

        if (doNotCreateStub)
        {
            return(new FullStubModel {
                Stub = stub, Metadata = new StubMetadataModel()
            });
        }

        await _stubContext.DeleteStubAsync(stub.Id);

        return(await _stubContext.AddStubAsync(stub));
    }
示例#7
0
    /// <inheritdoc />
    public async Task <FullStubModel> GenerateStubBasedOnRequestAsync(
        string requestCorrelationId,
        bool doNotCreateStub)
    {
        _logger.LogDebug($"Creating stub based on request with corr.ID '{requestCorrelationId}'.");
        var requestResult = await _stubContext.GetRequestResultAsync(requestCorrelationId);

        if (requestResult == null)
        {
            throw new NotFoundException(nameof(RequestResultModel), requestCorrelationId);
        }

        var request = _mapper.Map <HttpRequestModel>(requestResult.RequestParameters);
        var stub    = new StubModel
        {
            Conditions = await _httpRequestToConditionsService.ConvertToConditionsAsync(request),
            Response   =
            {
                Text = "OK!"
            }
        };

        // Generate an ID based on the created stub.
        var contents = JsonConvert.SerializeObject(stub);

        stub.EnsureStubId();

        FullStubModel result;

        if (doNotCreateStub)
        {
            result = new FullStubModel {
                Stub = stub, Metadata = new StubMetadataModel()
            };
        }
        else
        {
            await _stubContext.DeleteStubAsync(stub.Id);

            result = await _stubContext.AddStubAsync(stub);
        }

        _logger.LogInformation($"Stub with ID '{stub.Id}' generated!");

        return(result);
    }
        public async Task <FullStubModel> GenerateStubBasedOnRequestAsync(string requestCorrelationId)
        {
            _logger.LogInformation($"Creating stub based on request with corr.ID '{requestCorrelationId}'.");

            // TODO lateron, when the querying is fixed, only query for one request result.
            var requestResults = await _stubContext.GetRequestResultsAsync();

            var requestResult = requestResults.FirstOrDefault(r => r.CorrelationId == requestCorrelationId);

            if (requestResult == null)
            {
                throw new NotFoundException(nameof(RequestResultModel), requestCorrelationId);
            }

            var stub = new StubModel();

            foreach (var handler in _handlers.OrderByDescending(w => w.Priority))
            {
                var executed = await handler.HandleStubGenerationAsync(requestResult, stub);

                _logger.LogInformation($"Handler '{handler.GetType().Name}'" + (executed ? " executed" : "") + ".");
            }

            // Set a default response
            stub.Response.Text = "OK!";

            // Generate an ID based on the created stub.
            var contents = JsonConvert.SerializeObject(stub);

            stub.Id = "generated-" + HashingUtilities.GetMd5String(contents);
            await _stubContext.DeleteStubAsync(stub.Id);

            var result = await _stubContext.AddStubAsync(stub);

            _logger.LogInformation($"Stub with ID '{stub.Id}' generated!");

            return(result);
        }
示例#9
0
    /// <inheritdoc />
    public async Task <IEnumerable <FullStubModel> > Handle(
        AddStubsCommand request,
        CancellationToken cancellationToken)
    {
        if (request.Stubs == null || !request.Stubs.Any())
        {
            throw new ArgumentException("No stubs posted.");
        }

        // Validate posted stubs.
        var stubsToAdd        = request.Stubs.ToArray();
        var validationResults = stubsToAdd
                                .SelectMany(s =>
        {
            var validation = _stubModelValidator.ValidateStubModel(s);
            return(!string.IsNullOrWhiteSpace(s.Id)
                    ? validation.Select(v => $"{s.Id}: {v}")
                    : validation);
        })
                                .ToArray();

        if (validationResults.Any())
        {
            throw new ValidationException(validationResults);
        }

        // Validate that none of the posted stubs have the same ID.
        var duplicateIds = stubsToAdd
                           .Select(s => s.Id)
                           .GroupBy(id => id, StringComparer.OrdinalIgnoreCase)
                           .Where(g => g.Count() > 1)
                           .Select(g => g.Key)
                           .ToArray();

        if (duplicateIds.Any())
        {
            throw new ArgumentException(
                      $"The following stub IDs are posted more than once: {string.Join(", ", duplicateIds)}");
        }

        // Validated that no stubs with the same ID exist in readonly stub sources.
        var stubsFromReadonlySource = await _stubContext.GetStubsFromReadOnlySourcesAsync();

        var duplicateStubs = stubsFromReadonlySource.Where(r =>
                                                           stubsToAdd.Any(s => string.Equals(s.Id, r.Stub.Id, StringComparison.OrdinalIgnoreCase))).ToArray();

        if (duplicateStubs.Any())
        {
            throw new ValidationException(duplicateStubs.Select(s => $"Stub with ID already exists: {s.Stub.Id}"));
        }

        // Add the stubs.
        var result = new List <FullStubModel>();

        foreach (var stub in stubsToAdd)
        {
            // First, delete existing stub with same ID.
            await _stubContext.DeleteStubAsync(stub.Id);

            result.Add(await _stubContext.AddStubAsync(stub));
        }

        return(result);
    }