feat(ui): add current-launch logs tab
Add Live Chat and Logs tabs to the non-edit left panel. Expose a bounded process-local AppLog feed so the newest messages appear first without importing earlier startup.log contents or changing file logging. Ref: https://obsproject.com/forum/resources/understanding-obs-studio-log.473
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Controls.Primitives;
|
||||
using Microsoft.Data.Sqlite;
|
||||
using Xunit;
|
||||
using ytLive.Helpers;
|
||||
using ytLive.ViewModels;
|
||||
|
||||
namespace ytLive.Tests;
|
||||
|
||||
[Collection("RealApp")]
|
||||
public sealed class LogsPanelTests
|
||||
{
|
||||
private readonly RealAppHost _app;
|
||||
|
||||
public LogsPanelTests(RealAppHost app) => _app = app;
|
||||
|
||||
[Fact]
|
||||
public void NonEditPanel_DefaultsToLiveChat_AndShowsCurrentLaunchLogsNewestFirst()
|
||||
{
|
||||
var directory = Path.Combine(Path.GetTempPath(), $"ytlive-logs-panel-{Guid.NewGuid():N}");
|
||||
Directory.CreateDirectory(directory);
|
||||
var databasePath = Path.Combine(directory, "layout.db");
|
||||
var logPath = Path.Combine(directory, "startup.log");
|
||||
File.WriteAllText(logPath, "previous-launch-sentinel" + Environment.NewLine);
|
||||
AppLog.PathOverride = logPath;
|
||||
MainViewModel.LayoutPathOverride = databasePath;
|
||||
|
||||
try
|
||||
{
|
||||
_app.Run(() =>
|
||||
{
|
||||
var window = new MainWindow();
|
||||
try
|
||||
{
|
||||
window.Show();
|
||||
window.UpdateLayout();
|
||||
var vm = (MainViewModel)window.DataContext;
|
||||
var panel = (UserControl)window.FindName("LeftPanel")!;
|
||||
var chatTab = (ToggleButton)panel.FindName("LiveChatTabButton")!;
|
||||
var logsTab = (ToggleButton)panel.FindName("LogsTabButton")!;
|
||||
var logList = (ListBox)panel.FindName("LogListBox")!;
|
||||
|
||||
Assert.True(vm.IsLiveChatTabSelected);
|
||||
Assert.True(chatTab.IsChecked);
|
||||
Assert.False(logsTab.IsChecked);
|
||||
Assert.Equal(System.Windows.Visibility.Collapsed, logList.Visibility);
|
||||
|
||||
vm.IsLogsTabSelected = true;
|
||||
window.UpdateLayout();
|
||||
Assert.True(logsTab.IsChecked);
|
||||
Assert.False(chatTab.IsChecked);
|
||||
Assert.Equal(System.Windows.Visibility.Visible, logList.Visibility);
|
||||
|
||||
AppLog.Write("LogsPanel older marker");
|
||||
AppLog.Write("LogsPanel newer marker");
|
||||
vm.RefreshCurrentLaunchLogs();
|
||||
window.UpdateLayout();
|
||||
|
||||
var entries = vm.CurrentLaunchLogEntries.Select(entry => entry.Text).ToArray();
|
||||
var newerIndex = Array.FindIndex(entries, text => text.Contains("LogsPanel newer marker", StringComparison.Ordinal));
|
||||
var olderIndex = Array.FindIndex(entries, text => text.Contains("LogsPanel older marker", StringComparison.Ordinal));
|
||||
Assert.True(newerIndex >= 0 && olderIndex >= 0, "new log writes did not reach the Logs tab");
|
||||
Assert.True(newerIndex < olderIndex, "the Logs tab must put the newest entry first");
|
||||
Assert.DoesNotContain(entries, text => text.Contains("previous-launch-sentinel", StringComparison.Ordinal));
|
||||
Assert.Same(vm.CurrentLaunchLogEntries, logList.ItemsSource);
|
||||
}
|
||||
finally
|
||||
{
|
||||
window.Close();
|
||||
}
|
||||
});
|
||||
}
|
||||
finally
|
||||
{
|
||||
MainViewModel.LayoutPathOverride = null;
|
||||
AppLog.PathOverride = null;
|
||||
SqliteConnection.ClearAllPools();
|
||||
try { Directory.Delete(directory, recursive: true); } catch { }
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user