< Summary - Code Coverage

Information
Class: Plainquire.Page.Swashbuckle.OpenApiOperationExtensions
Assembly: Plainquire.Page.Swashbuckle
File(s): /home/runner/work/plainquire/plainquire/Plainquire.Page/Plainquire.Page.Swashbuckle/Extensions/OpenApiOperationExtensions.cs
Tag: 64_13932151703
Line coverage
100%
Covered lines: 76
Uncovered lines: 0
Coverable lines: 76
Total lines: 135
Line coverage: 100%
Branch coverage
83%
Covered branches: 10
Total branches: 12
Branch coverage: 83.3%
Method coverage
100%
Covered methods: 9
Total methods: 9
Method coverage: 100%

Metrics

File(s)

/home/runner/work/plainquire/plainquire/Plainquire.Page/Plainquire.Page.Swashbuckle/Extensions/OpenApiOperationExtensions.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Mvc.Abstractions;
 2using Microsoft.OpenApi.Any;
 3using Microsoft.OpenApi.Interfaces;
 4using Microsoft.OpenApi.Models;
 5using Plainquire.Page.Swashbuckle.Models;
 6using System;
 7using System.Collections.Generic;
 8using System.Linq;
 9
 10namespace Plainquire.Page.Swashbuckle;
 11
 12/// <summary>
 13/// Extension methods for <see cref="OpenApiOperation"/>.
 14/// </summary>
 15public static class OpenApiOperationExtensions
 16{
 17    private const string ENTITY_PAGE_EXTENSION = "x-entity-page";
 18    private const string ENTITY_DELETE_EXTENSION = "x-entity-page-delete";
 19
 20
 21    /// <summary>
 22    /// Replaces <see cref="EntityPage{TEntity}"/> and with the sort parameters.
 23    /// </summary>
 24    /// <param name="operation">The <see cref="OpenApiOperation"/> to operate on.</param>
 25    /// <param name="parametersToReplace">The parameters to replace.</param>
 26    public static void ReplacePageParameters(this OpenApiOperation operation, IList<PageParameterReplacement> parameters
 27    {
 2328        MarkExistingParametersForDeletion(parametersToReplace);
 2329        ReplacePageNumberParameters(operation, parametersToReplace);
 2330        ReplacePageSizeParameters(operation, parametersToReplace);
 2331        RemoveParametersMarkedForDeletion(operation);
 2332    }
 33
 34    private static void ReplacePageNumberParameters(OpenApiOperation operation, IList<PageParameterReplacement> paramete
 35    {
 2336        var httpQueryParameterGroup = GroupByPageNumberHttpQueryParameterName(parametersToReplace);
 10637        foreach (var (queryParameter, parameters) in httpQueryParameterGroup)
 38        {
 3039            var openApiParameter = new OpenApiParameter
 3040            {
 3041                Name = queryParameter,
 3042                Description = "Pages the result by the given page number.",
 3043                Schema = new OpenApiSchema
 3044                {
 3045                    Type = "integer",
 3046                    Format = "int32"
 3047                },
 3048                In = ParameterLocation.Query,
 3049                Extensions = new Dictionary<string, IOpenApiExtension>(StringComparer.Ordinal)
 3050                {
 3051                    [ENTITY_PAGE_EXTENSION] = new OpenApiBoolean(true)
 3052                }
 3053            };
 54
 3055            var insertionIndex = operation.Parameters.IndexOf(parameters[0].OpenApiParameter);
 3056            operation.Parameters.Insert(insertionIndex, openApiParameter);
 57        }
 2358    }
 59
 60    private static void ReplacePageSizeParameters(OpenApiOperation operation, IList<PageParameterReplacement> parameters
 61    {
 2362        var httpQueryParameterGroup = GroupByPageSizeHttpQueryParameterName(parametersToReplace);
 10463        foreach (var (queryParameter, parameters) in httpQueryParameterGroup)
 64        {
 2965            var openApiParameter = new OpenApiParameter
 2966            {
 2967                Name = queryParameter,
 2968                Description = "Pages the result by the given page size.",
 2969                Schema = new OpenApiSchema
 2970                {
 2971                    Type = "integer",
 2972                    Format = "int32"
 2973                },
 2974                In = ParameterLocation.Query,
 2975                Extensions = new Dictionary<string, IOpenApiExtension>(StringComparer.Ordinal)
 2976                {
 2977                    [ENTITY_PAGE_EXTENSION] = new OpenApiBoolean(true)
 2978                }
 2979            };
 80
 2981            var insertionIndex = operation.Parameters.IndexOf(parameters[0].OpenApiParameter);
 2982            operation.Parameters.Insert(insertionIndex, openApiParameter);
 83        }
 2384    }
 85
 86    private static Dictionary<string, List<PageParameterReplacement>> GroupByPageNumberHttpQueryParameterName(IList<Page
 2387        => parametersToReplace
 2388            .GroupBy(parameter => GetPageNumberParameterName(parameter.OpenApiDescription.ParameterDescriptor), StringCo
 2389            .ToDictionary(
 2390                group => group.Key,
 2391                group => group.ToList(),
 2392                StringComparer.Ordinal
 2393            );
 94
 95    private static Dictionary<string, List<PageParameterReplacement>> GroupByPageSizeHttpQueryParameterName(IList<PagePa
 2396        => parametersToReplace
 2397            .GroupBy(parameter => GetPageSizeParameterName(parameter.OpenApiDescription.ParameterDescriptor), StringComp
 2398            .ToDictionary(
 2399                group => group.Key,
 23100                group => group.ToList(),
 23101                StringComparer.Ordinal
 23102            );
 103
 104    private static void MarkExistingParametersForDeletion(IList<PageParameterReplacement> parameters)
 105    {
 132106        foreach (var parameter in parameters)
 43107            parameter.OpenApiParameter.Extensions.TryAdd(ENTITY_DELETE_EXTENSION, new OpenApiBoolean(true));
 23108    }
 109
 110    private static void RemoveParametersMarkedForDeletion(OpenApiOperation operation)
 111    {
 23112        var parametersToRemove = operation.Parameters
 23113            .Where(parameter => parameter.Extensions.ContainsKey(ENTITY_DELETE_EXTENSION))
 23114            .ToList();
 115
 132116        foreach (var parameter in parametersToRemove)
 43117            operation.Parameters.Remove(parameter);
 23118    }
 119
 120    private static string GetPageNumberParameterName(ParameterDescriptor parameterDescriptor)
 121    {
 43122        var actionParameterName = parameterDescriptor.Name;
 43123        var bindingParameterName = parameterDescriptor.BindingInfo?.BinderModelName;
 43124        var (pageNumberName, _) = ParameterExtensions.GetPageParameterNames(actionParameterName, bindingParameterName);
 43125        return pageNumberName;
 126    }
 127
 128    private static string GetPageSizeParameterName(ParameterDescriptor parameterDescriptor)
 129    {
 43130        var actionParameterName = parameterDescriptor.Name;
 43131        var bindingParameterName = parameterDescriptor.BindingInfo?.BinderModelName;
 43132        var (_, pageSizeName) = ParameterExtensions.GetPageParameterNames(actionParameterName, bindingParameterName);
 43133        return pageSizeName;
 134    }
 135}