Skip to main content
Glama
by V0v1kkk
NuGetToolsTests.cs8.77 kB
using DotNetMetadataMcpServer.Configuration; using DotNetMetadataMcpServer.Models; using DotNetMetadataMcpServer.Services; using DotNetMetadataMcpServer.Tools; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using System.Text.Json; namespace MetadataExplorerTest.Tools; [TestFixture] [Parallelizable(ParallelScope.All)] public class NuGetToolsTests { private NuGetToolService _nuGetToolService = null!; private IOptions<ToolsConfiguration> _toolsConfiguration = null!; private ILogger<NuGetTools> _logger = null!; [SetUp] public void Setup() { _toolsConfiguration = Options.Create(new ToolsConfiguration { DefaultPageSize = 20, IntendResponse = false }); _nuGetToolService = new NuGetToolService(NullLogger<NuGetToolService>.Instance, _toolsConfiguration); _logger = NullLogger<NuGetTools>.Instance; } [Test] public async Task SearchPackages_WithValidQuery_ReturnsResults() { // Act var resultJson = await NuGetTools.SearchPackages( _nuGetToolService, _toolsConfiguration, _logger, searchQuery: "Newtonsoft.Json", includePrerelease: false, fullTextFiltersWithWildCardSupport: null, pageNumber: 1); // Assert Assert.That(resultJson, Is.Not.Null); Assert.That(resultJson, Is.Not.Empty); var response = JsonSerializer.Deserialize<NuGetPackageSearchResponse>(resultJson); Assert.That(response, Is.Not.Null); Assert.That(response!.Packages, Is.Not.Empty); Assert.That(response.Packages.Any(p => p.Id.Contains("Newtonsoft.Json", StringComparison.OrdinalIgnoreCase)), Is.True); } [Test] public async Task SearchPackages_WithFilter_ReturnsFilteredResults() { // Act var resultJson = await NuGetTools.SearchPackages( _nuGetToolService, _toolsConfiguration, _logger, searchQuery: "json", includePrerelease: false, fullTextFiltersWithWildCardSupport: new List<string> { "*Newtonsoft*" }, pageNumber: 1); // Assert Assert.That(resultJson, Is.Not.Null); var response = JsonSerializer.Deserialize<NuGetPackageSearchResponse>(resultJson); Assert.That(response, Is.Not.Null); Assert.That(response!.Packages, Is.Not.Empty); // All results should contain "Newtonsoft" due to filter foreach (var package in response.Packages) { Assert.That( package.Id.Contains("Newtonsoft", StringComparison.OrdinalIgnoreCase) || (package.Description?.Contains("Newtonsoft", StringComparison.OrdinalIgnoreCase) ?? false), Is.True, $"Package {package.Id} doesn't match filter *Newtonsoft*"); } } [Test] public async Task GetPackageVersions_WithValidPackageId_ReturnsVersions() { // Act var resultJson = await NuGetTools.GetPackageVersions( _nuGetToolService, _toolsConfiguration, _logger, packageId: "Newtonsoft.Json", includePrerelease: false, fullTextFiltersWithWildCardSupport: null, pageNumber: 1); // Assert Assert.That(resultJson, Is.Not.Null); var response = JsonSerializer.Deserialize<NuGetPackageVersionsResponse>(resultJson); Assert.That(response, Is.Not.Null); Assert.That(response!.PackageId, Is.EqualTo("Newtonsoft.Json")); Assert.That(response.Versions, Is.Not.Empty); // Verify versions are properly formatted foreach (var version in response.Versions) { Assert.That(version.Version, Is.Not.Null.And.Not.Empty); Assert.That(version.Id, Is.EqualTo("Newtonsoft.Json")); } } [Test] public async Task GetPackageVersions_WithVersionFilter_ReturnsFilteredVersions() { // Act var resultJson = await NuGetTools.GetPackageVersions( _nuGetToolService, _toolsConfiguration, _logger, packageId: "Newtonsoft.Json", includePrerelease: false, fullTextFiltersWithWildCardSupport: new List<string> { "13.*" }, pageNumber: 1); // Assert Assert.That(resultJson, Is.Not.Null); var response = JsonSerializer.Deserialize<NuGetPackageVersionsResponse>(resultJson); Assert.That(response, Is.Not.Null); // All versions should start with "13." due to filter foreach (var version in response.Versions) { Assert.That(version.Version.StartsWith("13."), Is.True, $"Version {version.Version} doesn't match filter 13.*"); } } [Test] public async Task SearchPackages_WithIndentedResponse_ReturnsFormattedJson() { // Arrange var indentedConfig = Options.Create(new ToolsConfiguration { DefaultPageSize = 20, IntendResponse = true }); // Act var resultJson = await NuGetTools.SearchPackages( _nuGetToolService, indentedConfig, _logger, searchQuery: "Newtonsoft.Json", includePrerelease: false, fullTextFiltersWithWildCardSupport: null, pageNumber: 1); // Assert Assert.That(resultJson, Is.Not.Null); Assert.That(resultJson, Contains.Substring("\n")); // Indented JSON should contain newlines // Verify it's still valid JSON var response = JsonSerializer.Deserialize<NuGetPackageSearchResponse>(resultJson); Assert.That(response, Is.Not.Null); } [Test] public async Task GetPackageVersions_WithDependencies_ReturnsDependencyInfo() { // Act var resultJson = await NuGetTools.GetPackageVersions( _nuGetToolService, _toolsConfiguration, _logger, packageId: "Microsoft.Extensions.DependencyInjection", includePrerelease: false, fullTextFiltersWithWildCardSupport: null, pageNumber: 1); // Assert Assert.That(resultJson, Is.Not.Null); var response = JsonSerializer.Deserialize<NuGetPackageVersionsResponse>(resultJson); Assert.That(response, Is.Not.Null); Assert.That(response!.Versions, Is.Not.Empty); // Find a version with dependencies var versionWithDeps = response.Versions.FirstOrDefault(v => v.DependencyGroups.Any()); if (versionWithDeps != null) { Assert.That(versionWithDeps.DependencyGroups, Is.Not.Empty); foreach (var depGroup in versionWithDeps.DependencyGroups) { Assert.That(depGroup.TargetFramework, Is.Not.Null.And.Not.Empty); // Dependencies might be empty for some target frameworks } } } [Test] public async Task SearchPackages_Pagination_ReturnsCorrectPage() { // Arrange var smallPageConfig = Options.Create(new ToolsConfiguration { DefaultPageSize = 5, IntendResponse = false }); // Act - Get first page var page1Json = await NuGetTools.SearchPackages( _nuGetToolService, smallPageConfig, _logger, searchQuery: "logging", includePrerelease: false, fullTextFiltersWithWildCardSupport: null, pageNumber: 1); var page2Json = await NuGetTools.SearchPackages( _nuGetToolService, smallPageConfig, _logger, searchQuery: "logging", includePrerelease: false, fullTextFiltersWithWildCardSupport: null, pageNumber: 2); // Assert var page1 = JsonSerializer.Deserialize<NuGetPackageSearchResponse>(page1Json); var page2 = JsonSerializer.Deserialize<NuGetPackageSearchResponse>(page2Json); Assert.That(page1, Is.Not.Null); Assert.That(page2, Is.Not.Null); Assert.That(page1!.CurrentPage, Is.EqualTo(1)); Assert.That(page2!.CurrentPage, Is.EqualTo(2)); // Pages should have different packages (assuming there are more than 5 results) if (page1.Packages.Count > 0 && page2.Packages.Count > 0) { Assert.That(page1.Packages.First().Id, Is.Not.EqualTo(page2.Packages.First().Id)); } } }

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/V0v1kkk/DotNetMetadataMcpServer'

If you have feedback or need assistance with the MCP directory API, please join our Discord server