Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
kardolus
GitHub Repository: kardolus/chatgpt-cli
Path: blob/main/cache/cache_test.go
3431 views
1
package cache_test
2
3
import (
4
"encoding/json"
5
"errors"
6
"fmt"
7
"github.com/golang/mock/gomock"
8
"github.com/kardolus/chatgpt-cli/cache"
9
. "github.com/onsi/gomega"
10
"github.com/sclevine/spec"
11
"github.com/sclevine/spec/report"
12
"testing"
13
)
14
15
var (
16
mockCtrl *gomock.Controller
17
mockStore *MockStore
18
)
19
20
func TestUnitCache(t *testing.T) {
21
spec.Run(t, "Testing the history store", testCache, spec.Report(report.Terminal{}))
22
}
23
24
func testCache(t *testing.T, when spec.G, it spec.S) {
25
var subject *cache.Cache
26
27
const endpoint = "https://www.endpoint.com/mcp"
28
29
it.Before(func() {
30
RegisterTestingT(t)
31
mockCtrl = gomock.NewController(t)
32
mockStore = NewMockStore(mockCtrl)
33
subject = cache.New(mockStore)
34
})
35
36
it.After(func() {
37
mockCtrl.Finish()
38
})
39
40
when("GetSessionID()", func() {
41
it("should throw an error when the store returns an error", func() {
42
const msg = "error-message"
43
mockStore.EXPECT().Get(gomock.Any()).Return(nil, errors.New(msg))
44
45
_, err := subject.GetSessionID(endpoint)
46
Expect(err).To(HaveOccurred())
47
Expect(err).To(MatchError(msg))
48
})
49
it("should throw an error when the store returns an invalid json", func() {
50
const invalid = `{"no-closing":"bracket"`
51
mockStore.EXPECT().Get(gomock.Any()).Return([]byte(invalid), nil)
52
53
_, err := subject.GetSessionID(endpoint)
54
Expect(err).To(HaveOccurred())
55
Expect(err).To(MatchError("unexpected end of JSON input"))
56
})
57
it("returns the expected result when there are no errors", func() {
58
const sessionId = "session_id"
59
json := fmt.Sprintf(`{"endpoint": "%s", "session_id": "%s"}`, endpoint, sessionId)
60
61
mockStore.EXPECT().
62
Get(gomock.Any()).
63
DoAndReturn(func(key string) ([]byte, error) {
64
// verify we hash the endpoint
65
Expect(key).ToNot(Equal(endpoint))
66
Expect(len(key)).To(Equal(64)) // sha256 hex length
67
return []byte(json), nil
68
})
69
70
result, err := subject.GetSessionID(endpoint)
71
Expect(err).NotTo(HaveOccurred())
72
Expect(result).To(Equal(sessionId))
73
})
74
})
75
when("SetSessionID()", func() {
76
it("writes a JSON entry to the store under the hashed endpoint key", func() {
77
const sessionId = "session_id"
78
79
mockStore.EXPECT().
80
Set(gomock.Any(), gomock.Any()).
81
DoAndReturn(func(key string, raw []byte) error {
82
// verify key looks like sha256(endpoint)
83
Expect(key).ToNot(Equal(endpoint))
84
Expect(len(key)).To(Equal(64))
85
86
// verify payload
87
var e cache.Entry
88
Expect(json.Unmarshal(raw, &e)).To(Succeed())
89
Expect(e.Endpoint).To(Equal(endpoint))
90
Expect(e.SessionID).To(Equal(sessionId))
91
Expect(e.UpdatedAt.IsZero()).To(BeFalse())
92
93
return nil
94
})
95
96
err := subject.SetSessionID(endpoint, sessionId)
97
Expect(err).NotTo(HaveOccurred())
98
})
99
100
it("returns an error when the store Set fails", func() {
101
const sessionId = "session_id"
102
const msg = "set failed"
103
104
mockStore.EXPECT().
105
Set(gomock.Any(), gomock.Any()).
106
Return(errors.New(msg))
107
108
err := subject.SetSessionID(endpoint, sessionId)
109
Expect(err).To(HaveOccurred())
110
Expect(err).To(MatchError(msg))
111
})
112
})
113
when("DeleteSessionID()", func() {
114
it("deletes the hashed endpoint key from the store", func() {
115
mockStore.EXPECT().
116
Delete(gomock.Any()).
117
DoAndReturn(func(key string) error {
118
Expect(key).ToNot(Equal(endpoint))
119
Expect(len(key)).To(Equal(64))
120
return nil
121
})
122
123
err := subject.DeleteSessionID(endpoint)
124
Expect(err).NotTo(HaveOccurred())
125
})
126
127
it("returns an error when the store Delete fails", func() {
128
const msg = "delete failed"
129
mockStore.EXPECT().Delete(gomock.Any()).Return(errors.New(msg))
130
131
err := subject.DeleteSessionID(endpoint)
132
Expect(err).To(HaveOccurred())
133
Expect(err).To(MatchError(msg))
134
})
135
})
136
}
137
138