using NSubstitute; using TeleWave.Application.Common.Interfaces; using TeleWave.Application.Metadata; using TeleWave.Application.Metadata.SearchShows; using TeleWave.Domain.Library; using Xunit; namespace TeleWave.Application.Tests.Metadata; /// /// Поиск кандидатов в источнике. Внешняя сеть — единственная часть метаданных, которая падает /// регулярно, поэтому проверяется в первую очередь она. /// public class SearchShowMetadataTests { private static SearchShowMetadataQueryHandler Handler(IMetadataProvider? provider) { var resolver = Substitute.For(); // Явно: NSubstitute сам подставляет заглушку вместо интерфейсного null. resolver.Resolve(Arg.Any()).Returns(provider); return new SearchShowMetadataQueryHandler(resolver); } [Fact] public async Task ReturnsWhatProviderFound() { var provider = Substitute.For(); provider .SearchShowsAsync("Симпсоны", ShowKind.Series, Arg.Any()) .Returns([new MetadataCandidate("456", "The Simpsons", 1989, null, null)]); var result = await Handler(provider) .Handle( new SearchShowMetadataQuery("tmdb", "Симпсоны", ShowKind.Series), CancellationToken.None ); Assert.True(result.IsSuccess); Assert.Equal("456", Assert.Single(result.Value).ExternalId); } [Fact] public async Task ReturnsNothing_ForBlankQuery_WithoutCallingProvider() { var provider = Substitute.For(); var result = await Handler(provider) .Handle( new SearchShowMetadataQuery("tmdb", " ", ShowKind.Single), CancellationToken.None ); Assert.True(result.IsSuccess); Assert.Empty(result.Value); await provider .DidNotReceive() .SearchShowsAsync(Arg.Any(), Arg.Any(), Arg.Any()); } [Fact] public async Task Fails_WhenProviderIsNotConfigured() { var result = await Handler(null) .Handle( new SearchShowMetadataQuery("tmdb", "Симпсоны", ShowKind.Series), CancellationToken.None ); Assert.Equal(MetadataErrors.ProviderNotAvailable, result.Error); } [Fact] public async Task Fails_WhenSourceIsUnreachableOrRejectsTheKey() { var provider = Substitute.For(); provider .SearchShowsAsync(Arg.Any(), Arg.Any(), Arg.Any()) .Returns>(_ => throw new HttpRequestException("401")); var result = await Handler(provider) .Handle( new SearchShowMetadataQuery("tmdb", "Симпсоны", ShowKind.Series), CancellationToken.None ); // Сетевой сбой и неверный ключ — управляемая ошибка, а не исключение наружу. Assert.Equal(MetadataErrors.ProviderRequestFailed, result.Error); } }