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 }