forked from prebid/prebid-server
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodules_test.go
120 lines (111 loc) · 4.7 KB
/
modules_test.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
119
120
package modules
import (
"context"
"encoding/json"
"errors"
"fmt"
"math"
"net/http"
"testing"
"github.com/prebid/prebid-server/config"
"github.com/prebid/prebid-server/hooks"
"github.com/prebid/prebid-server/hooks/hookstage"
"github.com/prebid/prebid-server/modules/moduledeps"
"github.com/stretchr/testify/assert"
)
func TestModuleBuilderBuild(t *testing.T) {
vendor := "acme"
moduleName := "foobar"
defaultModulesConfig := map[string]map[string]interface{}{vendor: {moduleName: map[string]interface{}{"enabled": true}}}
defaultHookRepository, err := hooks.NewHookRepository(map[string]interface{}{vendor + "." + moduleName: module{}})
if err != nil {
t.Fatalf("Failed to init default hook repository: %s", err)
}
emptyHookRepository, err := hooks.NewHookRepository(map[string]interface{}{})
if err != nil {
t.Fatalf("Failed to init empty hook repository: %s", err)
}
testCases := map[string]struct {
givenModule interface{}
givenConfig config.Modules
givenHookBuilderErr error
expectedHookRepo hooks.HookRepository
expectedModulesStages map[string][]string
expectedErr error
}{
"Can build module with config": {
givenModule: module{},
givenConfig: defaultModulesConfig,
expectedModulesStages: map[string][]string{vendor + "_" + moduleName: {hooks.StageEntrypoint.String(), hooks.StageAuctionResponse.String()}},
expectedHookRepo: defaultHookRepository,
expectedErr: nil,
},
"Module is not added to hook repository if it's disabled": {
givenModule: module{},
givenConfig: map[string]map[string]interface{}{vendor: {moduleName: map[string]interface{}{"enabled": false, "attr": "val"}}},
expectedModulesStages: map[string][]string{},
expectedHookRepo: emptyHookRepository,
expectedErr: nil,
},
"Module considered disabled if status property not defined in module config": {
givenModule: module{},
givenConfig: map[string]map[string]interface{}{vendor: {moduleName: map[string]interface{}{"foo": "bar"}}},
expectedHookRepo: emptyHookRepository,
expectedModulesStages: map[string][]string{},
expectedErr: nil,
},
"Module considered disabled if its config not provided and as a result skipped from execution": {
givenModule: module{},
givenConfig: nil,
expectedHookRepo: emptyHookRepository,
expectedModulesStages: map[string][]string{},
expectedErr: nil,
},
"Fails if module does not implement any hook interface": {
givenModule: struct{}{},
givenConfig: defaultModulesConfig,
expectedHookRepo: nil,
expectedModulesStages: nil,
expectedErr: fmt.Errorf(`hook "%s.%s" does not implement any supported hook interface`, vendor, moduleName),
},
"Fails if module builder function returns error": {
givenModule: module{},
givenConfig: defaultModulesConfig,
givenHookBuilderErr: errors.New("failed to build module"),
expectedHookRepo: nil,
expectedModulesStages: nil,
expectedErr: fmt.Errorf(`failed to init "%s.%s" module: %s`, vendor, moduleName, "failed to build module"),
},
"Fails if config marshaling returns error": {
givenModule: module{},
givenConfig: map[string]map[string]interface{}{vendor: {moduleName: math.Inf(1)}},
expectedHookRepo: nil,
expectedModulesStages: nil,
expectedErr: fmt.Errorf(`failed to marshal "%s.%s" module config: json: unsupported value: +Inf`, vendor, moduleName),
},
}
for name, test := range testCases {
t.Run(name, func(t *testing.T) {
builder := &builder{
builders: ModuleBuilders{
vendor: {
moduleName: func(cfg json.RawMessage, deps moduledeps.ModuleDeps) (interface{}, error) {
return test.givenModule, test.givenHookBuilderErr
},
},
},
}
repo, modulesStages, err := builder.Build(test.givenConfig, moduledeps.ModuleDeps{HTTPClient: http.DefaultClient})
assert.Equal(t, test.expectedErr, err)
assert.Equal(t, test.expectedModulesStages, modulesStages)
assert.Equal(t, test.expectedHookRepo, repo)
})
}
}
type module struct{}
func (h module) HandleEntrypointHook(_ context.Context, _ hookstage.ModuleInvocationContext, _ hookstage.EntrypointPayload) (hookstage.HookResult[hookstage.EntrypointPayload], error) {
return hookstage.HookResult[hookstage.EntrypointPayload]{}, nil
}
func (h module) HandleAuctionResponseHook(_ context.Context, _ hookstage.ModuleInvocationContext, _ hookstage.AuctionResponsePayload) (hookstage.HookResult[hookstage.AuctionResponsePayload], error) {
return hookstage.HookResult[hookstage.AuctionResponsePayload]{}, nil
}