1package providertests
2
3import (
4 "bytes"
5 "io"
6 "net/http"
7 "path/filepath"
8 "strings"
9 "testing"
10
11 "gopkg.in/dnaeon/go-vcr.v4/pkg/cassette"
12 "gopkg.in/dnaeon/go-vcr.v4/pkg/recorder"
13)
14
15func newRecorder(t *testing.T) *recorder.Recorder {
16 cassetteName := filepath.Join("testdata", t.Name())
17
18 r, err := recorder.New(
19 cassetteName,
20 recorder.WithMode(recorder.ModeRecordOnce),
21 recorder.WithMatcher(customMatcher(t)),
22 recorder.WithHook(hookRemoveHeaders, recorder.AfterCaptureHook),
23 )
24 if err != nil {
25 t.Fatalf("recorder: failed to create recorder: %v", err)
26 }
27
28 t.Cleanup(func() {
29 if err := r.Stop(); err != nil {
30 t.Errorf("recorder: failed to stop recorder: %v", err)
31 }
32 })
33
34 return r
35}
36
37func customMatcher(t *testing.T) recorder.MatcherFunc {
38 return func(r *http.Request, i cassette.Request) bool {
39 if r.Body == nil || r.Body == http.NoBody {
40 return cassette.DefaultMatcher(r, i)
41 }
42
43 var reqBody []byte
44 var err error
45 reqBody, err = io.ReadAll(r.Body)
46 if err != nil {
47 t.Fatalf("recorder: failed to read request body")
48 }
49 r.Body.Close()
50 r.Body = io.NopCloser(bytes.NewBuffer(reqBody))
51
52 return r.Method == i.Method && r.URL.String() == i.URL && string(reqBody) == i.Body
53 }
54}
55
56var headersToKeep = map[string]struct{}{
57 "accept": {},
58 "content-type": {},
59 "user-agent": {},
60}
61
62func hookRemoveHeaders(i *cassette.Interaction) error {
63 for k := range i.Request.Headers {
64 if _, ok := headersToKeep[strings.ToLower(k)]; !ok {
65 delete(i.Request.Headers, k)
66 }
67 }
68 for k := range i.Response.Headers {
69 if _, ok := headersToKeep[strings.ToLower(k)]; !ok {
70 delete(i.Response.Headers, k)
71 }
72 }
73 return nil
74}