feat: add b-route send adapter shell
This commit is contained in:
81
internal/tools/send_message_broute_adapter.go
Normal file
81
internal/tools/send_message_broute_adapter.go
Normal file
@@ -0,0 +1,81 @@
|
||||
package tools
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type BRouteSendAdapterConfig struct {
|
||||
SidecarPath string
|
||||
TimeoutSeconds int
|
||||
Mode string
|
||||
}
|
||||
|
||||
type bRouteSendMessageConnector struct {
|
||||
config BRouteSendAdapterConfig
|
||||
}
|
||||
|
||||
func NewBRouteSendMessageConnector(config BRouteSendAdapterConfig) SendMessageConnector {
|
||||
config.Mode = strings.TrimSpace(strings.ToLower(config.Mode))
|
||||
if config.Mode == "" {
|
||||
config.Mode = "disabled"
|
||||
}
|
||||
return bRouteSendMessageConnector{config: config}
|
||||
}
|
||||
|
||||
func (c bRouteSendMessageConnector) ExecuteSendMessage(_ context.Context, request SendMessageConnectorRequest) (SendMessageConnectorResult, error) {
|
||||
switch c.config.Mode {
|
||||
case "disabled":
|
||||
result := SendMessageConnectorResult{
|
||||
Accepted: false,
|
||||
Status: "blocked",
|
||||
ErrorCode: "broute_mode_blocked",
|
||||
ErrorMessage: "B-route send adapter is disabled",
|
||||
ConnectorMode: "broute-disabled",
|
||||
}
|
||||
return result, fmt.Errorf(result.ErrorMessage)
|
||||
case "dry_run_contract":
|
||||
if err := validateBRouteSendMessageRequest(request); err != nil {
|
||||
return SendMessageConnectorResult{
|
||||
Accepted: false,
|
||||
Status: "failed",
|
||||
ErrorCode: "broute_invalid_request",
|
||||
ErrorMessage: err.Error(),
|
||||
ConnectorMode: "broute-dry-run-contract",
|
||||
}, nil
|
||||
}
|
||||
return SendMessageConnectorResult{
|
||||
Accepted: false,
|
||||
Status: "blocked",
|
||||
ErrorCode: "broute_dry_run_only",
|
||||
ErrorMessage: "B-route adapter dry_run_contract mode validates request shape only and does not start a sidecar",
|
||||
ConnectorMode: "broute-dry-run-contract",
|
||||
}, nil
|
||||
default:
|
||||
result := SendMessageConnectorResult{
|
||||
Accepted: false,
|
||||
Status: "blocked",
|
||||
ErrorCode: "broute_mode_blocked",
|
||||
ErrorMessage: "B-route send adapter mode is not enabled: " + c.config.Mode,
|
||||
ConnectorMode: "broute-disabled",
|
||||
}
|
||||
return result, fmt.Errorf(result.ErrorMessage)
|
||||
}
|
||||
}
|
||||
|
||||
func validateBRouteSendMessageRequest(request SendMessageConnectorRequest) error {
|
||||
if strings.TrimSpace(request.TargetRef) == "" {
|
||||
return fmt.Errorf("target_ref is required")
|
||||
}
|
||||
if strings.TrimSpace(request.ContentSHA256) == "" {
|
||||
return fmt.Errorf("content_sha256 is required")
|
||||
}
|
||||
if strings.TrimSpace(request.IdempotencyKeySHA256) == "" {
|
||||
return fmt.Errorf("idempotency_key_sha256 is required")
|
||||
}
|
||||
if request.ExecutionMode != sendMessageProductionMode {
|
||||
return fmt.Errorf("execution_mode must be production")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
55
internal/tools/send_message_broute_adapter_test.go
Normal file
55
internal/tools/send_message_broute_adapter_test.go
Normal file
@@ -0,0 +1,55 @@
|
||||
package tools
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestBRouteSendMessageConnectorDisabledMode(t *testing.T) {
|
||||
connector := NewBRouteSendMessageConnector(BRouteSendAdapterConfig{Mode: "disabled"})
|
||||
result, err := connector.ExecuteSendMessage(context.Background(), SendMessageConnectorRequest{
|
||||
TargetType: "direct",
|
||||
TargetID: "u1",
|
||||
TargetRef: "contact:u1",
|
||||
ContentSHA256: "abc",
|
||||
ContentLength: 3,
|
||||
IdempotencyKeySHA256: "idem",
|
||||
ExecutionMode: "production",
|
||||
})
|
||||
if err == nil {
|
||||
t.Fatalf("expected disabled error")
|
||||
}
|
||||
if result.ErrorCode != "broute_mode_blocked" {
|
||||
t.Fatalf("unexpected error code: %s", result.ErrorCode)
|
||||
}
|
||||
if result.ConnectorMode != "broute-disabled" {
|
||||
t.Fatalf("connector mode = %q, want broute-disabled", result.ConnectorMode)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBRouteSendMessageConnectorDryRunContract(t *testing.T) {
|
||||
connector := NewBRouteSendMessageConnector(BRouteSendAdapterConfig{
|
||||
SidecarPath: `Z:\path\that\must\not\be\started\SendSidecar.exe`,
|
||||
TimeoutSeconds: 5,
|
||||
Mode: "dry_run_contract",
|
||||
})
|
||||
result, err := connector.ExecuteSendMessage(context.Background(), SendMessageConnectorRequest{
|
||||
TargetType: "direct",
|
||||
TargetID: "u1",
|
||||
TargetRef: "contact:u1",
|
||||
ContentSHA256: strings.Repeat("a", 64),
|
||||
ContentLength: 3,
|
||||
IdempotencyKeySHA256: strings.Repeat("b", 64),
|
||||
ExecutionMode: "production",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("dry-run contract should not try to start a sidecar or return process error: %v", err)
|
||||
}
|
||||
if result.Accepted {
|
||||
t.Fatalf("dry-run contract must not accept a real send: %+v", result)
|
||||
}
|
||||
if result.ConnectorMode != "broute-dry-run-contract" || result.ErrorCode != "broute_dry_run_only" {
|
||||
t.Fatalf("unexpected dry-run result: %+v", result)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user