File: TagHelperMatchingConventionsTest.cs
Web Access
Project: src\src\Razor\src\Compiler\Microsoft.AspNetCore.Razor.Language\test\Microsoft.AspNetCore.Razor.Language.UnitTests.csproj (Microsoft.AspNetCore.Razor.Language.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using System.Collections.Generic;
using Xunit;
 
namespace Microsoft.AspNetCore.Razor.Language;
 
public class TagHelperMatchingConventionsTest
{
    public static TheoryData<Action<RequiredAttributeDescriptorBuilder>, string, string, bool> RequiredAttributeDescriptorData
    {
        get
        {
            // requiredAttributeDescriptor, attributeName, attributeValue, expectedResult
            return new TheoryData<Action<RequiredAttributeDescriptorBuilder>, string, string, bool>
                {
                    {
                        builder => builder.Name("key"),
                        "KeY",
                        "value",
                        true
                    },
                    {
                        builder => builder.Name("key"),
                        "keys",
                        "value",
                        false
                    },
                    {
                        builder => builder.Name("route-", RequiredAttributeNameComparison.PrefixMatch),
                        "ROUTE-area",
                        "manage",
                        true
                    },
                    {
                        builder => builder.Name("route-", RequiredAttributeNameComparison.PrefixMatch),
                        "routearea",
                        "manage",
                        false
                    },
                    {
                        builder => builder.Name("route-", RequiredAttributeNameComparison.PrefixMatch),
                        "route-",
                        "manage",
                        false
                    },
                    {
                        builder => builder.Name("key", RequiredAttributeNameComparison.FullMatch),
                        "KeY",
                        "value",
                        true
                    },
                    {
                        builder => builder.Name("key", RequiredAttributeNameComparison.FullMatch),
                        "keys",
                        "value",
                        false
                    },
                    {
                        builder => builder
                            .Name("key", RequiredAttributeNameComparison.FullMatch)
                            .Value("value", RequiredAttributeValueComparison.FullMatch),
                        "key",
                        "value",
                        true
                    },
                    {
                        builder => builder
                            .Name("key", RequiredAttributeNameComparison.FullMatch)
                            .Value("value", RequiredAttributeValueComparison.FullMatch),
                        "key",
                        "Value",
                        false
                    },
                    {
                        builder => builder
                            .Name("class", RequiredAttributeNameComparison.FullMatch)
                            .Value("btn", RequiredAttributeValueComparison.PrefixMatch),
                        "class",
                        "btn btn-success",
                        true
                    },
                    {
                        builder => builder
                            .Name("class", RequiredAttributeNameComparison.FullMatch)
                            .Value("btn", RequiredAttributeValueComparison.PrefixMatch),
                        "class",
                        "BTN btn-success",
                        false
                    },
                    {
                        builder => builder
                            .Name("href", RequiredAttributeNameComparison.FullMatch)
                            .Value("#navigate", RequiredAttributeValueComparison.SuffixMatch),
                        "href",
                        "/home/index#navigate",
                        true
                    },
                    {
                        builder => builder
                            .Name("href", RequiredAttributeNameComparison.FullMatch)
                            .Value("#navigate", RequiredAttributeValueComparison.SuffixMatch),
                        "href",
                        "/home/index#NAVigate",
                        false
                    },
                };
        }
    }
 
    [Theory]
    [MemberData(nameof(RequiredAttributeDescriptorData))]
    public void Matches_ReturnsExpectedResult(
        Action<RequiredAttributeDescriptorBuilder> configure,
        string attributeName,
        string attributeValue,
        bool expectedResult)
    {
        // Arrange
        var tagHelper = TagHelperDescriptorBuilder.CreateTagHelper("TestTagHelper", "Test")
            .TagMatchingRuleDescriptor(builder => builder
                .RequiredAttribute(builder => configure(builder)))
            .Build();
 
        var requiredAttribute = tagHelper.TagMatchingRules[0].Attributes[0];
 
        // Act
        var result = TagHelperMatchingConventions.SatisfiesRequiredAttribute(requiredAttribute, attributeName, attributeValue);
 
        // Assert
        Assert.Equal(expectedResult, result);
    }
 
    [Fact]
    public void CanSatisfyBoundAttribute_IndexerAttribute_ReturnsFalseIsNotMatching()
    {
        // Arrange
        var tagHelper = TagHelperDescriptorBuilder.CreateTagHelper("TestTagHelper", "Test")
            .BoundAttributeDescriptor(builder => builder.AsDictionary("asp-", typeof(Dictionary<string, string>).FullName))
            .Build();
 
        var boundAttribute = tagHelper.BoundAttributes[0];
 
        // Act
        var result = TagHelperMatchingConventions.CanSatisfyBoundAttribute("style", boundAttribute);
 
        // Assert
        Assert.False(result);
    }
 
    [Fact]
    public void CanSatisfyBoundAttribute_IndexerAttribute_ReturnsTrueIfMatching()
    {
        // Arrange
        var tagHelper = TagHelperDescriptorBuilder.CreateTagHelper("TestTagHelper", "Test")
            .BoundAttributeDescriptor(builder => builder.AsDictionary("asp-", typeof(Dictionary<string, string>).FullName))
            .Build();
 
        var boundAttribute = tagHelper.BoundAttributes[0];
 
        // Act
        var result = TagHelperMatchingConventions.CanSatisfyBoundAttribute("asp-route-controller", boundAttribute);
 
        // Assert
        Assert.True(result);
    }
}