返回 DeepSeek-Reasonix
scope_resources_test.go
根目录 / internal / extension / scope_resources_test.go
1 package extension
2
3 import (
4 "context"
5 "errors"
6 "io"
7 "testing"
8 )
9
10 type nopCloser struct{}
11
12 func (nopCloser) Close() error { return nil }
13
14 type errCloser struct{}
15
16 func (errCloser) Close() error { return errors.New("close failed") }
17
18 func TestTrackResourceHelpers(t *testing.T) {
19 s := NewEffectScope(3)
20 if err := TrackMCPClient(s, "demo", nopCloser{}); err != nil {
21 t.Fatal(err)
22 }
23 if err := TrackUIHub(s, 3); err != nil {
24 t.Fatal(err)
25 }
26 cancelled := false
27 if err := TrackProviderStream(s, "s1", func() { cancelled = true }, nil); err != nil {
28 t.Fatal(err)
29 }
30 if err := TrackWatcher(s, "w1", func() error { return nil }); err != nil {
31 t.Fatal(err)
32 }
33 if err := TrackEventSubscription(s, "e1", func() error { return nil }); err != nil {
34 t.Fatal(err)
35 }
36 if err := TrackBackgroundJob(s, "j1", func() {}, nil); err != nil {
37 t.Fatal(err)
38 }
39 if err := TrackControllerCleanup(s, "c1", func() error { return nil }); err != nil {
40 t.Fatal(err)
41 }
42 if err := TrackIrreversible(s, "irr-1", "test"); err != nil {
43 t.Fatal(err)
44 }
45 if err := s.Dispose(context.Background()); err != nil {
46 t.Fatal(err)
47 }
48 if !cancelled {
49 t.Fatal("expected provider stream cancel")
50 }
51 if _, ok := DefaultReceiptStore.Get("irr-1"); !ok {
52 t.Fatal("expected irreversible receipt")
53 }
54 }
55
56 func TestTrackMCPClientNilSafe(t *testing.T) {
57 if err := TrackMCPClient(nil, "x", nopCloser{}); err != nil {
58 t.Fatal(err)
59 }
60 var c io.Closer
61 s := NewEffectScope(1)
62 if err := TrackMCPClient(s, "x", c); err != nil {
63 t.Fatal(err)
64 }
65 }
66
67 func TestTrackMCPClientDisposeError(t *testing.T) {
68 s := NewEffectScope(1)
69 _ = TrackMCPClient(s, "bad", errCloser{})
70 if err := s.Dispose(context.Background()); err == nil {
71 t.Fatal("expected dispose error")
72 }
73 }
74
74 lines GO