using System.Net; using System.Text; using LehrerApp.Core.Models; using Xunit; namespace LehrerApp.Api.Tests; public sealed class NominatimGeocoderTests { [Fact] public async Task GeocodeAsync_NutztStrukturierteDeutschlandSucheUndLiestDisplayName() { Uri? requestedUri = null; var handler = new RecordingHandler(request => { requestedUri = request.RequestUri; return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent( """[{"lat":"50.105","lon":"8.761","display_name":"Testschule, Offenbach, Deutschland"}]""", Encoding.UTF8, "application/json"), }; }); var http = new HttpClient(handler) { BaseAddress = new Uri("https://nominatim.openstreetmap.org/") }; var geocoder = new NominatimGeocoder(http); var result = await geocoder.GeocodeAsync(new SchoolLocationRequest { SchoolName = "Testschule", Street = "Schulweg 1", PostalCode = "63000", City = "Offenbach", }, CancellationToken.None); Assert.NotNull(result); Assert.Equal(50.105, result!.Latitude); Assert.Equal("Testschule, Offenbach, Deutschland", result.DisplayName); Assert.Contains("countrycodes=de", requestedUri!.Query); Assert.Contains("street=Schulweg%201", requestedUri.Query); Assert.Contains("postalcode=63000", requestedUri.Query); } private sealed class RecordingHandler(Func response) : HttpMessageHandler { protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) => Task.FromResult(response(request)); } }