gitee.com/sasukebo/go-micro/v4@v4.7.1/api/handler/http/http_test.go (about)

     1  package http
     2  
     3  import (
     4  	"net"
     5  	"net/http"
     6  	"net/http/httptest"
     7  	"testing"
     8  
     9  	"gitee.com/sasukebo/go-micro/v4/api/handler"
    10  	"gitee.com/sasukebo/go-micro/v4/api/resolver"
    11  	"gitee.com/sasukebo/go-micro/v4/api/resolver/vpath"
    12  	"gitee.com/sasukebo/go-micro/v4/api/router"
    13  	regRouter "gitee.com/sasukebo/go-micro/v4/api/router/registry"
    14  	"gitee.com/sasukebo/go-micro/v4/registry"
    15  )
    16  
    17  func testHttp(t *testing.T, path, service, ns string) {
    18  	r := registry.NewMemoryRegistry()
    19  
    20  	l, err := net.Listen("tcp", "127.0.0.1:0")
    21  	if err != nil {
    22  		t.Fatal(err)
    23  	}
    24  	defer l.Close()
    25  
    26  	s := &registry.Service{
    27  		Name: service,
    28  		Nodes: []*registry.Node{
    29  			{
    30  				Id:      service + "-1",
    31  				Address: l.Addr().String(),
    32  			},
    33  		},
    34  	}
    35  
    36  	r.Register(s)
    37  	defer r.Deregister(s)
    38  
    39  	// setup the test handler
    40  	m := http.NewServeMux()
    41  	m.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) {
    42  		w.Write([]byte(`you got served`))
    43  	})
    44  
    45  	// start http test serve
    46  	go http.Serve(l, m)
    47  
    48  	// create new request and writer
    49  	w := httptest.NewRecorder()
    50  	req, err := http.NewRequest("POST", path, nil)
    51  	if err != nil {
    52  		t.Fatal(err)
    53  	}
    54  
    55  	// initialise the handler
    56  	rt := regRouter.NewRouter(
    57  		router.WithHandler("http"),
    58  		router.WithRegistry(r),
    59  		router.WithResolver(vpath.NewResolver(
    60  			resolver.WithNamespace(resolver.StaticNamespace(ns)),
    61  		)),
    62  	)
    63  
    64  	p := NewHandler(handler.WithRouter(rt))
    65  
    66  	// execute the handler
    67  	p.ServeHTTP(w, req)
    68  
    69  	if w.Code != 200 {
    70  		t.Fatalf("Expected 200 response got %d %s", w.Code, w.Body.String())
    71  	}
    72  
    73  	if w.Body.String() != "you got served" {
    74  		t.Fatalf("Expected body: you got served. Got: %s", w.Body.String())
    75  	}
    76  }
    77  
    78  func TestHttpHandler(t *testing.T) {
    79  	testData := []struct {
    80  		path      string
    81  		service   string
    82  		namespace string
    83  	}{
    84  		{
    85  			"/test/foo",
    86  			"go.micro.api.test",
    87  			"go.micro.api",
    88  		},
    89  		{
    90  			"/test/foo/baz",
    91  			"go.micro.api.test",
    92  			"go.micro.api",
    93  		},
    94  		{
    95  			"/v1/foo",
    96  			"go.micro.api.v1.foo",
    97  			"go.micro.api",
    98  		},
    99  		{
   100  			"/v1/foo/bar",
   101  			"go.micro.api.v1.foo",
   102  			"go.micro.api",
   103  		},
   104  		{
   105  			"/v2/baz",
   106  			"go.micro.api.v2.baz",
   107  			"go.micro.api",
   108  		},
   109  		{
   110  			"/v2/baz/bar",
   111  			"go.micro.api.v2.baz",
   112  			"go.micro.api",
   113  		},
   114  		{
   115  			"/v2/baz/bar",
   116  			"v2.baz",
   117  			"",
   118  		},
   119  	}
   120  
   121  	for _, d := range testData {
   122  		t.Run(d.service, func(t *testing.T) {
   123  			testHttp(t, d.path, d.service, d.namespace)
   124  		})
   125  	}
   126  }