< Summary - Code Coverage

Information
Class: Plainquire.Filter.Swashbuckle.Filters.EntityFilterParameterReplacer
Assembly: Plainquire.Filter.Swashbuckle
File(s): /home/runner/work/plainquire/plainquire/Plainquire.Filter/Plainquire.Filter.Swashbuckle/Filters/EntityFilterParameterReplacer.cs
Tag: 64_13932151703
Line coverage
100%
Covered lines: 24
Uncovered lines: 0
Coverable lines: 24
Total lines: 66
Line coverage: 100%
Branch coverage
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage
100%
Covered methods: 3
Total methods: 3
Method coverage: 100%

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)75%44100%
Apply(...)100%11100%
GetEntityFilterReplacements(...)100%11100%

File(s)

/home/runner/work/plainquire/plainquire/Plainquire.Filter/Plainquire.Filter.Swashbuckle/Filters/EntityFilterParameterReplacer.cs

#LineLine coverage
 1using LoxSmoke.DocXml;
 2using Microsoft.OpenApi.Any;
 3using Microsoft.OpenApi.Models;
 4using Plainquire.Filter.Swashbuckle.Models;
 5using Swashbuckle.AspNetCore.SwaggerGen;
 6using System;
 7using System.Collections.Generic;
 8using System.Diagnostics.CodeAnalysis;
 9using System.Linq;
 10
 11namespace Plainquire.Filter.Swashbuckle.Filters;
 12
 13/// <summary>
 14/// Replaces action parameters of type <see cref="EntityFilter"/> with filterable properties of type <c>TEntity</c>.
 15/// Implements <see cref="IOperationFilter" />
 16/// </summary>
 17/// <seealso cref="IOperationFilter" />
 18[SuppressMessage("ReSharper", "ClassNeverInstantiated.Global", Justification = "Instantiated via reflection.")]
 19public class EntityFilterParameterReplacer : IOperationFilter
 20{
 21    private readonly List<DocXmlReader> _docXmlReaders;
 22
 23    /// <summary>
 24    /// Initializes a new instance of the <see cref="EntityFilterParameterReplacer"/> class.
 25    /// </summary>
 26    /// <param name="xmlDocumentationFilePaths">Paths to XML documentation files. Used to provide parameter descriptions
 27    public EntityFilterParameterReplacer(IEnumerable<string>? xmlDocumentationFilePaths)
 628        => _docXmlReaders = xmlDocumentationFilePaths?.Select(x => new DocXmlReader(x)).ToList() ?? [];
 29
 30    /// <summary>
 31    /// Replaces all parameters of type <see cref="EntityFilter{TEntity}"/> with their applicable filter properties.
 32    /// </summary>
 33    /// <param name="operation">The operation.</param>
 34    /// <param name="context">The context.</param>
 35    public void Apply(OpenApiOperation operation, OperationFilterContext context)
 36    {
 337        var parameterReplacements = GetEntityFilterReplacements(operation, context);
 338        operation.Parameters.ReplaceFilterParameters(parameterReplacements, _docXmlReaders);
 39
 340        var hasParametersFromEntityFilter = parameterReplacements.Any();
 341        operation.Extensions[OpenApiParameterExtensions.ENTITY_EXTENSION_PREFIX + "has-filter-parameters"] = new OpenApi
 342    }
 43
 44    private static List<FilterParameterReplaceInfo> GetEntityFilterReplacements(OpenApiOperation operation, OperationFil
 45    {
 346        var parameterReplacements = operation.Parameters
 347            .Join(
 348                context.ApiDescription.ParameterDescriptions,
 349                parameter => parameter.Name,
 350                description => description.Name,
 351                (parameter, description) => (Parameter: parameter, Description: description),
 352                StringComparer.Ordinal
 353             )
 354            .Where(openApi => openApi.Description.IsEntityFilterParameter())
 355            .GroupBy(openApi => openApi.Description.ParameterDescriptor.ParameterType)
 356            .Select(parameterGroup =>
 357            {
 358                var parametersToRemove = parameterGroup.Select(x => x.Parameter).ToList();
 359                var filteredTypesToAdd = new[] { parameterGroup.Key }.ToList();
 360                return new FilterParameterReplaceInfo(parametersToRemove, filteredTypesToAdd);
 361            })
 362            .ToList();
 63
 364        return parameterReplacements;
 65    }
 66}