-
Notifications
You must be signed in to change notification settings - Fork 436
Expand file tree
/
Copy pathDirectoryCreateCommandTests.cs
More file actions
133 lines (110 loc) · 4.71 KB
/
DirectoryCreateCommandTests.cs
File metadata and controls
133 lines (110 loc) · 4.71 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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using Fabric.Mcp.Tools.OneLake.Commands.File;
using Fabric.Mcp.Tools.OneLake.Services;
using Microsoft.Extensions.Logging;
using Microsoft.Mcp.Core.Models.Command;
using NSubstitute;
using NSubstitute.ExceptionExtensions;
namespace Fabric.Mcp.Tools.OneLake.Tests.Commands;
public class DirectoryCreateCommandTests
{
[Fact]
public void Constructor_InitializesCommandCorrectly()
{
// Arrange
var logger = LoggerFactory.Create(builder => { }).CreateLogger<DirectoryCreateCommand>();
var oneLakeService = Substitute.For<IOneLakeService>();
// Act
var command = new DirectoryCreateCommand(logger, oneLakeService);
// Assert
Assert.Equal("create_directory", command.Name);
Assert.Equal("Create OneLake Directory", command.Title);
Assert.Contains("Creates a directory in OneLake storage", command.Description);
Assert.False(command.Metadata.ReadOnly);
Assert.False(command.Metadata.Destructive);
Assert.True(command.Metadata.Idempotent);
}
[Fact]
public void GetCommand_ReturnsValidCommand()
{
// Arrange
var logger = LoggerFactory.Create(builder => { }).CreateLogger<DirectoryCreateCommand>();
var oneLakeService = Substitute.For<IOneLakeService>();
var command = new DirectoryCreateCommand(logger, oneLakeService);
// Act
var systemCommand = command.GetCommand();
// Assert
Assert.NotNull(systemCommand);
Assert.Equal("create_directory", systemCommand.Name);
Assert.NotNull(systemCommand.Description);
}
[Fact]
public void CommandOptions_ContainsRequiredOptions()
{
// Arrange
var logger = LoggerFactory.Create(builder => { }).CreateLogger<DirectoryCreateCommand>();
var oneLakeService = Substitute.For<IOneLakeService>();
var command = new DirectoryCreateCommand(logger, oneLakeService);
// Act
var systemCommand = command.GetCommand();
// Assert - Just verify we have some options
Assert.NotEmpty(systemCommand.Options);
}
[Fact]
public void Constructor_ThrowsArgumentNullException_WhenLoggerIsNull()
{
// Arrange
var oneLakeService = Substitute.For<IOneLakeService>();
// Act & Assert
Assert.Throws<ArgumentNullException>(() => new DirectoryCreateCommand(null!, oneLakeService));
}
[Fact]
public void Constructor_ThrowsArgumentNullException_WhenOneLakeServiceIsNull()
{
// Arrange
var logger = LoggerFactory.Create(builder => { }).CreateLogger<DirectoryCreateCommand>();
// Act & Assert
Assert.Throws<ArgumentNullException>(() => new DirectoryCreateCommand(logger, null!));
}
[Fact]
public void Metadata_HasCorrectProperties()
{
// Arrange
var logger = LoggerFactory.Create(builder => { }).CreateLogger<DirectoryCreateCommand>();
var oneLakeService = Substitute.For<IOneLakeService>();
var command = new DirectoryCreateCommand(logger, oneLakeService);
// Act
var metadata = command.Metadata;
// Assert
Assert.False(metadata.Destructive);
Assert.True(metadata.Idempotent);
Assert.False(metadata.LocalRequired);
Assert.False(metadata.OpenWorld);
Assert.False(metadata.ReadOnly);
Assert.False(metadata.Secret);
}
[Theory]
[InlineData("../../dir")]
[InlineData("Files/../../other-item")]
[InlineData("../subdir")]
public async Task ExecuteAsync_RejectsTraversalPath_ReturnsErrorResponse(string traversalPath)
{
var logger = LoggerFactory.Create(builder => { }).CreateLogger<DirectoryCreateCommand>();
var oneLakeService = Substitute.For<IOneLakeService>();
var command = new DirectoryCreateCommand(logger, oneLakeService);
oneLakeService
.CreateDirectoryAsync(
Arg.Any<string>(),
Arg.Any<string>(),
Arg.Is<string>(p => p.Contains("..", StringComparison.Ordinal)),
Arg.Any<CancellationToken>())
.ThrowsAsync(new ArgumentException("Path cannot contain directory traversal sequences.", "directoryPath"));
var serviceProvider = Substitute.For<IServiceProvider>();
var systemCommand = command.GetCommand();
var parseResult = systemCommand.Parse($"--workspace-id workspace --item-id item --directory-path {traversalPath}");
var context = new CommandContext(serviceProvider);
var response = await command.ExecuteAsync(context, parseResult, CancellationToken.None);
Assert.NotEqual(System.Net.HttpStatusCode.OK, response.Status);
}
}