feat: add a-route uia send connector
This commit is contained in:
117
internal/tools/send_message_uia_adapter_test.go
Normal file
117
internal/tools/send_message_uia_adapter_test.go
Normal file
@@ -0,0 +1,117 @@
|
||||
package tools
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestUiaSendMessageConnectorRequiresEnabledModeAndWindowConfig(t *testing.T) {
|
||||
connector := NewUiaSendMessageConnector(UiaSendMessageAdapterConfig{Mode: "disabled"}, &fakeUiaHelperCaller{})
|
||||
result, err := connector.ExecuteSendMessage(context.Background(), SendMessageConnectorRequest{
|
||||
TargetRef: "contact:alice@imopenfire1-lanzhou",
|
||||
ContentText: "hello",
|
||||
ContentSHA256: sha256HexForSendMessageTest("hello"),
|
||||
IdempotencyKeySHA256: sha256HexForSendMessageTest("idem"),
|
||||
ExecutionMode: sendMessageProductionMode,
|
||||
})
|
||||
if err == nil {
|
||||
t.Fatalf("expected disabled connector error")
|
||||
}
|
||||
if result.ErrorCode != "uia_rpa_mode_blocked" || result.ConnectorMode != "uia-rpa-disabled" {
|
||||
t.Fatalf("unexpected result: %+v", result)
|
||||
}
|
||||
|
||||
connector = NewUiaSendMessageConnector(UiaSendMessageAdapterConfig{Mode: "enabled"}, &fakeUiaHelperCaller{})
|
||||
result, err = connector.ExecuteSendMessage(context.Background(), SendMessageConnectorRequest{
|
||||
TargetRef: "contact:alice@imopenfire1-lanzhou",
|
||||
ContentText: "hello",
|
||||
ContentSHA256: sha256HexForSendMessageTest("hello"),
|
||||
IdempotencyKeySHA256: sha256HexForSendMessageTest("idem"),
|
||||
ExecutionMode: sendMessageProductionMode,
|
||||
})
|
||||
if err == nil {
|
||||
t.Fatalf("expected missing config error")
|
||||
}
|
||||
if result.ErrorCode != "uia_rpa_config_missing" {
|
||||
t.Fatalf("unexpected missing config result: %+v", result)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUiaSendMessageConnectorCallsHelperAndMapsAck(t *testing.T) {
|
||||
caller := &fakeUiaHelperCaller{response: uiaHelperResponse{
|
||||
OK: true,
|
||||
Data: map[string]any{
|
||||
"action_mode": "uia_send_message",
|
||||
"target_ref": "contact:alice@imopenfire1-lanzhou",
|
||||
"content_sha256": sha256HexForSendMessageTest("hello uia"),
|
||||
"sent_message": true,
|
||||
"typed_text": true,
|
||||
"clicked_ui": true,
|
||||
"ack_ref": "uia:0x1234:btnSend",
|
||||
},
|
||||
}}
|
||||
connector := NewUiaSendMessageConnector(UiaSendMessageAdapterConfig{
|
||||
Mode: "enabled",
|
||||
Hwnd: "0x1234",
|
||||
SendEditorAutomationID: "rtbSendMessage",
|
||||
SendButtonAutomationID: "btnSend",
|
||||
}, caller)
|
||||
result, err := connector.ExecuteSendMessage(context.Background(), SendMessageConnectorRequest{
|
||||
TargetRef: "contact:alice@imopenfire1-lanzhou",
|
||||
ContentText: "hello uia",
|
||||
ContentSHA256: sha256HexForSendMessageTest("hello uia"),
|
||||
IdempotencyKeySHA256: sha256HexForSendMessageTest("idem-uia"),
|
||||
ExecutionMode: sendMessageProductionMode,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("ExecuteSendMessage: %v", err)
|
||||
}
|
||||
if !result.Accepted || result.Status != "accepted" || result.AckRef != "uia:0x1234:btnSend" || result.ConnectorMode != "uia-rpa" || !result.ProductionEnabled {
|
||||
t.Fatalf("unexpected result: %+v", result)
|
||||
}
|
||||
if caller.op != "uia_send_message" {
|
||||
t.Fatalf("helper op = %q", caller.op)
|
||||
}
|
||||
if caller.args["hwnd"] != "0x1234" || caller.args["send_editor_automation_id"] != "rtbSendMessage" || caller.args["send_button_automation_id"] != "btnSend" {
|
||||
t.Fatalf("unexpected helper args: %#v", caller.args)
|
||||
}
|
||||
if caller.args["content_text"] != "hello uia" || caller.args["content_sha256"] != sha256HexForSendMessageTest("hello uia") {
|
||||
t.Fatalf("helper did not receive send content/hash: %#v", caller.args)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSendMessageConnectorFromEnvBuildsUiaRPAConnector(t *testing.T) {
|
||||
t.Setenv(EnvSendConnectorMode, "uia_rpa")
|
||||
t.Setenv(EnvSendUIAHwnd, "0x1234")
|
||||
t.Setenv(EnvSendUIAEditorAutomationID, "editorA")
|
||||
t.Setenv(EnvSendUIButtonAutomationID, "buttonA")
|
||||
t.Setenv(EnvSendUIAHelperPath, t.TempDir()+"\\missing-helper.exe")
|
||||
|
||||
connector := NewSendMessageConnectorFromEnv()
|
||||
if connector == nil {
|
||||
t.Fatalf("NewSendMessageConnectorFromEnv returned nil for uia_rpa config")
|
||||
}
|
||||
result, err := connector.ExecuteSendMessage(context.Background(), SendMessageConnectorRequest{
|
||||
TargetRef: "contact:alice@imopenfire1-lanzhou",
|
||||
ContentText: "hello",
|
||||
ContentSHA256: sha256HexForSendMessageTest("hello"),
|
||||
IdempotencyKeySHA256: sha256HexForSendMessageTest("idem"),
|
||||
ExecutionMode: sendMessageProductionMode,
|
||||
})
|
||||
if err == nil || result.ErrorCode != "uia_rpa_helper_error" {
|
||||
t.Fatalf("expected configured connector to reach helper layer and fail on missing helper, got result=%+v err=%v", result, err)
|
||||
}
|
||||
}
|
||||
|
||||
type fakeUiaHelperCaller struct {
|
||||
response uiaHelperResponse
|
||||
err error
|
||||
op string
|
||||
args map[string]any
|
||||
}
|
||||
|
||||
func (f *fakeUiaHelperCaller) CallUiaHelper(ctx context.Context, op string, args map[string]any) (uiaHelperResponse, error) {
|
||||
f.op = op
|
||||
f.args = args
|
||||
return f.response, f.err
|
||||
}
|
||||
Reference in New Issue
Block a user