using Clawdbot.Windows.Core;
using Clawdbot.Windows.Protocol;
namespace Clawdbot.Windows.Tests;
///
/// Phase 0 validation tests - must ALL pass before proceeding with development.
/// These tests require a running Gateway at ws://127.0.0.1:18789/
///
/// Run with: dotnet test --filter "Category=Phase0"
///
[Trait("Category", "Phase0")]
public class Phase0ValidationTests
{
private const string GatewayUrl = "ws://127.0.0.1:18789/";
///
/// Checkpoint 0.1: Gateway Connectivity
/// Test that we can establish a WebSocket connection and receive hello response
///
[Fact(Skip = "Requires running Gateway")]
public async Task Checkpoint01_GatewayConnects_ReceivesHello()
{
// Arrange
await using var gateway = new GatewayChannel(GatewayUrl);
// Act
await gateway.ConnectAsync();
// Assert
Assert.Equal(GatewayState.Connected, gateway.State);
Assert.NotNull(gateway.HelloResponse);
Assert.Equal(GatewayProtocol.Version, gateway.HelloResponse.Protocol);
Assert.NotNull(gateway.Snapshot);
}
///
/// Checkpoint 0.2a: RPC Round-Trip - config.get
///
[Fact(Skip = "Requires running Gateway")]
public async Task Checkpoint02a_ConfigGet_ReturnsConfigAndHash()
{
// Arrange
await using var gateway = new GatewayChannel(GatewayUrl);
await gateway.ConnectAsync();
// Act
var response = await gateway.RequestAsync("config.get");
// Assert
Assert.NotNull(response);
Assert.NotEmpty(response.Hash);
Assert.NotEmpty(response.Path);
// Raw may be empty if no config file exists, but should not be null
Assert.NotNull(response.Raw);
}
///
/// Checkpoint 0.2b: RPC Round-Trip - channels.status
///
[Fact(Skip = "Requires running Gateway")]
public async Task Checkpoint02b_ChannelsStatus_ReturnsChannelList()
{
// Arrange
await using var gateway = new GatewayChannel(GatewayUrl);
await gateway.ConnectAsync();
// Act
var response = await gateway.RequestAsync("channels.status");
// Assert
Assert.NotNull(response);
Assert.NotNull(response.ChannelOrder);
Assert.NotNull(response.ChannelLabels);
Assert.True(response.Ts > 0, "Timestamp should be positive");
}
///
/// Checkpoint 0.2c: RPC Round-Trip - sessions.list
///
[Fact(Skip = "Requires running Gateway")]
public async Task Checkpoint02c_SessionsList_ReturnsSessions()
{
// Arrange
await using var gateway = new GatewayChannel(GatewayUrl);
await gateway.ConnectAsync();
// Act
var response = await gateway.RequestAsync>("sessions.list", new SessionsListParams
{
Limit = 10
});
// Assert
Assert.NotNull(response);
// Sessions list may be empty, but should not be null
}
///
/// Checkpoint 0.2d: Error responses parse correctly
///
[Fact(Skip = "Requires running Gateway")]
public async Task Checkpoint02d_InvalidRequest_ReturnsStructuredError()
{
// Arrange
await using var gateway = new GatewayChannel(GatewayUrl);
await gateway.ConnectAsync();
// Act & Assert
var ex = await Assert.ThrowsAsync(async () =>
{
await gateway.RequestAsync