github.com/annwntech/go-micro/v2@v2.9.5/handler/rpc_test.go (about)

     1  package handler
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"encoding/json"
     7  	"fmt"
     8  	"net/http"
     9  	"net/http/httptest"
    10  	"testing"
    11  
    12  	"github.com/annwntech/go-micro/v2"
    13  	"github.com/annwntech/go-micro/v2/metadata"
    14  )
    15  
    16  type TestHandler struct {
    17  	t      *testing.T
    18  	expect metadata.Metadata
    19  }
    20  
    21  type TestRequest struct{}
    22  type TestResponse struct{}
    23  
    24  func (t *TestHandler) Exec(ctx context.Context, req *TestRequest, rsp *TestResponse) error {
    25  	md, ok := metadata.FromContext(ctx)
    26  	if !ok {
    27  		return fmt.Errorf("Expected metadata got %t", ok)
    28  	}
    29  
    30  	for k, v := range t.expect {
    31  		if val := md[k]; val != v {
    32  			return fmt.Errorf("Expected %s for key %s got %s", v, k, val)
    33  		}
    34  	}
    35  
    36  	t.t.Logf("Received request %+v", req)
    37  	t.t.Logf("Received metadata %+v", md)
    38  
    39  	return nil
    40  }
    41  
    42  func TestRPCHandler(t *testing.T) {
    43  
    44  	srv := micro.NewService(
    45  		micro.Name("test"),
    46  	)
    47  
    48  	srv.Server().Handle(
    49  		srv.Server().NewHandler(&TestHandler{t, metadata.Metadata{"Foo": "Bar"}}),
    50  	)
    51  
    52  	if err := srv.Server().Start(); err != nil {
    53  		t.Fatal(err)
    54  	}
    55  
    56  	defer srv.Server().Stop()
    57  
    58  	w := httptest.NewRecorder()
    59  
    60  	request := map[string]string{
    61  		"service":  "test",
    62  		"endpoint": "TestHandler.Exec",
    63  		"request":  "{}",
    64  	}
    65  
    66  	rb, err := json.Marshal(request)
    67  	if err != nil {
    68  		t.Fatal(err)
    69  	}
    70  
    71  	b := bytes.NewBuffer(rb)
    72  
    73  	req, err := http.NewRequest("POST", "/rpc", b)
    74  	if err != nil {
    75  		t.Fatal(err)
    76  	}
    77  	req.Header.Set("Content-Type", "application/json")
    78  	req.Header.Set("Foo", "Bar")
    79  
    80  	NewRPCHandler(nil).ServeHTTP(w, req)
    81  
    82  	if w.Code != 200 {
    83  		t.Fatalf("Expected 200 response got %d %s", w.Code, w.Body.String())
    84  	}
    85  }