Merge claudedo/ff453a6b9db849cd9b076fc63fe5399a
This commit is contained in:
@@ -45,7 +45,7 @@ public sealed partial class LogVisualizerViewModel : ViewModelBase
|
|||||||
IEnumerable<WorkerLogEntry> items = WarnErrorOnly
|
IEnumerable<WorkerLogEntry> items = WarnErrorOnly
|
||||||
? _all.Where(e => e.Level is WorkerLogLevel.Warn or WorkerLogLevel.Error)
|
? _all.Where(e => e.Level is WorkerLogLevel.Warn or WorkerLogLevel.Error)
|
||||||
: _all;
|
: _all;
|
||||||
foreach (var e in items)
|
foreach (var e in items.Reverse())
|
||||||
Rows.Add(new LogVisualizerRow(e.TimestampUtc.ToLocalTime().ToString("HH:mm:ss"), e.Message, e.Level));
|
Rows.Add(new LogVisualizerRow(e.TimestampUtc.ToLocalTime().ToString("HH:mm:ss"), e.Message, e.Level));
|
||||||
StatusText = Rows.Count == 0
|
StatusText = Rows.Count == 0
|
||||||
? Loc.T("modals.logVisualizer.empty")
|
? Loc.T("modals.logVisualizer.empty")
|
||||||
|
|||||||
@@ -36,7 +36,7 @@
|
|||||||
Command="{Binding RefreshCommand}"/>
|
Command="{Binding RefreshCommand}"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<!-- Last 30 min, oldest-first -->
|
<!-- Last 30 min, newest-first -->
|
||||||
<Border Classes="terminal" Margin="14,0,14,14">
|
<Border Classes="terminal" Margin="14,0,14,14">
|
||||||
<ScrollViewer VerticalScrollBarVisibility="Visible" AllowAutoHide="False" Padding="10,8">
|
<ScrollViewer VerticalScrollBarVisibility="Visible" AllowAutoHide="False" Padding="10,8">
|
||||||
<ItemsControl ItemsSource="{Binding Rows}">
|
<ItemsControl ItemsSource="{Binding Rows}">
|
||||||
|
|||||||
@@ -16,14 +16,17 @@ public class LogVisualizerViewModelTests
|
|||||||
private static WorkerLogEntry E(WorkerLogLevel lvl, string msg)
|
private static WorkerLogEntry E(WorkerLogLevel lvl, string msg)
|
||||||
=> new(msg, lvl, new DateTime(2026, 6, 23, 8, 0, 0, DateTimeKind.Utc));
|
=> new(msg, lvl, new DateTime(2026, 6, 23, 8, 0, 0, DateTimeKind.Utc));
|
||||||
|
|
||||||
|
private static WorkerLogEntry E(WorkerLogLevel lvl, string msg, DateTime timestampUtc)
|
||||||
|
=> new(msg, lvl, timestampUtc);
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task Refresh_populates_rows_from_worker()
|
public async Task Refresh_populates_rows_from_worker_newest_first()
|
||||||
{
|
{
|
||||||
var vm = new LogVisualizerViewModel(new FakeClient(new[] { E(WorkerLogLevel.Info, "a"), E(WorkerLogLevel.Error, "b") }));
|
var vm = new LogVisualizerViewModel(new FakeClient(new[] { E(WorkerLogLevel.Info, "a"), E(WorkerLogLevel.Error, "b") }));
|
||||||
|
|
||||||
await vm.RefreshAsync();
|
await vm.RefreshAsync();
|
||||||
|
|
||||||
Assert.Equal(new[] { "a", "b" }, vm.Rows.Select(r => r.Message));
|
Assert.Equal(new[] { "b", "a" }, vm.Rows.Select(r => r.Message));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
@@ -35,7 +38,7 @@ public class LogVisualizerViewModelTests
|
|||||||
|
|
||||||
vm.WarnErrorOnly = true;
|
vm.WarnErrorOnly = true;
|
||||||
|
|
||||||
Assert.Equal(new[] { "w", "e" }, vm.Rows.Select(r => r.Message));
|
Assert.Equal(new[] { "e", "w" }, vm.Rows.Select(r => r.Message));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
@@ -48,4 +51,38 @@ public class LogVisualizerViewModelTests
|
|||||||
Assert.Empty(vm.Rows);
|
Assert.Empty(vm.Rows);
|
||||||
Assert.False(string.IsNullOrEmpty(vm.StatusText));
|
Assert.False(string.IsNullOrEmpty(vm.StatusText));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task Refresh_orders_newest_entry_first()
|
||||||
|
{
|
||||||
|
var t0 = new DateTime(2026, 6, 23, 8, 0, 0, DateTimeKind.Utc);
|
||||||
|
var vm = new LogVisualizerViewModel(new FakeClient(new[]
|
||||||
|
{
|
||||||
|
E(WorkerLogLevel.Info, "oldest", t0),
|
||||||
|
E(WorkerLogLevel.Info, "middle", t0.AddMinutes(1)),
|
||||||
|
E(WorkerLogLevel.Info, "newest", t0.AddMinutes(2)),
|
||||||
|
}));
|
||||||
|
|
||||||
|
await vm.RefreshAsync();
|
||||||
|
|
||||||
|
Assert.Equal(new[] { "newest", "middle", "oldest" }, vm.Rows.Select(r => r.Message));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task Refresh_orders_newest_entry_first_with_warn_error_only()
|
||||||
|
{
|
||||||
|
var t0 = new DateTime(2026, 6, 23, 8, 0, 0, DateTimeKind.Utc);
|
||||||
|
var vm = new LogVisualizerViewModel(new FakeClient(new[]
|
||||||
|
{
|
||||||
|
E(WorkerLogLevel.Warn, "oldest", t0),
|
||||||
|
E(WorkerLogLevel.Info, "skipped", t0.AddMinutes(1)),
|
||||||
|
E(WorkerLogLevel.Error, "middle", t0.AddMinutes(2)),
|
||||||
|
E(WorkerLogLevel.Warn, "newest", t0.AddMinutes(3)),
|
||||||
|
}));
|
||||||
|
await vm.RefreshAsync();
|
||||||
|
|
||||||
|
vm.WarnErrorOnly = true;
|
||||||
|
|
||||||
|
Assert.Equal(new[] { "newest", "middle", "oldest" }, vm.Rows.Select(r => r.Message));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user