diff --git a/Codev.Avalonia.Tests/MainWindowTests.cs b/Codev.Avalonia.Tests/MainWindowTests.cs index c37571ec..a6784586 100644 --- a/Codev.Avalonia.Tests/MainWindowTests.cs +++ b/Codev.Avalonia.Tests/MainWindowTests.cs @@ -213,6 +213,82 @@ public async Task Dragging_a_recent_conversation_row_reorders_the_sidebar() } } + [AvaloniaFact] + public async Task Dropping_conversations_across_sidebar_groups_does_not_reorder_them() + { + var root = Path.Combine(Path.GetTempPath(), "Codev-auto-mode-ui", Guid.NewGuid().ToString("N")); + MainViewModel? viewModel = null; + MainWindow? window = null; + try + { + viewModel = new MainViewModel(root); + var pinned = Assert.IsType(viewModel.ActiveConversation); + pinned.Title = "Pinned parent fixture"; + pinned.IsPinned = true; + pinned.SidebarOrder = 0; + pinned.ChildConversationsExpanded = true; + var recent = new Conversation + { + Title = "Recent parent fixture", + SidebarOrder = 0, + ChildConversationsExpanded = true + }; + var pinnedChild = new Conversation + { + Title = "Pinned child fixture", + ParentConversationId = pinned.Id, + SidebarOrder = 0 + }; + var recentChild = new Conversation + { + Title = "Recent child fixture", + ParentConversationId = recent.Id, + SidebarOrder = 0 + }; + var conversations = Assert.IsType>( + typeof(MainViewModel).GetField("_conversations", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(viewModel)); + conversations.Add(recent); + conversations.Add(pinnedChild); + conversations.Add(recentChild); + typeof(MainViewModel).GetMethod("RebuildLists", BindingFlags.Instance | BindingFlags.NonPublic)!.Invoke(viewModel, null); + + Assert.False(viewModel.CanReorderConversation(pinned.Id, recent)); + Assert.False(viewModel.CanReorderConversation(pinnedChild.Id, recentChild)); + window = new MainWindow { DataContext = viewModel }; + window.Show(); + window.UpdateLayout(); + + Drop(pinned, recent); + Drop(pinnedChild, recentChild); + + Assert.Equal(new[] { pinned.Id }, viewModel.PinnedConversations.Select(item => item.Id)); + Assert.Equal(new[] { recent.Id }, viewModel.RecentConversations.Select(item => item.Id)); + Assert.Equal(new[] { pinnedChild.Id }, pinned.ChildConversations.Select(item => item.Id)); + Assert.Equal(new[] { recentChild.Id }, recent.ChildConversations.Select(item => item.Id)); + } + finally + { + window?.Close(); + if (viewModel is not null) await StopAndFlushAsync(viewModel); + await DeleteAutoModeTestDirectoryAsync(root); + } + + void Drop(Conversation source, Conversation target) + { + var targetRow = Assert.Single(window!.GetVisualDescendants().OfType