diff --git a/GerbilManager.Tests/GerbilSearchTests.cs b/GerbilManager.Tests/GerbilSearchTests.cs new file mode 100644 index 0000000..b694f52 --- /dev/null +++ b/GerbilManager.Tests/GerbilSearchTests.cs @@ -0,0 +1,58 @@ +using System.Net; +using System.Net.Http.Json; +using GerbilManagerWebAPI.Models; + +namespace GerbilManager.Tests; + +/// SEARCH-1: separator-insensitive name search + OriginBreeder (Herkunft) filter. +public class GerbilSearchTests : IClassFixture +{ + private readonly HttpClient _client; + + public GerbilSearchTests(ApiFactory factory) => _client = factory.CreateClient(); + + private static HttpContent Gerbil(string name, string? originBreeder = null) => + JsonContent.Create(new + { + name, + gender = "female", + originBreeder, + }); + + [Theory] + [InlineData("Clan-Kleine-Chaoten", "clankleinechaoten")] + [InlineData("Clan Kleine Chaoten", "clankleinechaoten")] + [InlineData("v.d. Kleinen_Chaoten", "vdkleinenchaoten")] + public void Normalize_strips_separators_and_lowercases(string input, string expected) => + Assert.Equal(expected, GerbilSearch.Normalize(input)); + + [Fact] + public async Task NameSearch_filter_matches_across_separators() + { + var create = await _client.PostAsync("/gerbils", Gerbil("Clan-Kleine-Chaoten")); + Assert.Equal(HttpStatusCode.Created, create.StatusCode); + + // Gridify contains is "=*value" (no trailing '*', per the main hotfix 0ee2b53). + // The client normalizes the user's term the same way the column is normalized. + var json = await _client.GetStringAsync("/gerbils?filter=nameSearch=*clankleinechaoten"); + Assert.Contains("Clan-Kleine-Chaoten", json); + + // a term that doesn't normalize-match must NOT return it + var miss = await _client.GetStringAsync("/gerbils?filter=nameSearch=*completelyother"); + Assert.DoesNotContain("Clan-Kleine-Chaoten", miss); + } + + [Fact] + public async Task OriginBreeder_is_filterable_and_listed_in_breeders_endpoint() + { + await _client.PostAsync("/gerbils", Gerbil("Herkunftstier", originBreeder: "Zucht der kleinen Chaoten")); + + // distinct-values dropdown source + var breeders = await _client.GetStringAsync("/gerbils/breeders"); + Assert.Contains("Zucht der kleinen Chaoten", breeders); + + // Gridify filter on the field + var filtered = await _client.GetStringAsync("/gerbils?filter=originBreeder==Zucht der kleinen Chaoten"); + Assert.Contains("Herkunftstier", filtered); + } +}