w4c-workflows-api/w4c-workflows-api.Tests/WorkflowsControllerDetailTests.cs

94 lines
3.6 KiB
C#
Raw Normal View History

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));
}
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),
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);
}
}