using System; using System.IO; using Microsoft.Data.Sqlite; using Notification.Core; using Notification.Wpf.Controls; using Xunit; using ytLive.ViewModels; namespace ytLive.Tests; [Collection("RealApp")] public sealed class ToastPositionIntegrationTests { private readonly RealAppHost _app; public ToastPositionIntegrationTests(RealAppHost app) => _app = app; [Fact] public void GlobalPosition_UpdatesToastArea_AndPersistsAcrossRestart() => _app.Run(() => { var tempDb = Path.Combine(Path.GetTempPath(), $"ytLlive-toast-position-{Guid.NewGuid():N}.db"); MainViewModel.LayoutPathOverride = tempDb; MainWindow? window = null; try { window = new MainWindow(); window.Show(); var vm = (MainViewModel)window.DataContext; var area = Assert.IsType(window.FindName("ToastArea")); Assert.Equal(NotificationPosition.BottomRight, vm.ToastPosition); Assert.Equal(NotificationPosition.BottomRight, area.Position); vm.ToastPosition = NotificationPosition.CenterLeft; Assert.Equal(NotificationPosition.CenterLeft, area.Position); window.Close(); window = null; SqliteConnection.ClearAllPools(); window = new MainWindow(); window.Show(); var restoredVm = (MainViewModel)window.DataContext; var restoredArea = Assert.IsType(window.FindName("ToastArea")); Assert.Equal(NotificationPosition.CenterLeft, restoredVm.ToastPosition); Assert.Equal(NotificationPosition.CenterLeft, restoredArea.Position); var settings = SourceAssert.Text("Controls", "SettingsDrawer.xaml"); Assert.Contains("Text=\"Slide-out alerts\"", settings); Assert.Contains("Content=\"Center left\"", settings); Assert.Contains("Content=\"Bottom right\"", settings); } finally { window?.Close(); MainViewModel.LayoutPathOverride = null; SqliteConnection.ClearAllPools(); try { File.Delete(tempDb); } catch { /* best-effort cleanup */ } } }); }