Implement BumperEndpoints and remove deprecated bumper-related functionality
Added new BumperEndpoints to the API for managing bumper templates and variants, enhancing the channel management capabilities. Removed outdated bumper-related commands and handlers from the application, streamlining the codebase and improving maintainability. Updated ChannelEndpoints to reflect these changes and ensure proper routing for the new endpoints.
This commit is contained in:
@@ -1,5 +1,4 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using TeleWave.Application.Broadcast;
|
||||
using TeleWave.Application.Broadcast.Bumpers;
|
||||
using TeleWave.Application.Tests.Support;
|
||||
using TeleWave.Domain.Broadcast;
|
||||
@@ -9,23 +8,25 @@ namespace TeleWave.Application.Tests.Broadcast;
|
||||
|
||||
public class BumperVariantHandlersTests
|
||||
{
|
||||
private static readonly DateTimeOffset T0 = new(2026, 1, 1, 0, 0, 0, TimeSpan.Zero);
|
||||
private static BumperTemplate NewTemplate() => BumperTemplate.Create("Блок", "Текст 1");
|
||||
|
||||
private static BumperLineDto Line(string text) =>
|
||||
new(BumperLineStyle.Title, BumperLineColor.Text, text);
|
||||
|
||||
[Fact]
|
||||
public async Task AddVariant_AutoNames_WhenBlank()
|
||||
public async Task AddVariant_StartsFromDefaultPreset()
|
||||
{
|
||||
var fixture = new TestDb();
|
||||
var channel = Channel.Create("c", "c", T0);
|
||||
var template = channel.BumperTemplates[0];
|
||||
var template = NewTemplate();
|
||||
await using (var seed = fixture.New())
|
||||
{
|
||||
seed.Channels.Add(channel);
|
||||
seed.BumperTemplates.Add(template);
|
||||
await seed.SaveChangesAsync(CancellationToken.None);
|
||||
}
|
||||
|
||||
await using var db = fixture.New();
|
||||
var result = await new AddBumperTextVariantCommandHandler(db).Handle(
|
||||
new AddBumperTextVariantCommand(channel.Id, template.Id, " "),
|
||||
var result = await new AddBumperVariantCommandHandler(db).Handle(
|
||||
new AddBumperVariantCommand(template.Id, "Текст 2"),
|
||||
CancellationToken.None
|
||||
);
|
||||
Assert.True(result.IsSuccess);
|
||||
@@ -33,60 +34,60 @@ public class BumperVariantHandlersTests
|
||||
|
||||
await using var verify = fixture.New();
|
||||
var stored = await verify
|
||||
.Channels.Include(c => c.BumperTemplates)
|
||||
.ThenInclude(t => t.Variants)
|
||||
.FirstAsync(c => c.Id == channel.Id);
|
||||
var variants = stored.BumperTemplates[0].Variants;
|
||||
Assert.Equal(2, variants.Count);
|
||||
Assert.Contains(variants, v => v.Name == "Текст 2");
|
||||
.BumperTemplates.Include(t => t.Variants)
|
||||
.FirstAsync(t => t.Id == template.Id);
|
||||
Assert.Equal(2, stored.Variants.Count);
|
||||
var added = stored.Variants.First(v => v.Name == "Текст 2");
|
||||
// Пустой подблок в редакторе выглядит поломанным — новый начинается с «Сейчас/Далее».
|
||||
Assert.Equal(4, added.Lines.Count);
|
||||
Assert.Contains(added.Lines, l => l.Text == "{next.title}");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task AddVariant_UnknownTemplate_ReturnsNotFound()
|
||||
{
|
||||
var fixture = new TestDb();
|
||||
var channel = Channel.Create("c", "c", T0);
|
||||
await using (var seed = fixture.New())
|
||||
{
|
||||
seed.Channels.Add(channel);
|
||||
await seed.SaveChangesAsync(CancellationToken.None);
|
||||
}
|
||||
|
||||
await using var db = fixture.New();
|
||||
var result = await new AddBumperTextVariantCommandHandler(db).Handle(
|
||||
new AddBumperTextVariantCommand(channel.Id, Guid.NewGuid(), "x"),
|
||||
|
||||
var result = await new AddBumperVariantCommandHandler(db).Handle(
|
||||
new AddBumperVariantCommand(Guid.NewGuid(), "x"),
|
||||
CancellationToken.None
|
||||
);
|
||||
Assert.Equal(ChannelErrors.BumperTemplateNotFound, result.Error);
|
||||
|
||||
Assert.Equal(BumperErrors.TemplateNotFound, result.Error);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task UpdateVariant_ChangesFields()
|
||||
public async Task UpdateVariant_ReplacesLinesAndFields()
|
||||
{
|
||||
var fixture = new TestDb();
|
||||
var channel = Channel.Create("c", "c", T0);
|
||||
var template = channel.BumperTemplates[0];
|
||||
var template = NewTemplate();
|
||||
var variant = template.Variants[0];
|
||||
await using (var seed = fixture.New())
|
||||
{
|
||||
seed.Channels.Add(channel);
|
||||
seed.BumperTemplates.Add(template);
|
||||
await seed.SaveChangesAsync(CancellationToken.None);
|
||||
}
|
||||
|
||||
await using var db = fixture.New();
|
||||
var result = await new UpdateBumperTextVariantCommandHandler(db).Handle(
|
||||
new UpdateBumperTextVariantCommand(
|
||||
channel.Id,
|
||||
var result = await new UpdateBumperVariantCommandHandler(db).Handle(
|
||||
new UpdateBumperVariantCommand(
|
||||
template.Id,
|
||||
variant.Id,
|
||||
"Custom",
|
||||
BumperTextKind.Free,
|
||||
"NOW",
|
||||
"NEXT",
|
||||
"line1",
|
||||
"line2",
|
||||
BumperTrigger.Both,
|
||||
7
|
||||
new BumperVariantInput(
|
||||
"Custom",
|
||||
BumperTrigger.Both,
|
||||
BumperBackground.Template,
|
||||
7,
|
||||
[
|
||||
new BumperLineDto(
|
||||
BumperLineStyle.Label,
|
||||
BumperLineColor.Accent,
|
||||
"ДАЛЕЕ В {next.time}"
|
||||
),
|
||||
Line("{next.title}"),
|
||||
]
|
||||
)
|
||||
),
|
||||
CancellationToken.None
|
||||
);
|
||||
@@ -95,45 +96,75 @@ public class BumperVariantHandlersTests
|
||||
|
||||
await using var verify = fixture.New();
|
||||
var stored = await verify
|
||||
.Channels.Include(c => c.BumperTemplates)
|
||||
.ThenInclude(t => t.Variants)
|
||||
.FirstAsync(c => c.Id == channel.Id);
|
||||
var v = stored.BumperTemplates[0].Variants[0];
|
||||
.BumperTemplates.Include(t => t.Variants)
|
||||
.FirstAsync(t => t.Id == template.Id);
|
||||
var v = stored.Variants[0];
|
||||
Assert.Equal("Custom", v.Name);
|
||||
Assert.Equal(BumperTextKind.Free, v.Kind);
|
||||
Assert.Equal(7, v.Weight);
|
||||
Assert.Equal(BumperTrigger.Both, v.Trigger);
|
||||
Assert.Equal(BumperBackground.Template, v.Background);
|
||||
Assert.Equal(7, v.Weight);
|
||||
Assert.Equal(2, v.Lines.Count);
|
||||
Assert.Equal("ДАЛЕЕ В {next.time}", v.Lines[0].Text);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task UpdateVariant_UnknownPlaceholder_IsRejected()
|
||||
{
|
||||
var fixture = new TestDb();
|
||||
var template = NewTemplate();
|
||||
var variant = template.Variants[0];
|
||||
await using (var seed = fixture.New())
|
||||
{
|
||||
seed.BumperTemplates.Add(template);
|
||||
await seed.SaveChangesAsync(CancellationToken.None);
|
||||
}
|
||||
|
||||
await using var db = fixture.New();
|
||||
var result = await new UpdateBumperVariantCommandHandler(db).Handle(
|
||||
new UpdateBumperVariantCommand(
|
||||
template.Id,
|
||||
variant.Id,
|
||||
new BumperVariantInput(
|
||||
"Custom",
|
||||
BumperTrigger.Both,
|
||||
BumperBackground.Template,
|
||||
1,
|
||||
[Line("Далее {next.tittle}")]
|
||||
)
|
||||
),
|
||||
CancellationToken.None
|
||||
);
|
||||
|
||||
// В эфире опечатка превратилась бы в пустоту, и заметить это было бы уже некому.
|
||||
Assert.Equal("Bumpers.UnknownPlaceholders", result.Error.Code);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task RemoveVariant_CannotRemoveLast_ButRemovesExtra()
|
||||
{
|
||||
var fixture = new TestDb();
|
||||
var channel = Channel.Create("c", "c", T0);
|
||||
var template = channel.BumperTemplates[0];
|
||||
var template = NewTemplate();
|
||||
var only = template.Variants[0];
|
||||
var extra = template.AddVariant("Text 2");
|
||||
var extra = template.AddVariant("Текст 2");
|
||||
await using (var seed = fixture.New())
|
||||
{
|
||||
seed.Channels.Add(channel);
|
||||
seed.BumperTemplates.Add(template);
|
||||
await seed.SaveChangesAsync(CancellationToken.None);
|
||||
}
|
||||
|
||||
await using var db = fixture.New();
|
||||
var handler = new RemoveBumperTextVariantCommandHandler(db);
|
||||
|
||||
var okRemove = await handler.Handle(
|
||||
new RemoveBumperTextVariantCommand(channel.Id, template.Id, extra.Id),
|
||||
var okRemove = await new RemoveBumperVariantCommandHandler(db).Handle(
|
||||
new RemoveBumperVariantCommand(template.Id, extra.Id),
|
||||
CancellationToken.None
|
||||
);
|
||||
Assert.True(okRemove.IsSuccess);
|
||||
await db.SaveChangesAsync(CancellationToken.None);
|
||||
|
||||
await using var db2 = fixture.New();
|
||||
var lastGuard = await new RemoveBumperTextVariantCommandHandler(db2).Handle(
|
||||
new RemoveBumperTextVariantCommand(channel.Id, template.Id, only.Id),
|
||||
var lastGuard = await new RemoveBumperVariantCommandHandler(db2).Handle(
|
||||
new RemoveBumperVariantCommand(template.Id, only.Id),
|
||||
CancellationToken.None
|
||||
);
|
||||
Assert.Equal(ChannelErrors.CannotRemoveLastBumperTextVariant, lastGuard.Error);
|
||||
Assert.Equal(BumperErrors.CannotRemoveLastVariant, lastGuard.Error);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user