using PnvPanel.Application.Admin.Plans; using PnvPanel.Application.Tests.TestSupport; using PnvPanel.Domain.Plans; using Xunit; namespace PnvPanel.Application.Tests.Admin.Plans; public class PlanCommandHandlerTests { [Fact] public async Task Create_AddsPlan() { using var dbContext = InMemoryDbContextFactory.Create(); var handler = new CreatePlanCommandHandler(dbContext); var result = await handler.Handle( new CreatePlanCommand("Стандарт", 3, 0), CancellationToken.None ); await dbContext.SaveChangesAsync(CancellationToken.None); Assert.True(result.IsSuccess); Assert.Equal("Стандарт", result.Value.Name); Assert.Equal(3, result.Value.ConfigCount); Assert.True(result.Value.IsEnabled); Assert.NotNull(await dbContext.Plans.FindAsync([result.Value.Id], CancellationToken.None)); } [Fact] public async Task Update_WhenNotFound_ReturnsNotFound() { using var dbContext = InMemoryDbContextFactory.Create(); var handler = new UpdatePlanCommandHandler(dbContext); var result = await handler.Handle( new UpdatePlanCommand(Guid.NewGuid(), "Плюс", 6, 1, true), CancellationToken.None ); Assert.False(result.IsSuccess); Assert.Equal(PnvPanel.Application.Plans.PlanErrors.NotFound, result.Error); } [Fact] public async Task Update_WhenFound_UpdatesFields() { using var dbContext = InMemoryDbContextFactory.Create(); var plan = Plan.Create("Стандарт", 3, 0); dbContext.Plans.Add(plan); await dbContext.SaveChangesAsync(CancellationToken.None); var handler = new UpdatePlanCommandHandler(dbContext); var result = await handler.Handle( new UpdatePlanCommand(plan.Id, "Плюс", 6, 1, false), CancellationToken.None ); Assert.True(result.IsSuccess); Assert.Equal("Плюс", result.Value.Name); Assert.Equal(6, result.Value.ConfigCount); Assert.False(result.Value.IsEnabled); } [Fact] public async Task Delete_WhenNotFound_ReturnsNotFound() { using var dbContext = InMemoryDbContextFactory.Create(); var handler = new DeletePlanCommandHandler(dbContext); var result = await handler.Handle( new DeletePlanCommand(Guid.NewGuid()), CancellationToken.None ); Assert.False(result.IsSuccess); Assert.Equal(PnvPanel.Application.Plans.PlanErrors.NotFound, result.Error); } [Fact] public async Task Delete_WhenFound_RemovesPlan() { using var dbContext = InMemoryDbContextFactory.Create(); var plan = Plan.Create("Стандарт", 3, 0); dbContext.Plans.Add(plan); await dbContext.SaveChangesAsync(CancellationToken.None); var handler = new DeletePlanCommandHandler(dbContext); var result = await handler.Handle(new DeletePlanCommand(plan.Id), CancellationToken.None); await dbContext.SaveChangesAsync(CancellationToken.None); Assert.True(result.IsSuccess); Assert.Null(await dbContext.Plans.FindAsync([plan.Id], CancellationToken.None)); } [Fact] public async Task ListAdmin_ReturnsAllPlansOrderedBySortOrder() { using var dbContext = InMemoryDbContextFactory.Create(); dbContext.Plans.AddRange( Plan.Create("Про", 9, 2), Plan.Create("Стандарт", 3, 0), Plan.Create("Плюс", 6, 1) ); await dbContext.SaveChangesAsync(CancellationToken.None); var handler = new ListAdminPlansQueryHandler(dbContext); var result = await handler.Handle(new ListAdminPlansQuery(), CancellationToken.None); Assert.True(result.IsSuccess); Assert.Equal(["Стандарт", "Плюс", "Про"], result.Value.Select(p => p.Name)); } [Fact] public async Task ListPublic_OnlyReturnsEnabledPlans() { using var dbContext = InMemoryDbContextFactory.Create(); var disabled = Plan.Create("Скрытый", 12, 3); disabled.Update(disabled.Name, disabled.ConfigCount, disabled.SortOrder, isEnabled: false); dbContext.Plans.AddRange(Plan.Create("Стандарт", 3, 0), disabled); await dbContext.SaveChangesAsync(CancellationToken.None); var handler = new PnvPanel.Application.Plans.ListPlansQueryHandler(dbContext); var result = await handler.Handle(new PnvPanel.Application.Plans.ListPlansQuery(), CancellationToken.None); Assert.True(result.IsSuccess); Assert.Single(result.Value); Assert.Equal("Стандарт", result.Value[0].Name); } }