< Summary - Code Coverage

Information
Class: Plainquire.Filter.Swashbuckle.Filters.EntityFilterSetParameterReplacer
Assembly: Plainquire.Filter.Swashbuckle
File(s): /home/runner/work/plainquire/plainquire/Plainquire.Filter/Plainquire.Filter.Swashbuckle/Filters/EntityFilterSetParameterReplacer.cs
Tag: 70_19770578580
Line coverage
100%
Covered lines: 33
Uncovered lines: 0
Coverable lines: 33
Total lines: 75
Line coverage: 100%
Branch coverage
70%
Covered branches: 7
Total branches: 10
Branch coverage: 70%
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(...)50%44100%
GetEntityFilterReplacements(...)50%22100%

File(s)

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

#LineLine coverage
 1using LoxSmoke.DocXml;
 2using Microsoft.OpenApi;
 3using Plainquire.Filter.Swashbuckle.Models;
 4using Swashbuckle.AspNetCore.SwaggerGen;
 5using System;
 6using System.Collections.Generic;
 7using System.Diagnostics.CodeAnalysis;
 8using System.Linq;
 9using System.Text.Json.Nodes;
 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 EntityFilterSetParameterReplacer : IOperationFilter
 20{
 21    private readonly List<DocXmlReader> _docXmlReaders;
 22
 23    /// <summary>
 24    /// Initializes a new instance of the <see cref="EntityFilterSetParameterReplacer"/> class.
 25    /// </summary>
 26    /// <param name="xmlDocumentationFilePaths">Paths to XML documentation files. Used to provide parameter descriptions
 27    public EntityFilterSetParameterReplacer(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 ??= new List<IOpenApiParameter>();
 339        operation.Parameters.ReplaceFilterParameters(parameterReplacements, _docXmlReaders);
 40
 341        var hasParametersFromEntityFilter = parameterReplacements.Any();
 342        operation.Extensions ??= new Dictionary<string, IOpenApiExtension>(StringComparer.OrdinalIgnoreCase);
 343        operation.Extensions[OpenApiParameterExtensions.ENTITY_EXTENSION_PREFIX + "has-filter-parameters"] = new JsonNod
 344    }
 45
 46    private static List<FilterParameterReplaceInfo> GetEntityFilterReplacements(OpenApiOperation operation, OperationFil
 47    {
 348        operation.Parameters ??= new List<IOpenApiParameter>();
 349        var parameterReplacements = operation.Parameters
 350            .Join(
 351                context.ApiDescription.ParameterDescriptions,
 352                parameter => parameter.Name,
 353                description => description.Name,
 354                (parameter, description) => (Parameter: parameter, Description: description),
 355                StringComparer.Ordinal
 356            )
 357            .Where(openApi => openApi.Description.IsEntityFilterSetParameter())
 358            .GroupBy(x => x.Description.ParameterDescriptor.ParameterType)
 359            .Select(parameterGroup =>
 360            {
 361                var parametersToRemove = parameterGroup.Select(x => x.Parameter).ToList();
 362
 363                var filteredTypesToAdd = parameterGroup.Key
 364                    .GetProperties()
 365                    .Select(x => x.PropertyType)
 366                    .Where(x => x.IsGenericEntityFilter())
 367                    .ToList();
 368
 369                return new FilterParameterReplaceInfo(parametersToRemove, filteredTypesToAdd);
 370            })
 371            .ToList();
 72
 373        return parameterReplacements;
 74    }
 75}