diff options
Diffstat (limited to 'tests/Agent.Core.Tests/InternalToolTests.cs')
| -rw-r--r-- | tests/Agent.Core.Tests/InternalToolTests.cs | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/tests/Agent.Core.Tests/InternalToolTests.cs b/tests/Agent.Core.Tests/InternalToolTests.cs index e452cab..2015702 100644 --- a/tests/Agent.Core.Tests/InternalToolTests.cs +++ b/tests/Agent.Core.Tests/InternalToolTests.cs @@ -6,9 +6,9 @@ namespace Agent.Core.Tests; public sealed class InternalToolTests { [Fact] - public void Catalog_exposes_exactly_five_strict_tool_groups() + public void Catalog_exposes_six_strict_tool_groups() { - Assert.Equal(["file_search", "file_read", "file_edit", "process_run", "task_update"], InternalToolCatalog.All.Select(x => x.Name)); + Assert.Equal(["file_search", "file_read", "file_edit", "process_run", "task_update", "dir"], InternalToolCatalog.All.Select(x => x.Name)); foreach (InternalToolDefinition tool in InternalToolCatalog.All) Assert.False(tool.Parameters.GetProperty("additionalProperties").GetBoolean()); } @@ -86,4 +86,40 @@ public sealed class InternalToolTests handler.EndTask(scope); Assert.Throws<InvalidOperationException>(() => handler.Execute(scope, add.RootElement)); } + + [Theory] + [InlineData("dir", "{}")] + [InlineData("dir", """{"path":"x","operation":"invalid"}""")] + [InlineData("dir", """{"path":"x","operation":"mkdir","extra":1}""")] + [InlineData("dir", """{"operation":"mkdir"}""")] + public void Dir_malformed_arguments_are_rejected(string tool, string json) + { + using JsonDocument document = JsonDocument.Parse(json); + Assert.Throws<ToolValidationException>(() => InternalToolValidator.Validate(tool, document.RootElement)); + } + + [Fact] + public void Dir_catalog_definition_has_required_fields_and_strict_schema() + { + InternalToolDefinition definition = InternalToolCatalog.Get("dir"); + Assert.Equal("dir", definition.Name); + Assert.False(definition.Parameters.GetProperty("additionalProperties").GetBoolean()); + Assert.Equal(["path", "operation"], definition.Parameters.GetProperty("required").EnumerateArray().Select(r => r.GetString()!).ToArray()); + Assert.Equal(["mkdir", "rmdir", "list"], definition.Parameters.GetProperty("properties").GetProperty("operation").GetProperty("enum").EnumerateArray().Select(v => v.GetString()!).ToArray()); + } + + [Fact] + public async Task Dir_dispatched_to_fake_backend_has_external_effect() + { + FakeInternalToolBackend backend = new(); + InternalToolDispatcher dispatcher = new(new DenyByDefaultPolicy(new HashSet<string>(["dir"], StringComparer.Ordinal)), backend); + using JsonDocument document = JsonDocument.Parse("""{"path":"C:\\tmp\\sub","operation":"mkdir"}"""); + + ToolExecutionResult result = await dispatcher.DispatchAsync(Guid.NewGuid(), "dir", document.RootElement, TestContext.Current.CancellationToken); + + Assert.True(result.Success); + Assert.True(result.ExternalEffect); + Assert.Single(backend.Calls); + Assert.Equal("dir", backend.Calls[0].Name); + } } |
