using Xunit;
using Moq;
using System.Threading.Tasks;
using System.Text.Json;
namespace Svrnty.MCP.Core.Tests;
///
/// Unit tests for IMcpTool interface following TDD approach.
/// Tests the core abstraction for MCP tools.
///
public class IMcpToolTests
{
[Fact]
public void IMcpTool_ShouldHaveNameProperty()
{
// Arrange - Create a mock implementation
var mockTool = new Mock();
mockTool.Setup(t => t.Name).Returns("test_tool");
// Act
var name = mockTool.Object.Name;
// Assert
Assert.Equal("test_tool", name);
}
[Fact]
public void IMcpTool_ShouldHaveDescriptionProperty()
{
// Arrange
var mockTool = new Mock();
mockTool.Setup(t => t.Description).Returns("A test tool");
// Act
var description = mockTool.Object.Description;
// Assert
Assert.Equal("A test tool", description);
}
[Fact]
public void IMcpTool_ShouldHaveSchemaProperty()
{
// Arrange
var mockTool = new Mock();
var schema = JsonDocument.Parse("""
{
"type": "object",
"properties": {
"query": { "type": "string" }
}
}
""");
mockTool.Setup(t => t.Schema).Returns(schema);
// Act
var toolSchema = mockTool.Object.Schema;
// Assert
Assert.NotNull(toolSchema);
Assert.Equal("object", toolSchema.RootElement.GetProperty("type").GetString());
}
[Fact]
public async Task IMcpTool_ShouldExecuteAsync()
{
// Arrange
var mockTool = new Mock();
var expectedResult = JsonDocument.Parse("""{"status": "success"}""");
var arguments = JsonDocument.Parse("""{"query": "test"}""");
mockTool.Setup(t => t.ExecuteAsync(It.IsAny()))
.ReturnsAsync(expectedResult);
// Act
var result = await mockTool.Object.ExecuteAsync(arguments);
// Assert
Assert.NotNull(result);
Assert.Equal("success", result.RootElement.GetProperty("status").GetString());
}
[Fact]
public async Task IMcpTool_ExecuteAsync_ShouldHandleNullArguments()
{
// Arrange
var mockTool = new Mock();
var expectedResult = JsonDocument.Parse("""{"status": "executed"}""");
mockTool.Setup(t => t.ExecuteAsync(null!))
.ReturnsAsync(expectedResult);
// Act
var result = await mockTool.Object.ExecuteAsync(null!);
// Assert
Assert.NotNull(result);
}
[Fact]
public async Task IMcpTool_ExecuteAsync_ShouldReturnJsonResult()
{
// Arrange
var mockTool = new Mock();
var arguments = JsonDocument.Parse("""{"input": "value"}""");
var expectedResult = JsonDocument.Parse("""{"output": "result"}""");
mockTool.Setup(t => t.ExecuteAsync(arguments))
.ReturnsAsync(expectedResult);
// Act
var result = await mockTool.Object.ExecuteAsync(arguments);
// Assert
Assert.NotNull(result);
Assert.True(result.RootElement.TryGetProperty("output", out var output));
Assert.Equal("result", output.GetString());
}
}