Refactor group deletion logic to handle fallback group references
Updated the DeleteGroupCommandHandler to release fallback group references during group deletion, ensuring that groups can be removed even when used as fallback in templates. Adjusted related tests to verify the correct behavior of the deletion process, confirming that fallback references are cleared appropriately. Enhanced localization strings to provide clearer context for fallback group functionality in both English and Russian.
This commit is contained in:
@@ -225,14 +225,19 @@ public class DeleteGuardsTests
|
||||
Assert.Equal(GroupErrors.InUse(string.Empty).Code, result.Error.Code);
|
||||
}
|
||||
|
||||
/// <summary>Запасная группа шаблона внешнего ключа не имеет — её пришлось бы ловить отдельно.</summary>
|
||||
/// <summary>
|
||||
/// Запасная группа шаблона удаление не держит: слот и врезка — осознанная настройка сетки,
|
||||
/// а её проставляет и автосборка, и снять её из интерфейса было нечем — группа оставалась
|
||||
/// неудаляемой навсегда. Ссылка снимается, ревизия растёт: эфиру нужна пересборка.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public async Task DeleteGroup_UsedAsTemplateFallback_Fails()
|
||||
public async Task DeleteGroup_UsedAsTemplateFallback_ReleasesReference()
|
||||
{
|
||||
var fixture = new TestDb();
|
||||
var group = Group.Create("G");
|
||||
var template = ScheduleTemplate.Create(Guid.NewGuid(), "Сетка");
|
||||
template.SetFallbackGroup(group.Id);
|
||||
template.MarkApplied();
|
||||
|
||||
await using (var seed = fixture.New())
|
||||
{
|
||||
@@ -241,14 +246,22 @@ public class DeleteGuardsTests
|
||||
await seed.SaveChangesAsync(CancellationToken.None);
|
||||
}
|
||||
|
||||
await using var db = fixture.New();
|
||||
var result = await new DeleteGroupCommandHandler(db).Handle(
|
||||
new DeleteGroupCommand(group.Id),
|
||||
CancellationToken.None
|
||||
);
|
||||
await using (var db = fixture.New())
|
||||
{
|
||||
var result = await new DeleteGroupCommandHandler(db).Handle(
|
||||
new DeleteGroupCommand(group.Id),
|
||||
CancellationToken.None
|
||||
);
|
||||
|
||||
Assert.False(result.IsSuccess);
|
||||
Assert.Equal(GroupErrors.InUse(string.Empty).Code, result.Error.Code);
|
||||
Assert.True(result.IsSuccess);
|
||||
await db.SaveChangesAsync(CancellationToken.None);
|
||||
}
|
||||
|
||||
await using var check = fixture.New();
|
||||
var stored = await check.ScheduleTemplates.FirstAsync(t => t.Id == template.Id);
|
||||
Assert.Null(stored.FallbackGroupId);
|
||||
Assert.True(stored.HasPendingChanges);
|
||||
Assert.False(await check.Groups.AnyAsync(g => g.Id == group.Id));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -262,7 +275,20 @@ public class DeleteGuardsTests
|
||||
var group = Group.Create("G");
|
||||
var channel = Channel.Create("Первый", $"first-{Guid.NewGuid():N}", T0);
|
||||
var template = ScheduleTemplate.Create(channel.Id, "Сетка");
|
||||
template.SetFallbackGroup(group.Id);
|
||||
var layer = template.AddLayer("Базовый", 10);
|
||||
var slot = layer.AddSlot("Блок", new TimeOnly(6, 0), 60);
|
||||
slot.UpdateContent(
|
||||
new SlotContent(
|
||||
slot.Title,
|
||||
SlotKind.Content,
|
||||
group.Id,
|
||||
null,
|
||||
null,
|
||||
SlotBlockMode.FillSlot,
|
||||
1,
|
||||
OverflowPolicy.ContinueNext
|
||||
)
|
||||
);
|
||||
|
||||
await using (var seed = fixture.New())
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user