using Microsoft.EntityFrameworkCore; using TeleWave.Application.Library; using TeleWave.Application.Library.AddEpisode; using TeleWave.Application.Library.CreateShow; using TeleWave.Application.Library.RemoveEpisode; using TeleWave.Application.Library.RenameShow; using TeleWave.Application.Library.SetShowOriginalName; using TeleWave.Application.Tests.Support; using TeleWave.Domain.Library; using TeleWave.Domain.Media; using Xunit; namespace TeleWave.Application.Tests.Library; public class ShowHandlersTests { [Fact] public async Task CreateShow_PersistsShow() { var fixture = new TestDb(); await using var db = fixture.New(); var result = await new CreateShowCommandHandler(db).Handle( new CreateShowCommand("Симпсоны", ShowKind.Series, "desc", "The Simpsons"), CancellationToken.None ); Assert.True(result.IsSuccess); await db.SaveChangesAsync(CancellationToken.None); await using var verify = fixture.New(); var stored = await verify.Shows.FindAsync(result.Value); Assert.Equal("Симпсоны", stored!.Name); Assert.Equal("The Simpsons", stored.OriginalName); } [Fact] public async Task RenameShow_ChangesName_OrNotFound() { var fixture = new TestDb(); var show = Show.Create("Old", ShowKind.Series); await using (var seed = fixture.New()) { seed.Shows.Add(show); await seed.SaveChangesAsync(CancellationToken.None); } await using var db = fixture.New(); var missing = await new RenameShowCommandHandler(db).Handle( new RenameShowCommand(Guid.NewGuid(), "New"), CancellationToken.None ); Assert.Equal(ShowErrors.NotFound, missing.Error); var ok = await new RenameShowCommandHandler(db).Handle( new RenameShowCommand(show.Id, " New "), CancellationToken.None ); Assert.True(ok.IsSuccess); await db.SaveChangesAsync(CancellationToken.None); await using var verify = fixture.New(); Assert.Equal("New", (await verify.Shows.FindAsync(show.Id))!.Name); } [Fact] public async Task SetOriginalName_TrimsAndClears() { var fixture = new TestDb(); var show = Show.Create("A", ShowKind.Series); await using (var seed = fixture.New()) { seed.Shows.Add(show); await seed.SaveChangesAsync(CancellationToken.None); } await using var db = fixture.New(); var ok = await new SetShowOriginalNameCommandHandler(db).Handle( new SetShowOriginalNameCommand(show.Id, " Orig "), CancellationToken.None ); Assert.True(ok.IsSuccess); await db.SaveChangesAsync(CancellationToken.None); await using var verify = fixture.New(); Assert.Equal("Orig", (await verify.Shows.FindAsync(show.Id))!.OriginalName); } [Fact] public async Task AddEpisode_ParsesNumbers_AndGuardsSingle() { var fixture = new TestDb(); var series = Show.Create("Series", ShowKind.Series); var single = Show.Create("Movie", ShowKind.Single); single.AddEpisode(Guid.NewGuid()); // уже занята единственная серия var asset = MediaAsset.Register("The.Show.S03E07.WEBDL.mkv", ".mkv", MediaSource.Upload); await using (var seed = fixture.New()) { seed.Shows.Add(series); seed.Shows.Add(single); seed.MediaAssets.Add(asset); await seed.SaveChangesAsync(CancellationToken.None); } await using var db = fixture.New(); var handler = new AddEpisodeCommandHandler(db); // неизвестный ассет var noAsset = await handler.Handle( new AddEpisodeCommand(series.Id, Guid.NewGuid()), CancellationToken.None ); Assert.Equal(ShowErrors.AssetNotFound, noAsset.Error); // single уже имеет серию var singleGuard = await handler.Handle( new AddEpisodeCommand(single.Id, asset.Id), CancellationToken.None ); Assert.Equal(ShowErrors.SingleAlreadyHasEpisode, singleGuard.Error); // ок + распознавание S03E07 var ok = await handler.Handle( new AddEpisodeCommand(series.Id, asset.Id), CancellationToken.None ); Assert.True(ok.IsSuccess); await db.SaveChangesAsync(CancellationToken.None); await using var verify = fixture.New(); var stored = await verify.Shows.Include(s => s.Episodes).FirstAsync(s => s.Id == series.Id); var episode = Assert.Single(stored.Episodes); Assert.Equal(3, episode.Season); Assert.Equal(7, episode.Episode); } [Fact] public async Task RemoveEpisode_RemovesOrReportsNotFound() { var fixture = new TestDb(); var show = Show.Create("Series", ShowKind.Series); var ep = show.AddEpisode(Guid.NewGuid()); await using (var seed = fixture.New()) { seed.Shows.Add(show); await seed.SaveChangesAsync(CancellationToken.None); } await using var db = fixture.New(); var handler = new RemoveEpisodeCommandHandler(db); var missing = await handler.Handle( new RemoveEpisodeCommand(show.Id, Guid.NewGuid()), CancellationToken.None ); Assert.Equal(ShowErrors.EpisodeNotFound, missing.Error); var ok = await handler.Handle( new RemoveEpisodeCommand(show.Id, ep.Id), CancellationToken.None ); Assert.True(ok.IsSuccess); } }