github.com/bytom/bytom@v1.1.2-0.20221014091027-bbcba3df6075/blockchain/rpc/rpc_test.go (about)

     1  package rpc
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"net/http"
     7  	"net/http/httptest"
     8  	"net/url"
     9  	"strings"
    10  	"testing"
    11  
    12  	"github.com/bytom/bytom/testutil"
    13  )
    14  
    15  func TestRPCCallJSON(t *testing.T) {
    16  	requestBody := map[string]interface{}{
    17  		"hello": "world",
    18  	}
    19  
    20  	// the TestResponse is same with api Response
    21  	type TestResponse struct {
    22  		Status string      `json:"status,omitempty"`
    23  		Msg    string      `json:"msg,omitempty"`
    24  		Data   interface{} `json:"data,omitempty"`
    25  	}
    26  
    27  	response := &TestResponse{}
    28  	result := &TestResponse{
    29  		Status: "success",
    30  		Msg:    "right",
    31  		Data:   requestBody,
    32  	}
    33  
    34  	server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
    35  		// Inspect the request and ensure that it's what we expect.
    36  		if req.Header.Get("Content-Type") != "application/json" {
    37  			t.Errorf("got=%s; want=application/json", req.Header.Get("Content-Type"))
    38  		}
    39  		if !strings.HasPrefix(req.Header.Get("User-Agent"), "Bytom; ") {
    40  			t.Errorf("got=%s; want prefix='Bytom; '", req.Header.Get("User-Agent"))
    41  		}
    42  		if req.URL.Path != "/example/rpc/path" {
    43  			t.Errorf("got=%s want=/example/rpc/path", req.URL.Path)
    44  		}
    45  		un, pw, ok := req.BasicAuth()
    46  		if !ok {
    47  			t.Error("no user/password set")
    48  		} else if un != "test-user" {
    49  			t.Errorf("got=%s; want=test-user", un)
    50  		} else if pw != "test-secret" {
    51  			t.Errorf("got=%s; want=test-secret", pw)
    52  		}
    53  
    54  		decodedRequestBody := map[string]interface{}{}
    55  		if err := json.NewDecoder(req.Body).Decode(&decodedRequestBody); err != nil {
    56  			t.Fatal(err)
    57  		}
    58  		defer req.Body.Close()
    59  		if !testutil.DeepEqual(decodedRequestBody, requestBody) {
    60  			t.Errorf("got=%#v; want=%#v", decodedRequestBody, requestBody)
    61  		}
    62  
    63  		// Provide a dummy rpc response
    64  		rw.Header().Set("Content-Type", "application/json")
    65  		data, err := json.Marshal(result)
    66  		if err != nil {
    67  			t.Fatal(err)
    68  		}
    69  		rw.Write(data)
    70  	}))
    71  	defer server.Close()
    72  
    73  	//response := map[string]string{}
    74  	client := &Client{
    75  		BaseURL:     server.URL,
    76  		AccessToken: "test-user:test-secret",
    77  	}
    78  	err := client.Call(context.Background(), "/example/rpc/path", requestBody, &response)
    79  	if err != nil {
    80  		t.Fatal(err)
    81  	}
    82  
    83  	// Ensure that the response is as we expect.
    84  	if !testutil.DeepEqual(response, result) {
    85  		t.Errorf(`got=%#v; want=%#v`, response, result)
    86  	}
    87  
    88  	// Ensure that supplying a nil response is OK.
    89  	err = client.Call(context.Background(), "/example/rpc/path", requestBody, nil)
    90  	if err != nil {
    91  		t.Fatal(err)
    92  	}
    93  }
    94  
    95  func TestRPCCallError(t *testing.T) {
    96  	server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
    97  		http.Error(rw, "a terrible error", http.StatusInternalServerError)
    98  	}))
    99  	defer server.Close()
   100  
   101  	client := &Client{BaseURL: server.URL}
   102  	wantErr := ErrStatusCode{URL: server.URL + "/error", StatusCode: 500}
   103  	err := client.Call(context.Background(), "/error", nil, nil)
   104  	if !testutil.DeepEqual(wantErr, err) {
   105  		t.Errorf("got=%#v; want=%#v", err, wantErr)
   106  	}
   107  }
   108  
   109  func TestCleanedURLString(t *testing.T) {
   110  	u, _ := url.Parse("https://user:pass@foobar.com")
   111  	want := "https://foobar.com"
   112  
   113  	got := cleanedURLString(u)
   114  	if got != want {
   115  		t.Errorf("clean = %q want %q", got, want)
   116  	}
   117  }