using BuildFlow.Platform.Application.Menus.Helpers; using FluentAssertions; using Xunit; namespace BuildFlow.Platform.Tests.Menus; /// /// 菜单路由 name 派生器测试。 /// 路由 name 不再由用户填写,创建菜单缺省时由后端根据 Code 自动派生。 /// public class MenuRouteNameResolverTests { [Theory] [InlineData("system.user", "SystemUser")] [InlineData("system", "System")] [InlineData("buildflow.form.expense.list", "BuildflowFormExpenseList")] [InlineData("build-flow", "BuildFlow")] [InlineData("expense_request", "ExpenseRequest")] [InlineData("expenseRequest", "Expenserequest")] public void DeriveFromCode_ShouldConvertToPascalCase(string code, string expected) { MenuRouteNameResolver.DeriveFromCode(code).Should().Be(expected); } [Theory] [InlineData(null)] [InlineData("")] [InlineData(" ")] [InlineData("...___")] public void DeriveFromCode_ShouldReturnFallbackWhenCodeHasNoAlphanumeric(string? code) { MenuRouteNameResolver.DeriveFromCode(code).Should().Be("Menu"); } [Fact] public void DeriveFromCode_ShouldTruncateWhenCodeTooLong() { // 极长 Code:派生结果不应超过列长度保护阈值(90 字符)。 var longCode = new string('a', 200); var result = MenuRouteNameResolver.DeriveFromCode(longCode); result.Should().NotBeEmpty(); result.Length.Should().BeLessThanOrEqualTo(90); } [Fact] public void DeriveFromCode_ShouldHandleMixedCasingAndDigits() { MenuRouteNameResolver.DeriveFromCode("app.v2.userProfile") .Should().Be("AppV2Userprofile"); } }