< Summary - Code Coverage

Information
Class: Plainquire.Sort.Swashbuckle.Filters.EntitySortParameterReplacer
Assembly: Plainquire.Sort.Swashbuckle
File(s): /home/runner/work/plainquire/plainquire/Plainquire.Sort/Plainquire.Sort.Swashbuckle/Filters/EntitySortParameterReplacer.cs
Tag: 74_23635074410
Line coverage
96%
Covered lines: 30
Uncovered lines: 1
Coverable lines: 31
Total lines: 81
Line coverage: 96.7%
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%
IsEntitySortParameter(...)50%22100%
GetConfiguration(...)66.66%6675%

File(s)

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

#LineLine coverage
 1using Microsoft.AspNetCore.Mvc.ApiExplorer;
 2using Microsoft.Extensions.DependencyInjection;
 3using Microsoft.Extensions.Options;
 4using Microsoft.OpenApi;
 5using Plainquire.Sort.Abstractions;
 6using Plainquire.Sort.Swashbuckle.Models;
 7using Swashbuckle.AspNetCore.SwaggerGen;
 8using System;
 9using System.Collections.Generic;
 10using System.Diagnostics.CodeAnalysis;
 11using System.Linq;
 12
 13namespace Plainquire.Sort.Swashbuckle.Filters;
 14
 15/// <summary>
 16/// Replaces action parameters of type <see cref="EntitySort"/> with sortable properties of type <c>TEntity</c>.
 17/// Implements <see cref="IOperationFilter" />
 18/// </summary>
 19/// <seealso cref="IOperationFilter" />
 20[SuppressMessage("ReSharper", "ClassNeverInstantiated.Global", Justification = "Instantiated via DI.")]
 21public class EntitySortParameterReplacer : IOperationFilter
 22{
 23    private readonly IServiceProvider _serviceProvider;
 24    private readonly SortConfiguration _defaultConfiguration;
 25
 26    /// <summary>
 27    /// Initializes a new instance of the <see cref="EntitySortParameterReplacer"/> class.
 28    /// </summary>
 29    /// <param name="serviceProvider"></param>
 30    public EntitySortParameterReplacer(IServiceProvider serviceProvider)
 31    {
 3332        _serviceProvider = serviceProvider;
 3333        _defaultConfiguration = _serviceProvider.GetService<IOptions<SortConfiguration>>()?.Value ?? SortConfiguration.D
 3334    }
 35
 36    /// <summary>
 37    /// Replaces all parameters of type <see cref="EntitySort{TEntity}"/> with their applicable sort order properties.
 38    /// </summary>
 39    /// <param name="operation">The operation.</param>
 40    /// <param name="context">The context.</param>
 41    public void Apply(OpenApiOperation operation, OperationFilterContext context)
 42    {
 3143        operation.Parameters ??= new List<IOpenApiParameter>();
 3144        operation.AddOriginalIndexExtensionIfMissing(context);
 45
 3146        var parametersToReplace = context.ApiDescription.ParameterDescriptions
 3147            .Join(
 3148                operation.Parameters,
 3149                description => context.ApiDescription.ParameterDescriptions.IndexOf(description),
 3150                parameter => parameter.GetOriginalIndex(),
 3151                (description, parameter) => (Parameter: parameter, Description: description)
 3152            )
 3153            .Where(openApi => IsEntitySortParameter(openApi.Description))
 3154            .Select(openApi =>
 3155            {
 3156                var entitySortType = openApi.Description.ParameterDescriptor.ParameterType;
 3157                var configuration = GetConfiguration(entitySortType);
 3158                return new SortParameterReplacement(
 3159                    OpenApiParameter: openApi.Parameter,
 3160                    OpenApiDescription: openApi.Description,
 3161                    SortedType: entitySortType.GenericTypeArguments[0],
 3162                    Configuration: configuration);
 3163            })
 3164            .ToList();
 65
 3166        operation.ReplaceSortParameters(parametersToReplace);
 3167    }
 68
 69    [SuppressMessage("ReSharper", "ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract", Justification = "Paramet
 70    private static bool IsEntitySortParameter(ApiParameterDescription description)
 14571        => description.ParameterDescriptor != null && description.ParameterDescriptor.ParameterType.IsGenericEntitySort(
 72
 73    private SortConfiguration GetConfiguration(Type entitySortType)
 74    {
 5975        if (!entitySortType.IsGenericEntitySort())
 076            throw new ArgumentException("Type is not an EntitySort<>", nameof(entitySortType));
 77
 5978        var entityTypeConfiguration = ((EntitySort?)_serviceProvider.GetService(entitySortType))?.Configuration;
 5979        return entityTypeConfiguration ?? _defaultConfiguration;
 80    }
 81}