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.
This commit is contained in:
@@ -29,8 +29,9 @@ public class DynamicGroupsTests
|
||||
|
||||
var group = Group.Create("Мультфильмы");
|
||||
group.SetFilter(new GroupFilter(GenreIds: [genre.Id]).ToJson());
|
||||
group.AddElement(GroupElementKind.Show, pinned.Id);
|
||||
group.SetMode(GroupMode.Dynamic);
|
||||
// Закрепляют уже в динамическом режиме: там список — это поправки к правилу.
|
||||
group.AddElement(GroupElementKind.Show, pinned.Id);
|
||||
|
||||
await using (var seed = fixture.New())
|
||||
{
|
||||
@@ -97,17 +98,24 @@ public class DynamicGroupsTests
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task SwitchToDynamic_KeepsExistingItemsAsPinned()
|
||||
public async Task SwitchToDynamic_DropsTheOldListAndLetsTheRuleDecide()
|
||||
{
|
||||
// Смена режима не должна вымывать из эфира то, что уже стояло в слотах.
|
||||
// Переключили «по правилу» — значит состав считает правило. Прежний список, перенесённый
|
||||
// закреплённым, оставался бы в группе навсегда: сузить набор правилом было бы нечем,
|
||||
// и «динамическая» отличалась бы от статической только названием.
|
||||
var fixture = new TestDb();
|
||||
var show = Show.Create("A", ShowKind.Series);
|
||||
var genre = Genre.Create("Мультфильм", "animation");
|
||||
var byRule = WithGenre(Show.Create("По правилу", ShowKind.Series), genre);
|
||||
var old = Show.Create("Из старого списка", ShowKind.Series);
|
||||
|
||||
var group = Group.Create("Группа");
|
||||
group.AddElement(GroupElementKind.Show, show.Id);
|
||||
group.SetFilter(new GroupFilter(GenreIds: [genre.Id]).ToJson());
|
||||
group.AddElement(GroupElementKind.Show, old.Id);
|
||||
|
||||
await using (var seed = fixture.New())
|
||||
{
|
||||
seed.Shows.Add(show);
|
||||
seed.Genres.Add(genre);
|
||||
seed.Shows.AddRange(byRule, old);
|
||||
seed.Groups.Add(group);
|
||||
await seed.SaveChangesAsync(CancellationToken.None);
|
||||
}
|
||||
@@ -117,7 +125,11 @@ public class DynamicGroupsTests
|
||||
await using var check = fixture.New();
|
||||
var stored = check.Groups.Include(g => g.Items).Single();
|
||||
Assert.Equal(GroupMode.Dynamic, stored.Mode);
|
||||
Assert.Equal(GroupItemRole.Pinned, stored.Items.Single().Role);
|
||||
Assert.Empty(stored.Items);
|
||||
|
||||
// В составе — только то, что нашло правило: шоу из прежнего списка под него не подходит.
|
||||
var composition = await ResolveAsync(fixture, group.Id);
|
||||
Assert.Equal([byRule.Id], composition.Select(e => e.Id));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
||||
@@ -50,8 +50,9 @@ public class GetGroupTests
|
||||
|
||||
var group = Group.Create("Динамическая");
|
||||
group.SetFilter(new GroupFilter(GenreIds: [genre.Id]).ToJson());
|
||||
group.AddElement(GroupElementKind.Show, pinned.Id);
|
||||
group.SetMode(GroupMode.Dynamic);
|
||||
// Закрепляют уже в динамическом режиме: там список — это поправки к правилу.
|
||||
group.AddElement(GroupElementKind.Show, pinned.Id);
|
||||
|
||||
await using (var seed = fixture.New())
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user