返回 DeepSeek-Reasonix
pinned_prompt_refresh_test.go
根目录 / desktop / pinned_prompt_refresh_test.go
1 package main
2
3 import (
4 "context"
5 "os"
6 "path/filepath"
7 "reflect"
8 "strings"
9 "testing"
10
11 "reasonix/internal/control"
12 "reasonix/internal/provider"
13 )
14
15 type pinnedPromptProvider struct {
16 requests chan provider.Request
17 }
18
19 func (p *pinnedPromptProvider) Name() string { return "pinned-prompt" }
20
21 func (p *pinnedPromptProvider) Stream(_ context.Context, req provider.Request) (<-chan provider.Chunk, error) {
22 p.requests <- req
23 chunks := make(chan provider.Chunk, 2)
24 chunks <- provider.Chunk{Type: provider.ChunkText, Text: "ok"}
25 chunks <- provider.Chunk{Type: provider.ChunkDone}
26 close(chunks)
27 return chunks, nil
28 }
29
30 func submitAndCapturePinnedRequest(t *testing.T, ctrl *control.Controller, requests <-chan provider.Request, input string) provider.Request {
31 t.Helper()
32 if err := ctrl.RunTurn(context.Background(), input); err != nil {
33 t.Fatalf("RunTurn(%q): %v", input, err)
34 }
35 var req provider.Request
36 select {
37 case req = <-requests:
38 default:
39 t.Fatalf("provider request for %q was not recorded", input)
40 }
41 if len(req.Messages) == 0 || req.Messages[0].Role != provider.RoleSystem {
42 t.Fatalf("request %q has no leading system message: %+v", input, req.Messages)
43 }
44 return req
45 }
46
47 func pinnedRevisionBodies(messages []provider.Message) []string {
48 var out []string
49 for _, message := range messages {
50 if message.Role == provider.RoleUser && strings.HasPrefix(strings.TrimSpace(message.Content), "<pinned_context_revision") {
51 out = append(out, message.Content)
52 }
53 }
54 return out
55 }
56
57 func assertProviderRequestPrefix(t *testing.T, previous, current provider.Request) {
58 t.Helper()
59 if len(current.Messages) < len(previous.Messages) || !reflect.DeepEqual(current.Messages[:len(previous.Messages)], previous.Messages) {
60 t.Fatalf("previous request is not an exact prefix:\nprevious: %#v\ncurrent: %#v", previous.Messages, current.Messages)
61 }
62 }
63
64 func TestDesktopPinAPIAppendsRevisionOnlyWhenFileChanges(t *testing.T) {
65 prov := &pinnedPromptProvider{requests: make(chan provider.Request, 4)}
66 app, tab, ctrl, _ := pinnedConcurrencyFixture(t, prov)
67 path := filepath.Join(tab.WorkspaceRoot, "context.md")
68 if err := os.WriteFile(path, []byte("version one"), 0o600); err != nil {
69 t.Fatal(err)
70 }
71 if _, err := app.PinFileForTab(tab.ID, "context.md"); err != nil {
72 t.Fatalf("PinFileForTab: %v", err)
73 }
74
75 first := submitAndCapturePinnedRequest(t, ctrl, prov.requests, "first")
76 second := submitAndCapturePinnedRequest(t, ctrl, prov.requests, "second")
77 assertProviderRequestPrefix(t, first, second)
78 if first.Messages[0].Content != "BASE" || second.Messages[0].Content != "BASE" {
79 t.Fatalf("pinned context changed leading system messages: first=%q second=%q", first.Messages[0].Content, second.Messages[0].Content)
80 }
81 if revisions := pinnedRevisionBodies(second.Messages); len(revisions) != 1 || !strings.Contains(revisions[0], "version one") {
82 t.Fatalf("unchanged pinned file should retain exactly one revision: %v", revisions)
83 }
84 if err := os.WriteFile(path, []byte("version two"), 0o600); err != nil {
85 t.Fatal(err)
86 }
87 third := submitAndCapturePinnedRequest(t, ctrl, prov.requests, "third")
88 assertProviderRequestPrefix(t, second, third)
89 if revisions := pinnedRevisionBodies(third.Messages); len(revisions) != 2 || !strings.Contains(revisions[1], "version two") {
90 t.Fatalf("changed pinned file did not append a delta revision: %v", revisions)
91 }
92 fourth := submitAndCapturePinnedRequest(t, ctrl, prov.requests, "fourth")
93 assertProviderRequestPrefix(t, third, fourth)
94 if revisions := pinnedRevisionBodies(fourth.Messages); len(revisions) != 2 {
95 t.Fatalf("stable post-change file appended another revision: %v", revisions)
96 }
97 }
98
98 lines GO