up
Some checks failed
Docs CI / lint-and-preview (push) Has been cancelled
AOC Guard CI / aoc-guard (push) Has been cancelled
AOC Guard CI / aoc-verify (push) Has been cancelled
Export Center CI / export-ci (push) Has been cancelled
Symbols Server CI / symbols-smoke (push) Has been cancelled
devportal-offline / build-offline (push) Has been cancelled

This commit is contained in:
StellaOps Bot
2025-11-24 20:57:49 +02:00
parent 46c8c47d06
commit 7c39058386
92 changed files with 3549 additions and 157 deletions

View File

@@ -0,0 +1,65 @@
using System.Collections.Generic;
using StellaOps.Graph.Api.Services;
using Xunit;
namespace StellaOps.Graph.Api.Tests;
public class SearchServiceTests
{
[Fact]
public async Task SearchAsync_ReturnsNodeAndCursorTiles()
{
var service = new InMemoryGraphSearchService();
var req = new GraphSearchRequest
{
Kinds = new[] { "component" },
Query = "example",
Limit = 5
};
var results = new List<string>();
await foreach (var line in service.SearchAsync("acme", req))
{
results.Add(line);
}
Assert.Collection(results,
first => Assert.Contains("\"type\":\"node\"", first),
second => Assert.Contains("\"type\":\"cursor\"", second));
}
[Fact]
public async Task SearchAsync_RespectsCursorAndLimit()
{
var service = new InMemoryGraphSearchService();
var firstPage = new GraphSearchRequest { Kinds = new[] { "component" }, Limit = 1, Query = "widget" };
var results = new List<string>();
await foreach (var line in service.SearchAsync("acme", firstPage))
{
results.Add(line);
}
Assert.Equal(2, results.Count); // node + cursor
var cursorToken = ExtractCursor(results.Last());
var secondPage = firstPage with { Cursor = cursorToken };
var secondResults = new List<string>();
await foreach (var line in service.SearchAsync("acme", secondPage))
{
secondResults.Add(line);
}
Assert.Contains(secondResults, r => r.Contains("\"type\":\"node\""));
}
private static string ExtractCursor(string cursorJson)
{
const string tokenMarker = "\"token\":\"";
var start = cursorJson.IndexOf(tokenMarker, StringComparison.Ordinal);
if (start < 0) return string.Empty;
start += tokenMarker.Length;
var end = cursorJson.IndexOf('"', start);
return end > start ? cursorJson[start..end] : string.Empty;
}
}

View File

@@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../../StellaOps.Graph.Api/StellaOps.Graph.Api.csproj" />
<PackageReference Update="xunit" />
<PackageReference Update="xunit.runner.visualstudio" />
<PackageReference Update="Microsoft.NET.Test.Sdk" />
</ItemGroup>
</Project>