test(plugin): вынести правило релизного лока в хелпер с theory-покрытием
Освобождает JsonDocument в Read(), покрывает IsReleasedLockValid синтетическими JSON-кейсами (без релиза / валидный релиз / пустой url / некорректный sha256), приводит имена тестов к конвенции Method_condition_result проекта.
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
using System.Text.Json;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Kompas.Mcp.Tests;
|
||||
|
||||
@@ -6,24 +7,58 @@ namespace Kompas.Mcp.Tests;
|
||||
[Trait("Category", "Unit")]
|
||||
public sealed class PluginManifestTests
|
||||
{
|
||||
private const string NoReleaseLock =
|
||||
"""{"version":"0.0.0","sourceSha":"","url":"","sha256":""}""";
|
||||
|
||||
private const string ValidReleaseLock =
|
||||
"""{"version":"1.2.3","sourceSha":"deadbeef","url":"https://example.com/kompas-mcp.zip","sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}""";
|
||||
|
||||
private const string ReleaseLockMissingUrl =
|
||||
"""{"version":"1.2.3","sourceSha":"deadbeef","url":"","sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}""";
|
||||
|
||||
private const string ReleaseLockBadSha256 =
|
||||
"""{"version":"1.2.3","sourceSha":"deadbeef","url":"https://example.com/kompas-mcp.zip","sha256":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"}""";
|
||||
|
||||
private static string PluginRoot => Path.Combine(TestPaths.RepoRoot(), "plugin");
|
||||
|
||||
private static JsonElement Read(params string[] relativeParts)
|
||||
{
|
||||
var path = Path.Combine(new[] { PluginRoot }.Concat(relativeParts).ToArray());
|
||||
Assert.True(File.Exists(path), $"нет файла {path}");
|
||||
return JsonDocument.Parse(File.ReadAllText(path)).RootElement.Clone();
|
||||
using var doc = JsonDocument.Parse(File.ReadAllText(path));
|
||||
return doc.RootElement.Clone();
|
||||
}
|
||||
|
||||
private static JsonElement Parse(string json)
|
||||
{
|
||||
using var doc = JsonDocument.Parse(json);
|
||||
return doc.RootElement.Clone();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Правило релизного лока: version == "0.0.0" — релиза ещё не было, правило не применяется;
|
||||
/// иначе url обязателен и sha256 — 64 hex-символа в нижнем регистре.
|
||||
/// </summary>
|
||||
private static bool IsReleasedLockValid(JsonElement serverLock)
|
||||
{
|
||||
var version = serverLock.GetProperty("version").GetString();
|
||||
if (version == "0.0.0")
|
||||
return true;
|
||||
|
||||
var url = serverLock.GetProperty("url").GetString();
|
||||
var sha256 = serverLock.GetProperty("sha256").GetString();
|
||||
return !string.IsNullOrWhiteSpace(url) && Regex.IsMatch(sha256 ?? "", "^[0-9a-f]{64}$");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Manifest_NameIsKompas()
|
||||
public void Manifest_name_is_kompas()
|
||||
{
|
||||
var manifest = Read(".claude-plugin", "plugin.json");
|
||||
Assert.Equal("kompas", manifest.GetProperty("name").GetString());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Manifest_VersionMatchesLock()
|
||||
public void Manifest_version_matches_lock()
|
||||
{
|
||||
var manifest = Read(".claude-plugin", "plugin.json");
|
||||
var serverLock = Read("server.lock.json");
|
||||
@@ -31,15 +66,18 @@ public sealed class PluginManifestTests
|
||||
serverLock.GetProperty("version").GetString());
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(NoReleaseLock, true)]
|
||||
[InlineData(ValidReleaseLock, true)]
|
||||
[InlineData(ReleaseLockMissingUrl, false)]
|
||||
[InlineData(ReleaseLockBadSha256, false)]
|
||||
public void IsReleasedLockValid_matches_release_rule(string json, bool expected)
|
||||
=> Assert.Equal(expected, IsReleasedLockValid(Parse(json)));
|
||||
|
||||
[Fact]
|
||||
public void Lock_WhenReleased_HasUrlAndSha256()
|
||||
public void Lock_file_satisfies_release_rule()
|
||||
{
|
||||
var serverLock = Read("server.lock.json");
|
||||
// 0.0.0 — состояние «релиз ещё не публиковался»; url/sha256 заполняет релизный workflow.
|
||||
if (serverLock.GetProperty("version").GetString() == "0.0.0")
|
||||
return;
|
||||
|
||||
Assert.False(string.IsNullOrWhiteSpace(serverLock.GetProperty("url").GetString()));
|
||||
Assert.Matches("^[0-9a-f]{64}$", serverLock.GetProperty("sha256").GetString() ?? "");
|
||||
Assert.True(IsReleasedLockValid(serverLock));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user