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 := ®istry.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 }