SDT/tests/DevTool.Tests/ConfigBootstrapperMatrixTests.cs
2026-03-01 20:52:56 -06:00

110 lines
4.8 KiB
C#

using Sdt.Config;
using Xunit;
namespace DevTool.Tests;
public sealed class ConfigBootstrapperMatrixTests
{
[Fact]
public void DotnetProject_GeneratesDotnetCoreWorkflows()
{
var root = CreateTempDir("sdt-matrix-dotnet-");
File.WriteAllText(Path.Combine(root, "sample.sln"), "");
var scan = ConfigBootstrapper.Scan(root);
var config = ConfigBootstrapper.BuildDefaultConfig(scan);
var build = config.Workflows.FirstOrDefault(w => w.Id == "build");
var deps = config.Workflows.FirstOrDefault(w => w.Id == "deps-refresh");
var test = config.Workflows.FirstOrDefault(w => w.Id == "test");
Assert.NotNull(build);
Assert.NotNull(deps);
Assert.NotNull(test);
Assert.Contains(build!.Steps, s => s.Action == "dotnet-build");
Assert.Contains(deps!.Steps, s => s.Action == "dotnet-restore");
Assert.Contains(test!.Steps, s => s.Action == "dotnet-test");
}
[Fact]
public void NodeProject_GeneratesNodeCoreWorkflows()
{
var root = CreateTempDir("sdt-matrix-node-");
File.WriteAllText(Path.Combine(root, "package.json"), """{ "name": "demo", "scripts": { "build": "echo build", "test": "echo test" } }""");
var scan = ConfigBootstrapper.Scan(root);
var config = ConfigBootstrapper.BuildDefaultConfig(scan);
var build = config.Workflows.FirstOrDefault(w => w.Id == "build");
var deps = config.Workflows.FirstOrDefault(w => w.Id == "deps-refresh");
var test = config.Workflows.FirstOrDefault(w => w.Id == "test");
Assert.NotNull(build);
Assert.NotNull(deps);
Assert.NotNull(test);
Assert.Contains(build!.Steps, s => s.Action == "npm-build");
Assert.Contains(deps!.Steps, s => s.Action == "npm-ci");
Assert.Contains(test!.Steps, s => s.Action == "npm-test");
}
[Fact]
public void TauriCargoProject_GeneratesTauriAndCargoWorkflows()
{
var root = CreateTempDir("sdt-matrix-tauri-");
File.WriteAllText(Path.Combine(root, "package.json"), """{ "name": "demo", "scripts": { "build": "echo build" } }""");
File.WriteAllText(Path.Combine(root, "Cargo.toml"), "[package]\nname=\"demo\"\nversion=\"0.1.0\"");
File.WriteAllText(Path.Combine(root, "tauri.conf.json"), "{ }");
var scan = ConfigBootstrapper.Scan(root);
var config = ConfigBootstrapper.BuildDefaultConfig(scan);
var build = config.Workflows.FirstOrDefault(w => w.Id == "build");
var deps = config.Workflows.FirstOrDefault(w => w.Id == "deps-refresh");
var test = config.Workflows.FirstOrDefault(w => w.Id == "test");
Assert.NotNull(build);
Assert.NotNull(deps);
Assert.NotNull(test);
Assert.Contains(build!.Steps, s => s.Action == "tauri-build");
Assert.Contains(build.Steps, s => s.Action == "cargo-build");
Assert.Contains(deps!.Steps, s => s.Action == "npm-ci");
Assert.Contains(test!.Steps, s => s.Action == "cargo-test");
}
[Fact]
public void GoMavenGradle_ActionsRemainConservativeAndRunnable()
{
var root = CreateTempDir("sdt-matrix-jvm-go-");
File.WriteAllText(Path.Combine(root, "go.mod"), "module example.com/demo");
File.WriteAllText(Path.Combine(root, "pom.xml"), "<project/>");
File.WriteAllText(Path.Combine(root, "build.gradle"), "plugins {}");
var scan = ConfigBootstrapper.Scan(root);
var config = ConfigBootstrapper.BuildDefaultConfig(scan);
var build = config.Workflows.First(w => w.Id == "build");
var deps = config.Workflows.First(w => w.Id == "deps-refresh");
var test = config.Workflows.First(w => w.Id == "test");
Assert.Contains(build.Steps, s => s.Command == "go" && s.Args.SequenceEqual(["build", "./..."]));
Assert.Contains(build.Steps, s => s.Command == "mvn" && s.Args.SequenceEqual(["package", "-DskipTests"]));
Assert.Contains(build.Steps, s => s.Command == "gradle" && s.Args.SequenceEqual(["build"]));
Assert.Contains(deps.Steps, s => s.Command == "go" && s.Args.SequenceEqual(["mod", "download"]));
Assert.Contains(deps.Steps, s => s.Command == "mvn" && s.Args.SequenceEqual(["dependency:resolve"]));
Assert.Contains(deps.Steps, s => s.Command == "gradle" && s.Args.SequenceEqual(["dependencies"]));
Assert.Contains(test.Steps, s => s.Command == "go" && s.Args.SequenceEqual(["test", "./..."]));
Assert.Contains(test.Steps, s => s.Command == "mvn" && s.Args.SequenceEqual(["test"]));
Assert.Contains(test.Steps, s => s.Command == "gradle" && s.Args.SequenceEqual(["test"]));
}
private static string CreateTempDir(string prefix)
{
var path = Path.Combine(Path.GetTempPath(), prefix + Guid.NewGuid().ToString("N"));
Directory.CreateDirectory(path);
return path;
}
}