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

83 lines
3 KiB
C#
Raw Normal View History

2026-09-11 22:02:46 +00:00
using w4c_workflows.Models.Nodes;
2026-09-13 16:28:47 +00:00
using w4c_workflows.Services.Credentials;
2026-09-11 22:02:46 +00:00
using w4c_workflows.Services.Nodes;
using w4c_workflows.Services.Nodes.Connectors;
using Xunit;
namespace w4c_workflows.Tests;
/// <summary>
/// Proves the embedded connector blueprints load from catalog JSON and become
/// runnable once a <see cref="RestConnectorExecutor"/> is registered for them —
/// i.e. adding an integration is data, not a new executor.
/// </summary>
public class ConnectorCatalogTests
{
private sealed class NoopFactory : IHttpClientFactory
{
public HttpClient CreateClient(string name) => new(new HttpClientHandler(), disposeHandler: false);
}
[Fact]
public void Embedded_catalog_exposes_the_telegram_connector()
{
var blueprint = NodeTestData.CoreCatalog().Get("telegram");
Assert.NotNull(blueprint);
Assert.Equal(NodeOrigin.Connector, blueprint!.Origin);
Assert.NotNull(blueprint.Connector);
Assert.Equal("https://api.telegram.org", blueprint.Connector!.BaseUrl);
Assert.Contains("{credential.token}", blueprint.Connector.Path);
Assert.Contains(blueprint.Credentials, c => c.Alias == "telegram" && c.Required);
}
[Fact]
public void Embedded_catalog_exposes_the_discord_connector()
{
var blueprint = NodeTestData.CoreCatalog().Get("discord");
Assert.NotNull(blueprint?.Connector);
Assert.Equal("{credential.url}", blueprint!.Connector!.BaseUrl);
Assert.Contains(blueprint.Credentials, c => c.Alias == "discord");
}
2026-09-13 16:28:47 +00:00
[Fact]
public void Embedded_catalog_exposes_the_slack_connector_with_its_envelope()
{
var blueprint = NodeTestData.CoreCatalog().Get("slack");
var connector = blueprint?.Connector;
Assert.NotNull(connector);
Assert.Equal("https://slack.com", connector!.BaseUrl);
Assert.Equal("/api/{operation}", connector.Path);
Assert.Equal("slack", connector.CredentialAlias);
Assert.Equal("ok", connector.SuccessPath);
Assert.Equal("error", connector.ErrorPath);
Assert.Equal("slack_missing_scope", connector.ErrorCodeMap!["missing_scope"]);
Assert.Contains(blueprint!.Credentials, c => c.Alias == "slack" && c.Required);
}
2026-09-11 22:02:46 +00:00
[Fact]
public void Connector_blueprints_become_runnable_when_an_executor_is_registered()
{
var catalog = NodeTestData.CoreCatalog();
var executors = catalog.All
.Where(b => b.Connector != null)
.Select(b => (INodeExecutor)new RestConnectorExecutor(
2026-09-13 16:28:47 +00:00
b, new NoopFactory(), new CredentialTypeCatalog(), EgressTestData.Guard(), EgressTestData.Quota()))
2026-09-11 22:02:46 +00:00
.ToList();
var registry = new NodeExecutorRegistry(executors);
Assert.True(registry.CanRun("telegram"));
Assert.True(registry.CanRun("discord"));
2026-09-13 16:28:47 +00:00
Assert.True(registry.CanRun("slack"));
2026-09-11 22:02:46 +00:00
}
[Fact]
public void Catalog_category_rail_includes_the_integration_category()
{
Assert.Contains("Communication", NodeTestData.CoreCatalog().Categories);
}
}