From 725b2fe1a8154e0bf05069c1b2db0148098e2406 Mon Sep 17 00:00:00 2001 From: PJ Date: Mon, 1 Jun 2026 21:08:40 +0530 Subject: [PATCH] test(verifier): cross-extractor read guard and named() --- internal/verifier/extractor_guard_test.go | 34 +++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 internal/verifier/extractor_guard_test.go diff --git a/internal/verifier/extractor_guard_test.go b/internal/verifier/extractor_guard_test.go new file mode 100644 index 0000000..1fcf5d2 --- /dev/null +++ b/internal/verifier/extractor_guard_test.go @@ -0,0 +1,34 @@ +package verifier + +import ( + "strings" + "testing" +) + +func TestPushSnapshot_CrossExtractorReadIsGuarded(t *testing.T) { + verifier := newVerifier(t) + mustLoad(t, verifier, ` +const a = __sanderling__.extract(state => 1); +const b = __sanderling__.extract(() => a.current); +globalThis.a = a; +globalThis.b = b; +`) + err := verifier.PushSnapshot(SnapshotInput{Snapshots: Snapshots{}}) + if err == nil { + t.Fatal("expected guard error, got nil") + } + if !strings.Contains(err.Error(), "inside another extractor is not allowed") { + t.Errorf("guard error wrong: %v", err) + } +} + +func TestExtract_NamedSetsExtractorName(t *testing.T) { + verifier := newVerifier(t) + mustLoad(t, verifier, ` +const route = __sanderling__.extract(state => "home").named("route"); +globalThis.route = route; +`) + if got := verifier.extractors[0].name; got != "route" { + t.Errorf("named() did not set name: got %q, want %q", got, "route") + } +}