github.com/viant/toolbox@v0.34.5/service_router_test.go (about) 1 package toolbox_test 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "github.com/stretchr/testify/assert" 7 "github.com/viant/toolbox" 8 "log" 9 "net/http" 10 "strings" 11 "testing" 12 "time" 13 ) 14 15 type ReverseService struct{} 16 17 func (this ReverseService) Reverse(values []int) []int { 18 var result = make([]int, 0) 19 for i := len(values) - 1; i >= 0; i-- { 20 result = append(result, values[i]) 21 } 22 23 return result 24 } 25 26 func (this ReverseService) Reverse2(values []int) []int { 27 var result = make([]int, 0) 28 for i := len(values) - 1; i >= 0; i-- { 29 result = append(result, values[i]) 30 } 31 return result 32 } 33 34 var ReverseInvoker = func(serviceRouting *toolbox.ServiceRouting, request *http.Request, response http.ResponseWriter, uriParameters map[string]interface{}) error { 35 var function = serviceRouting.Handler.(func(values []int) []int) 36 idsParam := uriParameters["ids"] 37 ids := idsParam.([]string) 38 values := make([]int, 0) 39 for _, item := range ids { 40 values = append(values, toolbox.AsInt(item)) 41 } 42 var result = function(values) 43 err := toolbox.WriteServiceRoutingResponse(response, request, serviceRouting, result) 44 if err != nil { 45 return err 46 } 47 return nil 48 } 49 50 func StartServer(port string, t *testing.T) { 51 service := ReverseService{} 52 router := toolbox.NewServiceRouter( 53 toolbox.ServiceRouting{ 54 HTTPMethod: "GET", 55 URI: "/v1/reverse/{ids}", 56 Handler: service.Reverse, 57 Parameters: []string{"ids"}, 58 }, 59 toolbox.ServiceRouting{ 60 HTTPMethod: "POST", 61 URI: "/v1/reverse/", 62 Handler: service.Reverse, 63 Parameters: []string{"ids"}, 64 }, 65 toolbox.ServiceRouting{ 66 HTTPMethod: "DELETE", 67 URI: "/v1/delete/{ids}", 68 Handler: service.Reverse, 69 Parameters: []string{"ids"}, 70 }, 71 toolbox.ServiceRouting{ 72 HTTPMethod: "GET", 73 URI: "/v1/reverse2/{ids}", 74 Handler: service.Reverse, 75 Parameters: []string{"ids"}, 76 HandlerInvoker: ReverseInvoker, 77 }, 78 toolbox.ServiceRouting{ 79 HTTPMethod: "GET", 80 URI: "/v1/tasks", 81 Parameters: []string{"status"}, 82 Handler: func(status string) map[string]interface{} { 83 var result = map[string]interface{}{ 84 "STATUS": status, 85 "ABc": 101, 86 } 87 return result 88 }, 89 }, 90 toolbox.ServiceRouting{ 91 HTTPMethod: "GET", 92 URI: "/v1/tasks/{ids}", 93 Parameters: []string{"ids"}, 94 Handler: func(ids ...string) map[string]interface{} { 95 var result = map[string]interface{}{ 96 "STATUS": ids, 97 "ABc": 102, 98 } 99 return result 100 }, 101 }, 102 toolbox.ServiceRouting{ 103 HTTPMethod: "GET", 104 URI: "/v1/explain/{cluster}/{yyyy}/{mm}/{dd}/{hh}/{name}/{sid}/{aid}", 105 Parameters: []string{"cluster", "sid"}, 106 Handler: func(amap map[string]interface{}) map[string]interface{} { 107 return amap 108 }, 109 HandlerInvoker: func(serviceRouting *toolbox.ServiceRouting, request *http.Request, response http.ResponseWriter, parameters map[string]interface{}) error { 110 var result = make(map[string]interface{}) 111 for k, v := range parameters { 112 if strings.HasPrefix(k, "@") { 113 continue 114 } 115 result[k] = v 116 } 117 data, _ := json.Marshal(result) 118 response.Write(data) 119 return nil 120 }, 121 }, 122 ) 123 124 http.HandleFunc("/v1/", func(writer http.ResponseWriter, reader *http.Request) { 125 err := router.Route(writer, reader) 126 assert.Nil(t, err) 127 }) 128 129 fmt.Printf("Started test server on port %v\n", port) 130 log.Fatal(http.ListenAndServe(":"+port, nil)) 131 } 132 133 func TestServiceRouter(t *testing.T) { 134 go func() { 135 StartServer("8082", t) 136 }() 137 138 time.Sleep(2 * time.Second) 139 140 { //Test explain 141 var result = map[string]interface{}{} 142 err := toolbox.RouteToService("get", "http://127.0.0.1:8082/v1/explain/west/2020/07/26/22/22-02.0.i-08b66c734e4d10a60/59af369e-cf8b-11ea-8858-134d48b29f18/1258652", nil, &result) 143 if err != nil { 144 t.Errorf("failed to send explain request %v", err) 145 } 146 assert.EqualValues(t, map[string]interface{}{ 147 "cluster": "west", 148 "sid": "59af369e-cf8b-11ea-8858-134d48b29f18", 149 }, result) 150 } 151 152 { 153 154 var result = map[string]interface{}{} 155 err := toolbox.RouteToService("get", "http://127.0.0.1:8082/v1/tasks/1,2,3", nil, &result) 156 if err != nil { 157 t.Errorf("failed to send get request %v", err) 158 } 159 160 assert.EqualValues(t, []interface{}{"1", "2", "3"}, result["STATUS"]) 161 162 } 163 164 // 165 { 166 167 var result = map[string]interface{}{} 168 err := toolbox.RouteToService("get", "http://127.0.0.1:8082/v1/tasks?status=OK", nil, &result) 169 if err != nil { 170 t.Errorf("failed to send get request %v", err) 171 } 172 173 assert.EqualValues(t, "OK", result["STATUS"]) 174 175 } 176 177 var result = make([]int, 0) 178 179 { 180 181 err := toolbox.RouteToService("get", "http://127.0.0.1:8082/v1/reverse/1,7,3", nil, &result) 182 if err != nil { 183 t.Errorf("failed to send get request %v", err) 184 } 185 assert.EqualValues(t, []int{3, 7, 1}, result) 186 187 } 188 189 { 190 191 err := toolbox.RouteToService("post", "http://127.0.0.1:8082/v1/reverse/", []int{1, 7, 3}, &result) 192 if err != nil { 193 t.Errorf("failed to send get request %v", err) 194 } 195 assert.EqualValues(t, []int{3, 7, 1}, result) 196 } 197 { 198 199 err := toolbox.RouteToService("delete", "http://127.0.0.1:8082/v1/delete/", []int{1, 7, 3}, &result) 200 if err != nil { 201 t.Errorf("failed to send delete request %v", err) 202 } 203 assert.EqualValues(t, []int{3, 7, 1}, result) 204 } 205 { 206 207 err := toolbox.RouteToService("delete", "http://127.0.0.1:8082/v1/delete/1,7,3", nil, &result) 208 if err != nil { 209 t.Errorf("failed to send delete request %v", err) 210 } 211 assert.EqualValues(t, []int{3, 7, 1}, result) 212 } 213 214 { //Test custom handler invocation without reflection 215 216 err := toolbox.RouteToService("get", "http://127.0.0.1:8082/v1/reverse2/1,7,3", nil, &result) 217 if err != nil { 218 t.Errorf("failed to send delete request %v", err) 219 } 220 assert.EqualValues(t, []int{3, 7, 1}, result) 221 } 222 223 { //Test custom handler invocation without reflection 224 225 err := toolbox.RouteToService("get", "http://127.0.0.1:8082/v1/reverse2/1,7,3", nil, &result) 226 if err != nil { 227 t.Errorf("failed to send delete request %v", err) 228 } 229 assert.EqualValues(t, []int{3, 7, 1}, result) 230 } 231 232 }