github.com/fortexxx/gqlgen@v0.10.3-0.20191216030626-ca5ea8b21ead/graphql/handler/apollotracing/tracer_test.go (about) 1 package apollotracing_test 2 3 import ( 4 "encoding/json" 5 "net/http" 6 "net/http/httptest" 7 "strings" 8 "testing" 9 10 "github.com/99designs/gqlgen/graphql/handler/apollotracing" 11 "github.com/99designs/gqlgen/graphql/handler/extension" 12 "github.com/99designs/gqlgen/graphql/handler/lru" 13 "github.com/99designs/gqlgen/graphql/handler/testserver" 14 "github.com/99designs/gqlgen/graphql/handler/transport" 15 "github.com/stretchr/testify/assert" 16 "github.com/stretchr/testify/require" 17 "github.com/vektah/gqlparser/gqlerror" 18 ) 19 20 func TestApolloTracing(t *testing.T) { 21 h := testserver.New() 22 h.AddTransport(transport.POST{}) 23 h.Use(apollotracing.Tracer{}) 24 25 resp := doRequest(h, "POST", "/graphql", `{"query":"{ name }"}`) 26 assert.Equal(t, http.StatusOK, resp.Code, resp.Body.String()) 27 var respData struct { 28 Extensions struct { 29 Tracing apollotracing.TracingExtension `json:"tracing"` 30 } `json:"extensions"` 31 } 32 require.NoError(t, json.Unmarshal(resp.Body.Bytes(), &respData)) 33 34 tracing := &respData.Extensions.Tracing 35 36 require.EqualValues(t, 1, tracing.Version) 37 38 require.EqualValues(t, 0, tracing.StartTime.UnixNano()) 39 require.EqualValues(t, 700, tracing.EndTime.UnixNano()) 40 require.EqualValues(t, 700, tracing.Duration) 41 42 require.EqualValues(t, 100, tracing.Parsing.StartOffset) 43 require.EqualValues(t, 100, tracing.Parsing.Duration) 44 45 require.EqualValues(t, 300, tracing.Validation.StartOffset) 46 require.EqualValues(t, 100, tracing.Validation.Duration) 47 48 require.EqualValues(t, 500, tracing.Execution.Resolvers[0].StartOffset) 49 require.EqualValues(t, 100, tracing.Execution.Resolvers[0].Duration) 50 require.EqualValues(t, []interface{}{"name"}, tracing.Execution.Resolvers[0].Path) 51 require.EqualValues(t, "Query", tracing.Execution.Resolvers[0].ParentType) 52 require.EqualValues(t, "name", tracing.Execution.Resolvers[0].FieldName) 53 require.EqualValues(t, "String!", tracing.Execution.Resolvers[0].ReturnType) 54 } 55 56 func TestApolloTracing_withFail(t *testing.T) { 57 h := testserver.New() 58 h.AddTransport(transport.POST{}) 59 h.Use(extension.AutomaticPersistedQuery{Cache: lru.New(100)}) 60 h.Use(apollotracing.Tracer{}) 61 62 resp := doRequest(h, "POST", "/graphql", `{"operationName":"A","extensions":{"persistedQuery":{"version":1,"sha256Hash":"338bbc16ac780daf81845339fbf0342061c1e9d2b702c96d3958a13a557083a6"}}}`) 63 assert.Equal(t, http.StatusUnprocessableEntity, resp.Code, resp.Body.String()) 64 b := resp.Body.Bytes() 65 t.Log(string(b)) 66 var respData struct { 67 Errors gqlerror.List 68 } 69 require.NoError(t, json.Unmarshal(b, &respData)) 70 require.Equal(t, 1, len(respData.Errors)) 71 require.Equal(t, "PersistedQueryNotFound", respData.Errors[0].Message) 72 } 73 74 func doRequest(handler http.Handler, method string, target string, body string) *httptest.ResponseRecorder { 75 r := httptest.NewRequest(method, target, strings.NewReader(body)) 76 r.Header.Set("Content-Type", "application/json") 77 w := httptest.NewRecorder() 78 79 handler.ServeHTTP(w, r) 80 return w 81 }