diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index c284dd3e29..8c3febe5c3 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -39,7 +39,7 @@ { "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "", - "TagPrefix": "", // e.g., "Azure.Mcp.Tools.KeyVault.LiveTests" + "TagPrefix": "", // e.g., "Azure.Mcp.Tools.KeyVault.Tests" "Tag": "" } ``` diff --git a/AGENTS.md b/AGENTS.md index 9dbeadaba9..fc2e62eb82 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -124,7 +124,8 @@ Microsoft MCP (Model Context Protocol) servers provide AI agents with structured ### Good examples to follow - Command implementation: `tools/Azure.Mcp.Tools.Storage/src/Commands/Account/StorageAccountGetCommand.cs` - Service pattern: `tools/Azure.Mcp.Tools.Storage/src/Services/StorageService.cs` -- Unit tests: `tools/Azure.Mcp.Tools.Storage/tests/Azure.Mcp.Tools.Storage.UnitTests/Account/StorageAccountGetCommandTests.cs` +- Unit tests: `tools/Azure.Mcp.Tools.Storage/tests/Azure.Mcp.Tools.Storage.Tests/Account/StorageAccountGetCommandTests.cs` +- Integration tests: `tools/Azure.Mcp.Tools.Storage/tests/Azure.Mcp.Tools.Storage.Tests/StorageCommandTests.cs` - Live test infrastructure: `tools/Azure.Mcp.Tools.Storage/tests/test-resources.bicep` - Option definitions: `tools/Azure.Mcp.Tools.Storage/src/Options/StorageOptionDefinitions.cs` @@ -226,10 +227,9 @@ Azure.Mcp.Tools.{Service}/ │ ├── Models/ # Data models and DTOs │ └── {Service}Setup.cs # Service registration and configuration └── tests/ - ├── Azure.Mcp.Tools.{Service}.UnitTests/ # Unit tests (no Azure resources) - ├── Azure.Mcp.Tools.{Service}.LiveTests/ # Integration tests (requires Azure) - ├── test-resources.bicep # Test infrastructure template - └── test-resources-post.ps1 # Post-deployment setup script + ├── Azure.Mcp.Tools.{Service}.Tests/ # Unit tests (no Azure resources) and Integration tests (requires Azure) + ├── test-resources.bicep # Test infrastructure template + └── test-resources-post.ps1 # Post-deployment setup script ``` ### Command Naming Convention @@ -270,14 +270,14 @@ dotnet build # Specific toolset unit tests ./eng/scripts/Test-Code.ps1 -Paths Storage, KeyVault -# Live tests (requires Azure authentication and resources) -./eng/scripts/Test-Code.ps1 -TestType Live -Paths Storage - # Deploy test infrastructure for live tests ./eng/scripts/Deploy-TestResources.ps1 -Paths Storage +# Live tests (requires Azure authentication and resources) +./eng/scripts/Test-Code.ps1 -TestType Live -Paths Storage + # Run tests from specific directory -pushd 'tools/Azure.Mcp.Tools.Storage/tests/Azure.Mcp.Tools.Storage.UnitTests' +pushd 'tools/Azure.Mcp.Tools.Storage/tests/Azure.Mcp.Tools.Storage.Tests' dotnet test --filter "FullyQualifiedName~StorageAccountGetCommandTests" popd ``` @@ -514,8 +514,8 @@ tools/Azure.Mcp.Tools.{Service}/ │ ├── Services/{Service}Service.cs # Service implementation │ └── Commands/{Service}JsonContext.cs # JSON serialization context └── tests/ - ├── Azure.Mcp.Tools.{Service}.UnitTests/{Resource}/{Resource}{Operation}CommandTests.cs - ├── Azure.Mcp.Tools.{Service}.LiveTests/{Service}CommandTests.cs + ├── Azure.Mcp.Tools.{Service}.Tests/{Resource}/{Resource}{Operation}CommandTests.cs # Unit tests (no Azure resources) + ├── Azure.Mcp.Tools.{Service}.Tests/{Service}CommandTests.cs # Integration tests (requires Azure) ├── test-resources.bicep # Test infrastructure (Azure services only) └── test-resources-post.ps1 # Post-deployment script (Azure services only) ``` diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 182511d8ed..f407f84e4f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -76,21 +76,20 @@ If you are contributing significant changes, or if the issue is already assigned - `Fabric.Mcp.Core` - Fabric.Mcp.Core, depends on Azure.Mcp.Core (fabric uses azure) - `Microsoft.Mcp.Core` - Microsoft.Mcp.Core library - `servers\` - - `{server}.Mcp.Server - Individual servers (e.g. `Azure.Mcp.Server`, `Fabric.Mcp.Server`) + - `{Server}.Mcp.Server - Individual servers (e.g. `Azure.Mcp.Server`, `Fabric.Mcp.Server`) - `src` - Source for the server - `tests` - Any unit or live tests for the server - `README.md` - Specific readme for this server - `CHANGELOG.md` - Specific changelog for this server - `tools/` - Service-specific implementations - - `{server}.Mcp.Tools.{tool-name}/` - Individual server tools (e.g., `Azure.Mcp.Tools.KeyVault`, `Fabric.Mcp.Tools.Admin`) + - `{Server}.Mcp.Tools.{ToolArea}/` - Individual server tools (e.g., `Azure.Mcp.Tools.KeyVault`, `Fabric.Mcp.Tools.Admin`) - `src` - Service specific code - `Commands/` - Command implementations - `Models/` - Service specific models - `Services/` - Service implementations and interfaces - `Options/` - Service specific command options - `tests/` - Service specific tests - - `{server}.Mcp.Tools.{tool-name}.UnitTests/` - Unit tests require no authentication or test resources - - `{server}.Mcp.Tools.{tool-name}.LiveTests/` - Live tests depend on Azure resources and authentication + - `{Server}.Mcp.Tools.{ToolArea}.Tests/` - Unit tests (no Azure resources) and Integraion tests (requires Azure) - `test-resources.bicep` - Infrastructure templates for testing - `eng/` - Shared tools, templates, CLI helpers - `docs/` - Central documentation and onboarding materials diff --git a/Microsoft.Mcp.slnx b/Microsoft.Mcp.slnx index 0b94242f82..c0f3385b5b 100644 --- a/Microsoft.Mcp.slnx +++ b/Microsoft.Mcp.slnx @@ -5,8 +5,7 @@ - - + @@ -18,7 +17,7 @@ - + diff --git a/core/Azure.Mcp.Core/src/AssemblyInfo.cs b/core/Azure.Mcp.Core/src/AssemblyInfo.cs index b444160482..8dc254f837 100644 --- a/core/Azure.Mcp.Core/src/AssemblyInfo.cs +++ b/core/Azure.Mcp.Core/src/AssemblyInfo.cs @@ -3,7 +3,6 @@ using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("Azure.Mcp.Core.UnitTests")] -[assembly: InternalsVisibleTo("Azure.Mcp.Core.LiveTests")] +[assembly: InternalsVisibleTo("Azure.Mcp.Core.Tests")] [assembly: InternalsVisibleTo("Microsoft.Mcp.Tests")] [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/assets.json b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/assets.json deleted file mode 100644 index 5df5552c1f..0000000000 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/assets.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "AssetsRepo": "Azure/azure-sdk-assets", - "AssetsRepoPrefixPath": "", - "TagPrefix": "Azure.Mcp.Core.LiveTests", - "Tag": "Azure.Mcp.Core.LiveTests_62d59ec75e" -} \ No newline at end of file diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/AccessTokenHandlerTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/AccessTokenHandlerTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/AccessTokenHandlerTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/AccessTokenHandlerTests.cs index 9322d8042e..32911ea42a 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/AccessTokenHandlerTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/AccessTokenHandlerTests.cs @@ -8,7 +8,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests; +namespace Azure.Mcp.Core.Tests; public class AccessTokenHandlerTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Group/UnitTests/ResourceGroupListCommandTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Group/UnitTests/ResourceGroupListCommandTests.cs similarity index 98% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Group/UnitTests/ResourceGroupListCommandTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Group/UnitTests/ResourceGroupListCommandTests.cs index a430b59a87..b648b03441 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Group/UnitTests/ResourceGroupListCommandTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Group/UnitTests/ResourceGroupListCommandTests.cs @@ -12,7 +12,7 @@ using NSubstitute.ExceptionExtensions; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Group.UnitTests; +namespace Azure.Mcp.Core.Tests.UnitTests.Areas.Group.UnitTests; public class ResourceGroupListCommandTests : CommandUnitTestsBase { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Group/UnitTests/ResourceListCommandTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Group/UnitTests/ResourceListCommandTests.cs similarity index 98% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Group/UnitTests/ResourceListCommandTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Group/UnitTests/ResourceListCommandTests.cs index 06759d09c9..7222526228 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Group/UnitTests/ResourceListCommandTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Group/UnitTests/ResourceListCommandTests.cs @@ -11,7 +11,7 @@ using NSubstitute.ExceptionExtensions; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Group.UnitTests; +namespace Azure.Mcp.Core.Tests.UnitTests.Areas.Group.UnitTests; public class ResourceListCommandTests : CommandUnitTestsBase { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/ArrayOrCollectionElementTypeTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/ArrayOrCollectionElementTypeTests.cs similarity index 98% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/ArrayOrCollectionElementTypeTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/ArrayOrCollectionElementTypeTests.cs index 928d394af0..88e4be43f9 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/ArrayOrCollectionElementTypeTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/ArrayOrCollectionElementTypeTests.cs @@ -5,7 +5,7 @@ using Microsoft.Mcp.Core.Areas.Server.Commands; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server; +namespace Azure.Mcp.Core.Tests.Areas.Server; public class ArrayOrCollectionElementTypeTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/CommandFactoryHelpers.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/CommandFactoryHelpers.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/CommandFactoryHelpers.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/CommandFactoryHelpers.cs index e06e31e25b..a959ee07fd 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/CommandFactoryHelpers.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/CommandFactoryHelpers.cs @@ -54,7 +54,7 @@ using Microsoft.Mcp.Core.Services.Time; using NSubstitute; -namespace Azure.Mcp.Core.UnitTests.Areas.Server; +namespace Azure.Mcp.Core.Tests.Areas.Server; internal class CommandFactoryHelpers { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/BaseDiscoveryStrategyTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/BaseDiscoveryStrategyTests.cs similarity index 97% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/BaseDiscoveryStrategyTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/BaseDiscoveryStrategyTests.cs index 59ef378927..8343f1bfc9 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/BaseDiscoveryStrategyTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/BaseDiscoveryStrategyTests.cs @@ -8,19 +8,15 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Commands.Discovery; +namespace Azure.Mcp.Core.Tests.Areas.Server.Commands.Discovery; /// /// Concrete test implementation of BaseDiscoveryStrategy for testing disposal behavior /// -public class TestDiscoveryStrategy : BaseDiscoveryStrategy +public class TestDiscoveryStrategy(IEnumerable providers, ILogger? logger = null) + : BaseDiscoveryStrategy(logger ?? NullLogger.Instance) { - private readonly IEnumerable _providers; - - public TestDiscoveryStrategy(IEnumerable providers, ILogger? logger = null) : base(logger ?? NullLogger.Instance) - { - _providers = providers; - } + private readonly IEnumerable _providers = providers; public override Task> DiscoverServersAsync(CancellationToken cancellationToken) { @@ -43,10 +39,7 @@ private static IMcpServerProvider CreateMockServerProvider(string name, string i return mockProvider; } - private static BaseDiscoveryStrategy CreateMockStrategy(params IMcpServerProvider[] providers) - { - return new TestDiscoveryStrategy(providers); - } + private static TestDiscoveryStrategy CreateMockStrategy(params IMcpServerProvider[] providers) => new(providers); [Fact] public async Task FindServerProvider_WithEmptyDiscovery_ThrowsArgumentException() diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/CommandGroupDiscoveryStrategyTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/CommandGroupDiscoveryStrategyTests.cs similarity index 98% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/CommandGroupDiscoveryStrategyTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/CommandGroupDiscoveryStrategyTests.cs index 4e3093ccef..d3f57bc6ed 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/CommandGroupDiscoveryStrategyTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/CommandGroupDiscoveryStrategyTests.cs @@ -7,7 +7,7 @@ using Microsoft.Mcp.Tests.Client.Helpers; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Commands.Discovery; +namespace Azure.Mcp.Core.Tests.Areas.Server.Commands.Discovery; public class CommandGroupDiscoveryStrategyTests { @@ -150,8 +150,7 @@ public async Task DiscoverServersAsync_WithReadOnlyFalse_CreatesNonReadOnlyProvi // Assert Assert.NotEmpty(result); - Assert.All(result, provider => - Assert.False(((CommandGroupServerProvider)provider).ReadOnly)); + Assert.All(result, provider => Assert.False(((CommandGroupServerProvider)provider).ReadOnly)); } [Fact] @@ -166,8 +165,7 @@ public async Task DiscoverServersAsync_WithReadOnlyTrue_CreatesReadOnlyProviders // Assert Assert.NotEmpty(result); - Assert.All(result, provider => - Assert.True(((CommandGroupServerProvider)provider).ReadOnly)); + Assert.All(result, provider => Assert.True(((CommandGroupServerProvider)provider).ReadOnly)); } [Fact] @@ -182,8 +180,7 @@ public async Task DiscoverServersAsync_WithNullReadOnlyOption_DefaultsToFalse() // Assert Assert.NotEmpty(result); - Assert.All(result, provider => - Assert.False(((CommandGroupServerProvider)provider).ReadOnly)); + Assert.All(result, provider => Assert.False(((CommandGroupServerProvider)provider).ReadOnly)); } [Fact] diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/CommandGroupServerProviderTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/CommandGroupServerProviderTests.cs similarity index 95% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/CommandGroupServerProviderTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/CommandGroupServerProviderTests.cs index acc0cfc0b2..c297010962 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/CommandGroupServerProviderTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/CommandGroupServerProviderTests.cs @@ -7,15 +7,11 @@ using ModelContextProtocol.Client; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Commands.Discovery; +namespace Azure.Mcp.Core.Tests.Areas.Server.Commands.Discovery; public class CommandGroupServerProviderTests { - private readonly ICommandFactory _commandFactory; - public CommandGroupServerProviderTests() - { - _commandFactory = CommandFactoryHelpers.CreateCommandFactory(); - } + private readonly ICommandFactory _commandFactory = CommandFactoryHelpers.CreateCommandFactory(); [Fact] public void CreateMetadata_ReturnsExpectedMetadata() diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/CompositeDiscoveryStrategyTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/CompositeDiscoveryStrategyTests.cs similarity index 87% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/CompositeDiscoveryStrategyTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/CompositeDiscoveryStrategyTests.cs index 703d15dbb9..1d528c1a40 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/CompositeDiscoveryStrategyTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/CompositeDiscoveryStrategyTests.cs @@ -1,18 +1,19 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +using Microsoft.Extensions.Logging; using Microsoft.Mcp.Core.Areas.Server.Commands.Discovery; using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Commands.Discovery; +namespace Azure.Mcp.Core.Tests.Areas.Server.Commands.Discovery; public class CompositeDiscoveryStrategyTests { private static IMcpDiscoveryStrategy CreateMockStrategy(params IMcpServerProvider[] providers) { var strategy = Substitute.For(); - strategy.DiscoverServersAsync(TestContext.Current.CancellationToken).Returns(Task.FromResult>(providers)); + strategy.DiscoverServersAsync(TestContext.Current.CancellationToken).Returns(providers); return strategy; } @@ -29,10 +30,7 @@ private static IMcpServerProvider CreateMockProvider(string id, string? name = n } private static CompositeDiscoveryStrategy CreateCompositeStrategy(IEnumerable strategies) - { - var logger = Substitute.For>(); - return new CompositeDiscoveryStrategy(strategies, logger); - } + => new(strategies, Substitute.For>()); [Fact] public void Constructor_WithValidStrategies_InitializesCorrectly() @@ -54,9 +52,8 @@ public void Constructor_WithValidStrategies_InitializesCorrectly() public void Constructor_WithNullStrategies_ThrowsArgumentNullException() { // Act & Assert - var logger = Substitute.For>(); - var exception = Assert.Throws(() => - new CompositeDiscoveryStrategy(null!, logger)); + var logger = Substitute.For>(); + var exception = Assert.Throws(() => new CompositeDiscoveryStrategy(null!, logger)); Assert.Equal("strategies", exception.ParamName); } @@ -64,20 +61,8 @@ public void Constructor_WithNullStrategies_ThrowsArgumentNullException() public void Constructor_WithEmptyStrategies_ThrowsArgumentException() { // Act & Assert - var logger = Substitute.For>(); - var exception = Assert.Throws(() => - new CompositeDiscoveryStrategy([], logger)); - Assert.Equal("strategies", exception.ParamName); - Assert.Contains("At least one discovery strategy must be provided", exception.Message); - } - - [Fact] - public void DiscoverServersAsync_WithEmptyStrategies_ThrowsArgumentException() - { - // Act & Assert - var logger = Substitute.For>(); - var exception = Assert.Throws(() => - new CompositeDiscoveryStrategy([], logger)); + var logger = Substitute.For>(); + var exception = Assert.Throws(() => new CompositeDiscoveryStrategy([], logger)); Assert.Equal("strategies", exception.ParamName); Assert.Contains("At least one discovery strategy must be provided", exception.Message); } @@ -281,8 +266,8 @@ public async Task ShouldAggregateResults() var mockStrategy2 = Substitute.For(); var provider1 = Substitute.For(); var provider2 = Substitute.For(); - mockStrategy1.DiscoverServersAsync(TestContext.Current.CancellationToken).Returns(Task.FromResult>([provider1])); - mockStrategy2.DiscoverServersAsync(TestContext.Current.CancellationToken).Returns(Task.FromResult>([provider2])); + mockStrategy1.DiscoverServersAsync(TestContext.Current.CancellationToken).Returns([provider1]); + mockStrategy2.DiscoverServersAsync(TestContext.Current.CancellationToken).Returns([provider2]); var composite = CreateCompositeStrategy([mockStrategy1, mockStrategy2]); var result = await composite.DiscoverServersAsync(TestContext.Current.CancellationToken); Assert.Contains(provider1, result); @@ -298,8 +283,8 @@ public async Task ShouldAggregateResults_ReturnsAllProviders() var provider2 = Substitute.For(); provider1.CreateMetadata().Returns(new McpServerMetadata { Id = "one", Name = "one", Description = "desc1" }); provider2.CreateMetadata().Returns(new McpServerMetadata { Id = "two", Name = "two", Description = "desc2" }); - mockStrategy1.DiscoverServersAsync(TestContext.Current.CancellationToken).Returns(Task.FromResult>([provider1])); - mockStrategy2.DiscoverServersAsync(TestContext.Current.CancellationToken).Returns(Task.FromResult>([provider2])); + mockStrategy1.DiscoverServersAsync(TestContext.Current.CancellationToken).Returns([provider1]); + mockStrategy2.DiscoverServersAsync(TestContext.Current.CancellationToken).Returns([provider2]); var composite = CreateCompositeStrategy([mockStrategy1, mockStrategy2]); var result = (await composite.DiscoverServersAsync(TestContext.Current.CancellationToken)).ToList(); Assert.Equal(2, result.Count); diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/ConsolidatedToolDiscoveryStrategyTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/ConsolidatedToolDiscoveryStrategyTests.cs similarity index 90% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/ConsolidatedToolDiscoveryStrategyTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/ConsolidatedToolDiscoveryStrategyTests.cs index feaea83980..b4da8a97f2 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/ConsolidatedToolDiscoveryStrategyTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/ConsolidatedToolDiscoveryStrategyTests.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Microsoft.Mcp.Core.Areas.Server.Commands.Discovery; using Microsoft.Mcp.Core.Areas.Server.Options; using Microsoft.Mcp.Core.Commands; @@ -9,7 +10,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Commands.Discovery; +namespace Azure.Mcp.Core.Tests.Areas.Server.Commands.Discovery; public class ConsolidatedToolDiscoveryStrategyTests { @@ -29,9 +30,9 @@ private static ConsolidatedToolDiscoveryStrategy CreateStrategy( RootCommandGroupName = "azmcp" }); - var logger = Substitute.For>(); - var providerLogger = Substitute.For>(); - var serverAssembly = typeof(Azure.Mcp.Server.Program).Assembly; + var logger = Substitute.For>(); + var providerLogger = Substitute.For>(); + var serverAssembly = typeof(Mcp.Server.Program).Assembly; ResourceConsolidatedToolDefinitionProvider definitionProvider = new(providerLogger, serverAssembly, "consolidated-tools.json"); diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/RegistryDiscoveryStrategyTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/RegistryDiscoveryStrategyTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/RegistryDiscoveryStrategyTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/RegistryDiscoveryStrategyTests.cs index 3928049b71..fa9d1d5ca0 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/RegistryDiscoveryStrategyTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/RegistryDiscoveryStrategyTests.cs @@ -5,7 +5,7 @@ using Microsoft.Mcp.Core.Areas.Server.Options; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Commands.Discovery; +namespace Azure.Mcp.Core.Tests.Areas.Server.Commands.Discovery; public class RegistryDiscoveryStrategyTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/RegistryServerProviderTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/RegistryServerProviderTests.cs similarity index 97% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/RegistryServerProviderTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/RegistryServerProviderTests.cs index e2d939f8be..191f606be9 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Discovery/RegistryServerProviderTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Discovery/RegistryServerProviderTests.cs @@ -9,16 +9,15 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Commands.Discovery; +namespace Azure.Mcp.Core.Tests.Areas.Server.Commands.Discovery; public class RegistryServerProviderTests { private static RegistryServerProvider CreateServerProvider(string id, RegistryServerInfo serverInfo) { var httpClientFactory = Substitute.For(); - httpClientFactory.CreateClient(Arg.Any()) - .Returns(Substitute.For()); - return new RegistryServerProvider(id, serverInfo, httpClientFactory); + httpClientFactory.CreateClient(Arg.Any()).Returns(Substitute.For()); + return new(id, serverInfo, httpClientFactory); } [Fact] public void Constructor_InitializesCorrectly() @@ -159,10 +158,7 @@ public async Task CreateClientAsync_WithEnvVariables_MergesWithSystemEnvironment Type = "stdio", Command = "echo", Args = ["hello world"], - Env = new Dictionary - { - { "TEST_VAR", "test value" } - } + Env = new Dictionary([new("TEST_VAR", "test value")]) }; var provider = CreateServerProvider(testId, serverInfo); @@ -190,8 +186,7 @@ public async Task CreateClientAsync_NoUrlOrType_ThrowsArgumentException() var exception = await Assert.ThrowsAsync( () => provider.CreateClientAsync(new McpClientOptions(), TestContext.Current.CancellationToken)); - Assert.Contains($"Registry server '{testId}' does not have a valid transport type.", - exception.Message); + Assert.Contains($"Registry server '{testId}' does not have a valid transport type.", exception.Message); } [Fact] diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Runtime/McpRuntimeTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Runtime/McpRuntimeTests.cs similarity index 97% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Runtime/McpRuntimeTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Runtime/McpRuntimeTests.cs index a970d0e904..d65f0a42a4 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/Runtime/McpRuntimeTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/Runtime/McpRuntimeTests.cs @@ -17,7 +17,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Commands.Runtime; +namespace Azure.Mcp.Core.Tests.Areas.Server.Commands.Runtime; public class McpRuntimeTests { @@ -30,40 +30,29 @@ private static ServiceProvider CreateServiceProvider() return services.BuildServiceProvider(); } - private static IOptions CreateOptions(ServiceStartOptions? options = null) - { - return Microsoft.Extensions.Options.Options.Create(options ?? new ServiceStartOptions()); - } + private static IOptions CreateOptions(ServiceStartOptions? options = null) => + Microsoft.Extensions.Options.Options.Create(options ?? new ServiceStartOptions()); - private static McpServer CreateMockServer() - { - return Substitute.For(); - } + private static McpServer CreateMockServer() => Substitute.For(); - private static ITelemetryService CreateMockTelemetryService() - { - return Substitute.For(); - } + private static ITelemetryService CreateMockTelemetryService() => Substitute.For(); - private static RequestContext CreateListToolsRequest() - { - return new RequestContext(CreateMockServer(), new() { Method = RequestMethods.ToolsList }) + private static RequestContext CreateListToolsRequest() => + new(CreateMockServer(), new() { Method = RequestMethods.ToolsList }) { - Params = new ListToolsRequestParams() + Params = new() }; - } - private static RequestContext CreateCallToolRequest(string toolName = "test-tool", IDictionary? arguments = null) - { - return new RequestContext(CreateMockServer(), new() { Method = RequestMethods.ToolsCall }) + private static RequestContext CreateCallToolRequest( + string toolName = "test-tool", + IDictionary? arguments = null) => new(CreateMockServer(), new() { Method = RequestMethods.ToolsCall }) { - Params = new CallToolRequestParams + Params = new() { Name = toolName, Arguments = arguments ?? new Dictionary() } }; - } private static object GetAndAssertTagKeyValue(Activity activity, string tagName) { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ServiceCollectionExtensionsSerializedTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ServiceCollectionExtensionsSerializedTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ServiceCollectionExtensionsSerializedTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ServiceCollectionExtensionsSerializedTests.cs index 306feeba7c..c15ef1c113 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ServiceCollectionExtensionsSerializedTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ServiceCollectionExtensionsSerializedTests.cs @@ -9,7 +9,7 @@ using Microsoft.Mcp.Core.Helpers; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Commands; +namespace Azure.Mcp.Core.Tests.Areas.Server.Commands; // This is intentionally placed after the namespace declaration to avoid // conflicts with Azure.Mcp.Core.Areas.Server.Options diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ServiceCollectionExtensionsTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ServiceCollectionExtensionsTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ServiceCollectionExtensionsTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ServiceCollectionExtensionsTests.cs index 4978853c95..771fab3f19 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ServiceCollectionExtensionsTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ServiceCollectionExtensionsTests.cs @@ -15,7 +15,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Commands; +namespace Azure.Mcp.Core.Tests.Areas.Server.Commands; public class ServiceCollectionExtensionsTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ServiceInfoCommandTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ServiceInfoCommandTests.cs similarity index 95% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ServiceInfoCommandTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ServiceInfoCommandTests.cs index 693cb0f791..3b45c29649 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ServiceInfoCommandTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ServiceInfoCommandTests.cs @@ -7,7 +7,7 @@ using Microsoft.Mcp.Tests.Client; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Commands; +namespace Azure.Mcp.Core.Tests.Areas.Server.Commands; public class ServiceInfoCommandTests : CommandUnitTestsBase { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/BaseToolLoaderTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/BaseToolLoaderTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/BaseToolLoaderTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/BaseToolLoaderTests.cs index 6a033b4f38..3d15bf19f1 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/BaseToolLoaderTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/BaseToolLoaderTests.cs @@ -12,7 +12,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Commands.ToolLoading; +namespace Azure.Mcp.Core.Tests.Areas.Server.Commands.ToolLoading; public class BaseToolLoaderTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/CommandFactoryToolLoaderTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/CommandFactoryToolLoaderTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/CommandFactoryToolLoaderTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/CommandFactoryToolLoaderTests.cs index ecd94f55e2..ea43ea506e 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/CommandFactoryToolLoaderTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/CommandFactoryToolLoaderTests.cs @@ -14,7 +14,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Commands.ToolLoading; +namespace Azure.Mcp.Core.Tests.Areas.Server.Commands.ToolLoading; public class CommandFactoryToolLoaderTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/CompositeToolLoaderTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/CompositeToolLoaderTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/CompositeToolLoaderTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/CompositeToolLoaderTests.cs index 971780bff8..11226bf436 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/CompositeToolLoaderTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/CompositeToolLoaderTests.cs @@ -10,7 +10,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Commands.ToolLoading; +namespace Azure.Mcp.Core.Tests.Areas.Server.Commands.ToolLoading; public class CompositeToolLoaderTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/NamespaceToolLoaderTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/NamespaceToolLoaderTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/NamespaceToolLoaderTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/NamespaceToolLoaderTests.cs index 46ed040d38..7740464cb1 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/NamespaceToolLoaderTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/NamespaceToolLoaderTests.cs @@ -15,7 +15,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Commands.ToolLoading; +namespace Azure.Mcp.Core.Tests.Areas.Server.Commands.ToolLoading; public sealed class NamespaceToolLoaderTests : IAsyncDisposable { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/PluginTelemetryCommandTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/PluginTelemetryCommandTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/PluginTelemetryCommandTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/PluginTelemetryCommandTests.cs index cf4e06c6db..a407923f6f 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/PluginTelemetryCommandTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/PluginTelemetryCommandTests.cs @@ -16,7 +16,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Commands.ToolLoading; +namespace Azure.Mcp.Core.Tests.Areas.Server.Commands.ToolLoading; public class PluginTelemetryCommandTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/RegistryToolLoaderTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/RegistryToolLoaderTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/RegistryToolLoaderTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/RegistryToolLoaderTests.cs index 751293177e..49ae9e432b 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/RegistryToolLoaderTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/RegistryToolLoaderTests.cs @@ -2,7 +2,7 @@ // Licensed under the MIT License. using System.Text.Json; -using Azure.Mcp.Core.UnitTests.Areas.Server.Helpers; +using Azure.Mcp.Core.Tests.Areas.Server.Helpers; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Mcp.Core.Areas.Server.Commands.Discovery; @@ -13,7 +13,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Commands.ToolLoading; +namespace Azure.Mcp.Core.Tests.Areas.Server.Commands.ToolLoading; public class RegistryToolLoaderTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/ServerToolLoaderTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/ServerToolLoaderTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/ServerToolLoaderTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/ServerToolLoaderTests.cs index 872de4b248..54f9b38712 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/ServerToolLoaderTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/ServerToolLoaderTests.cs @@ -3,7 +3,7 @@ using System.Text.Json; using System.Text.Json.Nodes; -using Azure.Mcp.Core.UnitTests.Areas.Server.Helpers; +using Azure.Mcp.Core.Tests.Areas.Server.Helpers; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Mcp.Core.Areas.Server.Commands.Discovery; @@ -16,7 +16,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Commands.ToolLoading; +namespace Azure.Mcp.Core.Tests.Areas.Server.Commands.ToolLoading; public class ServerToolLoaderTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/SingleProxyToolLoaderTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/SingleProxyToolLoaderTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/SingleProxyToolLoaderTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/SingleProxyToolLoaderTests.cs index c3cb2169ae..3f0b0e958d 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/SingleProxyToolLoaderTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/SingleProxyToolLoaderTests.cs @@ -3,7 +3,7 @@ using System.Text.Json; using System.Text.Json.Nodes; -using Azure.Mcp.Core.UnitTests.Areas.Server.Helpers; +using Azure.Mcp.Core.Tests.Areas.Server.Helpers; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Mcp.Core.Areas.Server.Commands.Discovery; @@ -15,7 +15,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Commands.ToolLoading; +namespace Azure.Mcp.Core.Tests.Areas.Server.Commands.ToolLoading; public class SingleProxyToolLoaderTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Helpers/MockMcpClientBuilder.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Helpers/MockMcpClientBuilder.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Helpers/MockMcpClientBuilder.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Helpers/MockMcpClientBuilder.cs index c8cd2be0a9..56c0f0fb23 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Helpers/MockMcpClientBuilder.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Helpers/MockMcpClientBuilder.cs @@ -8,7 +8,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Helpers; +namespace Azure.Mcp.Core.Tests.Areas.Server.Helpers; /// /// A builder for creating mock instances for testing purposes. diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Helpers/MockMcpDiscoveryStrategyBuilder.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Helpers/MockMcpDiscoveryStrategyBuilder.cs similarity index 96% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Helpers/MockMcpDiscoveryStrategyBuilder.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Helpers/MockMcpDiscoveryStrategyBuilder.cs index d817c62314..b8af5e7cb1 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Helpers/MockMcpDiscoveryStrategyBuilder.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Helpers/MockMcpDiscoveryStrategyBuilder.cs @@ -6,7 +6,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Helpers; +namespace Azure.Mcp.Core.Tests.Areas.Server.Helpers; /// /// A builder for creating mock implementations of for testing purposes. @@ -16,13 +16,6 @@ public sealed class MockMcpDiscoveryStrategyBuilder { private readonly List _providers = []; - /// - /// Initializes a new instance of the MockMcpDiscoveryStrategyBuilder. - /// - public MockMcpDiscoveryStrategyBuilder() - { - } - /// /// Adds a new server with the specified client to the mock discovery strategy. /// diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/McpServerToolAttributeTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/McpServerToolAttributeTests.cs similarity index 98% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/McpServerToolAttributeTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/McpServerToolAttributeTests.cs index 09e5674b45..f78b31757b 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/McpServerToolAttributeTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/McpServerToolAttributeTests.cs @@ -5,7 +5,7 @@ using ModelContextProtocol.Server; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server; +namespace Azure.Mcp.Core.Tests.Areas.Server; public class McpServerToolAttributeTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Models/RegistryRootTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Models/RegistryRootTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Models/RegistryRootTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Models/RegistryRootTests.cs index 7eb1b9e6a4..325e9db781 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/Models/RegistryRootTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/Models/RegistryRootTests.cs @@ -6,7 +6,7 @@ using Microsoft.Mcp.Core.Areas.Server.Models; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server.Models; +namespace Azure.Mcp.Core.Tests.Areas.Server.Models; public class RegistryRootTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/OptionTypeTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/OptionTypeTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/OptionTypeTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/OptionTypeTests.cs index e9d8a716c8..02a13f33f9 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/OptionTypeTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/OptionTypeTests.cs @@ -5,7 +5,7 @@ using Microsoft.Mcp.Core.Areas.Server.Commands; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server; +namespace Azure.Mcp.Core.Tests.Areas.Server; public class OptionTypeTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/Areas/Server/ServerStartCommandTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/ServerStartCommandTests.cs similarity index 98% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/Areas/Server/ServerStartCommandTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/ServerStartCommandTests.cs index f00d7f31a9..4b266e5d8a 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/Areas/Server/ServerStartCommandTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/ServerStartCommandTests.cs @@ -2,12 +2,13 @@ // Licensed under the MIT License. using System.Diagnostics; +using Microsoft.Mcp.Tests.Attributes; using Microsoft.Mcp.Tests.Client.Helpers; using ModelContextProtocol.Client; using ModelContextProtocol.Protocol; using Xunit; -namespace Azure.Mcp.Core.LiveTests.Areas.Server; +namespace Azure.Mcp.Core.Tests.Areas.Server; /// /// Live integration tests for Azure MCP Server that validate tool loading behavior across different modes. @@ -63,6 +64,7 @@ public ValueTask DisposeAsync() #region Default Mode Tests + [LiveTestOnly] [Fact] public async Task DefaultMode_LoadsNamespaceTools() { @@ -92,6 +94,7 @@ public async Task DefaultMode_LoadsNamespaceTools() } } + [LiveTestOnly] [Fact] public async Task DefaultMode_IncludesUtilityCommands() { @@ -118,6 +121,7 @@ public async Task DefaultMode_IncludesUtilityCommands() } } + [LiveTestOnly] [Fact] public async Task DefaultMode_CanCallSubscriptionList() { @@ -141,6 +145,7 @@ public async Task DefaultMode_CanCallSubscriptionList() Output.WriteLine($"Subscription list result: {firstContent}"); } + [LiveTestOnly] [Fact] public async Task DefaultMode_CanCallGroupList() { @@ -168,6 +173,7 @@ public async Task DefaultMode_CanCallGroupList() #region All Mode Tests + [LiveTestOnly] [Fact] public async Task AllMode_LoadsAllIndividualTools() { @@ -201,6 +207,7 @@ public async Task AllMode_LoadsAllIndividualTools() #region Single Tool Proxy Mode Tests + [LiveTestOnly] [Fact] public async Task SingleProxyMode_LoadsSingleAzureTool() { @@ -221,6 +228,7 @@ public async Task SingleProxyMode_LoadsSingleAzureTool() Output.WriteLine($"Description: {tool.Description}"); } + [LiveTestOnly] [Fact] public async Task SingleProxyMode_WithNamespaceFilter_StillLoadsSingleAzureTool() { @@ -238,6 +246,7 @@ public async Task SingleProxyMode_WithNamespaceFilter_StillLoadsSingleAzureTool( Output.WriteLine("Single proxy mode with namespace filter still loaded 1 tool"); } + [LiveTestOnly] [Fact] public async Task SingleProxyMode_WithReadOnlyFlag_LoadsSingleAzureTool() { @@ -270,6 +279,7 @@ public async Task SingleProxyMode_WithReadOnlyFlag_LoadsSingleAzureTool() #region Namespace Proxy Mode Tests + [LiveTestOnly] [Fact] public async Task NamespaceProxyMode_LoadsNamespaceTools() { @@ -297,6 +307,7 @@ public async Task NamespaceProxyMode_LoadsNamespaceTools() } } + [LiveTestOnly] [Fact] public async Task NamespaceProxyMode_WithSpecificNamespaces_LoadsNamespaceSpecificTools() { @@ -337,6 +348,7 @@ public async Task NamespaceProxyMode_WithSpecificNamespaces_LoadsNamespaceSpecif Output.WriteLine($"Namespace proxy mode with [storage, keyvault] loaded {toolNames.Count} tools"); } + [LiveTestOnly] [Fact] public async Task NamespaceProxyMode_WithDocumentationNamespace_LoadsOnlyDocumentationTool() { @@ -361,6 +373,7 @@ public async Task NamespaceProxyMode_WithDocumentationNamespace_LoadsOnlyDocumen Output.WriteLine($"Tool: {toolNames.First()}"); } + [LiveTestOnly] [Fact] public async Task NamespaceProxyMode_StorageToolLearnMode_ReturnsStorageCommands() { @@ -404,6 +417,7 @@ public async Task NamespaceProxyMode_StorageToolLearnMode_ReturnsStorageCommands #region Default Mode with Filters Tests + [LiveTestOnly] [Fact] public async Task DefaultMode_WithNamespaceFilter_LoadsFilteredTools() { @@ -433,6 +447,7 @@ public async Task DefaultMode_WithNamespaceFilter_LoadsFilteredTools() } } + [LiveTestOnly] [Fact] public async Task AllMode_WithNamespaceFilter_LoadsFilteredIndividualTools() { @@ -460,6 +475,7 @@ public async Task AllMode_WithNamespaceFilter_LoadsFilteredIndividualTools() Output.WriteLine($"All mode with namespaces [storage, keyvault] loaded {toolNames.Count} tools"); } + [LiveTestOnly] [Fact] public async Task AllMode_WithReadOnlyFlag_LoadsOnlyReadOnlyTools() { @@ -515,6 +531,7 @@ public async Task AllMode_WithReadOnlyFlag_LoadsOnlyReadOnlyTools() #region Negative Tests - Invalid Modes and Namespaces + [LiveTestOnly] [Fact] public async Task InvalidMode_FailsToStartServer() { @@ -525,6 +542,7 @@ await Assert.ThrowsAsync(async () => }); } + [LiveTestOnly] [Fact] public async Task InvalidNamespace_LoadsGracefully() { @@ -551,6 +569,7 @@ public async Task InvalidNamespace_LoadsGracefully() #region Comparison Tests + [LiveTestOnly] [Fact] public async Task VerifyUniqueToolNames_InAllMode() { @@ -569,6 +588,7 @@ public async Task VerifyUniqueToolNames_InAllMode() Output.WriteLine($"Verified {toolNames.Count} unique tool names in all mode"); } + [LiveTestOnly] [Fact] public async Task VerifyUniqueToolNames_InDefaultMode() { @@ -591,6 +611,7 @@ public async Task VerifyUniqueToolNames_InDefaultMode() #region Consolidated Proxy Mode Tests + [LiveTestOnly] [Fact] public async Task ConsolidatedProxyMode_LoadsConsolidatedTools() { @@ -620,6 +641,7 @@ public async Task ConsolidatedProxyMode_LoadsConsolidatedTools() } } + [LiveTestOnly] [Fact] public async Task ConsolidatedProxyMode_ToolLearnMode_ReturnsConsolidatedCommands() { @@ -660,6 +682,7 @@ public async Task ConsolidatedProxyMode_ToolLearnMode_ReturnsConsolidatedCommand Output.WriteLine($"✓ Learn mode returned {responseText.Length} characters of consolidated command information"); } + [LiveTestOnly] [Fact] public async Task ConsolidatedProxyMode_WithNamespaceFilter_LoadsFilteredConsolidatedTools() { @@ -690,6 +713,7 @@ public async Task ConsolidatedProxyMode_WithNamespaceFilter_LoadsFilteredConsoli } } + [LiveTestOnly] [Fact] public async Task ConsolidatedProxyMode_WithReadOnlyFlag_LoadsOnlyReadOnlyConsolidatedTools() { @@ -732,6 +756,7 @@ public async Task ConsolidatedProxyMode_WithReadOnlyFlag_LoadsOnlyReadOnlyConsol } } + [LiveTestOnly] [Fact] public async Task ConsolidatedProxyMode_CanCallConsolidatedTool() { @@ -760,6 +785,7 @@ public async Task ConsolidatedProxyMode_CanCallConsolidatedTool() #region Tool Mode Tests + [LiveTestOnly] [Fact] public async Task ToolMode_AutomaticallyChangesToAllMode() { @@ -780,6 +806,7 @@ public async Task ToolMode_AutomaticallyChangesToAllMode() Assert.Contains("subscription_list", toolNames); } + [LiveTestOnly] [Fact] public async Task ToolMode_OverridesExplicitNamespaceMode() { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/ServiceStartCommandTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/ServiceStartCommandTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/ServiceStartCommandTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/ServiceStartCommandTests.cs index a78aa5446a..322160c076 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/ServiceStartCommandTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/ServiceStartCommandTests.cs @@ -16,7 +16,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server; +namespace Azure.Mcp.Core.Tests.Areas.Server; public class ServiceStartCommandTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/TypeToJsonTypeMapperTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/TypeToJsonTypeMapperTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/TypeToJsonTypeMapperTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/TypeToJsonTypeMapperTests.cs index bc431ef100..fbb06e0689 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Server/TypeToJsonTypeMapperTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Server/TypeToJsonTypeMapperTests.cs @@ -5,7 +5,7 @@ using Microsoft.Mcp.Core.Areas.Server.Commands; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Server; +namespace Azure.Mcp.Core.Tests.Areas.Server; public class TypeToJsonTypeMapperTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Subscription/AzureCliProfileHelperTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Subscription/AzureCliProfileHelperTests.cs similarity index 98% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Subscription/AzureCliProfileHelperTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Subscription/AzureCliProfileHelperTests.cs index e605b8dec2..e1e5e39023 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Subscription/AzureCliProfileHelperTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Subscription/AzureCliProfileHelperTests.cs @@ -4,7 +4,7 @@ using Microsoft.Mcp.Core.Helpers; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Subscription; +namespace Azure.Mcp.Core.Tests.Areas.Subscription; public class AzureCliProfileHelperTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Subscription/SubscriptionCommandTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Subscription/SubscriptionCommandTests.cs similarity index 98% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Subscription/SubscriptionCommandTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Subscription/SubscriptionCommandTests.cs index 0d0aea211f..e79d5d3cb7 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Subscription/SubscriptionCommandTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Subscription/SubscriptionCommandTests.cs @@ -12,7 +12,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Subscription; +namespace Azure.Mcp.Core.Tests.Areas.Subscription; public class SubscriptionCommandTests : CommandUnitTestsBase { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Subscription/SubscriptionListCommandTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Subscription/SubscriptionListCommandTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Subscription/SubscriptionListCommandTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Subscription/SubscriptionListCommandTests.cs index 2594c9e41d..840cf6d2ad 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Subscription/SubscriptionListCommandTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Subscription/SubscriptionListCommandTests.cs @@ -13,7 +13,7 @@ using NSubstitute.ExceptionExtensions; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Subscription; +namespace Azure.Mcp.Core.Tests.Areas.Subscription; public class SubscriptionListCommandTests : CommandUnitTestsBase { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Subscription/SubscriptionTestHelpers.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Subscription/SubscriptionTestHelpers.cs similarity index 97% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Subscription/SubscriptionTestHelpers.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Subscription/SubscriptionTestHelpers.cs index ad3e57cec4..ec1bb671d0 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Subscription/SubscriptionTestHelpers.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Subscription/SubscriptionTestHelpers.cs @@ -6,7 +6,7 @@ using Azure.ResourceManager.Resources; using Azure.ResourceManager.Resources.Models; -namespace Azure.Mcp.Core.UnitTests.Areas.Subscription; +namespace Azure.Mcp.Core.Tests.Areas.Subscription; /// /// Helper methods for creating test subscription data using the Azure SDK model factories. diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Tools/UnitTests/ToolsListCommandTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Tools/ToolsListCommandTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Tools/UnitTests/ToolsListCommandTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Tools/ToolsListCommandTests.cs index 70d663a147..31012b9ad2 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Areas/Tools/UnitTests/ToolsListCommandTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Areas/Tools/ToolsListCommandTests.cs @@ -4,7 +4,7 @@ using System.CommandLine; using System.Net; using System.Text.Json; -using Azure.Mcp.Core.UnitTests.Areas.Server; +using Azure.Mcp.Core.Tests.Areas.Server; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Mcp.Core.Areas; @@ -18,7 +18,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Areas.Tools.UnitTests; +namespace Azure.Mcp.Core.Tests.Areas.Tools; public class ToolsListCommandTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/AssemblyAttributes.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/AssemblyAttributes.cs similarity index 100% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/AssemblyAttributes.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/AssemblyAttributes.cs diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/Azure.Mcp.Core.LiveTests.csproj b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Azure.Mcp.Core.Tests.csproj similarity index 86% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/Azure.Mcp.Core.LiveTests.csproj rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Azure.Mcp.Core.Tests.csproj index 153bba9b00..f306a6cbb1 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/Azure.Mcp.Core.LiveTests.csproj +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Azure.Mcp.Core.Tests.csproj @@ -1,7 +1,9 @@ - + true Exe + true + true diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Client/MockClientTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Client/MockClientTests.cs similarity index 98% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Client/MockClientTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Client/MockClientTests.cs index bfea42d9ab..9db986c6ea 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Client/MockClientTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Client/MockClientTests.cs @@ -8,17 +8,10 @@ using ModelContextProtocol.Server; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Client; +namespace Azure.Mcp.Core.Tests.Client; public class MockClientTests { - private readonly McpServerOptions _options; - - public MockClientTests() - { - _options = CreateOptions(); - } - private static McpServerOptions CreateOptions(McpServerHandlers? serverHandlers = null) { return new McpServerOptions diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/ClientToolTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/ClientToolTests.cs similarity index 97% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/ClientToolTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/ClientToolTests.cs index f18deee670..dd19a5ae9e 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/ClientToolTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/ClientToolTests.cs @@ -10,9 +10,10 @@ using ModelContextProtocol.Protocol; using Xunit; -namespace Azure.Mcp.Core.LiveTests; +namespace Azure.Mcp.Core.Tests; -public class ClientToolTests(ITestOutputHelper output, TestProxyFixture testProxyFixture, LiveServerFixture liveServerFixture) : RecordedCommandTestsBase(output, testProxyFixture, liveServerFixture) +public class ClientToolTests(ITestOutputHelper output, TestProxyFixture testProxyFixture, LiveServerFixture liveServerFixture) + : RecordedCommandTestsBase(output, testProxyFixture, liveServerFixture) { [Fact] diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/CommandTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/CommandTests.cs similarity index 91% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/CommandTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/CommandTests.cs index b76f27a31c..c6591809c8 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/CommandTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/CommandTests.cs @@ -8,9 +8,10 @@ using Microsoft.Mcp.Tests.Generated.Models; using Xunit; -namespace Azure.Mcp.Core.LiveTests; +namespace Azure.Mcp.Core.Tests; -public class CommandTests(ITestOutputHelper output, TestProxyFixture testProxyFixture, LiveServerFixture liveServerFixture) : RecordedCommandTestsBase(output, testProxyFixture, liveServerFixture) +public class CommandTests(ITestOutputHelper output, TestProxyFixture testProxyFixture, LiveServerFixture liveServerFixture) + : RecordedCommandTestsBase(output, testProxyFixture, liveServerFixture) { [Fact] public async Task Should_list_groups_by_subscription() diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Commands/CommandFactoryTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Commands/CommandFactoryTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Commands/CommandFactoryTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Commands/CommandFactoryTests.cs index d933024459..b9b143df87 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Commands/CommandFactoryTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Commands/CommandFactoryTests.cs @@ -13,7 +13,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Commands; +namespace Azure.Mcp.Core.Tests.Commands; public class CommandFactoryTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Commands/DashSupportTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Commands/DashSupportTests.cs similarity index 98% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Commands/DashSupportTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Commands/DashSupportTests.cs index 856f7e6460..8365123941 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Commands/DashSupportTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Commands/DashSupportTests.cs @@ -4,7 +4,7 @@ using Microsoft.Mcp.Core.Commands; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Commands; +namespace Azure.Mcp.Core.Tests.Commands; /// /// Tests that demonstrate the fix for supporting dashes in command names. diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Commands/Extensions/CommandExtensionsTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Commands/Extensions/CommandExtensionsTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Commands/Extensions/CommandExtensionsTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Commands/Extensions/CommandExtensionsTests.cs index 22eb6f56a8..51599910e6 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Commands/Extensions/CommandExtensionsTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Commands/Extensions/CommandExtensionsTests.cs @@ -6,7 +6,7 @@ using Microsoft.Mcp.Core.Commands; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Commands.Extensions; +namespace Azure.Mcp.Core.Tests.Commands.Extensions; public class CommandExtensionsTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Extensions/CommandResultExtensionsTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Extensions/CommandResultExtensionsTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Extensions/CommandResultExtensionsTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Extensions/CommandResultExtensionsTests.cs index e6f87aaf04..532e1c4017 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Extensions/CommandResultExtensionsTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Extensions/CommandResultExtensionsTests.cs @@ -6,7 +6,7 @@ using Microsoft.Mcp.Core.Models.Option; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Extensions; +namespace Azure.Mcp.Core.Tests.Extensions; public class CommandResultExtensionsTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Extensions/HttpClientServiceCollectionExtensionsTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Extensions/HttpClientServiceCollectionExtensionsTests.cs similarity index 98% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Extensions/HttpClientServiceCollectionExtensionsTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Extensions/HttpClientServiceCollectionExtensionsTests.cs index ce86e1c921..bfda63ccf0 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Extensions/HttpClientServiceCollectionExtensionsTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Extensions/HttpClientServiceCollectionExtensionsTests.cs @@ -7,7 +7,7 @@ using Microsoft.Mcp.Core.Services.Http; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Extensions; +namespace Azure.Mcp.Core.Tests.Extensions; public class HttpClientServiceCollectionExtensionsTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Extensions/McpServerElicitationExtensionsTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Extensions/McpServerElicitationExtensionsTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Extensions/McpServerElicitationExtensionsTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Extensions/McpServerElicitationExtensionsTests.cs index 5d28d71110..2e0899ccad 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Extensions/McpServerElicitationExtensionsTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Extensions/McpServerElicitationExtensionsTests.cs @@ -10,7 +10,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Extensions; +namespace Azure.Mcp.Core.Tests.Extensions; public class McpServerElicitationExtensionsTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Extensions/OpenTelemetryExtensionsTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Extensions/OpenTelemetryExtensionsTests.cs similarity index 95% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Extensions/OpenTelemetryExtensionsTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Extensions/OpenTelemetryExtensionsTests.cs index b3496a5898..4c34eaf869 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Extensions/OpenTelemetryExtensionsTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Extensions/OpenTelemetryExtensionsTests.cs @@ -6,7 +6,7 @@ using Microsoft.Mcp.Core.Services.Telemetry; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Extensions; +namespace Azure.Mcp.Core.Tests.Extensions; public class OpenTelemetryExtensionsTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Helpers/AssemblyHelperTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Helpers/AssemblyHelperTests.cs similarity index 98% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Helpers/AssemblyHelperTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Helpers/AssemblyHelperTests.cs index be32512387..21a6c8612a 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Helpers/AssemblyHelperTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Helpers/AssemblyHelperTests.cs @@ -6,7 +6,7 @@ using Microsoft.Mcp.Core.Helpers; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Helpers; +namespace Azure.Mcp.Core.Tests.Helpers; public class AssemblyHelperTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Helpers/CollectionTypeHelperTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Helpers/CollectionTypeHelperTests.cs similarity index 98% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Helpers/CollectionTypeHelperTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Helpers/CollectionTypeHelperTests.cs index 6bf2c0cc3b..95e36051a7 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Helpers/CollectionTypeHelperTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Helpers/CollectionTypeHelperTests.cs @@ -6,7 +6,7 @@ using Microsoft.Mcp.Core.Helpers; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Helpers; +namespace Azure.Mcp.Core.Tests.Helpers; public class CollectionTypeHelperTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Helpers/CommandHelperTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Helpers/CommandHelperTests.cs similarity index 97% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Helpers/CommandHelperTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Helpers/CommandHelperTests.cs index 111a64262e..a45be82a8f 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Helpers/CommandHelperTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Helpers/CommandHelperTests.cs @@ -1,15 +1,16 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + using System.CommandLine; using Azure.Mcp.Core.Areas.Group.Commands; using Azure.Mcp.Core.Services.Azure.ResourceGroup; -using Azure.Mcp.Tools.AppService.Services; -using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Mcp.Core.Helpers; using Microsoft.Mcp.Tests.Helpers; using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Helpers; +namespace Azure.Mcp.Core.Tests.Helpers; public class CommandHelperTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Helpers/OptionParsingHelpersTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Helpers/OptionParsingHelpersTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Helpers/OptionParsingHelpersTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Helpers/OptionParsingHelpersTests.cs index ef7cc31896..7b4d0e75df 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Helpers/OptionParsingHelpersTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Helpers/OptionParsingHelpersTests.cs @@ -4,7 +4,7 @@ using Microsoft.Mcp.Core.Helpers; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Helpers; +namespace Azure.Mcp.Core.Tests.Helpers; public class OptionParsingHelpersTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Infrastructure/VersionSyncTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Infrastructure/VersionSyncTests.cs similarity index 98% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Infrastructure/VersionSyncTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Infrastructure/VersionSyncTests.cs index 41156715a3..c3aaaf822c 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Infrastructure/VersionSyncTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Infrastructure/VersionSyncTests.cs @@ -5,7 +5,7 @@ using System.Text.RegularExpressions; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Infrastructure; +namespace Azure.Mcp.Core.Tests.Infrastructure; public class VersionSyncTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/NpxTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/NpxTests.cs similarity index 96% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/NpxTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/NpxTests.cs index 3f09b64f41..3bf7519c96 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/NpxTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/NpxTests.cs @@ -2,10 +2,11 @@ // Licensed under the MIT License. using System.Diagnostics; +using Microsoft.Mcp.Tests.Attributes; using Microsoft.Mcp.Tests.Client.Helpers; using Xunit; -namespace Azure.Mcp.Core.LiveTests; +namespace Azure.Mcp.Core.Tests; public class NpxTests { @@ -23,6 +24,7 @@ public NpxTests() } } + [LiveTestOnly] [Fact] public async Task Help_command_should_return_help() { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Options/RetryPolicyOptionsTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Options/RetryPolicyOptionsTests.cs similarity index 98% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Options/RetryPolicyOptionsTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Options/RetryPolicyOptionsTests.cs index b5132a33c0..f83607769e 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Options/RetryPolicyOptionsTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Options/RetryPolicyOptionsTests.cs @@ -5,7 +5,7 @@ using Microsoft.Mcp.Core.Options; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Options; +namespace Azure.Mcp.Core.Tests.Options; public class RetryPolicyOptionsTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/RecordingFramework/RecordedCommandTestHarness.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/RecordingFramework/RecordedCommandTestHarness.cs similarity index 96% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/RecordingFramework/RecordedCommandTestHarness.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/RecordingFramework/RecordedCommandTestHarness.cs index 52182aa837..46d5b9a506 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/RecordingFramework/RecordedCommandTestHarness.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/RecordingFramework/RecordedCommandTestHarness.cs @@ -6,7 +6,7 @@ using Microsoft.Mcp.Tests.Helpers; using Xunit; -namespace Azure.Mcp.Core.LiveTests.RecordingFramework; +namespace Azure.Mcp.Core.Tests.RecordingFramework; /// /// Harness for testing RecordedCommandTestsBase functionality. Intended for proper abstraction of livetest settings etc to allow both record and playback modes in the same test for full roundtrip testing. diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/RecordingFramework/RecordedCommandTestsBaseTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/RecordingFramework/RecordedCommandTestsBaseTests.cs similarity index 98% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/RecordingFramework/RecordedCommandTestsBaseTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/RecordingFramework/RecordedCommandTestsBaseTests.cs index 27764b5831..ef2205fc6e 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/RecordingFramework/RecordedCommandTestsBaseTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/RecordingFramework/RecordedCommandTestsBaseTests.cs @@ -13,7 +13,7 @@ using Xunit; using Xunit.v3; -namespace Azure.Mcp.Core.LiveTests.RecordingFramework; +namespace Azure.Mcp.Core.Tests.RecordingFramework; internal sealed class TemporaryAssetsPathResolver : IRecordingPathResolver, IDisposable { @@ -122,8 +122,6 @@ public void Dispose() } } - - public sealed class RecordedCommandTestsBaseTest : IAsyncLifetime { private string RecordingFileLocation = string.Empty; @@ -141,6 +139,7 @@ public RecordedCommandTestsBaseTest() LiveServerFixture = new LiveServerFixture(); } + [LiveTestOnly] [Fact] public async Task ProxyRecordProducesRecording() { @@ -161,6 +160,7 @@ public async Task ProxyRecordProducesRecording() Assert.Equal("sampleValue", variablesElement.GetProperty("sampleKey").GetString()); } + [LiveTestOnly] [CustomMatcher(IgnoreQueryOrdering = true, CompareBodies = true)] [Fact] public async Task PerTestMatcherAttributeAppliesWhenPresent() @@ -194,6 +194,7 @@ public async Task PerTestMatcherAttributeAppliesWhenPresent() CollectedOutput.Received().WriteLine(Arg.Is(s => s.Contains($"Applying custom matcher to recordingId \"{recordingId}\""))); } + [LiveTestOnly] [Fact] public void CustomMatcherAttributeClearsAfterExecution() { @@ -224,6 +225,7 @@ public void CustomMatcherAttributeClearsAfterExecution() return (CustomMatcherAttribute?)method?.Invoke(null, null); } + [LiveTestOnly] [Fact] public async Task GlobalMatcherAndSanitizerAppliesWhenPresent() { @@ -250,6 +252,7 @@ public async Task GlobalMatcherAndSanitizerAppliesWhenPresent() CollectedOutput.Received().WriteLine(Arg.Is(s => s.Contains("Applying custom matcher to global settings"))); } + [LiveTestOnly] [Fact] public async Task VariableSurvivesRecordPlaybackRoundtrip() { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/RegistryDiscoveryStrategyHelper.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/RegistryDiscoveryStrategyHelper.cs similarity index 96% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/RegistryDiscoveryStrategyHelper.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/RegistryDiscoveryStrategyHelper.cs index f80952873b..49d2f53087 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/RegistryDiscoveryStrategyHelper.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/RegistryDiscoveryStrategyHelper.cs @@ -7,7 +7,7 @@ using Microsoft.Mcp.Core.Helpers; using NSubstitute; -namespace Azure.Mcp.Core.UnitTests; +namespace Azure.Mcp.Core.Tests; public class RegistryDiscoveryStrategyHelper { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/Services/Azure/Authentication/AuthenticationIntegrationTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/Authentication/AuthenticationIntegrationTests.cs similarity index 97% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/Services/Azure/Authentication/AuthenticationIntegrationTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/Authentication/AuthenticationIntegrationTests.cs index d9d208b5f1..8848fd411e 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/Services/Azure/Authentication/AuthenticationIntegrationTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/Authentication/AuthenticationIntegrationTests.cs @@ -14,10 +14,11 @@ using Microsoft.Mcp.Core.Services.Azure.Authentication; using Microsoft.Mcp.Core.Services.Caching; using Microsoft.Mcp.Tests; +using Microsoft.Mcp.Tests.Attributes; using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.LiveTests.Services.Azure.Authentication; +namespace Azure.Mcp.Core.Tests.Services.Azure.Authentication; public class AuthenticationIntegrationTests : IAsyncLifetime { @@ -48,6 +49,7 @@ public async ValueTask DisposeAsync() await _serviceProvider.DisposeAsync(); } + [LiveTestOnly] [Fact] public async Task LoginWithIdentityBroker_ThenListSubscriptions_ShouldSucceed() { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Azure/Authentication/AzureCloudConfigurationTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/Authentication/AzureCloudConfigurationTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Azure/Authentication/AzureCloudConfigurationTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/Authentication/AzureCloudConfigurationTests.cs index 247022607f..3a811d48cc 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Azure/Authentication/AzureCloudConfigurationTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/Authentication/AzureCloudConfigurationTests.cs @@ -7,7 +7,7 @@ using Microsoft.Mcp.Core.Services.Azure.Authentication; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Services.Azure.Authentication; +namespace Azure.Mcp.Core.Tests.Services.Azure.Authentication; /// /// Tests for AzureCloudConfiguration to verify sovereign cloud support. diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Azure/Authentication/CustomChainedCredentialTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/Authentication/CustomChainedCredentialTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Azure/Authentication/CustomChainedCredentialTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/Authentication/CustomChainedCredentialTests.cs index 60fb735824..555f7260cb 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Azure/Authentication/CustomChainedCredentialTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/Authentication/CustomChainedCredentialTests.cs @@ -7,7 +7,7 @@ using Microsoft.Extensions.Logging; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Services.Azure.Authentication; +namespace Azure.Mcp.Core.Tests.Services.Azure.Authentication; /// /// Tests for CustomChainedCredential configuration behavior. diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/Services/Azure/Authentication/HttpAuthenticationIntegrationTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/Authentication/HttpAuthenticationIntegrationTests.cs similarity index 98% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/Services/Azure/Authentication/HttpAuthenticationIntegrationTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/Authentication/HttpAuthenticationIntegrationTests.cs index 8f66627214..4ffd173ac5 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.LiveTests/Services/Azure/Authentication/HttpAuthenticationIntegrationTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/Authentication/HttpAuthenticationIntegrationTests.cs @@ -8,10 +8,11 @@ using System.Text.Json; using Microsoft.Mcp.Core.Areas.Server.Models; using Microsoft.Mcp.Tests; +using Microsoft.Mcp.Tests.Attributes; using Microsoft.Mcp.Tests.Client.Helpers; using Xunit; -namespace Azure.Mcp.Core.LiveTests.Services.Azure.Authentication; +namespace Azure.Mcp.Core.Tests.Services.Azure.Authentication; /// /// Integration tests for HTTP authentication behavior. @@ -106,6 +107,7 @@ public async ValueTask DisposeAsync() } } + [LiveTestOnly] [Fact] public async Task UnauthenticatedRequest_Returns401WithResourceMetadata() { @@ -141,6 +143,7 @@ public async Task UnauthenticatedRequest_Returns401WithResourceMetadata() _output.WriteLine("✓ Unauthenticated request returned correct WWW-Authenticate header"); } + [LiveTestOnly] [Fact] public async Task InvalidTokenRequest_Returns401WithErrorDetails() { @@ -175,6 +178,7 @@ public async Task InvalidTokenRequest_Returns401WithErrorDetails() _output.WriteLine($"✓ Invalid token request returned error details in WWW-Authenticate header"); } + [LiveTestOnly] [Fact] public async Task ExpiredTokenRequest_Returns401WithErrorDetails() { @@ -212,6 +216,7 @@ public async Task ExpiredTokenRequest_Returns401WithErrorDetails() _output.WriteLine($"✓ Expired token request returned error details in WWW-Authenticate header"); } + [LiveTestOnly] [Fact] public async Task OAuthProtectedResourceMetadataEndpoint_ReturnsValidMetadata() { @@ -236,6 +241,7 @@ public async Task OAuthProtectedResourceMetadataEndpoint_ReturnsValidMetadata() _output.WriteLine("✓ OAuth protected resource metadata endpoint returned valid metadata"); } + [LiveTestOnly] [Fact] public async Task MultipleUnauthenticatedRequests_ConsistentWwwAuthenticateHeader() { @@ -268,6 +274,7 @@ public async Task MultipleUnauthenticatedRequests_ConsistentWwwAuthenticateHeade _output.WriteLine("✓ WWW-Authenticate header is consistent across multiple requests"); } + [LiveTestOnly] [Fact] public async Task WwwAuthenticateHeader_ContainsCorrectRealm() { @@ -289,6 +296,7 @@ public async Task WwwAuthenticateHeader_ContainsCorrectRealm() _output.WriteLine($"✓ WWW-Authenticate header contains correct realm: {expectedRealm}"); } + [LiveTestOnly] [Fact] public async Task WwwAuthenticateHeader_ResourceMetadataPointsToCorrectEndpoint() { @@ -310,6 +318,7 @@ public async Task WwwAuthenticateHeader_ResourceMetadataPointsToCorrectEndpoint( _output.WriteLine($"✓ resource_metadata points to correct endpoint: {expectedMetadataUrl}"); } + [LiveTestOnly] [Fact] public async Task Client_CanDiscoverAndUseMetadataForAuthentication() { @@ -338,6 +347,7 @@ public async Task Client_CanDiscoverAndUseMetadataForAuthentication() _output.WriteLine($" Scope: {scope}"); } + [LiveTestOnly] [Fact] public async Task MetadataDocument_ContainsAllRequiredFields() { @@ -356,6 +366,7 @@ public async Task MetadataDocument_ContainsAllRequiredFields() Assert.All(metadata.AuthorizationServers, server => Assert.Matches(@"https://login\.microsoftonline\.com/.+/v2\.0", server)); } + [LiveTestOnly] [Fact] public async Task WwwAuthenticateMetadataUrl_MatchesActualEndpoint() { @@ -375,6 +386,7 @@ public async Task WwwAuthenticateMetadataUrl_MatchesActualEndpoint() Assert.Equal(_serverUrl, metadata?.Resource); } + [LiveTestOnly] [Fact] public async Task MetadataAuthorizationServer_ContainsCorrectTenantId() { @@ -388,6 +400,7 @@ public async Task MetadataAuthorizationServer_ContainsCorrectTenantId() Assert.Contains($"https://login.microsoftonline.com/{tenantId}/v2.0", json); } + [LiveTestOnly] [Fact] public async Task MetadataScopes_ContainsCorrectClientId() { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Azure/BaseAzureServiceRetryLimitsTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/BaseAzureServiceRetryLimitsTests.cs similarity index 98% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Azure/BaseAzureServiceRetryLimitsTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/BaseAzureServiceRetryLimitsTests.cs index 7813e1ffb0..0622f170f0 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Azure/BaseAzureServiceRetryLimitsTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/BaseAzureServiceRetryLimitsTests.cs @@ -10,7 +10,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Services.Azure; +namespace Azure.Mcp.Core.Tests.Services.Azure; /// /// Disables parallelization for tests that mutate global static state diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Azure/BaseAzureServiceTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/BaseAzureServiceTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Azure/BaseAzureServiceTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/BaseAzureServiceTests.cs index b9dc3e141b..613112db81 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Azure/BaseAzureServiceTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/BaseAzureServiceTests.cs @@ -11,7 +11,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Services.Azure; +namespace Azure.Mcp.Core.Tests.Services.Azure; public class BaseAzureServiceTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Azure/UserAgentPolicyTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/UserAgentPolicyTests.cs similarity index 98% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Azure/UserAgentPolicyTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/UserAgentPolicyTests.cs index 76d2108282..b6955e1fc0 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Azure/UserAgentPolicyTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Azure/UserAgentPolicyTests.cs @@ -6,7 +6,7 @@ using Microsoft.Mcp.Core.Services.Azure; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Services.Azure; +namespace Azure.Mcp.Core.Tests.Services.Azure; public class UserAgentPolicyTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Caching/CacheDurationsTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Caching/CacheDurationsTests.cs similarity index 95% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Caching/CacheDurationsTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Caching/CacheDurationsTests.cs index 44b2cce4ae..5cd7c0b9dc 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Caching/CacheDurationsTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Caching/CacheDurationsTests.cs @@ -4,7 +4,7 @@ using Microsoft.Mcp.Core.Services.Caching; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Services.Caching; +namespace Azure.Mcp.Core.Tests.Services.Caching; public class CacheDurationsTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Caching/CacheServiceTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Caching/CacheServiceTests.cs similarity index 99% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Caching/CacheServiceTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Caching/CacheServiceTests.cs index 713b2a7297..e7be7dabbb 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Caching/CacheServiceTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Caching/CacheServiceTests.cs @@ -5,7 +5,7 @@ using Microsoft.Mcp.Core.Services.Caching; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Services.Caching; +namespace Azure.Mcp.Core.Tests.Services.Caching; public class CacheServiceTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Caching/CachingServiceCollectionExtensionsTests.cs b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Caching/CachingServiceCollectionExtensionsTests.cs similarity index 98% rename from core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Caching/CachingServiceCollectionExtensionsTests.cs rename to core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Caching/CachingServiceCollectionExtensionsTests.cs index 3edf428144..a36741b829 100644 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Services/Caching/CachingServiceCollectionExtensionsTests.cs +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/Services/Caching/CachingServiceCollectionExtensionsTests.cs @@ -7,7 +7,7 @@ using NSubstitute; using Xunit; -namespace Azure.Mcp.Core.UnitTests.Services.Caching; +namespace Azure.Mcp.Core.Tests.Services.Caching; public class CacheServiceCollectionExtensionsTests { diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/assets.json b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/assets.json new file mode 100644 index 0000000000..bfb17d4fbb --- /dev/null +++ b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.Tests/assets.json @@ -0,0 +1,6 @@ +{ + "AssetsRepo": "Azure/azure-sdk-assets", + "AssetsRepoPrefixPath": "", + "TagPrefix": "Azure.Mcp.Core.Tests", + "Tag": "Azure.Mcp.Core.Tests_45cf2cb03a" +} diff --git a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Azure.Mcp.Core.UnitTests.csproj b/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Azure.Mcp.Core.UnitTests.csproj deleted file mode 100644 index b6a05696f4..0000000000 --- a/core/Azure.Mcp.Core/tests/Azure.Mcp.Core.UnitTests/Azure.Mcp.Core.UnitTests.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - true - Exe - - - - - - - - - - - - - - diff --git a/core/Microsoft.Mcp.Core/src/Microsoft.Mcp.Core.csproj b/core/Microsoft.Mcp.Core/src/Microsoft.Mcp.Core.csproj index 92f6f20ee0..e35ae54dc7 100644 --- a/core/Microsoft.Mcp.Core/src/Microsoft.Mcp.Core.csproj +++ b/core/Microsoft.Mcp.Core/src/Microsoft.Mcp.Core.csproj @@ -34,6 +34,6 @@ - + diff --git a/core/Microsoft.Mcp.Core/src/Properties/AssemblyInfo.cs b/core/Microsoft.Mcp.Core/src/Properties/AssemblyInfo.cs index b444160482..8dc254f837 100644 --- a/core/Microsoft.Mcp.Core/src/Properties/AssemblyInfo.cs +++ b/core/Microsoft.Mcp.Core/src/Properties/AssemblyInfo.cs @@ -3,7 +3,6 @@ using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("Azure.Mcp.Core.UnitTests")] -[assembly: InternalsVisibleTo("Azure.Mcp.Core.LiveTests")] +[assembly: InternalsVisibleTo("Azure.Mcp.Core.Tests")] [assembly: InternalsVisibleTo("Microsoft.Mcp.Tests")] [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] diff --git a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Areas/Server/Commands/CommandExtensionsTests.cs b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Areas/Server/Commands/CommandExtensionsTests.cs similarity index 98% rename from core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Areas/Server/Commands/CommandExtensionsTests.cs rename to core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Areas/Server/Commands/CommandExtensionsTests.cs index 1577a6a9f1..4087f51a84 100644 --- a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Areas/Server/Commands/CommandExtensionsTests.cs +++ b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Areas/Server/Commands/CommandExtensionsTests.cs @@ -7,7 +7,7 @@ using Microsoft.Mcp.Core.Extensions; using Xunit; -namespace Microsoft.Mcp.Core.UnitTests.Areas.Server.Commands; +namespace Microsoft.Mcp.Core.Tests.Areas.Server.Commands; /// /// Tests for , diff --git a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/GetParametersFromArgsTests.cs b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/GetParametersFromArgsTests.cs similarity index 98% rename from core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/GetParametersFromArgsTests.cs rename to core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/GetParametersFromArgsTests.cs index d3802158ae..d9e628e3f7 100644 --- a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/GetParametersFromArgsTests.cs +++ b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/GetParametersFromArgsTests.cs @@ -5,7 +5,7 @@ using Microsoft.Mcp.Core.Areas.Server.Commands.ToolLoading; using Xunit; -namespace Microsoft.Mcp.Core.UnitTests.Areas.Server.Commands.ToolLoading; +namespace Microsoft.Mcp.Core.Tests.Areas.Server.Commands.ToolLoading; /// /// Tests for , diff --git a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/ToolLoaderTelemetryTests.cs b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/ToolLoaderTelemetryTests.cs similarity index 99% rename from core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/ToolLoaderTelemetryTests.cs rename to core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/ToolLoaderTelemetryTests.cs index c4cc826fd3..81f117fe9d 100644 --- a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Areas/Server/Commands/ToolLoading/ToolLoaderTelemetryTests.cs +++ b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Areas/Server/Commands/ToolLoading/ToolLoaderTelemetryTests.cs @@ -17,7 +17,7 @@ using NSubstitute.ExceptionExtensions; using Xunit; -namespace Microsoft.Mcp.Core.UnitTests.Areas.Server.Commands.ToolLoading; +namespace Microsoft.Mcp.Core.Tests.Areas.Server.Commands.ToolLoading; /// /// Tests validating telemetry is emitted correctly for tool loading operations. diff --git a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Areas/Server/Commands/TypeToJsonTypeMapperTests.cs b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Areas/Server/Commands/TypeToJsonTypeMapperTests.cs similarity index 98% rename from core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Areas/Server/Commands/TypeToJsonTypeMapperTests.cs rename to core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Areas/Server/Commands/TypeToJsonTypeMapperTests.cs index 5249d0954a..0f3942a5e8 100644 --- a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Areas/Server/Commands/TypeToJsonTypeMapperTests.cs +++ b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Areas/Server/Commands/TypeToJsonTypeMapperTests.cs @@ -4,7 +4,7 @@ using Microsoft.Mcp.Core.Areas.Server.Commands; using Xunit; -namespace Microsoft.Mcp.Core.UnitTests.Areas.Server.Commands; +namespace Microsoft.Mcp.Core.Tests.Areas.Server.Commands; /// /// Tests for , specifically the enum type mapping diff --git a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Areas/Server/Models/ToolInputSchemaTests.cs b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Areas/Server/Models/ToolInputSchemaTests.cs similarity index 97% rename from core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Areas/Server/Models/ToolInputSchemaTests.cs rename to core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Areas/Server/Models/ToolInputSchemaTests.cs index 2c598f3adf..146bec315d 100644 --- a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Areas/Server/Models/ToolInputSchemaTests.cs +++ b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Areas/Server/Models/ToolInputSchemaTests.cs @@ -6,7 +6,7 @@ using Microsoft.Mcp.Core.Areas.Server.Models; using Xunit; -namespace Microsoft.Mcp.Core.UnitTests.Areas.Server.Models; +namespace Microsoft.Mcp.Core.Tests.Areas.Server.Models; /// /// Tests for serialization behavior, diff --git a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Areas/Server/Models/ToolPropertySchemaTests.cs b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Areas/Server/Models/ToolPropertySchemaTests.cs similarity index 98% rename from core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Areas/Server/Models/ToolPropertySchemaTests.cs rename to core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Areas/Server/Models/ToolPropertySchemaTests.cs index b4f17c427a..431a637122 100644 --- a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Areas/Server/Models/ToolPropertySchemaTests.cs +++ b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Areas/Server/Models/ToolPropertySchemaTests.cs @@ -6,7 +6,7 @@ using Microsoft.Mcp.Core.Areas.Server.Models; using Xunit; -namespace Microsoft.Mcp.Core.UnitTests.Areas.Server.Models; +namespace Microsoft.Mcp.Core.Tests.Areas.Server.Models; /// /// Tests for serialization behavior, diff --git a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Commands/BaseCommandMetadataTests.cs b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Commands/BaseCommandMetadataTests.cs similarity index 99% rename from core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Commands/BaseCommandMetadataTests.cs rename to core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Commands/BaseCommandMetadataTests.cs index c88bf212d1..a3b41967da 100644 --- a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Commands/BaseCommandMetadataTests.cs +++ b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Commands/BaseCommandMetadataTests.cs @@ -6,7 +6,7 @@ using Microsoft.Mcp.Core.Models.Command; using Xunit; -namespace Microsoft.Mcp.Core.UnitTests.Commands; +namespace Microsoft.Mcp.Core.Tests.Commands; /// /// Tests for , , diff --git a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Helpers/EndpointValidatorTests.cs b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Helpers/EndpointValidatorTests.cs similarity index 99% rename from core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Helpers/EndpointValidatorTests.cs rename to core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Helpers/EndpointValidatorTests.cs index 00e17b2f05..f0d9f41aea 100644 --- a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Helpers/EndpointValidatorTests.cs +++ b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Helpers/EndpointValidatorTests.cs @@ -8,7 +8,7 @@ using Microsoft.Mcp.Core.Helpers; using Xunit; -namespace Microsoft.Mcp.Core.UnitTests.Helpers; +namespace Microsoft.Mcp.Core.Tests.Helpers; public class EndpointValidatorTests { diff --git a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Helpers/McpHelperTests.cs b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Helpers/McpHelperTests.cs similarity index 98% rename from core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Helpers/McpHelperTests.cs rename to core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Helpers/McpHelperTests.cs index 8b718b011d..5a67f00724 100644 --- a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Helpers/McpHelperTests.cs +++ b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Helpers/McpHelperTests.cs @@ -7,7 +7,7 @@ using ModelContextProtocol.Protocol; using Xunit; -namespace Microsoft.Mcp.Core.UnitTests.Helpers; +namespace Microsoft.Mcp.Core.Tests.Helpers; public class McpHelperTests { diff --git a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Helpers/SqlQueryParameterizerTests.cs b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Helpers/SqlQueryParameterizerTests.cs similarity index 98% rename from core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Helpers/SqlQueryParameterizerTests.cs rename to core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Helpers/SqlQueryParameterizerTests.cs index a44405ecb4..0f7fc53558 100644 --- a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Helpers/SqlQueryParameterizerTests.cs +++ b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Helpers/SqlQueryParameterizerTests.cs @@ -1,11 +1,10 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -using Microsoft.Mcp.Core.Helpers; using Xunit; using static Microsoft.Mcp.Core.Helpers.SqlQueryParameterizer; -namespace Microsoft.Mcp.Core.UnitTests.Helpers; +namespace Microsoft.Mcp.Core.Tests.Helpers; public class SqlQueryParameterizerTests { diff --git a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Microsoft.Mcp.Core.UnitTests.csproj b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Microsoft.Mcp.Core.Tests.csproj similarity index 100% rename from core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Microsoft.Mcp.Core.UnitTests.csproj rename to core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Microsoft.Mcp.Core.Tests.csproj diff --git a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Caching/CacheKeyBuilderTests.cs b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Caching/CacheKeyBuilderTests.cs similarity index 95% rename from core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Caching/CacheKeyBuilderTests.cs rename to core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Caching/CacheKeyBuilderTests.cs index 86633a7d35..01636c1af4 100644 --- a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Caching/CacheKeyBuilderTests.cs +++ b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Caching/CacheKeyBuilderTests.cs @@ -4,7 +4,7 @@ using Microsoft.Mcp.Core.Services.Caching; using Xunit; -namespace Microsoft.Mcp.Core.UnitTests.Services.Caching; +namespace Microsoft.Mcp.Core.Tests.Services.Caching; public class CacheKeyBuilderTests { diff --git a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/DefaultMachineInformationProviderTests.cs b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/DefaultMachineInformationProviderTests.cs similarity index 90% rename from core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/DefaultMachineInformationProviderTests.cs rename to core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/DefaultMachineInformationProviderTests.cs index 57ebef8032..884ae7fa13 100644 --- a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/DefaultMachineInformationProviderTests.cs +++ b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/DefaultMachineInformationProviderTests.cs @@ -6,7 +6,7 @@ using NSubstitute; using Xunit; -namespace Microsoft.Mcp.Core.UnitTests.Services.Telemetry; +namespace Microsoft.Mcp.Core.Tests.Services.Telemetry; public class DefaultMachineInformationProviderTests { diff --git a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/LinuxInformationProviderTests.cs b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/LinuxInformationProviderTests.cs similarity index 94% rename from core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/LinuxInformationProviderTests.cs rename to core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/LinuxInformationProviderTests.cs index 6e6c47d3b7..aea19d75d5 100644 --- a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/LinuxInformationProviderTests.cs +++ b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/LinuxInformationProviderTests.cs @@ -8,7 +8,7 @@ using NSubstitute; using Xunit; -namespace Microsoft.Mcp.Core.UnitTests.Services.Telemetry; +namespace Microsoft.Mcp.Core.Tests.Services.Telemetry; [SupportedOSPlatform("linux")] public class LinuxInformationProviderTests diff --git a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/MacOSXInformationProviderTests.cs b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/MacOSXInformationProviderTests.cs similarity index 94% rename from core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/MacOSXInformationProviderTests.cs rename to core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/MacOSXInformationProviderTests.cs index b7e327539c..3ad24d3ab3 100644 --- a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/MacOSXInformationProviderTests.cs +++ b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/MacOSXInformationProviderTests.cs @@ -8,7 +8,7 @@ using NSubstitute; using Xunit; -namespace Microsoft.Mcp.Core.UnitTests.Services.Telemetry; +namespace Microsoft.Mcp.Core.Tests.Services.Telemetry; [SupportedOSPlatform("osx")] public class MacOSXInformationProviderTests diff --git a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/MachineInformationProviderBaseTests.cs b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/MachineInformationProviderBaseTests.cs similarity index 99% rename from core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/MachineInformationProviderBaseTests.cs rename to core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/MachineInformationProviderBaseTests.cs index 21bf1f651e..2ea082d580 100644 --- a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/MachineInformationProviderBaseTests.cs +++ b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/MachineInformationProviderBaseTests.cs @@ -8,7 +8,7 @@ using NSubstitute; using Xunit; -namespace Microsoft.Mcp.Core.UnitTests.Services.Telemetry; +namespace Microsoft.Mcp.Core.Tests.Services.Telemetry; public class MachineInformationProviderBaseTests { diff --git a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/TelemetryLogRecordEraserTests.cs b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/TelemetryLogRecordEraserTests.cs similarity index 99% rename from core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/TelemetryLogRecordEraserTests.cs rename to core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/TelemetryLogRecordEraserTests.cs index 123c609e84..d5b3835548 100644 --- a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/TelemetryLogRecordEraserTests.cs +++ b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/TelemetryLogRecordEraserTests.cs @@ -5,7 +5,7 @@ using OpenTelemetry.Logs; using Xunit; -namespace Microsoft.Mcp.Core.UnitTests.Services.Telemetry; +namespace Microsoft.Mcp.Core.Tests.Services.Telemetry; public class TelemetryLogRecordEraserTests { diff --git a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/TelemetryServiceTests.cs b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/TelemetryServiceTests.cs similarity index 99% rename from core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/TelemetryServiceTests.cs rename to core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/TelemetryServiceTests.cs index 3dabff465c..0350eb644d 100644 --- a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/TelemetryServiceTests.cs +++ b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/TelemetryServiceTests.cs @@ -15,7 +15,7 @@ using Xunit; using static Microsoft.Mcp.Core.Services.Azure.Authentication.AzureCloudConfiguration; -namespace Microsoft.Mcp.Core.UnitTests.Services.Telemetry; +namespace Microsoft.Mcp.Core.Tests.Services.Telemetry; public class TelemetryServiceTests { diff --git a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/UnixInformationProviderTests.cs b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/UnixInformationProviderTests.cs similarity index 99% rename from core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/UnixInformationProviderTests.cs rename to core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/UnixInformationProviderTests.cs index e13ed8135a..f917b01f4b 100644 --- a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/UnixInformationProviderTests.cs +++ b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/UnixInformationProviderTests.cs @@ -6,7 +6,7 @@ using NSubstitute; using Xunit; -namespace Microsoft.Mcp.Core.UnitTests.Services.Telemetry; +namespace Microsoft.Mcp.Core.Tests.Services.Telemetry; public class UnixInformationProviderTests { diff --git a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/WindowsInformationProviderTests.cs b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/WindowsInformationProviderTests.cs similarity index 94% rename from core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/WindowsInformationProviderTests.cs rename to core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/WindowsInformationProviderTests.cs index 8ecbbe4ef6..29681fecf4 100644 --- a/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.UnitTests/Services/Telemetry/WindowsInformationProviderTests.cs +++ b/core/Microsoft.Mcp.Core/tests/Microsoft.Mcp.Core.Tests/Services/Telemetry/WindowsInformationProviderTests.cs @@ -8,7 +8,7 @@ using NSubstitute; using Xunit; -namespace Microsoft.Mcp.Core.UnitTests.Services.Telemetry; +namespace Microsoft.Mcp.Core.Tests.Services.Telemetry; [SupportedOSPlatform("windows")] public class WindowsInformationProviderTests diff --git a/docs/recorded-tests.md b/docs/recorded-tests.md index 3a88a18b27..c29cad1cf1 100644 --- a/docs/recorded-tests.md +++ b/docs/recorded-tests.md @@ -2,7 +2,7 @@ ## Context -This repository ships CLI tools. Specifically, multiple combinations of `tools` assembled into `mcp servers` that are effectively standalone CLI tools themselves. Developers contribute LiveTests that invoke these tools against live azure resources and verify the output is as expected. +This repository ships CLI tools. Specifically, multiple combinations of `tools` assembled into `mcp servers` that are effectively standalone CLI tools themselves. Developers contribute LiveTests that invoke these tools against live Azure resources and verify the output is as expected. ## Architecture Overview @@ -44,7 +44,7 @@ The `.proxy` directory is recreated whenever a recorded test run needs the Test 1. **Rebase on latest** – Ensure your branch includes the current recorded-test infrastructure. 2. **Re-parent the test class** – Update live tests to inherit from `RecordedCommandTestsBase` instead of `CommandTestsBase`. 3. **Ensure proxy-aware HTTP usage** – Commands must obtain `HttpClient` instances via `IHttpClientFactory.CreateClient()` to benefit from playback redirection. -4. **Add `assets.json`** – If the toolset doesn’t have one, create `tools//tests//assets.json`: +4. **Add `assets.json`** – If the toolset doesn’t have one, create `tools//tests//assets.json`: ```json { "AssetsRepo": "Azure/azure-sdk-assets", @@ -66,7 +66,7 @@ Example Migrations: Follow this checklist any time you need to update recordings: 0. **Deploy LiveResources** - `Connect-AzAccount` with your targeted subscription, then invoke `./eng/scripts/Deploy-TestResources.ps1`. EG `./eng/scripts/Deploy-TestResources.ps1 -Paths KeyVault`. -1. **Set record mode** – Locate the `.testsettings.json` next to your test project (for example `tools/Azure.Mcp.Tools.KeyVault/tests/Azure.Mcp.Tools.KeyVault.LiveTests/.testsettings.json`). Update the file `TestMode` value to `Record`: +1. **Set record mode** – Locate the `.testsettings.json` next to your test project (for example `tools/Azure.Mcp.Tools.KeyVault/tests/Azure.Mcp.Tools.KeyVault.Tests/.testsettings.json`). Update the file `TestMode` value to `Record`: ```jsonc { // ... @@ -74,17 +74,17 @@ Follow this checklist any time you need to update recordings: // ... } ``` -2. **Run tests** – Invoke the live test project (e.g. `dotnet test tools/Azure.Mcp.Tools.KeyVault/tests/Azure.Mcp.Tools.KeyVault.LiveTests`). The harness boots the proxy, registers default sanitizers, and writes fresh recordings under `.assets/`. +2. **Run tests** – Invoke the live test project (e.g. `dotnet test tools/Azure.Mcp.Tools.KeyVault/tests/Azure.Mcp.Tools.KeyVault.Tests`). The harness boots the proxy, registers default sanitizers, and writes fresh recordings under `.assets/`. 3. **Inspect recordings** – Use the helper to locate the exact folder: ```powershell - ./.proxy/Azure.Sdk.Tools.TestProxy.exe config locate -a tools/Azure.Mcp.Tools.KeyVault/tests/Azure.Mcp.Tools.KeyVault.LiveTests/assets.json + ./.proxy/Azure.Sdk.Tools.TestProxy.exe config locate -a tools/Azure.Mcp.Tools.KeyVault/tests/Azure.Mcp.Tools.KeyVault.Tests/assets.json ``` Review each JSON recording and confirm no secrets or unstable data were missed by existing sanitizers. - Note that on `unix` platforms there is no `.exe` suffix. 4. **Switch to playback** – Change the `TestMode` value in `.testsettings.json` to `Playback`. Re-run the tests to verify they pass without hitting live resources. 5. **Push assets** – When satisfied, publish the updated recordings: ```powershell - ./.proxy/Azure.Sdk.Tools.TestProxy.exe push -a tools/Azure.Mcp.Tools.KeyVault/tests/Azure.Mcp.Tools.KeyVault.LiveTests/assets.json + ./.proxy/Azure.Sdk.Tools.TestProxy.exe push -a tools/Azure.Mcp.Tools.KeyVault/tests/Azure.Mcp.Tools.KeyVault.Tests/assets.json ``` This stages the local recording updates for commit, creates a new tag in `Azure/azure-sdk-assets`, and updates the `Tag` field in local `assets.json` to reflect new recording location. 6. **Commit** to `mcp` repo – Include: diff --git a/docs/tool-rename-checklist.md b/docs/tool-rename-checklist.md index ab6783e31f..13602a814c 100644 --- a/docs/tool-rename-checklist.md +++ b/docs/tool-rename-checklist.md @@ -45,7 +45,7 @@ Recorded tests reference tool names inside their JSON session files. Old recordi ``` - [ ] Verify playback passes locally: ```powershell - dotnet test tools/Azure.Mcp.Tools.{Toolset}/tests/Azure.Mcp.Tools.{Toolset}.LiveTests --no-build + dotnet test tools/Azure.Mcp.Tools.{Toolset}/tests/Azure.Mcp.Tools.{Toolset}.Tests --no-build ``` ### 4. Unit tests @@ -54,7 +54,7 @@ Recorded tests reference tool names inside their JSON session files. Old recordi - [ ] Update test class names and file names if they encode the old command name. - [ ] Confirm all unit tests pass: ```powershell - dotnet test tools/Azure.Mcp.Tools.{Toolset}/tests/Azure.Mcp.Tools.{Toolset}.UnitTests + dotnet test tools/Azure.Mcp.Tools.{Toolset}/tests/Azure.Mcp.Tools.{Toolset}.Tests ``` ### 5. Changelog diff --git a/eng/scripts/Get-ProjectProperties.ps1 b/eng/scripts/Get-ProjectProperties.ps1 index e12496f508..681194b54b 100644 --- a/eng/scripts/Get-ProjectProperties.ps1 +++ b/eng/scripts/Get-ProjectProperties.ps1 @@ -64,7 +64,10 @@ $propertyList = @( 'McpbPlatforms', - 'AzureSupportedClouds' + 'AzureSupportedClouds', + + 'HasLiveTests', + 'HasUnitTests' ) $projectFile = $projectFiles | Select-Object -First 1 diff --git a/eng/scripts/New-BuildInfo.ps1 b/eng/scripts/New-BuildInfo.ps1 index 7cfe6763a3..1a61851170 100644 --- a/eng/scripts/New-BuildInfo.ps1 +++ b/eng/scripts/New-BuildInfo.ps1 @@ -327,12 +327,29 @@ function Get-PathsToTest { Write-Progress -Activity "Checking for test resources" -Status $path + $projectName = (Get-Item $path).Name $testResourcesPath = "$path/tests" - $rootedTestResourcesPath = "$($using:RepoRoot)/$testResourcesPath" + $rootedTestResourcesPath = Resolve-Path "$($using:RepoRoot)/$testResourcesPath" $hasTestResources = Test-Path "$rootedTestResourcesPath/test-resources.bicep" - $hasLiveTests = (Get-ChildItem $rootedTestResourcesPath -Filter '*.LiveTests.csproj' -Recurse).Count -gt 0 + $hasUnifiedTests = Test-Path "$rootedTestResourcesPath/$projectName.Tests.csproj" + $testProjectDetails = $hasUnifiedTests ? (& "$($using:PSScriptRoot)/Get-ProjectProperties.ps1" -Path "$rootedTestResourcesPath/$projectName.Tests.csproj") : $null + $hasLiveTests = $false + # At this time there are two ways to denote if a project has live and unit tests. + # 1. Separate projects for live and unit tests, e.g. Azure.Mcp.Server.UnitTests.csproj and Azure.Mcp.Server.LiveTests.csproj + # 2. A single project with a property group that has true and/or true + # Eventually everything will migrate to the second approach, but for now we need to support both. + if ((Get-ChildItem $rootedTestResourcesPath -Filter '*.LiveTests.csproj' -Recurse).Count -gt 0) { + $hasLiveTests = $true + } elseif ($hasUnifiedTests) { + $hasLiveTests = $testProjectDetails.HasLiveTests + } $hasRecordedTests = $hasLiveTests -and (Get-ChildItem $rootedTestResourcesPath -Filter 'assets.json' -Recurse).Count -gt 0 - $hasUnitTests = (Get-ChildItem $rootedTestResourcesPath -Filter '*.UnitTests.csproj' -Recurse).Count -gt 0 + $hasUnitTests = $false + if ((Get-ChildItem $rootedTestResourcesPath -Filter '*.UnitTests.csproj' -Recurse).Count -gt 0) { + $hasUnitTests = $true + } elseif ($hasUnifiedTests) { + $hasUnitTests = $testProjectDetails.HasUnitTests + } $sourcePath = Join-Path $using:RepoRoot $path "src" diff --git a/eng/scripts/Test-Code.ps1 b/eng/scripts/Test-Code.ps1 index 0f0f5f086d..24884198c4 100755 --- a/eng/scripts/Test-Code.ps1 +++ b/eng/scripts/Test-Code.ps1 @@ -3,7 +3,7 @@ [CmdletBinding()] param( - [string[]] $Paths, + [string[]] $Paths = @('core\Azure.Mcp.Core'), [string[]] $Members, [ValidateSet('Live', 'Unit', 'All', 'Recorded')] [string] $TestType = 'Unit', @@ -43,14 +43,18 @@ Remove-Item -Recurse -Force $TestResultsPath -ErrorAction SilentlyContinue # Finds all test projects, then filters them based on the specified path filters. function FilterTestProjects { - $fileNameFilters = switch ($testType) { - 'Live' { '*.LiveTests.csproj' } - 'Unit' { '*.UnitTests.csproj' } - 'Recorded' { '*.LiveTests.csproj' } - 'All' { '*.LiveTests.csproj', '*.UnitTests.csproj' } + $testProjects = Get-ChildItem -Path "$RepoRoot" -Recurse -Filter "*Tests.csproj" -File + | Where-Object { + if ($_.Name -like '*.LiveTests.csproj') { + return $TestType -in @('Live', 'Recorded', 'All') + } elseif ($_.Name -like '*.UnitTests.csproj') { + return $TestType -in @('Unit', 'All') + } elseif ($_.Name -like "*Tests.csproj") { + $testProjectDetails = & "$($PSScriptRoot)/Get-ProjectProperties.ps1" -Path $_.FullName + return ($testProjectDetails.HasLiveTests -and $TestType -in @('Live', 'Recorded', 'All')) -or + ($testProjectDetails.HasUnitTests -and $TestType -in @('Unit', 'All')) + } } - - $testProjects = Get-ChildItem -Path "$RepoRoot" -Recurse -Filter "*.csproj" -Include $fileNameFilters -File | ForEach-Object { @{ FullName = $_.FullName Relative = (Resolve-Path -Path $_.FullName -Relative -RelativeBasePath $RepoRoot).Replace('\', '/').TrimStart('./') diff --git a/eng/scripts/Update-Solution.ps1 b/eng/scripts/Update-Solution.ps1 index 3cad491f60..43bad97a27 100644 --- a/eng/scripts/Update-Solution.ps1 +++ b/eng/scripts/Update-Solution.ps1 @@ -54,8 +54,8 @@ function Update-Solution { $projectArea = Split-Path -Parent $projectDirectory if($serverName -ne 'Azure.Mcp.Server' -and $projectArea -like "*Azure.Mcp.Core*") { - # Because of the Azure.Mcp.Core.UnitTests -> Azure.Mcp.Server -> All Azure Tools dependency chain, when - # we're not building the Azure.Mcp.Server solution, avoid adding the Azure.Mcp.Core.UnitTests project + # Because of the Azure.Mcp.Core.Tests -> Azure.Mcp.Server -> All Azure Tools dependency chain, when + # we're not building the Azure.Mcp.Server solution, avoid adding the Azure.Mcp.Core.Tests project continue } $testProjects += Get-ChildItem -Path "$projectArea/tests" -Filter "*.csproj" -Recurse -ErrorAction SilentlyContinue diff --git a/servers/Azure.Mcp.Server/Azure.Mcp.Server.slnx b/servers/Azure.Mcp.Server/Azure.Mcp.Server.slnx index 4c49c99a78..b74b5730be 100644 --- a/servers/Azure.Mcp.Server/Azure.Mcp.Server.slnx +++ b/servers/Azure.Mcp.Server/Azure.Mcp.Server.slnx @@ -5,8 +5,7 @@ - - + @@ -14,7 +13,7 @@ - + diff --git a/servers/Azure.Mcp.Server/docs/new-command.md b/servers/Azure.Mcp.Server/docs/new-command.md index e040ac718c..c2ad44890e 100644 --- a/servers/Azure.Mcp.Server/docs/new-command.md +++ b/servers/Azure.Mcp.Server/docs/new-command.md @@ -10,9 +10,7 @@ This document is the authoritative guide for adding new commands ("toolset comma All new Azure services and their commands should use the Toolset pattern: - **Toolset code** goes in `tools/Azure.Mcp.Tools.{Toolset}/src` (e.g., `tools/Azure.Mcp.Tools.Storage/src`) -- **Tests** go in `tools/Azure.Mcp.Tools.{Toolset}/tests`, divided into UnitTests and LiveTests: - - `tools/Azure.Mcp.Tools.{Toolset}/tests/Azure.Mcp.Tools.{Toolset}.UnitTests` (e.g., `tools/Azure.Mcp.Tools.Storage/tests/Azure.Mcp.Tools.Storage.UnitTests`) - - `tools/Azure.Mcp.Tools.{Toolset}/tests/Azure.Mcp.Tools.{Toolset}.LiveTests` (e.g., `tools/Azure.Mcp.Tools.Storage/tests/Azure.Mcp.Tools.Storage.LiveTests`) +- **Tests** go in `tools/Azure.Mcp.Tools.{Toolset}/tests` (e.g., `tools/Azure.Mcp.Tools.Storage/tests`) This keeps all code, options, models, JSON serialization contexts, and tests for a toolset together. See `tools/Azure.Mcp.Tools.Storage` for a reference implementation. @@ -27,7 +25,7 @@ If your command interacts with Azure resources (storage accounts, databases, VMs - ✅ **MUST include** RBAC role assignments for test application - ✅ **MUST validate** with `az bicep build --file tools/Azure.Mcp.Tools.{Toolset}/tests/test-resources.bicep` - ✅ **MUST test deployment** with `./eng/scripts/Deploy-TestResources.ps1 -Tool 'Azure.Mcp.Tools.{Toolset}'` -- ✅ **MUST include** live tests in `Azure.Mcp.Tools.{Toolset}.LiveTests` +- ✅ **MUST include** live tests in `Azure.Mcp.Tools.{Toolset}/tests/` - ✅ **MUST record** live tests for playback using `RecordedCommandTestsBase` (see [`/docs/recorded-tests.md`](https://github.com/microsoft/mcp/blob/main/docs/recorded-tests.md)) ### **Non-Azure Commands (No Test Infrastructure Needed)** @@ -116,8 +114,8 @@ Every new command (whether purely computational or Azure-resource backed) requir 4. Service interface: `tools/Azure.Mcp.Tools.{Toolset}/src/Services/I{ServiceName}Service.cs` 5. Service implementation: `tools/Azure.Mcp.Tools.{Toolset}/src/Services/{ServiceName}Service.cs` - Most toolsets have one primary service; some may have multiple where domain boundaries justify separation -6. Unit test: `tools/Azure.Mcp.Tools.{Toolset}/tests/Azure.Mcp.Tools.{Toolset}.UnitTests/{Resource}/{Resource}{Operation}CommandTests.cs` -7. Live test: `tools/Azure.Mcp.Tools.{Toolset}/tests/Azure.Mcp.Tools.{Toolset}.LiveTests/{Toolset}CommandTests.cs` +6. Unit test: `tools/Azure.Mcp.Tools.{Toolset}/tests/Azure.Mcp.Tools.{Toolset}.Tests/{Resource}/{Resource}{Operation}CommandTests.cs` +7. Live test: `tools/Azure.Mcp.Tools.{Toolset}/tests/Azure.Mcp.Tools.{Toolset}.Tests/{Toolset}CommandTests.cs` 8. Command registration in RegisterCommands(): `tools/Azure.Mcp.Tools.{Toolset}/src/{Toolset}Setup.cs` 9. Toolset registration in RegisterAreas(): `servers/Azure.Mcp.Server/src/Program.cs` 10. **Live test infrastructure** (for Azure service commands): @@ -1550,7 +1548,7 @@ public async Task ExecuteAsync_HandlesServiceError() Service.Operation().ThrowsAsync(new ServiceException("Test error")); // Act - var response = await ExecuteCommandAsync("--param value"); + var response = await ExecuteCommandAsync("--param", "value"); // Assert Assert.Equal(HttpStatusCode.InternalServerError, response.Status); @@ -1563,7 +1561,7 @@ public async Task ExecuteAsync_HandlesServiceError() When developing new commands, run only your specific tests to save time: ```bash # Run all tests from the test project directory: -pushd ./tools/Azure.Mcp.Tools.YourToolset/tests/Azure.Mcp.Tools.YourToolset.UnitTests #or .LiveTests +pushd ./tools/Azure.Mcp.Tools.YourToolset/tests/Azure.Mcp.Tools.YourToolset.Tests # Run only tests for your specific command class dotnet test --filter "FullyQualifiedName~YourCommandNameTests" --verbosity normal @@ -1710,7 +1708,7 @@ catch { } ``` -**4. Update Live Tests to Use Deployed Resources** +**3. Update Live Tests to Use Deployed Resources** Integration tests should use the deployed infrastructure: @@ -1766,7 +1764,7 @@ public class {Toolset}CommandTests(ITestOutputHelper output) } ``` -**5. Deploy and Test Resources** +**4. Deploy and Test Resources** Use the deployment script with your toolset: @@ -1775,8 +1773,8 @@ Use the deployment script with your toolset: ./eng/scripts/Deploy-TestResources.ps1 -Tools "{Toolset}" # Run live tests -pushd 'tools/Azure.Mcp.Tools.{Toolset}/tests/Azure.Mcp.Tools.{Toolset}.LiveTests' -dotnet test +pushd 'tools/Azure.Mcp.Tools.{Toolset}/tests/Azure.Mcp.Tools.{Toolset}.Tests' +dotnet test --filter "Category=Live" ``` Live test scenarios should include: @@ -2302,7 +2300,7 @@ var subscriptionResource = armClient.GetSubscriptionResource(new ResourceIdentif ### Live Test Project Configuration Issues **Issue: Live tests fail with "MCP server process exited unexpectedly" and "azmcp.exe not found"** -- **Cause**: Incorrect project configuration in `Azure.Mcp.Tools.{Toolset}.LiveTests.csproj` +- **Cause**: Incorrect project configuration in `Azure.Mcp.Tools.{Toolset}.Tests.csproj` - **Common Problem**: Referencing the toolset project (`Azure.Mcp.Tools.{Toolset}`) instead of the CLI project - **Solution**: Live test projects must reference `Azure.Mcp.Server.csproj` and include specific project properties - **Required Configuration**: diff --git a/servers/Azure.Mcp.Server/src/Properties/AssemblyInfo.cs b/servers/Azure.Mcp.Server/src/Properties/AssemblyInfo.cs index 8909fbd6ed..305ed771c5 100644 --- a/servers/Azure.Mcp.Server/src/Properties/AssemblyInfo.cs +++ b/servers/Azure.Mcp.Server/src/Properties/AssemblyInfo.cs @@ -1,2 +1,2 @@ -[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Azure.Mcp.Core.UnitTests")] +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Azure.Mcp.Core.Tests")] [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Azure.Mcp.Server.UnitTests")] diff --git a/servers/Fabric.Mcp.Server/Fabric.Mcp.Server.slnx b/servers/Fabric.Mcp.Server/Fabric.Mcp.Server.slnx index 94e105e8a0..7274cfd037 100644 --- a/servers/Fabric.Mcp.Server/Fabric.Mcp.Server.slnx +++ b/servers/Fabric.Mcp.Server/Fabric.Mcp.Server.slnx @@ -9,7 +9,7 @@ - + diff --git a/servers/Template.Mcp.Server/Template.Mcp.Server.slnx b/servers/Template.Mcp.Server/Template.Mcp.Server.slnx index b4f308322e..30fcf8a34f 100644 --- a/servers/Template.Mcp.Server/Template.Mcp.Server.slnx +++ b/servers/Template.Mcp.Server/Template.Mcp.Server.slnx @@ -5,7 +5,7 @@ - +