github.com/safing/portbase@v0.19.5/api/endpoints_test.go (about) 1 package api 2 3 import ( 4 "errors" 5 "sync" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 10 "github.com/safing/portbase/database/record" 11 ) 12 13 const ( 14 successMsg = "endpoint api success" 15 failedMsg = "endpoint api failed" 16 ) 17 18 type actionTestRecord struct { 19 record.Base 20 sync.Mutex 21 Msg string 22 } 23 24 func TestEndpoints(t *testing.T) { 25 t.Parallel() 26 27 testHandler := &mainHandler{ 28 mux: mainMux, 29 } 30 31 // ActionFn 32 33 assert.NoError(t, RegisterEndpoint(Endpoint{ 34 Path: "test/action", 35 Read: PermitAnyone, 36 ActionFunc: func(_ *Request) (msg string, err error) { 37 return successMsg, nil 38 }, 39 })) 40 assert.HTTPBodyContains(t, testHandler.ServeHTTP, "GET", apiV1Path+"test/action", nil, successMsg) 41 42 assert.NoError(t, RegisterEndpoint(Endpoint{ 43 Path: "test/action-err", 44 Read: PermitAnyone, 45 ActionFunc: func(_ *Request) (msg string, err error) { 46 return "", errors.New(failedMsg) 47 }, 48 })) 49 assert.HTTPBodyContains(t, testHandler.ServeHTTP, "GET", apiV1Path+"test/action-err", nil, failedMsg) 50 51 // DataFn 52 53 assert.NoError(t, RegisterEndpoint(Endpoint{ 54 Path: "test/data", 55 Read: PermitAnyone, 56 DataFunc: func(_ *Request) (data []byte, err error) { 57 return []byte(successMsg), nil 58 }, 59 })) 60 assert.HTTPBodyContains(t, testHandler.ServeHTTP, "GET", apiV1Path+"test/data", nil, successMsg) 61 62 assert.NoError(t, RegisterEndpoint(Endpoint{ 63 Path: "test/data-err", 64 Read: PermitAnyone, 65 DataFunc: func(_ *Request) (data []byte, err error) { 66 return nil, errors.New(failedMsg) 67 }, 68 })) 69 assert.HTTPBodyContains(t, testHandler.ServeHTTP, "GET", apiV1Path+"test/data-err", nil, failedMsg) 70 71 // StructFn 72 73 assert.NoError(t, RegisterEndpoint(Endpoint{ 74 Path: "test/struct", 75 Read: PermitAnyone, 76 StructFunc: func(_ *Request) (i interface{}, err error) { 77 return &actionTestRecord{ 78 Msg: successMsg, 79 }, nil 80 }, 81 })) 82 assert.HTTPBodyContains(t, testHandler.ServeHTTP, "GET", apiV1Path+"test/struct", nil, successMsg) 83 84 assert.NoError(t, RegisterEndpoint(Endpoint{ 85 Path: "test/struct-err", 86 Read: PermitAnyone, 87 StructFunc: func(_ *Request) (i interface{}, err error) { 88 return nil, errors.New(failedMsg) 89 }, 90 })) 91 assert.HTTPBodyContains(t, testHandler.ServeHTTP, "GET", apiV1Path+"test/struct-err", nil, failedMsg) 92 93 // RecordFn 94 95 assert.NoError(t, RegisterEndpoint(Endpoint{ 96 Path: "test/record", 97 Read: PermitAnyone, 98 RecordFunc: func(_ *Request) (r record.Record, err error) { 99 r = &actionTestRecord{ 100 Msg: successMsg, 101 } 102 r.CreateMeta() 103 return r, nil 104 }, 105 })) 106 assert.HTTPBodyContains(t, testHandler.ServeHTTP, "GET", apiV1Path+"test/record", nil, successMsg) 107 108 assert.NoError(t, RegisterEndpoint(Endpoint{ 109 Path: "test/record-err", 110 Read: PermitAnyone, 111 RecordFunc: func(_ *Request) (r record.Record, err error) { 112 return nil, errors.New(failedMsg) 113 }, 114 })) 115 assert.HTTPBodyContains(t, testHandler.ServeHTTP, "GET", apiV1Path+"test/record-err", nil, failedMsg) 116 } 117 118 func TestActionRegistration(t *testing.T) { 119 t.Parallel() 120 121 assert.Error(t, RegisterEndpoint(Endpoint{})) 122 123 assert.Error(t, RegisterEndpoint(Endpoint{ 124 Path: "test/err", 125 Read: NotFound, 126 })) 127 assert.Error(t, RegisterEndpoint(Endpoint{ 128 Path: "test/err", 129 Read: PermitSelf + 1, 130 })) 131 132 assert.Error(t, RegisterEndpoint(Endpoint{ 133 Path: "test/err", 134 Write: NotFound, 135 })) 136 assert.Error(t, RegisterEndpoint(Endpoint{ 137 Path: "test/err", 138 Write: PermitSelf + 1, 139 })) 140 141 assert.Error(t, RegisterEndpoint(Endpoint{ 142 Path: "test/err", 143 })) 144 145 assert.Error(t, RegisterEndpoint(Endpoint{ 146 Path: "test/err", 147 ActionFunc: func(_ *Request) (msg string, err error) { 148 return successMsg, nil 149 }, 150 DataFunc: func(_ *Request) (data []byte, err error) { 151 return []byte(successMsg), nil 152 }, 153 })) 154 155 assert.NoError(t, RegisterEndpoint(Endpoint{ 156 Path: "test/err", 157 ActionFunc: func(_ *Request) (msg string, err error) { 158 return successMsg, nil 159 }, 160 })) 161 }