Files
multica/server/internal/featureflagdispatch/evaluator_test.go
Multica Eve 1ac3a03e5d MUL-3618: dispatch daemon feature flag snapshots (#4509)
* MUL-3618: dispatch daemon feature flag snapshots

Co-authored-by: multica-agent <github@multica.ai>

* MUL-3618: narrow daemon flag snapshots to process scope

Co-authored-by: multica-agent <github@multica.ai>

---------

Co-authored-by: Eve <eve@multica-ai.local>
Co-authored-by: multica-agent <github@multica.ai>
2026-06-24 16:19:30 +08:00

97 lines
3.5 KiB
Go

package featureflagdispatch
import (
"context"
"testing"
"github.com/jackc/pgx/v5/pgtype"
"github.com/multica-ai/multica/server/internal/util"
db "github.com/multica-ai/multica/server/pkg/db/generated"
"github.com/multica-ai/multica/server/pkg/featureflag"
)
func TestEvaluateForRuntimeWritesDaemonBoundSnapshot(t *testing.T) {
t.Parallel()
provider := featureflag.NewStaticProvider()
provider.Set(RuntimeBriefSlimFlag, featureflag.Rule{Default: true})
evaluator := NewEvaluator(featureflag.NewService(provider))
snapshot := evaluator.EvaluateForRuntime(context.Background(), testRuntime("00000000-0000-0000-0000-000000000001", "daemon-a"))
if snapshot == nil {
t.Fatal("snapshot is nil")
}
if snapshot.Version != defaultSnapshotVersion {
t.Fatalf("snapshot version = %d, want %d", snapshot.Version, defaultSnapshotVersion)
}
if got := snapshot.Flags[RuntimeBriefSlimFlag]; got != "on" {
t.Fatalf("%s = %q, want on", RuntimeBriefSlimFlag, got)
}
if len(snapshot.Flags) != len(DaemonBoundFlags) {
t.Fatalf("snapshot flags = %#v, want exactly daemon-bound registry", snapshot.Flags)
}
}
func TestEvaluateForRuntimeIncludesDaemonContext(t *testing.T) {
t.Parallel()
provider := featureflag.NewStaticProvider()
provider.Set(RuntimeBriefSlimFlag, featureflag.Rule{
Default: false,
Allow: []string{"daemon-allowed"},
AllowBy: "daemon_id",
})
evaluator := NewEvaluator(featureflag.NewService(provider))
snapshot := evaluator.EvaluateForRuntime(context.Background(), testRuntime("00000000-0000-0000-0000-000000000002", "daemon-allowed"))
if got := snapshot.Flags[RuntimeBriefSlimFlag]; got != "on" {
t.Fatalf("%s = %q, want on for daemon_id allow", RuntimeBriefSlimFlag, got)
}
}
func TestEvaluateForRuntimeIsDaemonProcessScoped(t *testing.T) {
t.Parallel()
provider := featureflag.NewStaticProvider()
provider.Set(RuntimeBriefSlimFlag, featureflag.Rule{
Default: false,
Allow: []string{"daemon-a"},
AllowBy: "daemon_id",
})
evaluator := NewEvaluator(featureflag.NewService(provider))
snapshotA := evaluator.EvaluateForRuntime(context.Background(), testRuntime("00000000-0000-0000-0000-0000000000aa", "daemon-a"))
snapshotB := evaluator.EvaluateForRuntime(context.Background(), testRuntime("00000000-0000-0000-0000-0000000000bb", "daemon-a"))
if got := snapshotA.Flags[RuntimeBriefSlimFlag]; got != "on" {
t.Fatalf("workspace A %s = %q, want on", RuntimeBriefSlimFlag, got)
}
if got := snapshotB.Flags[RuntimeBriefSlimFlag]; got != "on" {
t.Fatalf("workspace B %s = %q, want on", RuntimeBriefSlimFlag, got)
}
}
func TestEvaluateForRuntimeDoesNotUseWorkspaceContext(t *testing.T) {
t.Parallel()
provider := featureflag.NewStaticProvider()
provider.Set(RuntimeBriefSlimFlag, featureflag.Rule{
Default: false,
Allow: []string{"00000000-0000-0000-0000-0000000000aa"},
AllowBy: "workspace_id",
})
evaluator := NewEvaluator(featureflag.NewService(provider))
snapshot := evaluator.EvaluateForRuntime(context.Background(), testRuntime("00000000-0000-0000-0000-0000000000aa", "daemon-a"))
if got := snapshot.Flags[RuntimeBriefSlimFlag]; got != "off" {
t.Fatalf("%s = %q, want off because daemon snapshots are process-scoped, not workspace-scoped", RuntimeBriefSlimFlag, got)
}
}
func testRuntime(workspaceID, daemonID string) db.AgentRuntime {
return db.AgentRuntime{
ID: util.MustParseUUID("10000000-0000-0000-0000-000000000001"),
WorkspaceID: util.MustParseUUID(workspaceID),
DaemonID: pgtype.Text{String: daemonID, Valid: daemonID != ""},
}
}