< Summary - Code Coverage

Information
Class: Plainquire.Filter.Mvc.ModelBinders.EntityFilterModelBinder
Assembly: Plainquire.Filter.Mvc
File(s): /home/runner/work/plainquire/plainquire/Plainquire.Filter/Plainquire.Filter.Mvc/ModelBinders/EntityFilterModelBinder.cs
Tag: 64_13932151703
Line coverage
91%
Covered lines: 22
Uncovered lines: 2
Coverable lines: 24
Total lines: 60
Line coverage: 91.6%
Branch coverage
83%
Covered branches: 15
Total branches: 18
Branch coverage: 83.3%
Method coverage
100%
Covered methods: 2
Total methods: 2
Method coverage: 100%

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
BindModelAsync(...)75%8892.85%
CreateEntityFilter(...)80%101090%

File(s)

/home/runner/work/plainquire/plainquire/Plainquire.Filter/Plainquire.Filter.Mvc/ModelBinders/EntityFilterModelBinder.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Mvc.ModelBinding;
 2using Microsoft.Extensions.DependencyInjection;
 3using Microsoft.Extensions.Options;
 4using Plainquire.Filter.Abstractions;
 5using System;
 6using System.Reflection;
 7using System.Threading.Tasks;
 8
 9namespace Plainquire.Filter.Mvc.ModelBinders;
 10
 11/// <summary>
 12/// ModelBinder for <see cref="EntityFilter{TEntity}"/>
 13/// Implements <see cref="IModelBinder" />
 14/// </summary>
 15/// <seealso cref="IModelBinder" />
 16public class EntityFilterModelBinder : IModelBinder
 17{
 18    /// <inheritdoc />
 19    public Task BindModelAsync(ModelBindingContext bindingContext)
 20    {
 1021        if (bindingContext == null)
 022            throw new ArgumentNullException(nameof(bindingContext));
 23
 1024        var serviceProvider = bindingContext.ActionContext.HttpContext.RequestServices;
 1025        var filteredType = bindingContext.ModelType.GetGenericArguments()[0];
 26
 1027        var filterableProperties = filteredType.GetFilterableProperties();
 1028        var entityFilterAttribute = filteredType.GetCustomAttribute<EntityFilterAttribute>();
 1029        var entityFilter = CreateEntityFilter(filteredType, serviceProvider);
 30
 8431        foreach (var property in filterableProperties)
 32        {
 3233            var parameterName = property.GetFilterParameterName(entityFilterAttribute?.Prefix);
 3234            var parameterValues = bindingContext.ValueProvider.GetValue(parameterName);
 8435            foreach (var filterSyntax in parameterValues)
 1036                entityFilter.PropertyFilters.Add(new PropertyFilter(property.Name, ValueFiltersFactory.Create(filterSynt
 37        }
 38
 1039        bindingContext.Result = ModelBindingResult.Success(entityFilter);
 1040        return Task.CompletedTask;
 41    }
 42
 43    private static EntityFilter CreateEntityFilter(Type? type, IServiceProvider serviceProvider)
 44    {
 1045        if (type == null)
 046            return new EntityFilter();
 47
 1048        var entityFilterType = typeof(EntityFilter<>).MakeGenericType(type);
 1049        var entityFilterInstance = Activator.CreateInstance(entityFilterType)
 1050            ?? throw new InvalidOperationException($"Unable to create instance of type {entityFilterType.Name}");
 51
 1052        var entityFilter = (EntityFilter)entityFilterInstance;
 53
 1054        var prototypeConfiguration = ((EntityFilter?)serviceProvider.GetService(entityFilterType))?.Configuration;
 1055        var injectedConfiguration = serviceProvider.GetService<IOptions<FilterConfiguration>>()?.Value;
 1056        entityFilter.Configuration = prototypeConfiguration ?? injectedConfiguration;
 57
 1058        return entityFilter;
 59    }
 60}