fix(worker): Base-URL ohne Schema laesst die Ticket-Anbindung scheitern

Ein blanker Hostname ist eine relative URI; HttpClient lehnt sie mit
InvalidOperationException ab. Die lief an dem zu engen catch-Filter
vorbei, flog roh aus dem Hub und wurde von TryInvokeAsync zu null
verschluckt - die UI meldete "Worker not reachable", obwohl der Worker
lief und die Ursache eine Eingabe war.

- TicketSystemConfig ergaenzt fehlendes http://
- BandelTicketClient uebersetzt jede Transport-Exception in eine
  lesbare TicketApiException
- TestTicketConnection faengt alles und antwortet mit dem Grund
- GetTicketSettings liefert die effektive URL, damit die Ergaenzung
  sichtbar ist
This commit is contained in:
mika kuns
2026-08-27 14:03:52 +02:00
parent 2fe2ac83b1
commit 3322152b9c
6 changed files with 95 additions and 8 deletions
@@ -36,6 +36,23 @@ public sealed class TicketSystemConfigTests : IDisposable
public void Base_url_trailing_slash_is_trimmed()
=> Assert.Equal("http://api.local", Make("http://api.local/", "tsp_x").BaseUrl);
// Ein blanker Hostname ist das, was man in ein Feld namens "API base URL" tippt. Ohne Schema
// ist das eine RELATIVE URI, und HttpClient lehnt sie mit InvalidOperationException ab —
// genau daran ist die erste Einrichtung gescheitert.
[Theory]
[InlineData("bandelapis.fb-tuning.local", "http://bandelapis.fb-tuning.local")]
[InlineData("bandelapis.fb-tuning.local/", "http://bandelapis.fb-tuning.local")]
[InlineData(" bandelapis.fb-tuning.local ", "http://bandelapis.fb-tuning.local")]
[InlineData("api.local:8080", "http://api.local:8080")]
public void Missing_scheme_defaults_to_http(string entered, string expected)
=> Assert.Equal(expected, Make(entered, "tsp_x").BaseUrl);
[Theory]
[InlineData("https://api.local")]
[InlineData("http://api.local")]
public void Explicit_scheme_is_left_alone(string entered)
=> Assert.Equal(entered, Make(entered, "tsp_x").BaseUrl);
public void Dispose()
{
if (Directory.Exists(_dir)) Directory.Delete(_dir, recursive: true);