Skip to content

Commit dc0ff5c

Browse files
fix: remove stale ClawSharp.Web and ClawSharp.UI.Tests references
1 parent ce2ceee commit dc0ff5c

8 files changed

Lines changed: 429 additions & 83 deletions

File tree

ClawSharp.slnx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,5 @@
2222
<Project Path="tests/ClawSharp.Providers.Tests/ClawSharp.Providers.Tests.csproj" />
2323
<Project Path="tests/ClawSharp.Tools.Tests/ClawSharp.Tools.Tests.csproj" />
2424
<Project Path="tests/ClawSharp.TestHelpers/ClawSharp.TestHelpers.csproj" />
25-
<Project Path="tests/ClawSharp.UI.Tests/ClawSharp.UI.Tests.csproj" />
2625
</Folder>
2726
</Solution>

src/ClawSharp.Web/Pages/Chat.razor

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
@page "/chat"
2+
@using Microsoft.AspNetCore.SignalR.Client
3+
@inject NavigationManager Navigation
4+
@implements IAsyncDisposable
5+
6+
<PageTitle>Chat - ClawSharp</PageTitle>
7+
8+
<h1>Chat</h1>
9+
10+
<div class="chat-container">
11+
<div class="messages">
12+
@foreach (var message in messages)
13+
{
14+
<div class="message @(message.IsUser ? "user" : "bot")">
15+
<div class="message-content">@message.Content</div>
16+
<div class="message-time">@message.Timestamp.ToString("HH:mm")</div>
17+
</div>
18+
}
19+
</div>
20+
21+
<div class="chat-input">
22+
<input @bind="messageInput" @onkeydown="HandleKeyDown" placeholder="Type a message..." disabled="@(!IsConnected)" />
23+
<button @onclick="SendMessage" disabled="@(!IsConnected)">Send</button>
24+
</div>
25+
26+
<div class="status">
27+
Connection status: @(IsConnected ? "Connected" : "Disconnected")
28+
</div>
29+
</div>
30+
31+
@code {
32+
private HubConnection? hubConnection;
33+
private List<ChatMessage> messages = [];
34+
private string messageInput = "";
35+
36+
private bool IsConnected => hubConnection?.State == HubConnectionState.Connected;
37+
38+
protected override async Task OnInitializedAsync()
39+
{
40+
hubConnection = new HubConnectionBuilder()
41+
.WithUrl(Navigation.ToAbsoluteUri("/hubs/agent"))
42+
.WithAutomaticReconnect()
43+
.Build();
44+
45+
hubConnection.On<string>("ReceiveMessage", (message) =>
46+
{
47+
messages.Add(new ChatMessage
48+
{
49+
Content = message,
50+
IsUser = false,
51+
Timestamp = DateTime.Now
52+
});
53+
InvokeAsync(StateHasChanged);
54+
});
55+
56+
await hubConnection.StartAsync();
57+
}
58+
59+
private async Task SendMessage()
60+
{
61+
if (hubConnection is not null && !string.IsNullOrWhiteSpace(messageInput))
62+
{
63+
messages.Add(new ChatMessage
64+
{
65+
Content = messageInput,
66+
IsUser = true,
67+
Timestamp = DateTime.Now
68+
});
69+
70+
await hubConnection.InvokeAsync("SendMessage", messageInput);
71+
messageInput = "";
72+
}
73+
}
74+
75+
private async Task HandleKeyDown(KeyboardEventArgs e)
76+
{
77+
if (e.Key == "Enter")
78+
{
79+
await SendMessage();
80+
}
81+
}
82+
83+
public async ValueTask DisposeAsync()
84+
{
85+
if (hubConnection is not null)
86+
{
87+
await hubConnection.DisposeAsync();
88+
}
89+
}
90+
91+
private class ChatMessage
92+
{
93+
public string Content { get; set; } = "";
94+
public bool IsUser { get; set; }
95+
public DateTime Timestamp { get; set; }
96+
}
97+
}

src/ClawSharp.Web/Pages/MemoryBrowser.razor

Lines changed: 0 additions & 82 deletions
This file was deleted.
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using Bunit;
2+
using ClawSharp.UI.Pages;
3+
using MudBlazor;
4+
5+
namespace ClawSharp.UI.Tests;
6+
7+
public class ChatTests : MudBlazorTestContext
8+
{
9+
[Fact]
10+
public void Chat_RendersInputAndButton()
11+
{
12+
// Arrange & Act
13+
var cut = RenderComponent<Chat>();
14+
15+
// Assert
16+
var textField = cut.FindComponents<MudTextField<string>>()
17+
.FirstOrDefault(c => c.Instance.Label == "Type your message...");
18+
textField.Should().NotBeNull();
19+
20+
var sendButton = cut.FindComponents<MudButton>()
21+
.FirstOrDefault(c => c.Markup.Contains("Send"));
22+
sendButton.Should().NotBeNull();
23+
}
24+
25+
[Fact]
26+
public void Chat_SendButton_DisabledWhenEmpty()
27+
{
28+
// Arrange & Act
29+
var cut = RenderComponent<Chat>();
30+
31+
// Assert
32+
var sendButton = cut.FindComponents<MudButton>()
33+
.FirstOrDefault(c => c.Markup.Contains("Send"));
34+
sendButton.Should().NotBeNull();
35+
sendButton!.Instance.Disabled.Should().BeTrue();
36+
}
37+
38+
[Fact]
39+
public void Chat_HasSessionKeyInput()
40+
{
41+
// Arrange & Act
42+
var cut = RenderComponent<Chat>();
43+
44+
// Assert
45+
var sessionKeyInput = cut.FindComponents<MudTextField<string>>()
46+
.FirstOrDefault(c => c.Instance.Label == "Session Key");
47+
sessionKeyInput.Should().NotBeNull();
48+
}
49+
50+
[Fact]
51+
public void Chat_HasOptionsPanel()
52+
{
53+
// Arrange & Act
54+
var cut = RenderComponent<Chat>();
55+
56+
// Assert
57+
var optionsHeading = cut.FindAll("h6").FirstOrDefault(e => e.TextContent.Contains("Options"));
58+
optionsHeading.Should().NotBeNull();
59+
}
60+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net10.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
<IsPackable>false</IsPackable>
8+
<IsTestProject>true</IsTestProject>
9+
</PropertyGroup>
10+
11+
<ItemGroup>
12+
<PackageReference Include="bunit" Version="1.36.0" />
13+
<PackageReference Include="coverlet.collector" Version="6.0.4" />
14+
<PackageReference Include="FluentAssertions" Version="8.2.0" />
15+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
16+
<PackageReference Include="MudBlazor" Version="8.0.0" />
17+
<PackageReference Include="NSubstitute" Version="5.3.0" />
18+
<PackageReference Include="xunit" Version="2.9.3" />
19+
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.0" />
20+
</ItemGroup>
21+
22+
<ItemGroup>
23+
<ProjectReference Include="..\..\src\ClawSharp.UI\ClawSharp.UI.csproj" />
24+
</ItemGroup>
25+
26+
<ItemGroup>
27+
<Using Include="Xunit" />
28+
<Using Include="FluentAssertions" />
29+
<Using Include="NSubstitute" />
30+
<Using Include="Bunit" />
31+
</ItemGroup>
32+
33+
</Project>
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
using Bunit;
2+
using ClawSharp.UI.Pages;
3+
using Microsoft.Extensions.DependencyInjection;
4+
using MudBlazor;
5+
using MudBlazor.Services;
6+
7+
namespace ClawSharp.UI.Tests;
8+
9+
public class MemoryBrowserTests : TestContext
10+
{
11+
public MemoryBrowserTests()
12+
{
13+
Services.AddMudServices();
14+
Services.AddMudPopoverService();
15+
Services.AddScoped<HttpClient>(_ => new HttpClient { BaseAddress = new Uri("http://localhost") });
16+
17+
// Setup MudBlazor JS interop mocks
18+
JSInterop.Mode = JSRuntimeMode.Loose;
19+
20+
// Add MudPopoverProvider to the render tree
21+
RenderTree.Add<MudPopoverProvider>();
22+
}
23+
24+
[Fact]
25+
public void MemoryBrowser_Renders()
26+
{
27+
// Arrange & Act
28+
var cut = RenderComponent<Memory>();
29+
30+
// Assert
31+
cut.Markup.Should().Contain("Memory");
32+
}
33+
34+
[Fact]
35+
public void MemoryBrowser_HasSearchInput()
36+
{
37+
// Arrange & Act
38+
var cut = RenderComponent<Memory>();
39+
40+
// Assert - check the markup contains search-related text
41+
cut.Markup.Should().Contain("Search memory");
42+
}
43+
44+
[Fact]
45+
public void MemoryBrowser_HasAddMemorySection()
46+
{
47+
// Arrange & Act
48+
var cut = RenderComponent<Memory>();
49+
50+
// Assert
51+
cut.Markup.Should().Contain("Add New Memory");
52+
}
53+
54+
[Fact]
55+
public void MemoryBrowser_HasKeyField()
56+
{
57+
// Arrange & Act
58+
var cut = RenderComponent<Memory>();
59+
60+
// Assert
61+
cut.Markup.Should().Contain("Key");
62+
}
63+
64+
[Fact]
65+
public void MemoryBrowser_HasContentField()
66+
{
67+
// Arrange & Act
68+
var cut = RenderComponent<Memory>();
69+
70+
// Assert
71+
cut.Markup.Should().Contain("Content");
72+
}
73+
}

0 commit comments

Comments
 (0)