From 5d4b7a4719a74b26e60703dc35650a0dbd1c597b Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 1 May 2026 14:23:04 +0800 Subject: [PATCH] Add unit tests for AbpSelectTagHelperService info text rendering - Verify info text is rendered as
(not ) - Verify aria-describedby is set on the select tag --- .../Form/AbpSelectTagHelperService_Tests.cs | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 framework/test/Volo.Abp.AspNetCore.Mvc.UI.Tests/Volo/Abp/AspNetCore/Mvc/UI/Bootstrap/TagHelpers/Form/AbpSelectTagHelperService_Tests.cs diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Tests/Volo/Abp/AspNetCore/Mvc/UI/Bootstrap/TagHelpers/Form/AbpSelectTagHelperService_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Tests/Volo/Abp/AspNetCore/Mvc/UI/Bootstrap/TagHelpers/Form/AbpSelectTagHelperService_Tests.cs new file mode 100644 index 0000000000..240562f929 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Tests/Volo/Abp/AspNetCore/Mvc/UI/Bootstrap/TagHelpers/Form/AbpSelectTagHelperService_Tests.cs @@ -0,0 +1,129 @@ +#nullable enable + +using System.Collections.Generic; +using System.Reflection; +using System.Text.Encodings.Web; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc.ModelBinding; +using Microsoft.AspNetCore.Mvc.ViewFeatures; +using Microsoft.AspNetCore.Razor.TagHelpers; +using Microsoft.Extensions.Localization; +using Shouldly; +using Xunit; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form; + +public class AbpSelectTagHelperService_Tests +{ + [Fact] + public async Task Info_text_should_be_rendered_as_div_with_form_text_class() + { + var service = new TestAbpSelectTagHelperService(); + var tagHelper = new AbpSelectTagHelper(service) + { + AspFor = CreateModelExpression(), + InfoText = "Description" + }; + + var output = CreateOutput(); + + await tagHelper.ProcessAsync(CreateContext(), output); + + service.LastGroupHtml.ShouldContain("
(), + "test"); + } + + private static TagHelperOutput CreateOutput() + { + return new TagHelperOutput( + "abp-select", + new TagHelperAttributeList(), + (_, _) => Task.FromResult(new DefaultTagHelperContent())); + } + + private static ModelExpression CreateModelExpression() + { + var metadataProvider = new EmptyModelMetadataProvider(); + return new ModelExpression( + "TestSelect", + metadataProvider.GetModelExplorerForType(typeof(string), null)); + } + + private sealed class TestAbpSelectTagHelperService : AbpSelectTagHelperService + { + public string LastGroupHtml { get; private set; } = string.Empty; + + public TagHelperOutput? LastSelectTag { get; private set; } + + public TestAbpSelectTagHelperService() + : base(null!, HtmlEncoder.Default, new FakeTagHelperLocalizer(), null!, null!) + { + } + + protected override Task GetSelectTagAsync(TagHelperContext context, TagHelperOutput output, TagHelperContent childContent) + { + LastSelectTag = new TagHelperOutput( + "select", + new TagHelperAttributeList { { "id", "TestSelect" } }, + (_, _) => Task.FromResult(new DefaultTagHelperContent())) + { + TagMode = TagMode.StartTagAndEndTag + }; + + return Task.FromResult(LastSelectTag); + } + + protected override Task GetLabelAsHtmlAsync(TagHelperContext context, TagHelperOutput output, TagHelperOutput selectTag) + { + return Task.FromResult(string.Empty); + } + + protected override Task GetValidationAsHtmlAsync(TagHelperContext context, TagHelperOutput output, TagHelperOutput selectTag) + { + return Task.FromResult(string.Empty); + } + + protected override void AddGroupToFormGroupContents(TagHelperContext context, string propertyName, string html, int order, out bool suppress) + { + LastGroupHtml = html; + suppress = false; + } + } + + private sealed class FakeTagHelperLocalizer : IAbpTagHelperLocalizer + { + public string GetLocalizedText(string text, ModelExplorer explorer) => text; + + public IStringLocalizer? GetLocalizerOrNull(ModelExplorer explorer) => null; + + public IStringLocalizer? GetLocalizerOrNull(Assembly assembly) => null; + } +}