Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using LibGit2Sharp;
using Moq;
using Azure.Sdk.Tools.Cli.Services.Languages;
using Azure.Sdk.Tools.Cli.Services.Languages.Samples.SampleGeneration;

namespace Azure.Sdk.Tools.Cli.Tests.Helpers;

Expand Down Expand Up @@ -58,7 +59,7 @@ public async Task FindSamplesDirectory_WithSampleFiles_ReturnsSamplesDirectory()
// Create non-sample files
CreateTestFile(packagePath, "tests/unit/other.cs", "namespace Test; public class NotASample { }");

var helper = new DotnetLanguageService(processHelper, powershellHelper, gitHelper, new TestLogger<DotnetLanguageService>(), commonValidationHelpers);
var helper = new DotnetLanguageService(processHelper, powershellHelper, gitHelper, new TestLogger<DotnetLanguageService>(), commonValidationHelpers, Mock.Of<IFileHelper>());

// Act
var packageInfo = await helper.GetPackageInfo(packagePath);
Expand All @@ -80,7 +81,7 @@ public async Task FindSamplesDirectory_WithSnippetFiles_ReturnsSamplesDirectory(
// Create non-sample files
CreateTestFile(packagePath, "tests/unit/UnitTest.cs", "namespace Test; public class UnitTest { }");

var helper = new DotnetLanguageService(processHelper, powershellHelper, gitHelper, new TestLogger<DotnetLanguageService>(), commonValidationHelpers);
var helper = new DotnetLanguageService(processHelper, powershellHelper, gitHelper, new TestLogger<DotnetLanguageService>(), commonValidationHelpers, Mock.Of<IFileHelper>());

// Act
var packageInfo = await helper.GetPackageInfo(packagePath);
Expand All @@ -98,7 +99,7 @@ public async Task FindSamplesDirectory_WithNoSampleFiles_ReturnsDefaultPath()
// Create non-sample files only
CreateTestFile(packagePath, "tests/unit/other.cs", "namespace Test; public class NotASample { }");

var helper = new DotnetLanguageService(processHelper, powershellHelper, gitHelper, new TestLogger<DotnetLanguageService>(), commonValidationHelpers);
var helper = new DotnetLanguageService(processHelper, powershellHelper, gitHelper, new TestLogger<DotnetLanguageService>(), commonValidationHelpers, Mock.Of<IFileHelper>());

// Act
var packageInfo = await helper.GetPackageInfo(packagePath);
Expand All @@ -113,7 +114,7 @@ public async Task FindSamplesDirectory_WithNoTestsDirectory_ReturnsDefaultPath()
// Arrange
var (packagePath, gitHelper, processHelper, powershellHelper, commonValidationHelpers) = CreateTestPackage();

var helper = new DotnetLanguageService(processHelper, powershellHelper, gitHelper, new TestLogger<DotnetLanguageService>(), commonValidationHelpers);
var helper = new DotnetLanguageService(processHelper, powershellHelper, gitHelper, new TestLogger<DotnetLanguageService>(), commonValidationHelpers, Mock.Of<IFileHelper>());

// Act
var packageInfo = await helper.GetPackageInfo(packagePath);
Expand All @@ -132,7 +133,7 @@ public async Task FindSamplesDirectory_WithSnippetRegions_ReturnsCorrectDirector
CreateTestFile(packagePath, "tests/examples/SAMPLE_Basic.cs", "#region Snippet:ExampleSnippet\nnamespace Test; public class SAMPLE_Basic { }\n#endregion");
CreateTestFile(packagePath, "tests/examples/ExampleSNIPPET.cs", "#region Snippet:AnotherExample\nnamespace Test; public class ExampleSNIPPET { }\n#endregion");

var helper = new DotnetLanguageService(processHelper, powershellHelper, gitHelper, new TestLogger<DotnetLanguageService>(), commonValidationHelpers);
var helper = new DotnetLanguageService(processHelper, powershellHelper, gitHelper, new TestLogger<DotnetLanguageService>(), commonValidationHelpers, Mock.Of<IFileHelper>());

// Act
var packageInfo = await helper.GetPackageInfo(packagePath);
Expand All @@ -151,7 +152,7 @@ public async Task FindSamplesDirectory_WithMultipleDirectories_ReturnsFirstFound
CreateTestFile(packagePath, "tests/examples/BasicSample.cs", "#region Snippet:ExampleSnippet\nnamespace Test; public class BasicSample { }\n#endregion");
CreateTestFile(packagePath, "tests/snippets/BasicSnippet.cs", "#region Snippet:AnotherSnippet\nnamespace Test; public class BasicSnippet { }\n#endregion");

var helper = new DotnetLanguageService(processHelper, powershellHelper, gitHelper, new TestLogger<DotnetLanguageService>(), commonValidationHelpers);
var helper = new DotnetLanguageService(processHelper, powershellHelper, gitHelper, new TestLogger<DotnetLanguageService>(), commonValidationHelpers, Mock.Of<IFileHelper>());

// Act
var packageInfo = await helper.GetPackageInfo(packagePath);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,11 +185,11 @@ public async Task VersionParsing_MissingFile_ReturnsNull(SdkLanguage language, s
{
///var powershellHelper = new Mock<IPowershellHelper>();

SdkLanguage.DotNet => new DotnetLanguageService(processHelper, powershellHelper, gitHelper, new TestLogger<DotnetLanguageService>(), commonValidationHelper),
SdkLanguage.Java => new JavaLanguageService(processHelper, gitHelper, new Mock<IMavenHelper>().Object, microAgentMock, new TestLogger<JavaLanguageService>(), commonValidationHelper),
SdkLanguage.Python => new PythonLanguageService(processHelper, pythonHelper, npxHelper, gitHelper, new TestLogger<PythonLanguageService>(), commonValidationHelper),
SdkLanguage.JavaScript => new JavaScriptLanguageService(processHelper, npxHelper, gitHelper, new TestLogger<JavaScriptLanguageService>(), commonValidationHelper),
SdkLanguage.Go => new GoLanguageService(processHelper, gitHelper, new TestLogger<GoLanguageService>(), commonValidationHelper),
SdkLanguage.DotNet => new DotnetLanguageService(processHelper, powershellHelper, gitHelper, new TestLogger<DotnetLanguageService>(), commonValidationHelper, Mock.Of<IFileHelper>()),
SdkLanguage.Java => new JavaLanguageService(processHelper, gitHelper, new Mock<IMavenHelper>().Object, microAgentMock, new TestLogger<JavaLanguageService>(), commonValidationHelper, Mock.Of<IFileHelper>()),
SdkLanguage.Python => new PythonLanguageService(processHelper, pythonHelper, npxHelper, gitHelper, new TestLogger<PythonLanguageService>(), commonValidationHelper, Mock.Of<IFileHelper>()),
SdkLanguage.JavaScript => new JavaScriptLanguageService(processHelper, npxHelper, gitHelper, new TestLogger<JavaScriptLanguageService>(), commonValidationHelper, Mock.Of<IFileHelper>()),
SdkLanguage.Go => new GoLanguageService(processHelper, gitHelper, new TestLogger<GoLanguageService>(), commonValidationHelper, Mock.Of<IFileHelper>()),
_ => throw new ArgumentException($"Unsupported language '{language}'", nameof(language))
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
// Licensed under the MIT License.

using System.Text;
using Azure.Sdk.Tools.Cli.Samples;
using Azure.Sdk.Tools.Cli.Services.Languages.Samples;
using Azure.Sdk.Tools.Cli.Services.Languages.Samples.SampleGeneration;
using Azure.Sdk.Tools.Cli.Tests.TestHelpers;

namespace Azure.Sdk.Tools.Cli.Tests.Samples;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

using Azure.Sdk.Tools.Cli.Samples;
using Azure.Sdk.Tools.Cli.Services.Languages.Samples.SampleGeneration;
using Azure.Sdk.Tools.Cli.Tests.TestHelpers;

namespace Azure.Sdk.Tools.Cli.Tests.Samples;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

using Azure.Sdk.Tools.Cli.Samples;
using Azure.Sdk.Tools.Cli.Services.Languages.Samples.SampleGeneration;
using Azure.Sdk.Tools.Cli.Tests.TestHelpers;

namespace Azure.Sdk.Tools.Cli.Tests.Samples;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

using Azure.Sdk.Tools.Cli.Samples;
using Azure.Sdk.Tools.Cli.Services.Languages.Samples.SampleGeneration;
using Azure.Sdk.Tools.Cli.Tests.TestHelpers;

namespace Azure.Sdk.Tools.Cli.Tests.Samples;
Expand Down Expand Up @@ -200,4 +200,4 @@ public void Includes_All_Components_When_Everything_Present()
"All directory inputs should include .py files");
});
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

using Azure.Sdk.Tools.Cli.Samples;
using Azure.Sdk.Tools.Cli.Services.Languages.Samples.SampleGeneration;
using Azure.Sdk.Tools.Cli.Tests.TestHelpers;

namespace Azure.Sdk.Tools.Cli.Tests.Samples;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ public void SetUp()
_powerShellHelperMock.Object,
_gitHelperMock.Object,
NullLogger<DotnetLanguageService>.Instance,
_commonValidationHelperMock.Object);
_commonValidationHelperMock.Object,
Mock.Of<IFileHelper>());

_repoRoot = Path.Combine(Path.GetTempPath(), "azure-sdk-for-net");
_packagePath = Path.Combine(_repoRoot, "sdk", "healthdataaiservices", "Azure.Health.Deidentification");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ public async Task SetUp()
LangService = new GoLanguageService(
new ProcessHelper(NullLogger<ProcessHelper>.Instance, Mock.Of<IRawOutputHelper>()),
gitHelper,
NullLogger<GoLanguageService>.Instance, Mock.Of<ICommonValidationHelpers>());
NullLogger<GoLanguageService>.Instance, Mock.Of<ICommonValidationHelpers>(),
Mock.Of<IFileHelper>());

if (!await LangService.CheckDependencies(CancellationToken.None))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ public void SetUp()
MockMavenHelper.Object,
new Mock<IMicroagentHostService>().Object,
NullLogger<JavaLanguageService>.Instance,
new Mock<ICommonValidationHelpers>().Object);
new Mock<ICommonValidationHelpers>().Object,
Mock.Of<IFileHelper>());
}

#region Setup Helpers
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ public void SetUp()
_npxHelperMock.Object,
_gitHelperMock.Object,
NullLogger<JavaScriptLanguageService>.Instance,
_commonValidationHelpersMock.Object);
_commonValidationHelpersMock.Object,
Mock.Of<IFileHelper>());

_packagePath = "/tmp/javascript-package";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,16 +37,11 @@ public void Setup()
_mockCommonValidationHelpers = new Mock<ICommonValidationHelpers>();

// Create language-specific check implementations with mocked dependencies
var pythonCheck = new PythonLanguageService(_mockProcessHelper.Object, _mockPythonHelper.Object, _mockNpxHelper.Object, _mockGitHelper.Object, _mockPythonLogger.Object, _mockCommonValidationHelpers.Object);
var pythonCheck = new PythonLanguageService(_mockProcessHelper.Object, _mockPythonHelper.Object, _mockNpxHelper.Object, _mockGitHelper.Object, _mockPythonLogger.Object, _mockCommonValidationHelpers.Object, Mock.Of<IFileHelper>());

var languageChecks = new List<PythonLanguageService> { pythonCheck };
var mockPowershellHelper = new Mock<IPowershellHelper>();

// Setup the mock resolver to return the PythonLanguageSpecificChecks instance
var mockResolver = new Mock<ILanguageSpecificResolver<PythonLanguageService>>();
mockResolver.Setup(x => x.Resolve(It.IsAny<string>(), It.IsAny<CancellationToken>()))
.ReturnsAsync(pythonCheck);

var mockPowershellHelper = new Mock<IPowershellHelper>();

_packageCheckTool = new PackageCheckTool(_mockLogger.Object, _mockGitHelper.Object, languageChecks);

// Setup default mock responses
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@
using Azure.Sdk.Tools.Cli.Helpers;
using Azure.Sdk.Tools.Cli.Microagents;
using Azure.Sdk.Tools.Cli.Models;
using Azure.Sdk.Tools.Cli.Samples;
using Azure.Sdk.Tools.Cli.Services.Languages.Samples;
using Azure.Sdk.Tools.Cli.Services;
using Azure.Sdk.Tools.Cli.Services.Languages;
using Azure.Sdk.Tools.Cli.Services.Languages.Samples.SampleGeneration;
using Azure.Sdk.Tools.Cli.Telemetry;
using Azure.Sdk.Tools.Cli.Tests.TestHelpers;
using Azure.Sdk.Tools.Cli.Tools.Package;
Expand Down Expand Up @@ -132,23 +133,6 @@ public async Task GenerateSamples_LanguageSpecificOutputPath(SdkLanguage languag
}));
}

var sampleCtxResolverMock = new Mock<ILanguageSpecificResolver<SampleLanguageContext>>();
sampleCtxResolverMock.Setup(r => r.Resolve(It.IsAny<string>(), It.IsAny<CancellationToken>())).ReturnsAsync(() =>
{
// Use a real FileHelper instance instead of mock
var fileHelper = new FileHelper(new TestLogger<FileHelper>());

return language switch
{
SdkLanguage.DotNet => new DotNetSampleLanguageContext(fileHelper),
SdkLanguage.Java => new JavaSampleLanguageContext(fileHelper),
SdkLanguage.Python => new PythonSampleLanguageContext(fileHelper),
SdkLanguage.JavaScript => new TypeScriptSampleLanguageContext(fileHelper),
SdkLanguage.Go => new GoSampleLanguageContext(fileHelper),
_ => throw new InvalidOperationException($"Unexpected language value '{language}' in test sample context resolver.")
};
});

var mockGitHelper = new Mock<IGitHelper>();
mockGitHelper.Setup(g => g.DiscoverRepoRoot(It.IsAny<string>())).Returns(repoRoot);
mockGitHelper.Setup(g => g.GetRepoName(It.IsAny<string>())).Returns(() =>
Expand All @@ -163,7 +147,7 @@ public async Task GenerateSamples_LanguageSpecificOutputPath(SdkLanguage languag
_ => "unknown-sdk"
};
});
tool = new SampleGeneratorTool(microagentHostServiceMock.Object, logger, mockGitHelper.Object, _languageServices, sampleCtxResolverMock.Object);
tool = new SampleGeneratorTool(microagentHostServiceMock.Object, logger, mockGitHelper.Object, _languageServices);
tool.Initialize(_outputHelper, telemetryServiceMock.Object);
var command = tool.GetCommandInstances().First();
var parseResult = command.Parse(["generate", "--prompt", "Do thing", "--package-path", packagePath]);
Expand Down Expand Up @@ -308,12 +292,7 @@ public async Task GenerateSamples_PackageInfoResolverReturnsNull_ReturnsError()
var pkgPath = Path.Combine(tempDir.DirectoryPath, "sdk", "group", "service", "pkg");
Directory.CreateDirectory(pkgPath);

var sampleCtxResolver = new Mock<ILanguageSpecificResolver<SampleLanguageContext>>();
// Use a real FileHelper instance
var fileHelper = new FileHelper(new TestLogger<FileHelper>());
sampleCtxResolver.Setup(r => r.Resolve(It.IsAny<string>(), It.IsAny<CancellationToken>())).ReturnsAsync(new GoSampleLanguageContext(fileHelper));

var errorTool = new SampleGeneratorTool(microagentHostServiceMock.Object, logger, _mockGitHelper.Object, [], sampleCtxResolver.Object);
var errorTool = new SampleGeneratorTool(microagentHostServiceMock.Object, logger, _mockGitHelper.Object, []);
errorTool.Initialize(_outputHelper, telemetryServiceMock.Object);
var command = errorTool.GetCommandInstances().First();
var parseResult = command.Parse(["generate", "--prompt", "Anything", "--package-path", pkgPath]);
Expand Down Expand Up @@ -379,28 +358,24 @@ public void Setup()
var gitLogger = new TestLogger<GitHelper>();
var gitHubServiceMock = new Mock<IGitHubService>();
realGitHelper = new GitHelper(gitHubServiceMock.Object, gitLogger);
// Use a real FileHelper instance instead of mock
var fileHelper = new FileHelper(new TestLogger<FileHelper>());
_languageServices = [
new PythonLanguageService(_mockProcessHelper.Object, _mockPythonHelper.Object, _mockNpxHelper.Object, realGitHelper, languageLogger, _commonValidationHelpers.Object),
new JavaLanguageService(_mockProcessHelper.Object, realGitHelper, new Mock<IMavenHelper>().Object, microagentHostServiceMock.Object, languageLogger, _commonValidationHelpers.Object),
new JavaScriptLanguageService(_mockProcessHelper.Object, _mockNpxHelper.Object, realGitHelper, languageLogger, _commonValidationHelpers.Object),
new PythonLanguageService(_mockProcessHelper.Object, _mockPythonHelper.Object, _mockNpxHelper.Object, realGitHelper, languageLogger, _commonValidationHelpers.Object, fileHelper),
new JavaLanguageService(_mockProcessHelper.Object, realGitHelper, new Mock<IMavenHelper>().Object, microagentHostServiceMock.Object, languageLogger, _commonValidationHelpers.Object, fileHelper),
new JavaScriptLanguageService(_mockProcessHelper.Object, _mockNpxHelper.Object, realGitHelper, languageLogger, _commonValidationHelpers.Object, fileHelper),
_mockGoLanguageService.Object,
new DotnetLanguageService(_mockProcessHelper.Object, _mockPowerShellHelper.Object, realGitHelper, languageLogger, _commonValidationHelpers.Object)
new DotnetLanguageService(_mockProcessHelper.Object, _mockPowerShellHelper.Object, realGitHelper, languageLogger, _commonValidationHelpers.Object, fileHelper)
];

_mockGoLanguageService.Setup(ls => ls.Language).Returns(SdkLanguage.Go);

var sampleCtxResolverMock = new Mock<ILanguageSpecificResolver<SampleLanguageContext>>();

// Use a real FileHelper instance instead of mock
var fileHelper = new FileHelper(new TestLogger<FileHelper>());
sampleCtxResolverMock.Setup(r => r.Resolve(It.IsAny<string>(), It.IsAny<CancellationToken>())).ReturnsAsync(new GoSampleLanguageContext(fileHelper));
_mockGoLanguageService.Setup(r => r.SampleLanguageContext).Returns(new GoSampleLanguageContext(fileHelper));

tool = new SampleGeneratorTool(
microagentHostServiceMock.Object,
logger,
_mockGitHelper.Object,
_languageServices,
sampleCtxResolverMock.Object
_languageServices
);

tool.Initialize(_outputHelper, telemetryServiceMock.Object);
Expand Down Expand Up @@ -569,25 +544,4 @@ public async Task GenerateSamples_MissingPromptOption_ShowsError()
// Assert: parser/tool should fail with non-zero exit code
Assert.That(exitCode, Is.Not.EqualTo(0), "Expected non-zero exit code when required --prompt option is missing");
}

[Test]
public async Task GenerateSamples_SampleContextResolverReturnsNull_ReturnsError()
{
var (repoRoot, packagePath) = CreateFakeGoPackage();

// Sample context resolver returns null to trigger validation error.
var sampleCtxResolver = new Mock<ILanguageSpecificResolver<SampleLanguageContext>>();
sampleCtxResolver.Setup(r => r.Resolve(It.IsAny<string>(), It.IsAny<CancellationToken>()))
.ReturnsAsync((SampleLanguageContext?)null);

var errorTool = new SampleGeneratorTool(microagentHostServiceMock.Object, logger, _mockGitHelper.Object, _languageServices, sampleCtxResolver.Object);
errorTool.Initialize(_outputHelper, telemetryServiceMock.Object);
var command = errorTool.GetCommandInstances().First();
var parseResult = command.Parse(["generate", "--prompt", "Scenario", "--package-path", packagePath]);
int exitCode = await parseResult.InvokeAsync();

Assert.That(exitCode, Is.EqualTo(1), "Expected validation error exit code when sample context resolver returns null");
var firstRelevant = _outputHelper.Outputs.FirstOrDefault(o => o.Stream == OutputHelper.StreamType.Stdout || o.Stream == OutputHelper.StreamType.Stderr);
Assert.That(firstRelevant.Output, Does.Contain("Unable to determine language"));
}
}
Loading
Loading