Files
TeleWave/backend/tests/TeleWave.Domain.Tests/Programming/GroupTests.cs
T
Leonid Pershin 375e0a810b
ci / build-backend (push) Successful in 1m36s
ci / build-frontend (push) Successful in 52s
ci / tests (push) Successful in 2m3s
ci / sonar (push) Successful in 6m21s
Refactor group mode switching logic to ensure proper list management
Updated the Group and UpdateGroupCommandHandler classes to clarify the behavior of group mode switching. The transition to dynamic mode now clears the existing item list to prevent old items from interfering with the new rule-based composition. Enhanced documentation and comments to explain the implications of mode changes. Updated tests to reflect the new behavior, ensuring that the group correctly handles item lists during mode transitions. Localization strings were also updated to inform users about the changes in item management during mode switching.
2026-07-31 04:22:36 +03:00

196 lines
6.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using TeleWave.Domain.Programming;
using Xunit;
namespace TeleWave.Domain.Tests.Programming;
public class GroupTests
{
private static IReadOnlyList<Guid> Order(Group group) =>
group.Items.OrderBy(i => i.Position).Select(i => i.Id).ToList();
[Fact]
public void AddElement_AppendsAndRejectsDuplicates()
{
var group = Group.Create("Боевики 90-х");
var showId = Guid.NewGuid();
Assert.NotNull(group.AddElement(GroupElementKind.Show, showId));
Assert.Null(group.AddElement(GroupElementKind.Show, showId));
Assert.Single(group.Items);
}
[Fact]
public void AddElement_SameIdDifferentKind_AreDistinct()
{
var group = Group.Create("Смешанная");
var id = Guid.NewGuid();
group.AddElement(GroupElementKind.Show, id);
group.AddElement(GroupElementKind.Collection, id);
Assert.Equal(2, group.Items.Count);
}
[Fact]
public void RemoveElement_DropsAllMatchingPositions()
{
var group = Group.Create("Боевики");
var showId = Guid.NewGuid();
group.AddElement(GroupElementKind.Show, showId);
group.AddElement(GroupElementKind.Show, Guid.NewGuid());
var removed = group.RemoveElement(GroupElementKind.Show, showId);
Assert.Equal(1, removed);
Assert.Single(group.Items);
}
[Fact]
public void SetWeight_ClampsNegativeToZero()
{
var group = Group.Create("Боевики");
var item = group.AddElement(GroupElementKind.Show, Guid.NewGuid())!;
group.SetWeight(item.Id, -5);
// Ноль — законный вес («исключить, не удаляя»), отрицательный сломал бы взвешенный выбор.
Assert.Equal(0, item.Weight);
}
[Fact]
public void SetWeight_UnknownItem_ReturnsFalse()
{
var group = Group.Create("Боевики");
Assert.False(group.SetWeight(Guid.NewGuid(), 3));
}
[Fact]
public void Reorder_KeepsUnmentionedAfterRequested()
{
var group = Group.Create("Боевики");
var a = group.AddElement(GroupElementKind.Show, Guid.NewGuid())!;
var b = group.AddElement(GroupElementKind.Show, Guid.NewGuid())!;
var c = group.AddElement(GroupElementKind.Show, Guid.NewGuid())!;
group.Reorder([c.Id]);
Assert.Equal([c.Id, a.Id, b.Id], Order(group));
}
[Fact]
public void SetFilter_TreatsBlankAsAbsent()
{
var group = Group.Create("Боевики");
group.SetFilter(" ");
Assert.Null(group.FilterJson);
}
[Fact]
public void UpdateStats_StoresSnapshot()
{
var group = Group.Create("Боевики");
var at = new DateTimeOffset(2026, 1, 1, 0, 0, 0, TimeSpan.Zero);
group.UpdateStats(3, 42, TimeSpan.FromHours(18), at);
Assert.Equal(3, group.ItemCount);
Assert.Equal(42, group.UnitCount);
Assert.Equal(TimeSpan.FromHours(18), group.TotalDuration);
Assert.Equal(at, group.StatsComputedAt);
}
[Fact]
public void SetMode_ToDynamic_DropsTheOldList()
{
// Прежний состав, перенесённый закреплённым, отменял бы сам переход: правило считало бы
// набор заново, а старые позиции оставались бы в нём навсегда — сузить группу правилом
// стало бы нечем.
var group = Group.Create("Боевики");
group.AddElement(GroupElementKind.Show, Guid.NewGuid());
group.AddElement(GroupElementKind.Show, Guid.NewGuid());
group.SetMode(GroupMode.Dynamic);
Assert.Equal(GroupMode.Dynamic, group.Mode);
Assert.Empty(group.Items);
}
[Fact]
public void SetMode_BackToStatic_DropsCorrectionsToo()
{
// В обратную сторону симметрично: закрепления и исключения — поправки к правилу, и без
// правила они бессмысленны. Состав статической группе выдаёт прикладной слой.
var group = Group.Create("Боевики");
group.SetMode(GroupMode.Dynamic);
group.AddElement(GroupElementKind.Show, Guid.NewGuid());
group.Exclude(GroupElementKind.Show, Guid.NewGuid());
group.SetMode(GroupMode.Static);
Assert.Empty(group.Items);
}
[Fact]
public void SetMode_SameMode_ChangesNothing()
{
var group = Group.Create("Боевики");
group.AddElement(GroupElementKind.Show, Guid.NewGuid());
group.SetMode(GroupMode.Static);
Assert.Equal(GroupItemRole.Member, group.Items.Single().Role);
}
[Fact]
public void AddElement_InDynamicGroup_PinsByDefault()
{
// Иначе правило вымело бы позицию на первом же обращении.
var group = Group.Create("Боевики");
group.SetMode(GroupMode.Dynamic);
var item = group.AddElement(GroupElementKind.Show, Guid.NewGuid());
Assert.Equal(GroupItemRole.Pinned, item!.Role);
}
[Fact]
public void Exclude_TurnsPinnedIntoExclusion()
{
// Держать на один элемент обе противоположные поправки нельзя.
var group = Group.Create("Боевики");
group.SetMode(GroupMode.Dynamic);
var show = Guid.NewGuid();
group.AddElement(GroupElementKind.Show, show);
Assert.True(group.Exclude(GroupElementKind.Show, show));
Assert.Equal(GroupItemRole.Excluded, group.Items.Single().Role);
}
[Fact]
public void Exclude_InStaticGroup_IsRefused()
{
var group = Group.Create("Боевики");
Assert.False(group.Exclude(GroupElementKind.Show, Guid.NewGuid()));
Assert.Empty(group.Items);
}
[Fact]
public void RemoveExclusion_ReturnsElementToTheRule()
{
var group = Group.Create("Боевики");
group.SetMode(GroupMode.Dynamic);
var show = Guid.NewGuid();
group.Exclude(GroupElementKind.Show, show);
Assert.True(group.RemoveExclusion(GroupElementKind.Show, show));
Assert.Empty(group.Items);
// Снимать нечего — второй раз это уже не поправка.
Assert.False(group.RemoveExclusion(GroupElementKind.Show, show));
}
}