99 lines
4.8 KiB
Go
99 lines
4.8 KiB
Go
package domain
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
"testing"
|
|
|
|
"git.cin.su/m/Assistant/contracts/capability"
|
|
)
|
|
|
|
func TestReminderResolvesToSchedulingImplementation(t *testing.T) {
|
|
requirement := resolutionRequirement(capability.CapabilityKindScheduleReminder)
|
|
resolution, err := ResolveCapability(requirement, []capability.CapabilityImplementation{implementation("scheduler-b", capability.CapabilityKindScheduleReminder, 900, 50), implementation("scheduler-a", capability.CapabilityKindScheduleReminder, 950, 75)})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if resolution.Status != capability.ResolutionAvailable || len(resolution.Eligible) != 2 || !resolution.Eligible[0].Selected || resolution.Eligible[0].Implementation.ID != "scheduler-a" {
|
|
t.Fatalf("unexpected resolution: %#v", resolution)
|
|
}
|
|
}
|
|
|
|
func TestUnavailableImplementationExcluded(t *testing.T) {
|
|
candidate := implementation("scheduler", capability.CapabilityKindScheduleReminder, 900, 50)
|
|
candidate.Health = capability.HealthUnavailable
|
|
resolution, err := ResolveCapability(resolutionRequirement(capability.CapabilityKindScheduleReminder), []capability.CapabilityImplementation{candidate})
|
|
if !errors.Is(err, ErrNoCapabilityImplementation) || resolution.Gap == nil || resolution.Gap.Reason != capability.GapUnhealthy {
|
|
t.Fatalf("expected unhealthy gap, got resolution=%#v err=%v", resolution, err)
|
|
}
|
|
}
|
|
|
|
func TestSelectionDoesNotDependOnProviderName(t *testing.T) {
|
|
left := implementation("zzz-provider-name", capability.CapabilityKindScheduleReminder, 980, 20)
|
|
right := implementation("aaa-provider-name", capability.CapabilityKindScheduleReminder, 900, 10)
|
|
resolution, err := ResolveCapability(resolutionRequirement(capability.CapabilityKindScheduleReminder), []capability.CapabilityImplementation{left, right})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if resolution.Eligible[0].Implementation.ID != left.ID {
|
|
t.Fatalf("selection appears provider-name driven: %#v", resolution.Eligible)
|
|
}
|
|
}
|
|
|
|
func TestCredentialRefDoesNotGrantAuthority(t *testing.T) {
|
|
candidate := implementation("mail", capability.CapabilityKindSendEmail, 900, 50)
|
|
candidate.CredentialRef = "credential://mail/token"
|
|
candidate.AuthorityPolicyRef = "mail-send-approved-v1"
|
|
resolution, err := ResolveCapability(resolutionRequirement(capability.CapabilityKindSendEmail), []capability.CapabilityImplementation{candidate})
|
|
if !errors.Is(err, ErrNoCapabilityImplementation) || resolution.Gap == nil || resolution.Gap.Reason != capability.GapUnauthorized {
|
|
t.Fatalf("credential ref must not grant authority: resolution=%#v err=%v", resolution, err)
|
|
}
|
|
}
|
|
|
|
func TestCapabilityGapPreservesOriginalIntentCorrelation(t *testing.T) {
|
|
requirement := resolutionRequirement(capability.CapabilityKindSendEmail)
|
|
resolution, err := ResolveCapability(requirement, nil)
|
|
if !errors.Is(err, ErrNoCapabilityImplementation) || resolution.Gap == nil {
|
|
t.Fatalf("expected gap, got resolution=%#v err=%v", resolution, err)
|
|
}
|
|
if resolution.Gap.OriginalIntentID != requirement.OriginalIntentID || resolution.Gap.SourceUtteranceID != requirement.SourceUtteranceID || len(resolution.Gap.Strategies) == 0 {
|
|
t.Fatalf("gap lost correlation/strategies: %#v", resolution.Gap)
|
|
}
|
|
if strings.Contains(strings.ToLower(resolution.Gap.Detail), "codex") {
|
|
t.Fatalf("gap must not become codex-specific: %#v", resolution.Gap)
|
|
}
|
|
}
|
|
|
|
func resolutionRequirement(kind capability.CapabilityKind) capability.CapabilityResolutionRequirement {
|
|
return capability.CapabilityResolutionRequirement{
|
|
CapabilityKind: kind,
|
|
OwnerPrincipalID: "owner-1",
|
|
ActorID: "actor-1",
|
|
OriginalIntentID: "intent-1",
|
|
SourceUtteranceID: "utterance-1",
|
|
RequiredConstraints: []capability.DataConstraint{capability.DataConstraintLocalOnly},
|
|
AuthorityContextRef: capability.AuthorityPolicyCreatorDirectiveV1,
|
|
ObservedAtUnixMillis: 1000,
|
|
}
|
|
}
|
|
|
|
func implementation(id string, kind capability.CapabilityKind, reliability int64, latency int64) capability.CapabilityImplementation {
|
|
return capability.CapabilityImplementation{
|
|
ID: capability.CapabilityImplementationID(id),
|
|
CapabilityID: capability.CapabilityID(strings.ToLower(string(kind))),
|
|
CapabilityKind: kind,
|
|
OwnerPrincipalID: "owner-1",
|
|
Revision: 1,
|
|
Kind: capability.ImplementationInternalFunction,
|
|
TargetRef: capability.ImplementationTargetRef("internal://" + strings.ToLower(string(kind))),
|
|
Qualification: capability.QualificationValidated,
|
|
Activation: capability.ActivationActive,
|
|
Health: capability.HealthAvailable,
|
|
AuthorityPolicyRef: capability.AuthorityPolicyCreatorDirectiveV1,
|
|
DataConstraints: []capability.DataConstraint{capability.DataConstraintLocalOnly, capability.DataConstraintNoCredentialForward},
|
|
ReliabilityMillis: &reliability,
|
|
LatencyScoreMillis: &latency,
|
|
ObservedAtUnixMillis: 1000,
|
|
}
|
|
}
|