Skip to content

Commit edfaf02

Browse files
committed
feat: add tests
1 parent d4ff252 commit edfaf02

File tree

1 file changed

+193
-0
lines changed

1 file changed

+193
-0
lines changed
Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
package backendinfo
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"net/http"
7+
"net/http/httptest"
8+
"os"
9+
"path/filepath"
10+
"runtime"
11+
"strings"
12+
"testing"
13+
"time"
14+
15+
"github.com/stretchr/testify/require"
16+
"github.com/x1unix/go-playground/pkg/goplay"
17+
"github.com/x1unix/go-playground/pkg/testutil"
18+
)
19+
20+
func TestBackendVersionService_ServerVersion(t *testing.T) {
21+
want := strings.TrimPrefix(runtime.Version(), "go")
22+
23+
svc := NewBackendVersionService(nil, nil, ServiceConfig{})
24+
got := svc.ServerVersion()
25+
require.Equal(t, got, want)
26+
}
27+
28+
func TestBackendVersionService_GetRemoteVersions(t *testing.T) {
29+
cases := map[string]struct{
30+
constructor func(t *testing.T, expect BackendVersions) *BackendVersionService
31+
onPostRun func(t *testing.T, svc *BackendVersionService, expect BackendVersions)
32+
expect BackendVersions
33+
expectErr string
34+
}{
35+
"should use ram cache": {
36+
expect: BackendVersions{
37+
CurrentStable: "1.23",
38+
PreviousStable: "1.22",
39+
Nightly: "test",
40+
},
41+
constructor: func(t *testing.T, expect BackendVersions) *BackendVersionService {
42+
svc := NewBackendVersionService(nil, nil, ServiceConfig{TTL: DefaultVersionCacheTTL})
43+
svc.memCache = &cacheEntry{
44+
Version: cacheFileVersion,
45+
CreatedAt: time.Now(),
46+
Data: expect,
47+
}
48+
return svc
49+
},
50+
},
51+
"should fallback to filesystem cache": {
52+
expect: BackendVersions{
53+
CurrentStable: "1",
54+
PreviousStable: "2",
55+
Nightly: "test",
56+
},
57+
constructor: func(t *testing.T, expect BackendVersions) *BackendVersionService {
58+
fname := writeTestJson(t, "cache.json", cacheEntry{
59+
CreatedAt: time.Now(),
60+
Version: cacheFileVersion,
61+
Data: expect,
62+
})
63+
svc := NewBackendVersionService(nil, nil, ServiceConfig{
64+
TTL: DefaultVersionCacheTTL,
65+
CacheFile: fname,
66+
})
67+
68+
return svc
69+
},
70+
},
71+
"should fetch data if not cached": {
72+
expect: BackendVersions{
73+
CurrentStable: "1",
74+
PreviousStable: "2",
75+
Nightly: "test",
76+
},
77+
constructor: func(t *testing.T, expect BackendVersions) *BackendVersionService {
78+
fname := filepath.Join(t.TempDir(), "test", "store.json")
79+
srv := setupTestServer(expect)
80+
logger := testutil.GetLogger(t).Desugar()
81+
c := goplay.NewClient(srv.URL, "", 5 * time.Second)
82+
83+
svc := NewBackendVersionService(logger, c, ServiceConfig{
84+
TTL: DefaultVersionCacheTTL,
85+
CacheFile: fname,
86+
})
87+
88+
return svc
89+
},
90+
onPostRun: func(t *testing.T, svc *BackendVersionService, expect BackendVersions) {
91+
f, err := os.Open(svc.cfg.CacheFile)
92+
require.NoError(t, err)
93+
defer f.Close()
94+
95+
dst := &cacheEntry{}
96+
err = json.NewDecoder(f).Decode(dst)
97+
require.Equal(t, expect, dst.Data)
98+
},
99+
},
100+
"should fetch data on cache miss": {
101+
expect: BackendVersions{
102+
CurrentStable: "1",
103+
PreviousStable: "2",
104+
Nightly: "test",
105+
},
106+
constructor: func(t *testing.T, expect BackendVersions) *BackendVersionService {
107+
fname := writeTestJson(t, "cache.json", cacheEntry{
108+
CreatedAt: time.Now().Add(-30 * time.Hour),
109+
Version: cacheFileVersion,
110+
})
111+
112+
srv := setupTestServer(expect)
113+
logger := testutil.GetLogger(t).Desugar()
114+
c := goplay.NewClient(srv.URL, "", 5 * time.Second)
115+
116+
svc := NewBackendVersionService(logger, c, ServiceConfig{
117+
TTL: time.Hour,
118+
CacheFile: fname,
119+
})
120+
121+
return svc
122+
},
123+
onPostRun: func(t *testing.T, svc *BackendVersionService, expect BackendVersions) {
124+
f, err := os.Open(svc.cfg.CacheFile)
125+
require.NoError(t, err)
126+
defer f.Close()
127+
128+
dst := &cacheEntry{}
129+
err = json.NewDecoder(f).Decode(dst)
130+
require.Equal(t, expect, dst.Data)
131+
},
132+
},
133+
}
134+
135+
for n, c := range cases {
136+
t.Run(n, func(t *testing.T) {
137+
if c.constructor == nil {
138+
t.Fatal("missing constructor")
139+
}
140+
141+
svc := c.constructor(t, c.expect)
142+
got, err := svc.GetRemoteVersions(context.TODO())
143+
if c.expectErr != "" {
144+
require.Error(t, err)
145+
require.EqualError(t, err, c.expectErr)
146+
return
147+
}
148+
149+
require.NoError(t, err)
150+
require.NotNil(t, got)
151+
require.Equal(t, *got, c.expect)
152+
})
153+
}
154+
}
155+
156+
func writeTestJson(t *testing.T, name string, data any) string {
157+
fname := filepath.Join(t.TempDir(), name)
158+
f, err := os.OpenFile(fname, os.O_RDWR | os.O_CREATE | os.O_TRUNC, 0644)
159+
require.NoError(t, err, "can't create test file")
160+
161+
err = json.NewEncoder(f).Encode(data)
162+
_ = f.Close()
163+
164+
require.NoError(t, err, "can't wrote to a test file")
165+
return fname
166+
}
167+
168+
func setupTestServer(expects BackendVersions) *httptest.Server {
169+
return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
170+
var msg string
171+
switch r.URL.Query().Get("backend") {
172+
case goplay.BackendGoPrev:
173+
msg = expects.PreviousStable
174+
case goplay.BackendGoTip:
175+
msg = expects.Nightly
176+
case goplay.BackendGoCurrent:
177+
msg = expects.CurrentStable
178+
}
179+
180+
rsp := goplay.CompileResponse{
181+
Events: []*goplay.CompileEvent{
182+
{
183+
Kind: "stdout",
184+
Message: msg,
185+
},
186+
},
187+
}
188+
189+
w.Header().Set("Content-Type", "application/json")
190+
_ = json.NewEncoder(w).Encode(rsp)
191+
}))
192+
}
193+

0 commit comments

Comments
 (0)