< 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    {
 17421        ApplicationApiVersioningOptions apiVersioningOptions = new();
 22
 17423        configuration
 17424            .GetSection(ApplicationApiVersioningOptions.SectionName)
 17425            .Bind(apiVersioningOptions);
 26
 17427        ValidateApiVersioningOptions(apiVersioningOptions);
 28
 16629        services
 16630            .AddOptions<ApplicationApiVersioningOptions>()
 16631            .Bind(configuration.GetSection(ApplicationApiVersioningOptions.SectionName))
 13832            .Validate(options => options.DefaultMajorVersion > 0,
 16633                "ProjectTemplate:ApiVersioning:DefaultMajorVersion must be greater than zero.")
 13834            .Validate(options => options.DefaultMinorVersion >= 0,
 16635                "ProjectTemplate:ApiVersioning:DefaultMinorVersion must be zero or greater.")
 13836            .Validate(options => options.EnableUrlSegmentVersioning || options.EnableHeaderVersioning,
 16637                "ProjectTemplate:ApiVersioning must enable URL segment versioning, header versioning, or both.")
 13838            .Validate(options => !options.EnableHeaderVersioning || !string.IsNullOrWhiteSpace(options.HeaderName),
 16639                "ProjectTemplate:ApiVersioning:HeaderName is required when header versioning is enabled.")
 16640            .ValidateOnStart();
 41
 16642        IApiVersionReader[] readers = CreateApiVersionReaders(apiVersioningOptions);
 43
 16644        services
 16645            .AddApiVersioning(options =>
 16646            {
 15447                options.DefaultApiVersion = new ApiVersion(
 15448                    apiVersioningOptions.DefaultMajorVersion,
 15449                    apiVersioningOptions.DefaultMinorVersion);
 16650
 15451                options.AssumeDefaultVersionWhenUnspecified =
 15452                    apiVersioningOptions.AssumeDefaultVersionWhenUnspecified;
 16653
 15454                options.ReportApiVersions = apiVersioningOptions.ReportApiVersions;
 15455                options.ApiVersionReader = ApiVersionReader.Combine(readers);
 15456            })
 16657            .AddMvc();
 58
 16659        return services;
 60    }
 61
 62    private static IApiVersionReader[] CreateApiVersionReaders(
 63        ApplicationApiVersioningOptions options)
 64    {
 16665        List<IApiVersionReader> readers = [];
 66
 16667        if (options.EnableUrlSegmentVersioning)
 68        {
 16469            readers.Add(new UrlSegmentApiVersionReader());
 70        }
 71
 16672        if (options.EnableHeaderVersioning)
 73        {
 16474            readers.Add(new HeaderApiVersionReader(options.HeaderName));
 75        }
 76
 16677        return [.. readers];
 78    }
 79
 80    private static void ValidateApiVersioningOptions(ApplicationApiVersioningOptions options)
 81    {
 17482        if (options.DefaultMajorVersion <= 0)
 83        {
 284            throw new InvalidOperationException(
 285                "ProjectTemplate:ApiVersioning:DefaultMajorVersion must be greater than zero.");
 86        }
 87
 17288        if (options.DefaultMinorVersion < 0)
 89        {
 290            throw new InvalidOperationException(
 291                "ProjectTemplate:ApiVersioning:DefaultMinorVersion must be zero or greater.");
 92        }
 93
 17094        if (!options.EnableUrlSegmentVersioning && !options.EnableHeaderVersioning)
 95        {
 296            throw new InvalidOperationException(
 297                "ProjectTemplate:ApiVersioning must enable URL segment versioning, header versioning, or both.");
 98        }
 99
 168100        if (options.EnableHeaderVersioning && string.IsNullOrWhiteSpace(options.HeaderName))
 101        {
 2102            throw new InvalidOperationException(
 2103                "ProjectTemplate:ApiVersioning:HeaderName is required when header versioning is enabled.");
 104        }
 166105    }
 106}