2026-09-01 16:37:53 +00:00
|
|
|
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<IReadOnlyList<WorkflowFile>> ListAsync(CancellationToken ct)
|
|
|
|
|
=> Task.FromResult<IReadOnlyList<WorkflowFile>>(Array.Empty<WorkflowFile>());
|
|
|
|
|
|
|
|
|
|
public Task<string> ReadAsync(string path, CancellationToken ct)
|
|
|
|
|
=> Task.FromResult(YamlContent);
|
|
|
|
|
|
2026-09-13 16:28:47 +00:00
|
|
|
public Task<WorkflowSourceState> GetStateAsync(CancellationToken ct = default)
|
|
|
|
|
=> Task.FromResult<WorkflowSourceState>(new(null, false));
|
2026-09-01 16:37:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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<WorkflowSyncService>.Instance);
|
|
|
|
|
|
|
|
|
|
var controller = new WorkflowsController(
|
|
|
|
|
db,
|
|
|
|
|
sync,
|
|
|
|
|
new FakeWorkflowSource(),
|
|
|
|
|
new MermaidGeneratorService(),
|
|
|
|
|
new WorkflowHtmlRenderer(NullLogger<WorkflowHtmlRenderer>.Instance),
|
|
|
|
|
new RenderTokenService(new ConfigurationBuilder().Build(), NullLogger<RenderTokenService>.Instance),
|
2026-09-11 22:02:46 +00:00
|
|
|
QuotaTestData.Launcher(db),
|
2026-09-01 16:37:53 +00:00
|
|
|
new DurableStateStore(db),
|
|
|
|
|
NullLogger<WorkflowsController>.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<OkObjectResult>(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<NotFoundObjectResult>(result);
|
|
|
|
|
}
|
|
|
|
|
}
|