recorder_test.go

 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}