postit: persist settings save and apply ApiUrl changes without restart #51

Merged
notazof merged 25 commits from feat/estimate into main 2026-09-06 21:05:58 +01:00
2 changed files with 83 additions and 0 deletions
Showing only changes of commit 7a4cd9e1cc - Show all commits

postit-tests: cover rdv suggested address panel

Paul Schneider 2026-09-06 17:31:41 +01:00
Signed by: notazof
GPG key ID: 1DD5D838E5343B06

View file

@ -0,0 +1,79 @@
using Avalonia.Controls;
using Avalonia.Headless.XUnit;
using PostIt.ViewModels;
using PostIt.ViewModels.Commands;
using PostIt.Views.Commands;
using Yavsc.Abstract.Workflow;
using Yavsc.Api.Client;
namespace PostIt.Tests;
public class RdvPageHeadlessTests
{
[AvaloniaFact]
public void Suggested_address_panel_is_hidden_by_default()
{
var page = CreatePage(out _);
var panel = page.FindControl<Grid>("SuggestedAddressPanel");
var progress = page.FindControl<ProgressBar>("SuggestedAddressProgress");
Assert.NotNull(panel);
Assert.NotNull(progress);
Assert.False(panel!.IsVisible);
Assert.False(progress!.IsVisible);
}
[AvaloniaFact]
public async Task Suggested_address_panel_and_spinner_follow_viewmodel_state()
{
var page = CreatePage(out var vm);
var panel = page.FindControl<Grid>("SuggestedAddressPanel")!;
var progress = page.FindControl<ProgressBar>("SuggestedAddressProgress")!;
var applyButton = page.FindControl<Button>("ApplySuggestedAddressButton")!;
vm.Address = "Saisie manuelle";
vm.NotifyReverseGeocodingStarted();
await Task.Delay(50);
Assert.True(panel.IsVisible);
Assert.True(progress.IsVisible);
Assert.False(applyButton.IsVisible);
vm.ApplyResolvedAddress("10 rue de Rivoli, 75001 Paris");
await Task.Delay(50);
Assert.True(panel.IsVisible);
Assert.False(progress.IsVisible);
Assert.True(applyButton.IsVisible);
}
private static RdvPage CreatePage(out RdvViewModel vm)
{
vm = new RdvViewModel(
new ActivityInfo { Code = "dev", Name = "Développement" },
new ActivityUserDisplayItem { PerformerId = "perf-1", UserName = "Alice" },
new CommandFormSummary { Id = 12, ActionName = "Rdv", Title = "Rendez-vous" },
new BillingApiClient(new RecordingApi(), "https://business.example/api/v1/"));
var page = new RdvPage { DataContext = vm };
var nav = new NavigationPage();
_ = nav.PushAsync(page);
var window = new Window { Content = nav };
window.Show();
return page;
}
private sealed class RecordingApi : IYavscApiClient
{
public HttpClient Http { get; } = new();
public Task<T> CallAsync<T>(HttpMethod method, string path, object? body = null, CancellationToken ct = default)
=> Task.FromResult(default(T)!);
public Task CallAsync(HttpMethod method, string path, object? body = null, CancellationToken ct = default)
=> Task.CompletedTask;
public ValueTask DisposeAsync() => ValueTask.CompletedTask;
}
}

View file

@ -41,6 +41,7 @@
<TextBox Grid.Row="6" Grid.Column="1" Text="{Binding Address, Mode=TwoWay}" Margin="0,0,0,8" /> <TextBox Grid.Row="6" Grid.Column="1" Text="{Binding Address, Mode=TwoWay}" Margin="0,0,0,8" />
<Grid Grid.Row="7" <Grid Grid.Row="7"
x:Name="SuggestedAddressPanel"
Grid.ColumnSpan="2" Grid.ColumnSpan="2"
ColumnDefinitions="*,12,Auto,12,Auto" ColumnDefinitions="*,12,Auto,12,Auto"
Margin="0,0,0,8" Margin="0,0,0,8"
@ -51,9 +52,12 @@
TextWrapping="Wrap" TextWrapping="Wrap"
Opacity="0.8" /> Opacity="0.8" />
<Button Grid.Column="2" <Button Grid.Column="2"
x:Name="ApplySuggestedAddressButton"
Content="Utiliser" Content="Utiliser"
IsVisible="{Binding HasSuggestedAddress}"
Command="{Binding ApplySuggestedAddressCommand}" /> Command="{Binding ApplySuggestedAddressCommand}" />
<ProgressBar Grid.Column="4" <ProgressBar Grid.Column="4"
x:Name="SuggestedAddressProgress"
Width="80" Width="80"
IsIndeterminate="True" IsIndeterminate="True"
IsVisible="{Binding IsResolvingAddress}" /> IsVisible="{Binding IsResolvingAddress}" />