From f20a42a94b319bc20f096546bbba1d2cc57b1a45 Mon Sep 17 00:00:00 2001 From: Gulum Date: Sat, 6 Jun 2026 09:04:20 +0200 Subject: [PATCH] =?UTF-8?q?SEARCH-1:=20tests=20=E2=80=94=20Normalize=20uni?= =?UTF-8?q?t=20+=20separator-insensitive=20nameSearch=20filter=20+=20Origi?= =?UTF-8?q?nBreeder/breeders=20endpoint=20(SQLite=20in-memory=20round-trip?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GerbilManager.Tests/GerbilSearchTests.cs | 58 ++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 GerbilManager.Tests/GerbilSearchTests.cs 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); + } +}