| 1 | using McpToolManifest; |
| 2 | |
| 3 | namespace GitMcp.Tests; |
| 4 | |
| 5 | public sealed class McpToolManifestTests |
| 6 | { |
| 7 | [Fact] |
| 8 | public void Mcp_tools_manifest_matches_ToolCatalog_names_and_descriptions() |
| 9 | { |
| 10 | var manifestPath = Path.Combine(AppContext.BaseDirectory, "mcp-tools.manifest.json"); |
| 11 | Assert.True(File.Exists(manifestPath), $"Missing copied manifest: {manifestPath}"); |
| 12 | |
| 13 | var doc = McpToolManifestReader.Load(manifestPath); |
| 14 | var validation = McpToolManifestReader.Validate(doc); |
| 15 | Assert.True(validation.Count == 0, string.Join(Environment.NewLine, validation)); |
| 16 | |
| 17 | Assert.Equal("git-mcp", doc.McpId); |
| 18 | |
| 19 | var catalog = ToolCatalog.Build(); |
| 20 | var manifestNames = doc.Tools.Select(t => t.Name).ToArray(); |
| 21 | var catalogNames = catalog.Select(t => t.Name).ToArray(); |
| 22 | var nameDiff = ToolCatalogNameComparer.Compare(manifestNames, catalogNames); |
| 23 | Assert.True(nameDiff.Count == 0, string.Join(Environment.NewLine, nameDiff)); |
| 24 | |
| 25 | var catalogByName = catalog.ToDictionary(t => t.Name, t => t.Description, StringComparer.Ordinal); |
| 26 | Assert.Equal(catalogByName.Count, doc.Tools.Count); |
| 27 | foreach (var tool in doc.Tools) |
| 28 | { |
| 29 | Assert.True(catalogByName.TryGetValue(tool.Name, out var expected), $"Unexpected tool in manifest: {tool.Name}"); |
| 30 | Assert.Equal(expected, tool.Description); |
| 31 | } |
| 32 | } |
| 33 | } |
| 34 | |