File: DefaultOutputCachePolicyProviderTests.cs
Web Access
Project: src\src\Middleware\OutputCaching\test\Microsoft.AspNetCore.OutputCaching.Tests.csproj (Microsoft.AspNetCore.OutputCaching.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.AspNetCore.OutputCaching;
using Microsoft.Extensions.Options;
 
namespace Microsoft.AspNetCore.OutputCaching.Tests;
 
public class DefaultOutputCachePolicyProviderTests
{
    [Fact]
    public void GetBasePolicies_WithBasePolicies_ReturnsConfiguredPolicies()
    {
        // Arrange
        var options = new OutputCacheOptions();
        var policy1 = new OutputCachePolicyBuilder().Expire(TimeSpan.FromMinutes(5)).Build();
        var policy2 = new OutputCachePolicyBuilder().Expire(TimeSpan.FromMinutes(10)).Build();
        
        options.AddBasePolicy(policy1);
        options.AddBasePolicy(policy2);
 
        var outputCacheOptions = Options.Create(options);
        var policyProvider = new DefaultOutputCachePolicyProvider(outputCacheOptions);
 
        // Act
        var actualPolicies = policyProvider.GetBasePolicies();
 
        // Assert
        Assert.Equal(2, actualPolicies.Count);
        Assert.Same(policy1, actualPolicies[0]);
        Assert.Same(policy2, actualPolicies[1]);
    }
 
    [Fact]
    public void GetBasePolicies_WithoutBasePolicies_ReturnsEmptyList()
    {
        // Arrange
        var options = new OutputCacheOptions();
        var outputCacheOptions = Options.Create(options);
        var policyProvider = new DefaultOutputCachePolicyProvider(outputCacheOptions);
 
        // Act
        var actualPolicies = policyProvider.GetBasePolicies();
 
        // Assert
        Assert.NotNull(actualPolicies);
        Assert.Empty(actualPolicies);
    }
 
    [Fact]
    public async Task GetPolicyAsync_WithNamedPolicy_ReturnsPolicy()
    {
        // Arrange
        var options = new OutputCacheOptions();
        var policy = new OutputCachePolicyBuilder().Expire(TimeSpan.FromMinutes(15)).Build();
        options.AddPolicy("TestPolicy", policy);
 
        var outputCacheOptions = Options.Create(options);
        var policyProvider = new DefaultOutputCachePolicyProvider(outputCacheOptions);
 
        // Act
        var actualPolicy = await policyProvider.GetPolicyAsync("TestPolicy");
 
        // Assert
        Assert.NotNull(actualPolicy);
        Assert.Same(policy, actualPolicy);
    }
 
    [Theory]
    [InlineData("")]
    [InlineData("PolicyName")]
    [InlineData("AnotherPolicy")]
    public async Task GetPolicyAsync_GetsNamedPolicy(string policyName)
    {
        // Arrange
        var options = new OutputCacheOptions();
        var policy = new OutputCachePolicyBuilder().Expire(TimeSpan.FromSeconds(30)).Build();
        options.AddPolicy(policyName, policy);
 
        var outputCacheOptions = Options.Create(options);
        var policyProvider = new DefaultOutputCachePolicyProvider(outputCacheOptions);
 
        // Act
        var actualPolicy = await policyProvider.GetPolicyAsync(policyName);
 
        // Assert
        Assert.NotNull(actualPolicy);
        Assert.Same(policy, actualPolicy);
    }
 
    [Fact]
    public async Task GetPolicyAsync_WithNonExistentPolicy_ReturnsNull()
    {
        // Arrange
        var options = new OutputCacheOptions();
        var outputCacheOptions = Options.Create(options);
        var policyProvider = new DefaultOutputCachePolicyProvider(outputCacheOptions);
 
        // Act
        var actualPolicy = await policyProvider.GetPolicyAsync("NonExistentPolicy");
 
        // Assert
        Assert.Null(actualPolicy);
    }
 
    [Fact]
    public async Task GetPolicyAsync_WithMultipleNamedPolicies_ReturnsCorrectPolicy()
    {
        // Arrange
        var options = new OutputCacheOptions();
        var policy1 = new OutputCachePolicyBuilder().Expire(TimeSpan.FromMinutes(5)).Build();
        var policy2 = new OutputCachePolicyBuilder().Expire(TimeSpan.FromMinutes(10)).Build();
        var policy3 = new OutputCachePolicyBuilder().Expire(TimeSpan.FromMinutes(15)).Build();
        
        options.AddPolicy("Fast", policy1);
        options.AddPolicy("Medium", policy2);
        options.AddPolicy("Slow", policy3);
 
        var outputCacheOptions = Options.Create(options);
        var policyProvider = new DefaultOutputCachePolicyProvider(outputCacheOptions);
 
        // Act
        var actualPolicy1 = await policyProvider.GetPolicyAsync("Fast");
        var actualPolicy2 = await policyProvider.GetPolicyAsync("Medium");
        var actualPolicy3 = await policyProvider.GetPolicyAsync("Slow");
 
        // Assert
        Assert.Same(policy1, actualPolicy1);
        Assert.Same(policy2, actualPolicy2);
        Assert.Same(policy3, actualPolicy3);
    }
 
    [Fact]
    public async Task GetPolicyAsync_CaseInsensitivePolicyName()
    {
        // Arrange
        var options = new OutputCacheOptions();
        var policy = new OutputCachePolicyBuilder().Expire(TimeSpan.FromMinutes(20)).Build();
        options.AddPolicy("TestPolicy", policy);
 
        var outputCacheOptions = Options.Create(options);
        var policyProvider = new DefaultOutputCachePolicyProvider(outputCacheOptions);
 
        // Act
        var actualPolicyLower = await policyProvider.GetPolicyAsync("testpolicy");
        var actualPolicyUpper = await policyProvider.GetPolicyAsync("TESTPOLICY");
        var actualPolicyMixed = await policyProvider.GetPolicyAsync("TeStPoLiCy");
 
        // Assert
        Assert.Same(policy, actualPolicyLower);
        Assert.Same(policy, actualPolicyUpper);
        Assert.Same(policy, actualPolicyMixed);
    }
 
    [Fact]
    public void GetBasePolicies_WithBuilderAction_ReturnsPolicy()
    {
        // Arrange
        var options = new OutputCacheOptions();
        options.AddBasePolicy(builder => builder.Expire(TimeSpan.FromMinutes(30)));
 
        var outputCacheOptions = Options.Create(options);
        var policyProvider = new DefaultOutputCachePolicyProvider(outputCacheOptions);
 
        // Act
        var actualPolicies = policyProvider.GetBasePolicies();
 
        // Assert
        Assert.Single(actualPolicies);
        Assert.NotNull(actualPolicies[0]);
    }
 
    [Fact]
    public async Task GetPolicyAsync_WithBuilderAction_ReturnsPolicy()
    {
        // Arrange
        var options = new OutputCacheOptions();
        options.AddPolicy("BuilderPolicy", builder => builder
            .Expire(TimeSpan.FromMinutes(45))
            .SetVaryByQuery("version"));
 
        var outputCacheOptions = Options.Create(options);
        var policyProvider = new DefaultOutputCachePolicyProvider(outputCacheOptions);
 
        // Act
        var actualPolicy = await policyProvider.GetPolicyAsync("BuilderPolicy");
 
        // Assert
        Assert.NotNull(actualPolicy);
    }
 
    [Fact]
    public void Constructor_WithNullOptions_ThrowsArgumentNullException()
    {
        // Act & Assert
        Assert.Throws<ArgumentNullException>(() => new DefaultOutputCachePolicyProvider(null!));
    }
 
    [Fact]
    public async Task GetPolicyAsync_WithNullPolicyName_ThrowsArgumentNullException()
    {
        // Arrange
        var options = new OutputCacheOptions();
        var outputCacheOptions = Options.Create(options);
        var policyProvider = new DefaultOutputCachePolicyProvider(outputCacheOptions);
 
        // Act & Assert
        await Assert.ThrowsAsync<ArgumentNullException>(
            async () => await policyProvider.GetPolicyAsync(null!));
    }
}