Files
kompas3d-mcp/tests/Kompas.Mcp.Tests/PluginSkillsTests.cs
T

51 lines
1.9 KiB
C#

namespace Kompas.Mcp.Tests;
/// <summary>Публикуемые навыки должны быть самодостаточны: без ссылок на внутренности репозитория.</summary>
[Trait("Category", "Unit")]
public sealed class PluginSkillsTests
{
private static string SkillsRoot => Path.Combine(TestPaths.RepoRoot(), "plugin", "skills");
public static TheoryData<string> SkillFiles()
{
var data = new TheoryData<string>();
foreach (var file in Directory.GetFiles(SkillsRoot, "*.md", SearchOption.AllDirectories))
data.Add(file);
return data;
}
[Theory]
[MemberData(nameof(SkillFiles))]
public void Skill_has_no_repository_only_references(string file)
{
var text = File.ReadAllText(file);
string[] forbidden = ["usecases/", "src/Kompas", "kompas-sdk-research", "docs-maintainer", "docs/Kompas3D_SDK"];
foreach (var token in forbidden)
Assert.DoesNotContain(token, text, StringComparison.Ordinal);
}
[Theory]
[MemberData(nameof(SkillFiles))]
public void Skill_has_no_stale_tool_count(string file)
{
var text = File.ReadAllText(file);
Assert.DoesNotContain("46 инструментов", text, StringComparison.Ordinal);
}
[Fact]
public void Both_skills_are_present_with_frontmatter()
{
foreach (var name in new[] { "kompas-3d", "kompas-fdm-design" })
{
var path = Path.Combine(SkillsRoot, name, "SKILL.md");
Assert.True(File.Exists(path), $"нет навыка {path}");
var text = File.ReadAllText(path);
Assert.StartsWith("---", text, StringComparison.Ordinal);
Assert.Contains($"name: {name}", text, StringComparison.Ordinal);
Assert.Contains("description:", text, StringComparison.Ordinal);
}
}
}