using System.Text.Json; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging.Abstractions; using w4c_workflows.Controllers; using w4c_workflows.Data; using w4c_workflows.Services; using w4c_workflows.Services.Runs; using Xunit; namespace w4c_workflows.Tests; [Collection("WorkflowsPostgres")] public class WorkflowsControllerDetailTests { private const string YamlContent = "name: linear\nmode: function\nlanguage: shell\n"; private sealed class FakeWorkflowSource : IWorkflowSource { public Task> ListAsync(CancellationToken ct) => Task.FromResult>(Array.Empty()); public Task ReadAsync(string path, CancellationToken ct) => Task.FromResult(YamlContent); public Task GetStateAsync(CancellationToken ct = default) => Task.FromResult(new(null, false)); } private readonly WorkflowsPostgresFixture _fixture; public WorkflowsControllerDetailTests(WorkflowsPostgresFixture fixture) { _fixture = fixture; } private static WorkflowsController Controller(WorkflowsDbContext db, string tenantId) { var sync = new WorkflowSyncService( db, new WorkflowCompiler(new WorkflowValidator(new LanguageRegistry())), new FakeWorkflowSource(), NullLogger.Instance); var controller = new WorkflowsController( db, sync, new FakeWorkflowSource(), new MermaidGeneratorService(), new WorkflowHtmlRenderer(NullLogger.Instance), new RenderTokenService(new ConfigurationBuilder().Build(), NullLogger.Instance), QuotaTestData.Launcher(db), new DurableStateStore(db), NullLogger.Instance) { ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext() }, }; controller.HttpContext.Items["TenantId"] = tenantId; return controller; } [Fact] public async Task Get_returns_definition_task_tree_and_raw_yaml() { var tenantId = "t" + Guid.NewGuid().ToString("N")[..12]; await using var db = _fixture.CreateContext(); var workflow = WorkflowDataHelpers.CompileAndSave(db, tenantId, WorkflowDataHelpers.LinearYaml); var result = await Controller(db, tenantId).Get(workflow.Id, default); var ok = Assert.IsType(result); var json = JsonSerializer.Serialize(ok.Value, new JsonSerializerOptions(JsonSerializerDefaults.Web)); using var doc = JsonDocument.Parse(json); var root = doc.RootElement; Assert.Equal(workflow.Id, root.GetProperty("id").GetGuid()); Assert.Equal("linear", root.GetProperty("name").GetString()); Assert.Equal(YamlContent, root.GetProperty("yaml").GetString()); Assert.Equal(3, root.GetProperty("tasks").GetArrayLength()); // root + a + b } [Fact] public async Task Get_404s_for_foreign_workflow() { var tenantId = "t" + Guid.NewGuid().ToString("N")[..12]; await using var db = _fixture.CreateContext(); var other = "t" + Guid.NewGuid().ToString("N")[..12]; var workflow = WorkflowDataHelpers.CompileAndSave(db, other, WorkflowDataHelpers.LinearYaml); var result = await Controller(db, tenantId).Get(workflow.Id, default); Assert.IsType(result); } }