forked from Azure/azure-sdk-tools
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCliIntegrationTests.cs
More file actions
111 lines (86 loc) · 3.43 KB
/
CliIntegrationTests.cs
File metadata and controls
111 lines (86 loc) · 3.43 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
using Moq;
using System.CommandLine;
using Azure.Sdk.Tools.Cli.Contract;
using Azure.Sdk.Tools.Cli.Models;
using Azure.Sdk.Tools.Cli.Services;
using Azure.Sdk.Tools.Cli.Tests.TestHelpers;
using Azure.Sdk.Tools.Cli.Tools.HelloWorldTool;
namespace Azure.Sdk.Tools.Cli.Tests;
internal class CliIntegrationTests
{
private Mock<OutputService> outputServiceMock = new(MockBehavior.Strict);
private Tuple<Command, TestLogger<T>> GetTestInstanceWithLogger<T>() where T : MCPTool
{
var testLogger = new TestLogger<T>();
outputServiceMock = new(OutputModes.Plain) { CallBase = true };
outputServiceMock.Setup(s => s.Output(It.IsAny<string>())).Verifiable();
var tool = (T)Activator.CreateInstance(
typeof(T),
args: [testLogger, outputServiceMock.Object]
)!;
// Nothing needs to be added here. The parameter 'services' is already optional by using 'object[] services = null'.
// The assignment 'services ??= Array.Empty<object>();' ensures it defaults to an empty array if not provided.
var tuple = new Tuple<Command, TestLogger<T>>(
item1: tool.GetCommand(),
item2: testLogger
);
return tuple;
}
[Test]
public async Task TestWindows()
{
if (!OperatingSystem.IsWindows())
{
Assert.Ignore("This test is only applicable on Windows.");
}
var (cmd, logger) = GetTestInstanceWithLogger<HelloWorldTool>();
var output = "";
outputServiceMock
.Setup(s => s.Output(It.IsAny<string>()))
.Callback<string>(s => output = s);
var exitCode = await cmd.InvokeAsync(["hello-world", "HI. MY NAME IS"]);
Assert.That(exitCode, Is.EqualTo(0));
var expected = @"
Message: RESPONDING TO 'HI. MY NAME IS' with SUCCESS: 0
Result: null
Duration: 1ms".TrimStart();
outputServiceMock
.Verify(s => s.Output(It.IsAny<string>()), Times.Once);
Assert.That(output, Is.EqualTo(expected));
}
[Test]
public async Task TestHelloWorldCLIOptions()
{
var (cmd, logger) = GetTestInstanceWithLogger<HelloWorldTool>();
var output = "";
outputServiceMock
.Setup(s => s.Output(It.IsAny<string>()))
.Callback<string>(s => output = s);
var exitCode = await cmd.InvokeAsync(["hello-world", "HI. MY NAME IS"]);
Assert.That(exitCode, Is.EqualTo(0));
var expected = @"
Message: RESPONDING TO 'HI. MY NAME IS' with SUCCESS: 0
Result: null
Duration: 1ms".TrimStart();
outputServiceMock
.Verify(s => s.Output(It.IsAny<string>()), Times.Once);
var input = output.Replace("\r", "");
Assert.That(output, Is.EqualTo(expected));
}
[Test]
public async Task TestHelloWorldCLIOptionsFail()
{
var (cmd, logger) = GetTestInstanceWithLogger<HelloWorldTool>();
var output = "";
outputServiceMock
.Setup(s => s.Output(It.IsAny<string>()))
.Callback<string>(s => output = s);
var exitCode = await cmd.InvokeAsync(["hello-world", "HI. MY NAME IS", "--fail"]);
Assert.That(exitCode, Is.EqualTo(1));
var expected = "[ERROR] RESPONDING TO 'HI. MY NAME IS' with FAIL: 1";
outputServiceMock
.Verify(s => s.Output(It.IsAny<string>()), Times.Once);
var input = output.Replace("\r", "");
Assert.That(output, Is.EqualTo(expected));
}
}