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