Ctrl K
ComunidadGuías…

internal/approvalgate/defer_held_call_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package approvalgate

import (
	"context"
	"encoding/json"
	"errors"
	"testing"

	"github.com/yeomyeonggeori/blueprotocol/agentcontract"
	"github.com/yeomyeonggeori/blueprotocol/toolcontract"
)

type recordingDeferrer struct {
	request DeferralRequest
	result  toolcontract.ToolResult
	failure error
}

func (deferrer *recordingDeferrer) DeferApprovedCall(_ context.Context, request DeferralRequest) (toolcontract.ToolResult, error) {
	deferrer.request = request
	return deferrer.result, deferrer.failure
}

var narrowedHeldCall = agentcontract.HeldCall{
	ToolName:          "event_delete",
	ToolInput:         json.RawMessage(`{"eventHint":"meeting"}`),
	ApprovedToolInput: json.RawMessage(`{"eventID":"event-1"}`),
}

func TestADeferredCallCarriesTheInputTheRequesterApproved(t *testing.T) {
	deferrer := &recordingDeferrer{result: toolcontract.ToolSuccessData("scheduled", nil)}

	carriedOutCall := DeferHeldCall(context.Background(), deferrer, narrowedHeldCall, DeferralRequest{TaskRunID: "task-1"})

	if string(deferrer.request.ToolInput) != `{"eventID":"event-1"}` || deferrer.request.ToolName != "event_delete" || deferrer.request.TaskRunID != "task-1" {
		t.Fatalf("expected the approved input to be scheduled, got %+v", deferrer.request)
	}
	if string(carriedOutCall.ToolInput) != `{"eventID":"event-1"}` || carriedOutCall.Result.Failure != nil {
		t.Fatalf("expected the approved call carried out, got %+v", carriedOutCall)
	}
}

func TestADeferralThatCannotBeScheduledFailsLoudly(t *testing.T) {
	failing := DeferHeldCall(context.Background(), &recordingDeferrer{failure: errors.New("scheduler down")}, narrowedHeldCall, DeferralRequest{})
	unconfigured := DeferHeldCall(context.Background(), nil, narrowedHeldCall, DeferralRequest{})

	if failing.Result.Failure == nil || unconfigured.Result.Failure == nil {
		t.Fatalf("expected both to report that nothing will run, got %+v %+v", failing.Result, unconfigured.Result)
	}
}

func TestADeferredCallNamesTheHoldItSettles(t *testing.T) {
	heldCall := narrowedHeldCall
	heldCall.HoldID = "hold-1"

	carriedOutCall := DeferHeldCall(context.Background(), &recordingDeferrer{result: toolcontract.ToolSuccessData("scheduled", nil)}, heldCall, DeferralRequest{})

	if carriedOutCall.HoldID != "hold-1" {
		t.Fatalf("the loop matches a carried-out call to its hold by id, got %q", carriedOutCall.HoldID)
	}
}