modified layout (#2)

Reviewed-on: #2
Co-authored-by: Aleksandr Neychev <alexnejchev73@gmail.com>
This commit was merged in pull request #2.
This commit is contained in:
2026-08-12 14:25:05 +00:00
committed by alex
parent 55ac8e6556
commit 68b3d544d2
14 changed files with 376 additions and 415 deletions
@@ -13,13 +13,15 @@ namespace CursorLang.Settings.Tests.ViewModels;
/// </summary>
public sealed class UpdateViewModelTests
{
// The section has something to say at every moment, the one before the first
// answer included: the status line is never an empty spot in the window
[Fact]
public void Before_the_first_check_the_section_says_nothing()
public void Before_the_first_check_the_section_says_so()
{
using UpdateViewModel viewModel = Create(new FakeUpdateService());
Assert.Equal(UpdateStatus.Idle, viewModel.Status);
Assert.False(viewModel.HasStatus);
Assert.Equal("en:UpdateNotChecked", viewModel.StatusText);
Assert.False(viewModel.IsDownloadOffered);
Assert.False(viewModel.IsInstallOffered);
Assert.True(viewModel.CanCheck);
@@ -62,96 +64,36 @@ public sealed class UpdateViewModelTests
await viewModel.CheckCommand.ExecuteAsync(null);
Assert.Equal(UpdateStatus.Failed, viewModel.Status);
Assert.True(viewModel.HasStatus);
Assert.Equal("en:UpdateFailed", viewModel.StatusText);
}
// The app does not always start with a live network, and the user who never
// asked about updates has no use for the complaint
// The window is opened by hand, and the answer is what the section is there
// for: a dead network is part of the answer rather than a reason to say nothing
[Fact]
public async Task A_check_at_startup_keeps_a_failure_to_itself()
public async Task A_check_when_the_window_opens_says_when_it_did_not_work_out()
{
var updates = new FakeUpdateService { Failure = new HttpRequestException("no network") };
using UpdateViewModel viewModel = Create(updates);
await viewModel.StartAsync();
Assert.Equal(UpdateStatus.Idle, viewModel.Status);
Assert.False(viewModel.HasStatus);
Assert.Equal(UpdateStatus.Failed, viewModel.Status);
Assert.Equal("en:UpdateFailed", viewModel.StatusText);
}
// Nothing is remembered between openings: an answer from yesterday is worth
// less than today's, and the request costs nothing at this rate
[Fact]
public async Task A_successful_check_is_remembered_in_the_settings()
public async Task Every_opening_of_the_window_asks_anew()
{
var settings = new AppSettings();
var updates = new FakeUpdateService { Release = Release("2.0.0.0") };
using UpdateViewModel viewModel = Create(updates, settings);
await viewModel.CheckCommand.ExecuteAsync(null);
Assert.NotNull(settings.LastUpdateCheck);
}
[Fact]
public async Task A_check_that_did_not_work_out_is_not_remembered()
{
var settings = new AppSettings();
var updates = new FakeUpdateService { Failure = new HttpRequestException("no network") };
using UpdateViewModel viewModel = Create(updates, settings);
await viewModel.CheckCommand.ExecuteAsync(null);
Assert.Null(settings.LastUpdateCheck);
}
[Fact]
public async Task A_recent_check_is_not_repeated_at_startup()
{
var settings = new AppSettings { LastUpdateCheck = DateTimeOffset.UtcNow };
var updates = new FakeUpdateService();
using UpdateViewModel viewModel = Create(updates, settings);
using UpdateViewModel viewModel = Create(updates);
await viewModel.StartAsync();
Assert.Equal(0, updates.CheckCalls);
}
[Fact]
public async Task A_check_of_yesterday_is_repeated_at_startup()
{
var settings = new AppSettings { LastUpdateCheck = DateTimeOffset.UtcNow - TimeSpan.FromDays(2) };
var updates = new FakeUpdateService();
using UpdateViewModel viewModel = Create(updates, settings);
await viewModel.StartAsync();
Assert.Equal(1, updates.CheckCalls);
}
[Fact]
public async Task A_ban_on_checking_by_itself_is_obeyed()
{
var settings = new AppSettings { CheckForUpdates = false };
var updates = new FakeUpdateService();
using UpdateViewModel viewModel = Create(updates, settings);
await viewModel.StartAsync();
Assert.Equal(0, updates.CheckCalls);
// The button still works: the setting is about the app doing it on its own
await viewModel.CheckCommand.ExecuteAsync(null);
Assert.Equal(1, updates.CheckCalls);
}
[Fact]
public void The_ban_on_checking_travels_to_the_settings()
{
var settings = new AppSettings { CheckForUpdates = true };
using UpdateViewModel viewModel = Create(new FakeUpdateService(), settings);
viewModel.CheckAutomatically = false;
Assert.False(settings.CheckForUpdates);
Assert.Equal(2, updates.CheckCalls);
}
[Fact]
@@ -283,10 +225,6 @@ public sealed class UpdateViewModelTests
private static UpdateViewModel Create(
IUpdateService updates,
AppSettings? settings = null,
ILocalizationService? localization = null) =>
new(updates,
localization ?? new FakeLocalizationService(),
settings ?? new AppSettings(),
new UpdateOptions());
new(updates, localization ?? new FakeLocalizationService());
}