返回 DeepSeek-Reasonix
file_compensate_test.go
根目录 / internal / extension / file_compensate_test.go
1 package extension
2
3 import (
4 "os"
5 "path/filepath"
6 "testing"
7 )
8
9 func TestFilePriorCompensateRestore(t *testing.T) {
10 dir := t.TempDir()
11 path := filepath.Join(dir, "f.txt")
12 if err := os.WriteFile(path, []byte("old"), 0o644); err != nil {
13 t.Fatal(err)
14 }
15 s := NewFilePriorStore()
16 s.Capture("r1", path, []byte("old"), true)
17 if err := os.WriteFile(path, []byte("new"), 0o644); err != nil {
18 t.Fatal(err)
19 }
20 if err := s.Compensate("r1"); err != nil {
21 t.Fatal(err)
22 }
23 got, err := os.ReadFile(path)
24 if err != nil {
25 t.Fatal(err)
26 }
27 if string(got) != "old" {
28 t.Fatalf("got %q", got)
29 }
30 }
31
32 func TestFilePriorCompensateRemoveCreate(t *testing.T) {
33 dir := t.TempDir()
34 path := filepath.Join(dir, "new.txt")
35 if err := os.WriteFile(path, []byte("created"), 0o644); err != nil {
36 t.Fatal(err)
37 }
38 s := NewFilePriorStore()
39 s.Capture("c1", path, nil, false)
40 if err := s.Compensate("c1"); err != nil {
41 t.Fatal(err)
42 }
43 if _, err := os.Stat(path); !os.IsNotExist(err) {
44 t.Fatalf("expected removed, err=%v", err)
45 }
46 }
47
48 func TestApplyFileWriteCompensationUpdatesReceipt(t *testing.T) {
49 dir := t.TempDir()
50 path := filepath.Join(dir, "x.txt")
51 _ = os.WriteFile(path, []byte("v1"), 0o644)
52 id := "file-write:" + path
53 DefaultFilePriorStore.Capture(id, path, []byte("v1"), true)
54 _ = os.WriteFile(path, []byte("v2"), 0o644)
55 if err := ApplyFileWriteCompensation(id); err != nil {
56 t.Fatal(err)
57 }
58 r, ok := DefaultReceiptStore.Get(id)
59 if !ok || r.CompensationStatus != "applied" {
60 t.Fatalf("receipt = %+v ok=%v", r, ok)
61 }
62 }
63
64 func TestFilePriorStoreBoundsRetainedBytes(t *testing.T) {
65 s := newFilePriorStore(5, 4)
66 dir := t.TempDir()
67 if !s.Capture("first", filepath.Join(dir, "first"), []byte("1234"), true) {
68 t.Fatal("in-budget prior was rejected")
69 }
70 if s.Capture("too-large", filepath.Join(dir, "large"), []byte("12345"), true) {
71 t.Fatal("oversized prior was retained")
72 }
73 if s.Capture("over-total", filepath.Join(dir, "total"), []byte("12"), true) {
74 t.Fatal("prior exceeding the owner budget was retained")
75 }
76 if s.retainedBytes != 4 || len(s.byID) != 1 {
77 t.Fatalf("retained state = bytes:%d entries:%d, want 4/1", s.retainedBytes, len(s.byID))
78 }
79 s.Forget("first")
80 if s.retainedBytes != 0 || len(s.byID) != 0 {
81 t.Fatalf("forget retained state = bytes:%d entries:%d, want 0/0", s.retainedBytes, len(s.byID))
82 }
83 }
84
84 lines GO