using Service.IconSearch; namespace WebApi.Test.Service.IconSearch; /// /// Iconify API 集成测试(需要网络连接) /// 用于验证完整的图标搜索流程 /// public class IconifyApiIntegrationTest : BaseTest { private readonly IconifyApiService _service; private readonly ILogger _logger; public IconifyApiIntegrationTest() { _logger = Substitute.For>(); var settings = Options.Create(new IconifySettings { ApiUrl = "https://api.iconify.design/search", DefaultLimit = 20, MaxRetryCount = 3, RetryDelayMs = 1000 }); _service = new IconifyApiService(settings, _logger); } [Fact] public async Task 完整流程_搜索玩具图标() { // Arrange var keywords = new List { "toy", "play" }; // Act var icons = await _service.SearchIconsAsync(keywords, 10); // Assert icons.Should().NotBeNull(); icons.Should().NotBeEmpty("应该返回玩具相关的图标"); // 验证图标格式 icons.All(i => !string.IsNullOrEmpty(i.CollectionName)).Should().BeTrue("所有图标应该有 CollectionName"); icons.All(i => !string.IsNullOrEmpty(i.IconName)).Should().BeTrue("所有图标应该有 IconName"); icons.All(i => i.IconIdentifier.Contains(":")).Should().BeTrue("所有图标的 IconIdentifier 应该包含 ':'"); // 打印前5个图标用于验证 _logger.LogInformation("搜索到 {Count} 个图标", icons.Count); foreach (var icon in icons.Take(5)) { _logger.LogInformation(" - {Identifier} (Collection: {Collection}, Name: {Name})", icon.IconIdentifier, icon.CollectionName, icon.IconName); } } [Fact] public async Task 完整流程_搜索食物图标() { // Arrange var keywords = new List { "food", "meal", "restaurant" }; // Act var icons = await _service.SearchIconsAsync(keywords, 15); // Assert icons.Should().NotBeNull(); icons.Should().NotBeEmpty("应该返回食物相关的图标"); icons.Count.Should().BeGreaterThan(0); // 验证至少有一些常见的图标集 var collections = icons.Select(i => i.CollectionName).Distinct().ToList(); collections.Should().Contain(c => c == "mdi" || c == "material-symbols" || c == "tabler", "应该包含常见的图标集"); } [Fact] public async Task 验证图标标识符格式() { // Arrange var keywords = new List { "home" }; // Act var icons = await _service.SearchIconsAsync(keywords, 5); // Assert icons.Should().NotBeNull(); icons.Should().NotBeEmpty(); foreach (var icon in icons) { // 验证标识符格式: "collection:iconName" var parts = icon.IconIdentifier.Split(':'); parts.Should().HaveCount(2, $"图标标识符 '{icon.IconIdentifier}' 应该是 'collection:name' 格式"); parts[0].Should().Be(icon.CollectionName); parts[1].Should().Be(icon.IconName); } } }