-
Notifications
You must be signed in to change notification settings - Fork 216
/
conversion.go
118 lines (98 loc) · 2.77 KB
/
conversion.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package http
import (
"bytes"
"context"
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
"strings"
"testing"
"time"
"github.com/cloudevents/sdk-go"
"github.com/cloudevents/sdk-go/pkg/cloudevents/transport"
cehttp "github.com/cloudevents/sdk-go/pkg/cloudevents/transport/http"
"github.com/google/uuid"
)
// Conversion Test:
// Data -> POST -> Wire Format -> Receive -> Error -> Convert -> Got
// Given: ^ ^==Want
// Data is a payload.
type ConversionTest struct {
now time.Time
data interface{}
convertFn cloudevents.ConvertFn
asSent *TapValidation
asRecv *TapValidation
want *cloudevents.Event
}
type ConversionTestCases map[string]ConversionTest
func UnitTestConvert(ctx context.Context, m transport.Message, err error) (*cloudevents.Event, error) {
if msg, ok := m.(*cehttp.Message); ok {
tx := cloudevents.HTTPTransportContextFrom(ctx)
// Make a new event and convert the message payload.
event := cloudevents.NewEvent()
event.SetSource("github.com/cloudevents/test/http/conversion")
event.SetType(fmt.Sprintf("io.cloudevents.conversion.http.%s", strings.ToLower(tx.Method)))
event.SetID("321-CBA")
event.Data = msg.Body
return &event, nil
}
return nil, err
}
func UnitTestConvertNilNil(context.Context, transport.Message, error) (*cloudevents.Event, error) {
return nil, nil
}
func ClientConversion(t *testing.T, tc ConversionTest, topts ...cehttp.Option) {
tap := NewTap()
server := httptest.NewServer(tap)
defer server.Close()
if len(topts) == 0 {
topts = append(topts, cloudevents.WithBinaryEncoding())
}
topts = append(topts, cloudevents.WithPort(0)) // random port
trans, err := cloudevents.NewHTTPTransport(
topts...,
)
if err != nil {
t.Fatal(err)
}
tap.handler = trans
ce, err := cloudevents.NewClient(
trans,
cloudevents.WithEventDefaulter(AlwaysThen(tc.now)),
cloudevents.WithConverterFn(tc.convertFn),
)
if err != nil {
t.Fatal(err)
}
testID := uuid.New().String()
recvCtx, recvCancel := context.WithCancel(context.Background())
go func() {
t.Log(ce.StartReceiver(recvCtx, func(got cloudevents.Event) {
assertEventEquality(t, "got event", tc.want, &got)
}))
}()
b, err := json.Marshal(tc.data)
if err != nil {
t.Fatal(err)
}
req, err := http.NewRequest("POST", server.URL, bytes.NewBuffer(b))
if err != nil {
t.Fatal(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set(unitTestIDKey, testID)
got, err := http.DefaultClient.Do(req)
if err != nil {
t.Fatal(err)
}
_ = got
recvCancel()
if req, ok := tap.req[testID]; ok {
assertTappedEquality(t, "http request", tc.asSent, &req)
}
if resp, ok := tap.resp[testID]; ok {
assertTappedEquality(t, "http response", tc.asRecv, &resp)
}
}