test(backend): cover step 17 modules and extract stubs

Add tests for partnership workflow, middleman adaptation and idea notifications; extract reusable test stubs into separate files; add architecture guard forbidding object-valued dictionaries in data contracts.
This commit is contained in:
Rafał Tyński
2026-10-04 03:49:51 +02:00
parent fa1199539b
commit cca20a9965
15 changed files with 427 additions and 94 deletions
@@ -0,0 +1,62 @@
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);
}
}