using TeleWave.Application.Library.GetShow;
using TeleWave.Domain.Library;
using TeleWave.Domain.Media;
using TeleWave.Infrastructure.Persistence;
using Xunit;
namespace TeleWave.Integration.Tests;
///
/// Карточка шоу против настоящей БД: запрос собирает серии, жанры и коллекции несколькими
/// проекциями, и часть из них EF может не суметь перевести — на InMemory такое не всплывает.
///
[Collection("postgres")]
public sealed class GetShowIntegrationTests(PostgresFixture fixture)
{
[SkippableFact]
public async Task GetShow_ReturnsEpisodesGenresAndCollections()
{
Skip.IfNot(fixture.Available, "Docker недоступен");
await using var seed = fixture.CreateContext();
var showId = await SeedAsync(seed);
await using var db = fixture.CreateContext();
var result = await new GetShowQueryHandler(db).Handle(new GetShowQuery(showId), default);
Assert.True(result.IsSuccess);
Assert.Equal(2, result.Value.Episodes.Count);
Assert.Equal(2, result.Value.Genres.Count);
Assert.Single(result.Value.Collections);
Assert.True(result.Value.Genres[0].IsPrimary);
Assert.All(result.Value.Episodes, e => Assert.NotNull(e.AssetName));
}
[SkippableFact]
public async Task GetShow_WithoutGenresAndCollections_Works()
{
Skip.IfNot(fixture.Available, "Docker недоступен");
await using var seed = fixture.CreateContext();
var show = Show.Create($"Голое шоу {Guid.NewGuid():N}"[..20], ShowKind.Series);
seed.Shows.Add(show);
await seed.SaveChangesAsync();
await using var db = fixture.CreateContext();
var result = await new GetShowQueryHandler(db).Handle(new GetShowQuery(show.Id), default);
Assert.True(result.IsSuccess);
Assert.Empty(result.Value.Episodes);
Assert.Empty(result.Value.Genres);
Assert.Empty(result.Value.Collections);
}
private static async Task SeedAsync(AppDbContext db)
{
var tag = Guid.NewGuid().ToString("N")[..8];
var action = Genre.Create($"Боевик {tag}", $"action-{tag}");
var comedy = Genre.Create($"Комедия {tag}", $"comedy-{tag}");
db.Genres.AddRange(action, comedy);
var show = Show.Create($"Шоу {tag}", ShowKind.Series);
for (var i = 0; i < 2; i++)
{
var asset = MediaAsset.Register($"{tag}-s01e0{i}.mkv", ".mkv", MediaSource.Upload);
db.MediaAssets.Add(asset);
show.AddEpisode(asset.Id);
}
show.SetGenres([action.Id, comedy.Id], action.Id);
db.Shows.Add(show);
await db.SaveChangesAsync();
var collection = Collection.Create($"Франшиза {tag}");
collection.AddShow(show.Id);
db.Collections.Add(collection);
await db.SaveChangesAsync();
return show.Id;
}
}