github.com/shippio/gqlgen@v0.0.0-20220912092219-633ea699ef07/client/client_test.go (about)

     1  package client_test
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"io"
     7  	"mime/multipart"
     8  	"net/http"
     9  	"net/textproto"
    10  	"testing"
    11  
    12  	"github.com/99designs/gqlgen/client"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestClient(t *testing.T) {
    17  	h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    18  		b, err := io.ReadAll(r.Body)
    19  		if err != nil {
    20  			panic(err)
    21  		}
    22  		require.Equal(t, `{"query":"user(id:$id){name}","variables":{"id":1}}`, string(b))
    23  
    24  		err = json.NewEncoder(w).Encode(map[string]interface{}{
    25  			"data": map[string]interface{}{
    26  				"name": "bob",
    27  			},
    28  		})
    29  		if err != nil {
    30  			panic(err)
    31  		}
    32  	})
    33  
    34  	c := client.New(h)
    35  
    36  	var resp struct {
    37  		Name string
    38  	}
    39  
    40  	c.MustPost("user(id:$id){name}", &resp, client.Var("id", 1))
    41  
    42  	require.Equal(t, "bob", resp.Name)
    43  }
    44  
    45  func TestClientMultipartFormData(t *testing.T) {
    46  	h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    47  		bodyBytes, err := io.ReadAll(r.Body)
    48  		require.NoError(t, err)
    49  		require.Contains(t, string(bodyBytes), `Content-Disposition: form-data; name="operations"`)
    50  		require.Contains(t, string(bodyBytes), `{"query":"mutation ($input: Input!) {}","variables":{"file":{}}`)
    51  		require.Contains(t, string(bodyBytes), `Content-Disposition: form-data; name="map"`)
    52  		require.Contains(t, string(bodyBytes), `{"0":["variables.file"]}`)
    53  		require.Contains(t, string(bodyBytes), `Content-Disposition: form-data; name="0"; filename="example.txt"`)
    54  		require.Contains(t, string(bodyBytes), `Content-Type: text/plain`)
    55  		require.Contains(t, string(bodyBytes), `Hello World`)
    56  
    57  		w.Write([]byte(`{}`))
    58  	})
    59  
    60  	c := client.New(h)
    61  
    62  	var resp struct{}
    63  	c.MustPost("{ id }", &resp,
    64  		func(bd *client.Request) {
    65  			bodyBuf := &bytes.Buffer{}
    66  			bodyWriter := multipart.NewWriter(bodyBuf)
    67  			bodyWriter.WriteField("operations", `{"query":"mutation ($input: Input!) {}","variables":{"file":{}}`)
    68  			bodyWriter.WriteField("map", `{"0":["variables.file"]}`)
    69  
    70  			h := make(textproto.MIMEHeader)
    71  			h.Set("Content-Disposition", `form-data; name="0"; filename="example.txt"`)
    72  			h.Set("Content-Type", "text/plain")
    73  			ff, _ := bodyWriter.CreatePart(h)
    74  			ff.Write([]byte("Hello World"))
    75  			bodyWriter.Close()
    76  
    77  			bd.HTTP.Body = io.NopCloser(bodyBuf)
    78  			bd.HTTP.Header.Set("Content-Type", bodyWriter.FormDataContentType())
    79  		},
    80  	)
    81  }
    82  
    83  func TestAddHeader(t *testing.T) {
    84  	h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    85  		require.Equal(t, "ASDF", r.Header.Get("Test-Key"))
    86  
    87  		w.Write([]byte(`{}`))
    88  	})
    89  
    90  	c := client.New(h)
    91  
    92  	var resp struct{}
    93  	c.MustPost("{ id }", &resp,
    94  		client.AddHeader("Test-Key", "ASDF"),
    95  	)
    96  }
    97  
    98  func TestAddClientHeader(t *testing.T) {
    99  	h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   100  		require.Equal(t, "ASDF", r.Header.Get("Test-Key"))
   101  
   102  		w.Write([]byte(`{}`))
   103  	})
   104  
   105  	c := client.New(h, client.AddHeader("Test-Key", "ASDF"))
   106  
   107  	var resp struct{}
   108  	c.MustPost("{ id }", &resp)
   109  }
   110  
   111  func TestBasicAuth(t *testing.T) {
   112  	h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   113  		user, pass, ok := r.BasicAuth()
   114  		require.True(t, ok)
   115  		require.Equal(t, "user", user)
   116  		require.Equal(t, "pass", pass)
   117  
   118  		w.Write([]byte(`{}`))
   119  	})
   120  
   121  	c := client.New(h)
   122  
   123  	var resp struct{}
   124  	c.MustPost("{ id }", &resp,
   125  		client.BasicAuth("user", "pass"),
   126  	)
   127  }
   128  
   129  func TestAddCookie(t *testing.T) {
   130  	h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   131  		c, err := r.Cookie("foo")
   132  		require.NoError(t, err)
   133  		require.Equal(t, "value", c.Value)
   134  
   135  		w.Write([]byte(`{}`))
   136  	})
   137  
   138  	c := client.New(h)
   139  
   140  	var resp struct{}
   141  	c.MustPost("{ id }", &resp,
   142  		client.AddCookie(&http.Cookie{Name: "foo", Value: "value"}),
   143  	)
   144  }
   145  
   146  func TestAddExtensions(t *testing.T) {
   147  	h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   148  		b, err := io.ReadAll(r.Body)
   149  		if err != nil {
   150  			panic(err)
   151  		}
   152  		require.Equal(t, `{"query":"user(id:1){name}","extensions":{"persistedQuery":{"sha256Hash":"ceec2897e2da519612279e63f24658c3e91194cbb2974744fa9007a7e1e9f9e7","version":1}}}`, string(b))
   153  		err = json.NewEncoder(w).Encode(map[string]interface{}{
   154  			"data": map[string]interface{}{
   155  				"Name": "Bob",
   156  			},
   157  		})
   158  		if err != nil {
   159  			panic(err)
   160  		}
   161  	})
   162  
   163  	c := client.New(h)
   164  
   165  	var resp struct {
   166  		Name string
   167  	}
   168  	c.MustPost("user(id:1){name}", &resp,
   169  		client.Extensions(map[string]interface{}{"persistedQuery": map[string]interface{}{"version": 1, "sha256Hash": "ceec2897e2da519612279e63f24658c3e91194cbb2974744fa9007a7e1e9f9e7"}}),
   170  	)
   171  }