< 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: 74_23635074410
Line coverage
90%
Covered lines: 18
Uncovered lines: 2
Coverable lines: 20
Total lines: 55
Line coverage: 90%
Branch coverage
80%
Covered branches: 8
Total branches: 10
Branch coverage: 80%
Method coverage
100%
Covered methods: 2
Total methods: 2
Method coverage: 100%

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
BindModelAsync(...)50%2292.3%
GetFilterConfiguration(...)87.5%8885.71%

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.Collections.Generic;
 7using System.Linq;
 8using System.Threading.Tasks;
 9
 10namespace Plainquire.Filter.Mvc.ModelBinders;
 11
 12/// <summary>
 13/// ModelBinder for <see cref="EntityFilter{TEntity}"/>
 14/// Implements <see cref="IModelBinder" />
 15/// </summary>
 16/// <seealso cref="IModelBinder" />
 17public class EntityFilterModelBinder : IModelBinder
 18{
 19    /// <inheritdoc />
 20    public Task BindModelAsync(ModelBindingContext bindingContext)
 21    {
 1222        if (bindingContext == null)
 023            throw new ArgumentNullException(nameof(bindingContext));
 24
 1225        var request = bindingContext.ActionContext.HttpContext.Request;
 26
 1227        var filteredType = bindingContext.ModelType.GetGenericArguments()[0];
 1228        var serviceProvider = bindingContext.ActionContext.HttpContext.RequestServices;
 1229        var configuration = GetFilterConfiguration(filteredType, serviceProvider);
 1230        var entityFilter = EntityFilterFactory.Create(filteredType, configuration);
 31
 1232        var filters = request.Query
 1233            .SelectMany(kvp => kvp.Value.Select(value => new KeyValuePair<string, string?>(kvp.Key, value)))
 1234            .ToArray();
 35
 1236        entityFilter.ApplyFromSyntax(filteredType, filters);
 37
 1238        bindingContext.Result = ModelBindingResult.Success(entityFilter);
 39
 1240        return Task.CompletedTask;
 41    }
 42
 43    private static FilterConfiguration? GetFilterConfiguration(Type? entityType, IServiceProvider serviceProvider)
 44    {
 1245        if (entityType == null)
 046            return null;
 47
 1248        var entityFilterType = typeof(EntityFilter<>).MakeGenericType(entityType);
 1249        var prototypeConfiguration = ((EntityFilter?)serviceProvider.GetService(entityFilterType))?.Configuration;
 1250        var injectedConfiguration = serviceProvider.GetService<IOptions<FilterConfiguration>>()?.Value;
 51
 1252        var configuration = prototypeConfiguration ?? injectedConfiguration;
 1253        return configuration;
 54    }
 55}