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  }