XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEWorkflow

【WinUI】XFE基于windows的工作流

公开
关注 0 Fork 0 Star 0
UTF-8
using System.IO.Compression;
using System.Text.Json;
using System.Text.Json.Nodes;
using XFEExtension.NetCore.XUnit.Assertions;
using XFEExtension.NetCore.XUnit.Attributes;
using XFEWorkflow.Abstractions;
using XFEWorkflow.Infrastructure.Compilation;
using XFEWorkflow.Infrastructure.Execution;
using XFEWorkflow.Infrastructure.Plugins;
using XFEWorkflow.Infrastructure.Storage;

namespace XFEWorkflow.Test;

[TestFixture]
public sealed class BasicSampleTests
{
    [TestCase("basic-text-concat", "json")]
    [TestCase("basic-text-concat", "xfeworkflow")]
    [TestCase("basic-text-concat", "csharp")]
    [TestCase("basic-array-filter-join", "json")]
    [TestCase("basic-array-filter-join", "xfeworkflow")]
    [TestCase("basic-array-filter-join", "csharp")]
    [TestCase("basic-for-numbers", "json")]
    [TestCase("basic-for-numbers", "xfeworkflow")]
    [TestCase("basic-for-numbers", "csharp")]
    [TestCase("basic-while-wired-condition", "json")]
    [TestCase("basic-while-wired-condition", "xfeworkflow")]
    [TestCase("basic-while-wired-condition", "csharp")]
    public async Task ImportableExamplesUseOnlyWiresAndRunInASeparateRunner(string name, string format)
    {
        await using var workspace = new TestWorkspace(); await using var runs = new RunCoordinator(workspace.Paths, new PluginManager(workspace.Paths, workspace.State),
            new CredentialVault(workspace.State), new(), TestSupport.FindOutput("XFEWorkflow.Runner", "XFEWorkflow.Runner.exe"));
        var workflow = await new WorkflowRepository(workspace.Paths).ImportAsync(Path.Combine(TestSupport.Root, "samples/workflows", name + "." + (format == "csharp" ? "json" : format)));
        Assert.Equal(false, workflow.Enabled); Assert.Equal(0, workflow.PluginVersions.Count);
        if (format == "csharp") { GraphCodeGenerator.Update(workflow, true); workflow.Kind = WorkflowKind.CSharp; }
        var inputs = workflow.InputDefaults.ToJsonString();
        var run = await runs.RunAsync(workflow).WaitAsync(TimeSpan.FromSeconds(15)); Assert.Equal(RunStatus.Succeeded, run.Status, run.Error);
        var messages = WorkflowLogService.RunEntries(run).Select(e => e.LogText).ToArray();
        var expected = name switch { "basic-text-concat" => new[] { "你好,XFEWorkflow 🌚" }, "basic-array-filter-join" => ["张三 🌚、王五 👨‍👩‍👧‍👦"], "basic-for-numbers" => ["10", "20", "30"], _ => ["1", "2", "3"] };
        Assert.True(messages.SequenceEqual(expected), string.Join("|", messages));
        Assert.Equal(inputs, workflow.InputDefaults.ToJsonString());
        foreach (var node in Nodes(workflow.Graph).Where(n => n.CapabilityId == "core.log")) Assert.Equal(0, node.Parameters.Count, "消息必须通过数据连线输入");
        if (name == "basic-array-filter-join")
        {
            Assert.Equal("1001", run.Outputs["contacts"]![0]!["id"]!.GetValue<string>()); Assert.Equal("1003", run.Outputs["contacts"]![1]!["id"]!.GetValue<string>());
        }
    }

    [Test]
    public async Task PackagesContainExactReadableJsonAndNoMessageExpressions()
    {
        foreach (var name in new[] { "basic-text-concat", "basic-array-filter-join", "basic-for-numbers", "basic-while-wired-condition" })
        {
            var path = Path.Combine(TestSupport.Root, "samples/workflows", name); var text = await File.ReadAllTextAsync(path + ".json");
            Assert.False(text.Contains("$var")); Assert.False(text.Contains("$node")); Assert.False(text.Contains("\\u4"));
            using var package = ZipFile.OpenRead(path + ".xfeworkflow"); Assert.Equal(1, package.Entries.Count); using var reader = new StreamReader(package.GetEntry("workflow.json")!.Open());
            Assert.Equal(text.ReplaceLineEndings("\n"), (await reader.ReadToEndAsync()).ReplaceLineEndings("\n"));
            var definition = JsonSerializer.Deserialize<WorkflowDefinition>(text, WorkflowJson.Options)!;
            foreach (var log in Nodes(definition.Graph).Where(n => n.CapabilityId == "core.log")) Assert.Equal(0, log.Parameters.Count);
        }
    }
    private static IEnumerable<NodeDefinition> Nodes(GraphDefinition graph) => graph.Nodes.Concat(graph.Nodes.SelectMany(n => n.Children.Values).SelectMany(Nodes));
}