Skip to content

Commit 03223e8

Browse files
committed
add initial prototype
1 parent 803c0d0 commit 03223e8

16 files changed

Lines changed: 2507 additions & 0 deletions

tools/azsdk-cli/Azure.Sdk.Tools.Cli.Tests/Helpers/FileHelperTests.cs

Lines changed: 504 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
using System.Text;
5+
using Azure.Sdk.Tools.Cli.SampleGeneration.Languages;
6+
7+
namespace Azure.Sdk.Tools.Cli.Tests.SampleGeneration;
8+
9+
public class DotNetSourceInputProviderTests
10+
{
11+
private static string CreateTempPackage(out string srcDir, out string testsDir)
12+
{
13+
string root = Path.Combine(Path.GetTempPath(), "azsdk-test-" + Guid.NewGuid().ToString("N"));
14+
Directory.CreateDirectory(root);
15+
srcDir = Path.Combine(root, "src");
16+
testsDir = Path.Combine(root, "tests");
17+
Directory.CreateDirectory(srcDir);
18+
Directory.CreateDirectory(testsDir);
19+
return root;
20+
}
21+
22+
private static string WriteFile(string dir, string name, string content)
23+
{
24+
var path = Path.Combine(dir, name);
25+
File.WriteAllText(path, content, Encoding.UTF8);
26+
return path;
27+
}
28+
29+
[Test]
30+
public void Includes_Infrastructure_Base_Class_No_Test_Methods()
31+
{
32+
var provider = new DotNetSourceInputProvider();
33+
var root = CreateTempPackage(out var src, out var tests);
34+
35+
WriteFile(src, "Client.cs", "public class Client { }");
36+
WriteFile(tests, "KeysTestBase.cs", @"using NUnit.Framework; public abstract class KeysTestBase { [SetUp] public void Setup(){} }");
37+
38+
var inputs = provider.Create(root);
39+
40+
Assert.Multiple(() =>
41+
{
42+
// Expect: src folder and KeysTestBase.cs represented (as individual file input), no test methods so it's infra.
43+
Assert.That(inputs.Any(i => i.Path == src), "src directory should be included");
44+
Assert.That(inputs.Any(i => i.Path.EndsWith("KeysTestBase.cs")), "KeysTestBase.cs should be included as infra");
45+
});
46+
47+
}
48+
49+
[Test]
50+
public void Excludes_File_With_Test_Method()
51+
{
52+
var provider = new DotNetSourceInputProvider();
53+
var root = CreateTempPackage(out var src, out var tests);
54+
55+
WriteFile(src, "Client.cs", "public class Client { }");
56+
WriteFile(tests, "KeyClientTests.cs", @"using NUnit.Framework; public class KeyClientTests { [Test] public void TestA(){} }");
57+
58+
var inputs = provider.Create(root);
59+
60+
Assert.That(!inputs.Any(i => i.Path.EndsWith("KeyClientTests.cs")), "Test file with [Test] should be excluded");
61+
}
62+
63+
[Test]
64+
public void Includes_File_With_Lifecycle_Only()
65+
{
66+
var provider = new DotNetSourceInputProvider();
67+
var root = CreateTempPackage(out var src, out var tests);
68+
69+
WriteFile(src, "Client.cs", "public class Client { }");
70+
WriteFile(tests, "Fixture.cs", @"using NUnit.Framework; public class Fixture { [OneTimeSetUp] public void Init(){} }");
71+
72+
var inputs = provider.Create(root);
73+
74+
Assert.That(inputs.Any(i => i.Path.EndsWith("Fixture.cs")), "File with only lifecycle attributes should be treated as infra");
75+
}
76+
77+
[Test]
78+
public void Excludes_File_With_TestCase_Method()
79+
{
80+
var provider = new DotNetSourceInputProvider();
81+
var root = CreateTempPackage(out var src, out var tests);
82+
83+
WriteFile(src, "Client.cs", "public class Client { }");
84+
WriteFile(tests, "SomethingTests.cs", @"using NUnit.Framework; public class SomethingTests { [TestCase(1)] public void TestA(int x){} }");
85+
86+
var inputs = provider.Create(root);
87+
Assert.That(!inputs.Any(i => i.Path.EndsWith("SomethingTests.cs")), "File containing [TestCase] should be excluded");
88+
}
89+
90+
[Test]
91+
public void Includes_Abstract_Base_With_Inheritance_Of_RecordedTestBase()
92+
{
93+
var provider = new DotNetSourceInputProvider();
94+
var root = CreateTempPackage(out var src, out var tests);
95+
96+
WriteFile(src, "Client.cs", "public class Client { }");
97+
WriteFile(tests, "CustomTestBase.cs", @"public abstract class CustomTestBase : RecordedTestBase<object> { protected void Helper(){} }");
98+
99+
var inputs = provider.Create(root);
100+
Assert.That(inputs.Any(i => i.Path.EndsWith("CustomTestBase.cs")), "Abstract base inheriting RecordedTestBase should be included");
101+
}
102+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
using Azure.Sdk.Tools.Cli.SampleGeneration.Languages;
5+
6+
namespace Azure.Sdk.Tools.Cli.Tests.SampleGeneration;
7+
8+
public class TypeScriptSourceInputProviderTests
9+
{
10+
private static string CreateTempRoot() => Path.Combine(Path.GetTempPath(), "azsdk-ts-test-" + Guid.NewGuid().ToString("N"));
11+
12+
[Test]
13+
public void Prefers_DistEsm_Over_Src_When_Both_Exist()
14+
{
15+
var provider = new TypeScriptSourceInputProvider();
16+
var root = CreateTempRoot();
17+
var distEsm = Path.Combine(root, "dist", "esm");
18+
var src = Path.Combine(root, "src");
19+
Directory.CreateDirectory(distEsm);
20+
Directory.CreateDirectory(src);
21+
22+
var inputs = provider.Create(root);
23+
24+
Assert.Multiple(() =>
25+
{
26+
Assert.That(inputs.Any(i => i.Path == distEsm), "dist/esm directory should be included");
27+
Assert.That(inputs.All(i => i.Path != src), "src directory should NOT be included when dist/esm exists");
28+
});
29+
30+
31+
var distInput = inputs.Single(i => i.Path == distEsm);
32+
Assert.That(distInput.IncludeExtensions, Is.Not.Null);
33+
Assert.That(distInput.IncludeExtensions, Does.Contain(".d.ts"));
34+
}
35+
36+
[Test]
37+
public void Includes_Src_When_DistEsm_Missing()
38+
{
39+
var provider = new TypeScriptSourceInputProvider();
40+
var root = CreateTempRoot();
41+
var src = Path.Combine(root, "src");
42+
Directory.CreateDirectory(src);
43+
44+
var inputs = provider.Create(root);
45+
var srcInput = inputs.Single(i => i.Path == src);
46+
Assert.That(srcInput.IncludeExtensions, Does.Contain(".ts"));
47+
}
48+
49+
[Test]
50+
public void Throws_When_No_Source_Directories()
51+
{
52+
var provider = new TypeScriptSourceInputProvider();
53+
var root = CreateTempRoot();
54+
Directory.CreateDirectory(root);
55+
56+
Assert.Throws<InvalidOperationException>(() => provider.Create(root));
57+
}
58+
59+
[Test]
60+
public void Includes_sample_env_When_Present()
61+
{
62+
var provider = new TypeScriptSourceInputProvider();
63+
var root = CreateTempRoot();
64+
var src = Path.Combine(root, "src");
65+
Directory.CreateDirectory(src);
66+
var sampleEnv = Path.Combine(root, "sample.env");
67+
File.WriteAllText(sampleEnv, "KEY=VALUE");
68+
69+
var inputs = provider.Create(root);
70+
Assert.That(inputs.Any(i => i.Path == sampleEnv), "sample.env should be included as a file input");
71+
}
72+
73+
[Test]
74+
public void Includes_samples_dev_Directory()
75+
{
76+
var provider = new TypeScriptSourceInputProvider();
77+
var root = CreateTempRoot();
78+
var src = Path.Combine(root, "src");
79+
Directory.CreateDirectory(src);
80+
var samplesDev = Path.Combine(root, "samples-dev");
81+
Directory.CreateDirectory(samplesDev);
82+
83+
var inputs = provider.Create(root);
84+
Assert.That(inputs.Any(i => i.Path == samplesDev), "samples-dev directory should be included");
85+
var sdInput = inputs.Single(i => i.Path == samplesDev);
86+
Assert.That(sdInput.IncludeExtensions, Does.Contain(".ts"));
87+
}
88+
89+
[Test]
90+
public void Includes_snippets_spec_File()
91+
{
92+
var provider = new TypeScriptSourceInputProvider();
93+
var root = CreateTempRoot();
94+
var src = Path.Combine(root, "src");
95+
Directory.CreateDirectory(src);
96+
var testDir = Path.Combine(root, "test");
97+
Directory.CreateDirectory(testDir);
98+
var snippetsSpec = Path.Combine(testDir, "snippets.spec.ts");
99+
File.WriteAllText(snippetsSpec, "// test snippets");
100+
101+
var inputs = provider.Create(root);
102+
Assert.That(inputs.Any(i => i.Path == snippetsSpec), "snippets.spec.ts should be included");
103+
}
104+
}

tools/azsdk-cli/Azure.Sdk.Tools.Cli/Azure.Sdk.Tools.Cli.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,13 @@
4040
<PackageReference Include="ModelContextProtocol" Version="0.3.0-preview.4" />
4141
<PackageReference Include="ModelContextProtocol.AspNetCore" Version="0.1.0-preview.11" />
4242
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.3" />
43+
<PackageReference Include="Microsoft.Extensions.FileSystemGlobbing" Version="9.0.3" />
4344
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.3" />
4445
<PackageReference Include="Microsoft.VisualStudio.Services.Client" Version="19.225.1" />
4546
<PackageReference Include="Microsoft.TeamFoundation.DistributedTask.WebApi" Version="19.225.1" />
4647
<PackageReference Include="Microsoft.TeamFoundationServer.Client" Version="19.225.1" />
4748
<PackageReference Include="System.Data.SqlClient" Version="4.8.6" />
49+
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.11.0" PrivateAssets="all" />
4850
</ItemGroup>
4951

5052
<ItemGroup>

tools/azsdk-cli/Azure.Sdk.Tools.Cli/Commands/SharedOptions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public static class SharedOptions
2626
typeof(PipelineTestsTool),
2727
typeof(QuokkaTool),
2828
typeof(ReadMeGeneratorTool),
29+
typeof(SampleGeneratorTool),
2930
typeof(ReleasePlanTool),
3031
typeof(ReleaseReadinessTool),
3132
typeof(SdkBuildTool),

0 commit comments

Comments
 (0)