< 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
100%
Covered branches: 16
Total branches: 16
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
AddApplicationApiVersioning(...)100%11100%
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    {
 11721        ApplicationApiVersioningOptions apiVersioningOptions = new();
 22
 11723        configuration
 11724            .GetSection(ApplicationApiVersioningOptions.SectionName)
 11725            .Bind(apiVersioningOptions);
 26
 11727        ValidateApiVersioningOptions(apiVersioningOptions);
 28
 11329        services
 11330            .AddOptions<ApplicationApiVersioningOptions>()
 11331            .Bind(configuration.GetSection(ApplicationApiVersioningOptions.SectionName))
 11332            .Validate(options => options.DefaultMajorVersion > 0,
 11333                "ProjectTemplate:ApiVersioning:DefaultMajorVersion must be greater than zero.")
 11334            .Validate(options => options.DefaultMinorVersion >= 0,
 11335                "ProjectTemplate:ApiVersioning:DefaultMinorVersion must be zero or greater.")
 11336            .Validate(options => options.EnableUrlSegmentVersioning || options.EnableHeaderVersioning,
 11337                "ProjectTemplate:ApiVersioning must enable URL segment versioning, header versioning, or both.")
 11338            .Validate(options => !options.EnableHeaderVersioning || !string.IsNullOrWhiteSpace(options.HeaderName),
 11339                "ProjectTemplate:ApiVersioning:HeaderName is required when header versioning is enabled.")
 11340            .ValidateOnStart();
 41
 11342        IApiVersionReader[] readers = CreateApiVersionReaders(apiVersioningOptions);
 43
 11344        services
 11345            .AddApiVersioning(options =>
 11346            {
 11347                options.DefaultApiVersion = new ApiVersion(
 11348                    apiVersioningOptions.DefaultMajorVersion,
 11349                    apiVersioningOptions.DefaultMinorVersion);
 11350
 11351                options.AssumeDefaultVersionWhenUnspecified =
 11352                    apiVersioningOptions.AssumeDefaultVersionWhenUnspecified;
 11353
 11354                options.ReportApiVersions = apiVersioningOptions.ReportApiVersions;
 11355                options.ApiVersionReader = ApiVersionReader.Combine(readers);
 11356            })
 11357            .AddMvc();
 58
 11359        return services;
 60    }
 61
 62    private static IApiVersionReader[] CreateApiVersionReaders(
 63        ApplicationApiVersioningOptions options)
 64    {
 11365        List<IApiVersionReader> readers = [];
 66
 11367        if (options.EnableUrlSegmentVersioning)
 68        {
 11269            readers.Add(new UrlSegmentApiVersionReader());
 70        }
 71
 11372        if (options.EnableHeaderVersioning)
 73        {
 11274            readers.Add(new HeaderApiVersionReader(options.HeaderName));
 75        }
 76
 11377        return [.. readers];
 78    }
 79
 80    private static void ValidateApiVersioningOptions(ApplicationApiVersioningOptions options)
 81    {
 11782        if (options.DefaultMajorVersion <= 0)
 83        {
 184            throw new InvalidOperationException(
 185                "ProjectTemplate:ApiVersioning:DefaultMajorVersion must be greater than zero.");
 86        }
 87
 11688        if (options.DefaultMinorVersion < 0)
 89        {
 190            throw new InvalidOperationException(
 191                "ProjectTemplate:ApiVersioning:DefaultMinorVersion must be zero or greater.");
 92        }
 93
 11594        if (!options.EnableUrlSegmentVersioning && !options.EnableHeaderVersioning)
 95        {
 196            throw new InvalidOperationException(
 197                "ProjectTemplate:ApiVersioning must enable URL segment versioning, header versioning, or both.");
 98        }
 99
 114100        if (options.EnableHeaderVersioning && string.IsNullOrWhiteSpace(options.HeaderName))
 101        {
 1102            throw new InvalidOperationException(
 1103                "ProjectTemplate:ApiVersioning:HeaderName is required when header versioning is enabled.");
 104        }
 113105    }
 106}