< Summary

Information
Class: ProjectTemplate.Web.Extensions.ApiVersioningServiceExtensions
Assembly: ProjectTemplate.Web
File(s): /home/runner/work/NetCoreApplicationTemplate/NetCoreApplicationTemplate/src/ProjectTemplate.Web/Extensions/ApiVersioningServiceExtensions.cs
Line coverage
100%
Covered lines: 52
Uncovered lines: 0
Coverable lines: 52
Total lines: 106
Line coverage: 100%
Branch coverage
90%
Covered branches: 18
Total branches: 20
Branch coverage: 90%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
AddApplicationApiVersioning(...)50%44100%
CreateApiVersionReaders(...)100%44100%
ValidateApiVersioningOptions(...)100%1212100%

File(s)

/home/runner/work/NetCoreApplicationTemplate/NetCoreApplicationTemplate/src/ProjectTemplate.Web/Extensions/ApiVersioningServiceExtensions.cs

#LineLine coverage
 1using Asp.Versioning;
 2using ProjectTemplate.Web.Options;
 3
 4namespace ProjectTemplate.Web.Extensions;
 5
 6/// <summary>
 7/// Provides extension methods to register API versioning services for the application.
 8/// </summary>
 9public static class ApiVersioningServiceExtensions
 10{
 11    /// <summary>
 12    /// Adds API versioning services and conventions for controller-based APIs.
 13    /// </summary>
 14    /// <param name="services">The service collection to configure.</param>
 15    /// <param name="configuration">The application configuration source.</param>
 16    /// <returns>The same service collection instance so calls can be chained.</returns>
 17    public static IServiceCollection AddApplicationApiVersioning(
 18        this IServiceCollection services,
 19        IConfiguration configuration)
 20    {
 16221        ApplicationApiVersioningOptions apiVersioningOptions = new();
 22
 16223        configuration
 16224            .GetSection(ApplicationApiVersioningOptions.SectionName)
 16225            .Bind(apiVersioningOptions);
 26
 16227        ValidateApiVersioningOptions(apiVersioningOptions);
 28
 15429        services
 15430            .AddOptions<ApplicationApiVersioningOptions>()
 15431            .Bind(configuration.GetSection(ApplicationApiVersioningOptions.SectionName))
 13032            .Validate(options => options.DefaultMajorVersion > 0,
 15433                "ProjectTemplate:ApiVersioning:DefaultMajorVersion must be greater than zero.")
 13034            .Validate(options => options.DefaultMinorVersion >= 0,
 15435                "ProjectTemplate:ApiVersioning:DefaultMinorVersion must be zero or greater.")
 13036            .Validate(options => options.EnableUrlSegmentVersioning || options.EnableHeaderVersioning,
 15437                "ProjectTemplate:ApiVersioning must enable URL segment versioning, header versioning, or both.")
 13038            .Validate(options => !options.EnableHeaderVersioning || !string.IsNullOrWhiteSpace(options.HeaderName),
 15439                "ProjectTemplate:ApiVersioning:HeaderName is required when header versioning is enabled.")
 15440            .ValidateOnStart();
 41
 15442        IApiVersionReader[] readers = CreateApiVersionReaders(apiVersioningOptions);
 43
 15444        services
 15445            .AddApiVersioning(options =>
 15446            {
 14247                options.DefaultApiVersion = new ApiVersion(
 14248                    apiVersioningOptions.DefaultMajorVersion,
 14249                    apiVersioningOptions.DefaultMinorVersion);
 15450
 14251                options.AssumeDefaultVersionWhenUnspecified =
 14252                    apiVersioningOptions.AssumeDefaultVersionWhenUnspecified;
 15453
 14254                options.ReportApiVersions = apiVersioningOptions.ReportApiVersions;
 14255                options.ApiVersionReader = ApiVersionReader.Combine(readers);
 14256            })
 15457            .AddMvc();
 58
 15459        return services;
 60    }
 61
 62    private static IApiVersionReader[] CreateApiVersionReaders(
 63        ApplicationApiVersioningOptions options)
 64    {
 15465        List<IApiVersionReader> readers = [];
 66
 15467        if (options.EnableUrlSegmentVersioning)
 68        {
 15269            readers.Add(new UrlSegmentApiVersionReader());
 70        }
 71
 15472        if (options.EnableHeaderVersioning)
 73        {
 15274            readers.Add(new HeaderApiVersionReader(options.HeaderName));
 75        }
 76
 15477        return [.. readers];
 78    }
 79
 80    private static void ValidateApiVersioningOptions(ApplicationApiVersioningOptions options)
 81    {
 16282        if (options.DefaultMajorVersion <= 0)
 83        {
 284            throw new InvalidOperationException(
 285                "ProjectTemplate:ApiVersioning:DefaultMajorVersion must be greater than zero.");
 86        }
 87
 16088        if (options.DefaultMinorVersion < 0)
 89        {
 290            throw new InvalidOperationException(
 291                "ProjectTemplate:ApiVersioning:DefaultMinorVersion must be zero or greater.");
 92        }
 93
 15894        if (!options.EnableUrlSegmentVersioning && !options.EnableHeaderVersioning)
 95        {
 296            throw new InvalidOperationException(
 297                "ProjectTemplate:ApiVersioning must enable URL segment versioning, header versioning, or both.");
 98        }
 99
 156100        if (options.EnableHeaderVersioning && string.IsNullOrWhiteSpace(options.HeaderName))
 101        {
 2102            throw new InvalidOperationException(
 2103                "ProjectTemplate:ApiVersioning:HeaderName is required when header versioning is enabled.");
 104        }
 154105    }
 106}