...
1 package middleware
2
3 import (
4 "context"
5 "fmt"
6 "testing"
7 )
8
9 var _ Handler = (HandlerFunc)(nil)
10 var _ Handler = (decoratedHandler{})
11
12 type mockMiddleware struct {
13 id int
14 }
15
16 func (m mockMiddleware) ID() string {
17 return fmt.Sprintf("mock middleware %d", m.id)
18 }
19
20 func (m mockMiddleware) HandleMiddleware(ctx context.Context, input interface{}, next Handler) (
21 output interface{}, metadata Metadata, err error,
22 ) {
23 output, metadata, err = next.Handle(ctx, input)
24
25 mockKeySet(&metadata, m.id, fmt.Sprintf("mock-%d", m.id))
26
27 return output, metadata, err
28 }
29
30 type mockKey struct{ Key int }
31
32 func mockKeySet(md *Metadata, key int, val string) {
33 md.Set(mockKey{Key: key}, val)
34 }
35
36 func mockKeyGet(md MetadataReader, key int) string {
37 v := md.Get(mockKey{Key: key})
38 if v == nil {
39 return ""
40 }
41
42 return v.(string)
43 }
44
45 type mockHandler struct {
46 }
47
48 func (m *mockHandler) Handle(ctx context.Context, input interface{}) (
49 output interface{}, metadata Metadata, err error,
50 ) {
51 return nil, metadata, nil
52 }
53
54 func TestDecorateHandler(t *testing.T) {
55 mockHandler := &mockHandler{}
56 h := DecorateHandler(
57 mockHandler,
58 mockMiddleware{id: 0},
59 mockMiddleware{id: 1},
60 mockMiddleware{id: 2},
61 )
62
63 _, metadata, err := h.Handle(context.Background(), struct{}{})
64 if err != nil {
65 t.Fatalf("expect no error, got %v", err)
66 }
67
68 expectMeta := map[int]interface{}{
69 0: "mock-0",
70 1: "mock-1",
71 2: "mock-2",
72 }
73
74 for key, expect := range expectMeta {
75 v := mockKeyGet(metadata, key)
76 if e, a := expect, v; e != a {
77 t.Errorf("expect %v: %v metadata got %v", key, e, a)
78 }
79 }
80 }
81
View as plain text