feat: add in-process adapter research contract
This commit is contained in:
@@ -52,6 +52,26 @@ func (c bRouteSendMessageConnector) ExecuteSendMessage(_ context.Context, reques
|
||||
ErrorMessage: "B-route adapter dry_run_contract mode validates request shape only and does not start a sidecar",
|
||||
ConnectorMode: "broute-dry-run-contract",
|
||||
}, nil
|
||||
case "in_process_contract":
|
||||
if err := validateBRouteSendMessageRequest(request); err != nil {
|
||||
return SendMessageConnectorResult{
|
||||
Accepted: false,
|
||||
Status: "failed",
|
||||
ErrorCode: "broute_invalid_request",
|
||||
ErrorMessage: err.Error(),
|
||||
ConnectorMode: "broute-in-process-contract",
|
||||
SideEffects: sendMessageNoSideEffects(),
|
||||
}, nil
|
||||
}
|
||||
return SendMessageConnectorResult{
|
||||
Accepted: false,
|
||||
Status: "blocked",
|
||||
ErrorCode: "broute_in_process_contract_only",
|
||||
ErrorMessage: "B-route in_process_contract mode validates the future in-process adapter contract only; logged-in runtime reachability and sent-record evidence are still required",
|
||||
ConnectorMode: "broute-in-process-contract",
|
||||
ProductionEnabled: false,
|
||||
SideEffects: sendMessageNoSideEffects(),
|
||||
}, nil
|
||||
default:
|
||||
result := SendMessageConnectorResult{
|
||||
Accepted: false,
|
||||
|
||||
@@ -53,3 +53,32 @@ func TestBRouteSendMessageConnectorDryRunContract(t *testing.T) {
|
||||
t.Fatalf("unexpected dry-run result: %+v", result)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBRouteSendMessageConnectorInProcessContract(t *testing.T) {
|
||||
connector := NewBRouteSendMessageConnector(BRouteSendAdapterConfig{Mode: "in_process_contract"})
|
||||
result, err := connector.ExecuteSendMessage(context.Background(), SendMessageConnectorRequest{
|
||||
TargetType: "direct",
|
||||
TargetID: "u1",
|
||||
TargetRef: "contact:u1",
|
||||
ContentText: "hello",
|
||||
ContentSHA256: strings.Repeat("a", 64),
|
||||
ContentLength: 5,
|
||||
IdempotencyKeySHA256: strings.Repeat("b", 64),
|
||||
ExecutionMode: "production",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("in_process_contract should be a structured blocked result, not process error: %v", err)
|
||||
}
|
||||
if result.Accepted || result.ProductionEnabled {
|
||||
t.Fatalf("contract mode must not accept production send: %+v", result)
|
||||
}
|
||||
if result.Status != "blocked" || result.ErrorCode != "broute_in_process_contract_only" {
|
||||
t.Fatalf("unexpected contract result: %+v", result)
|
||||
}
|
||||
if result.ConnectorMode != "broute-in-process-contract" {
|
||||
t.Fatalf("connector mode = %q", result.ConnectorMode)
|
||||
}
|
||||
if result.SideEffects["sent_message"] != false || result.SideEffects["attached_hook"] != false {
|
||||
t.Fatalf("contract mode must report no side effects: %#v", result.SideEffects)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,6 +53,9 @@ type uiaSendMessageConnector struct {
|
||||
|
||||
func NewSendMessageConnectorFromEnv() SendMessageConnector {
|
||||
mode := strings.TrimSpace(strings.ToLower(os.Getenv(EnvSendConnectorMode)))
|
||||
if mode == "in_process_contract" || mode == "in-process-contract" {
|
||||
return NewBRouteSendMessageConnector(BRouteSendAdapterConfig{Mode: "in_process_contract"})
|
||||
}
|
||||
if mode != "uia_rpa" && mode != "uia-rpa" {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package tools
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
@@ -103,6 +104,31 @@ func TestSendMessageConnectorFromEnvBuildsUiaRPAConnector(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestSendMessageConnectorFromEnvBuildsInProcessContractConnector(t *testing.T) {
|
||||
t.Setenv(EnvSendConnectorMode, "in_process_contract")
|
||||
|
||||
connector := NewSendMessageConnectorFromEnv()
|
||||
if connector == nil {
|
||||
t.Fatalf("NewSendMessageConnectorFromEnv returned nil for in_process_contract config")
|
||||
}
|
||||
result, err := connector.ExecuteSendMessage(context.Background(), SendMessageConnectorRequest{
|
||||
TargetType: "direct",
|
||||
TargetID: "u1",
|
||||
TargetRef: "contact:u1",
|
||||
ContentText: "hello",
|
||||
ContentSHA256: strings.Repeat("a", 64),
|
||||
ContentLength: 5,
|
||||
IdempotencyKeySHA256: strings.Repeat("b", 64),
|
||||
ExecutionMode: sendMessageProductionMode,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("in_process_contract should return structured blocked result, got err=%v", err)
|
||||
}
|
||||
if result.Accepted || result.ProductionEnabled || result.ErrorCode != "broute_in_process_contract_only" {
|
||||
t.Fatalf("unexpected in-process contract result: %+v", result)
|
||||
}
|
||||
}
|
||||
|
||||
type fakeUiaHelperCaller struct {
|
||||
response uiaHelperResponse
|
||||
err error
|
||||
|
||||
Reference in New Issue
Block a user