-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRealClaudeIntegrationTests.cs
More file actions
106 lines (87 loc) · 4.2 KB
/
RealClaudeIntegrationTests.cs
File metadata and controls
106 lines (87 loc) · 4.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
using ManagedCode.ClaudeCodeSharpSDK.Client;
using ManagedCode.ClaudeCodeSharpSDK.Models;
using ManagedCode.ClaudeCodeSharpSDK.Tests.Shared;
namespace ManagedCode.ClaudeCodeSharpSDK.Tests.Integration;
[Property(TestConstants.RequiresClaudeAuthPropertyName, TestConstants.TrueString)]
[RequiresAuthenticatedClaude]
public class RealClaudeIntegrationTests
{
private const string AgainStatusOnlyPrompt = "Again: reply with a JSON object where status is exactly \"ok\".";
private const string PlainTextOkPrompt = "Reply with short plain text: ok.";
private const string StatusOnlyPrompt = "Reply with a JSON object where status is exactly \"ok\".";
private static readonly TimeSpan TestTimeout = TimeSpan.FromMinutes(2);
private static readonly TimeSpan TwoTurnTimeout = TimeSpan.FromMinutes(3);
[Test]
public async Task RunAsync_WithRealClaudeCli_ReturnsStructuredOutput()
{
var settings = RealClaudeTestSupport.GetRequiredSettings();
using var client = RealClaudeTestSupport.CreateClient();
using var thread = StartRealIntegrationThread(client, settings.Model);
using var cancellation = new CancellationTokenSource(TestTimeout);
var schema = IntegrationOutputSchemas.StatusOnly();
var result = await thread.RunAsync<StatusResponse>(
StatusOnlyPrompt,
schema,
IntegrationOutputJsonContext.Default.StatusResponse,
cancellation.Token);
await Assert.That(result.TypedResponse.Status).IsEqualTo(TestConstants.OkStatusValue);
await Assert.That(result.Usage).IsNotNull();
}
[Test]
public async Task RunStreamedAsync_WithRealClaudeCli_YieldsCompletedTurnEvent()
{
var settings = RealClaudeTestSupport.GetRequiredSettings();
using var client = RealClaudeTestSupport.CreateClient();
using var thread = StartRealIntegrationThread(client, settings.Model);
using var cancellation = new CancellationTokenSource(TestTimeout);
var streamed = await thread.RunStreamedAsync(
PlainTextOkPrompt,
new TurnOptions { CancellationToken = cancellation.Token });
var hasTurnCompleted = false;
var hasTurnFailed = false;
var hasCompletedItem = false;
await foreach (var threadEvent in streamed.Events.WithCancellation(cancellation.Token))
{
hasTurnCompleted |= threadEvent is TurnCompletedEvent;
hasTurnFailed |= threadEvent is TurnFailedEvent;
hasCompletedItem |= threadEvent is ItemCompletedEvent;
}
await Assert.That(hasCompletedItem).IsTrue();
await Assert.That(hasTurnCompleted).IsTrue();
await Assert.That(hasTurnFailed).IsFalse();
await Assert.That(thread.Id).IsNotNull();
}
[Test]
public async Task RunAsync_WithRealClaudeCli_SecondTurnKeepsThreadId()
{
var settings = RealClaudeTestSupport.GetRequiredSettings();
using var client = RealClaudeTestSupport.CreateClient();
using var thread = StartRealIntegrationThread(client, settings.Model);
using var cancellation = new CancellationTokenSource(TwoTurnTimeout);
var schema = IntegrationOutputSchemas.StatusOnly();
var first = await thread.RunAsync<StatusResponse>(
StatusOnlyPrompt,
schema,
IntegrationOutputJsonContext.Default.StatusResponse,
cancellation.Token);
var firstThreadId = thread.Id;
await Assert.That(firstThreadId).IsNotNull();
await Assert.That(first.Usage).IsNotNull();
var second = await thread.RunAsync<StatusResponse>(
AgainStatusOnlyPrompt,
schema,
IntegrationOutputJsonContext.Default.StatusResponse,
cancellation.Token);
await Assert.That(second.TypedResponse.Status).IsEqualTo(TestConstants.OkStatusValue);
await Assert.That(second.Usage).IsNotNull();
await Assert.That(thread.Id).IsEqualTo(firstThreadId);
}
private static ClaudeThread StartRealIntegrationThread(ClaudeClient client, string model)
{
return client.StartThread(new ThreadOptions
{
Model = model,
DangerouslySkipPermissions = true,
});
}
}