< Summary - Code Coverage

Information
Class: Plainquire.Page.Mvc.ModelBinders.EntityPageModelBinder
Assembly: Plainquire.Page.Mvc
File(s): /home/runner/work/plainquire/plainquire/Plainquire.Page/Plainquire.Page.Mvc/ModelBinders/EntityPageModelBinder.cs
Tag: 64_13932151703
Line coverage
94%
Covered lines: 36
Uncovered lines: 2
Coverable lines: 38
Total lines: 85
Line coverage: 94.7%
Branch coverage
78%
Covered branches: 22
Total branches: 28
Branch coverage: 78.5%
Method coverage
100%
Covered methods: 3
Total methods: 3
Method coverage: 100%

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
BindModelAsync(...)72.22%181892.59%
GetParameterValue(...)100%11100%
CreateEntityPage(...)90%1010100%

File(s)

/home/runner/work/plainquire/plainquire/Plainquire.Page/Plainquire.Page.Mvc/ModelBinders/EntityPageModelBinder.cs

#LineLine coverage
 1
 2
 3using Microsoft.AspNetCore.Mvc.ModelBinding;
 4using Microsoft.Extensions.DependencyInjection;
 5using Microsoft.Extensions.Options;
 6using Plainquire.Filter.Abstractions;
 7using Plainquire.Page.Abstractions;
 8using System;
 9using System.Globalization;
 10using System.Linq;
 11using System.Reflection;
 12using System.Threading.Tasks;
 13
 14namespace Plainquire.Page.Mvc.ModelBinders;
 15
 16/// <summary>
 17/// ModelBinder for <see cref="EntityPage{TEntity}"/>
 18/// Implements <see cref="IModelBinder" />
 19/// </summary>
 20/// <seealso cref="IModelBinder" />
 21public class EntityPageModelBinder : IModelBinder
 22{
 23    /// <inheritdoc />
 24    public Task BindModelAsync(ModelBindingContext bindingContext)
 25    {
 1926        if (bindingContext == null)
 027            throw new ArgumentNullException(nameof(bindingContext));
 28
 1929        var serviceProvider = bindingContext.ActionContext.HttpContext.RequestServices;
 30
 1931        var isGenericPage = bindingContext.ModelType.IsGenericType;
 1932        var pageType = isGenericPage ? bindingContext.ModelType.GenericTypeArguments[0] : null;
 1933        var entityPage = CreateEntityPage(pageType, serviceProvider);
 34
 1935        var parameterOrPropertyName = bindingContext.ModelMetadata.ParameterName ?? bindingContext.ModelMetadata.Propert
 1936        if (parameterOrPropertyName == null)
 037            throw new InvalidOperationException("Unable to get original parameter name.");
 38
 1939        var (pageParameterName, pageSizeParameterName) = ParameterExtensions
 1940            .GetPageParameterNames(parameterOrPropertyName, bindingContext.OriginalModelName);
 41
 1942        var pageParameterValue = bindingContext.HttpContext.Request.Query.Keys
 1943            .Where(queryParameter => queryParameter.Equals(pageParameterName, StringComparison.OrdinalIgnoreCase))
 1944            .Select(queryParameter => GetParameterValue(queryParameter, bindingContext))
 1945            .FirstOrDefault();
 46
 1947        var pageSizeParameterValue = bindingContext.HttpContext.Request.Query.Keys
 1948            .Where(queryParameter => queryParameter.Equals(pageSizeParameterName, StringComparison.OrdinalIgnoreCase))
 1949            .Select(queryParameter => GetParameterValue(queryParameter, bindingContext))
 1950            .FirstOrDefault();
 51
 1952        var pageSizeFromFilterAttribute = pageType?
 1953            .GetCustomAttribute<EntityFilterAttribute>()?
 1954            .PageSize
 1955            .ToString(CultureInfo.InvariantCulture);
 56
 1957        entityPage.PageNumberValue = pageParameterValue ?? string.Empty;
 1958        entityPage.PageSizeValue = pageSizeParameterValue ?? pageSizeFromFilterAttribute ?? string.Empty;
 59
 1960        bindingContext.Result = ModelBindingResult.Success(entityPage);
 61
 1962        return Task.CompletedTask;
 63    }
 64
 65    private static string? GetParameterValue(string queryParameter, ModelBindingContext bindingContext)
 3366        => bindingContext.ValueProvider.GetValue(queryParameter).FirstValue;
 67
 68    private static EntityPage CreateEntityPage(Type? pageType, IServiceProvider serviceProvider)
 69    {
 1970        if (pageType == null)
 1071            return new EntityPage();
 72
 973        var entityPageType = typeof(EntityPage<>).MakeGenericType(pageType);
 974        var entityPageInstance = Activator.CreateInstance(entityPageType)
 975            ?? throw new InvalidOperationException($"Unable to create instance of type {entityPageType.Name}");
 76
 977        var entityPage = (EntityPage)entityPageInstance;
 78
 979        var prototypeConfiguration = ((EntityPage?)serviceProvider.GetService(entityPageType))?.Configuration;
 980        var injectedConfiguration = serviceProvider.GetService<IOptions<PageConfiguration>>()?.Value;
 981        entityPage.Configuration = prototypeConfiguration ?? injectedConfiguration;
 82
 983        return entityPage;
 84    }
 85}