Create ChatAgent.Api.Tests and ChatAgent.Client.Tests projects with xUnit and Moq. Test HealthController (200 + valid response), ChatController (SSE streaming with mocked upstream, error handling), and ChatApiClient (delta parsing, error events, health endpoint). 6 tests, all passing. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2.2 KiB
2.2 KiB
ADDED Requirements
Requirement: API test project exists
An xUnit test project SHALL exist at tests/ChatAgent.Api.Tests/ targeting the API project, with xUnit, Moq, and Microsoft.AspNetCore.Mvc.Testing as dependencies.
Scenario: API tests run
- WHEN
dotnet testis run from the solution root - THEN API tests are discovered and executed
Requirement: Client test project exists
An xUnit test project SHALL exist at tests/ChatAgent.Client.Tests/ targeting the Client services, with xUnit and Moq as dependencies.
Scenario: Client tests run
- WHEN
dotnet testis run from the solution root - THEN Client service tests are discovered and executed
Requirement: HealthController test coverage
Tests SHALL verify that GET /api/health returns HTTP 200 with a valid HealthResponse containing a non-empty Status and a recent Timestamp.
Scenario: Health endpoint returns 200
- WHEN a GET request is sent to /api/health
- THEN the response status is 200 and the body contains
status: "healthy"and a UTC timestamp
Requirement: ChatController test coverage
Tests SHALL verify that POST /api/chat returns a streaming SSE response containing text deltas and a [DONE] terminator. Tests SHALL mock the upstream Responses API.
Scenario: Chat streams text deltas
- WHEN a POST is sent to /api/chat with a valid ChatRequest
- THEN the response is
text/event-streamcontainingdata: {"text":"..."}events followed bydata: [DONE]
Scenario: Chat handles upstream error
- WHEN the Responses API is unreachable or returns an error
- THEN the response contains a
data: {"error":"..."}event followed bydata: [DONE]
Requirement: ChatApiClient test coverage
Tests SHALL verify that SendChatStreamingAsync correctly parses SSE events from the backend into text deltas, handles [DONE], and throws on error events.
Scenario: Client parses text deltas
- WHEN the backend returns SSE events with text deltas
- THEN SendChatStreamingAsync yields each text fragment in order
Scenario: Client handles error event
- WHEN the backend returns an error SSE event
- THEN SendChatStreamingAsync throws HttpRequestException with the error message