< Summary - Code Coverage

Information
Class: Plainquire.Sort.Swashbuckle.Filters.EntitySortSetParameterReplacer
Assembly: Plainquire.Sort.Swashbuckle
File(s): /home/runner/work/plainquire/plainquire/Plainquire.Sort/Plainquire.Sort.Swashbuckle/Filters/EntitySortSetParameterReplacer.cs
Tag: 71_21978539030
Line coverage
96%
Covered lines: 32
Uncovered lines: 1
Coverable lines: 33
Total lines: 80
Line coverage: 96.9%
Branch coverage
75%
Covered branches: 12
Total branches: 16
Branch coverage: 75%
Method coverage
100%
Covered methods: 4
Total methods: 4
Method coverage: 100%

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)83.33%66100%
Apply(...)50%22100%
IsEntitySortSetParameter(...)50%22100%
GetConfiguration(...)66.66%6675%

File(s)

/home/runner/work/plainquire/plainquire/Plainquire.Sort/Plainquire.Sort.Swashbuckle/Filters/EntitySortSetParameterReplacer.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Mvc.ApiExplorer;
 2using Microsoft.Extensions.DependencyInjection;
 3using Microsoft.Extensions.Options;
 4using Microsoft.OpenApi;
 5using Plainquire.Filter.Abstractions;
 6using Plainquire.Sort.Abstractions;
 7using Plainquire.Sort.Swashbuckle.Models;
 8using Swashbuckle.AspNetCore.SwaggerGen;
 9using System;
 10using System.Collections.Generic;
 11using System.Diagnostics.CodeAnalysis;
 12using System.Linq;
 13using System.Reflection;
 14
 15namespace Plainquire.Sort.Swashbuckle.Filters;
 16
 17/// <summary>
 18/// Replaces action parameters of type <see cref="IOperationFilter"/> with filterable properties of type <c>TEntity</c>.
 19/// Implements <see cref="IOperationFilter" />
 20/// </summary>
 21/// <seealso cref="EntitySort" />
 22[SuppressMessage("ReSharper", "ClassNeverInstantiated.Global", Justification = "Created by reflection")]
 23public class EntitySortSetParameterReplacer : IOperationFilter
 24{
 25    private readonly IServiceProvider _serviceProvider;
 26    private readonly SortConfiguration _defaultConfiguration;
 27
 28    /// <summary>
 29    /// Initializes a new instance of the <see cref="EntitySortSetParameterReplacer"/> class.
 30    /// </summary>
 31    /// <param name="serviceProvider"></param>
 32    public EntitySortSetParameterReplacer(IServiceProvider serviceProvider)
 33    {
 3234        _serviceProvider = serviceProvider;
 3235        _defaultConfiguration = _serviceProvider.GetService<IOptions<SortConfiguration>>()?.Value ?? SortConfiguration.D
 3236    }
 37
 38    /// <inheritdoc />
 39    public void Apply(OpenApiOperation operation, OperationFilterContext context)
 40    {
 2941        operation.Parameters ??= new List<IOpenApiParameter>();
 2942        var parametersToReplace = operation.Parameters
 2943            .Join(
 2944                context.ApiDescription.ParameterDescriptions,
 2945                parameter => operation.Parameters.IndexOf(parameter),
 2946                description => context.ApiDescription.ParameterDescriptions.IndexOf(description),
 2947                (parameter, description) => (Parameter: parameter, Description: description)
 2948            )
 2949            .Where(openApi => IsEntitySortSetParameter(openApi.Description))
 2950            .SelectMany(openApi =>
 2951                openApi.Description.ParameterDescriptor
 2952                    .ParameterType
 2953                    .GetProperties()
 2954                    .Select(x => x.PropertyType)
 2955                    .Where(type => type.IsGenericEntitySort())
 2956                    .Select(entitySortType => new SortParameterReplacement(
 2957                        OpenApiParameter: openApi.Parameter,
 2958                        OpenApiDescription: openApi.Description,
 2959                        SortedType: entitySortType.GenericTypeArguments[0],
 2960                        Configuration: GetConfiguration(entitySortType))
 2961                    )
 2962            )
 2963            .ToList();
 64
 2965        operation.ReplaceSortParameters(parametersToReplace);
 2966    }
 67
 68    [SuppressMessage("ReSharper", "ConditionalAccessQualifierIsNonNullableAccordingToAPIContract", Justification = "Para
 69    private static bool IsEntitySortSetParameter(ApiParameterDescription description)
 9870        => description.ParameterDescriptor?.ParameterType.GetCustomAttribute<EntitySortSetAttribute>() != null;
 71
 72    private SortConfiguration GetConfiguration(Type entitySortType)
 73    {
 3274        if (!entitySortType.IsGenericEntitySort())
 075            throw new ArgumentException("Type is not an EntitySort<>", nameof(entitySortType));
 76
 3277        var entityTypeConfiguration = ((EntitySort?)_serviceProvider.GetService(entitySortType))?.Configuration;
 3278        return entityTypeConfiguration ?? _defaultConfiguration;
 79    }
 80}