using TarninaHub.Application.Abstractions; using TarninaHub.Application.Dtos; using TarninaHub.Application.Matchmaking; using TarninaHub.Infrastructure.Assist; using TarninaHub.Infrastructure.Llm; using TarninaHub.Tests.Stubs; namespace TarninaHub.Tests.Infrastructure; public class MiddlemanAssistantTests { private static InnovationResponse SampleInnovation() => new( "innovation:klub", "Klub sąsiedzki", "Miejsce spotkań i edukacji cyfrowej", "Opis", "social_challenge:seniorzy", "pilot", "5000 PLN", null, [], true, DateTimeOffset.UtcNow); private static MiddlemanAssistant CreateAssistant(InnovationResponse? innovation) => new( new StubInnovationLookup(innovation), new NullLlmProvider(), new InMemoryLlmRequestLimiter(30)); [Fact] public async Task AdaptAsync_ReturnsNullWhenInnovationMissing() { var assistant = CreateAssistant(null); var result = await assistant.AdaptAsync( new MiddlemanRequest("innovation:missing", null, null), CancellationToken.None); Assert.Null(result); } [Fact] public async Task AdaptAsync_BuildsOfflineServiceForm() { var assistant = CreateAssistant(SampleInnovation()); var result = await assistant.AdaptAsync( new MiddlemanRequest( "innovation:klub", new InstitutionProfile("gmina", "usługi opiekuńcze", ["seniorzy"]), "opieka dzienna"), CancellationToken.None); Assert.NotNull(result); Assert.False(result!.FromLlm); Assert.Contains("Klub sąsiedzki", result.ServiceForm); Assert.Contains("seniorzy", result.ServiceForm); Assert.NotEmpty(result.RequiredResources); Assert.NotEmpty(result.Rationale); } }