github.com/maeglindeveloper/gqlgen@v0.13.1-0.20210413081235-57808b12a0a0/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 "time" 10 11 "github.com/99designs/gqlgen/graphql" 12 "github.com/99designs/gqlgen/graphql/handler/apollotracing" 13 "github.com/99designs/gqlgen/graphql/handler/extension" 14 "github.com/99designs/gqlgen/graphql/handler/lru" 15 "github.com/99designs/gqlgen/graphql/handler/testserver" 16 "github.com/99designs/gqlgen/graphql/handler/transport" 17 "github.com/stretchr/testify/assert" 18 "github.com/stretchr/testify/require" 19 "github.com/vektah/gqlparser/v2/ast" 20 "github.com/vektah/gqlparser/v2/gqlerror" 21 ) 22 23 func TestApolloTracing(t *testing.T) { 24 now := time.Unix(0, 0) 25 26 graphql.Now = func() time.Time { 27 defer func() { 28 now = now.Add(100 * time.Nanosecond) 29 }() 30 return now 31 } 32 33 h := testserver.New() 34 h.AddTransport(transport.POST{}) 35 h.Use(apollotracing.Tracer{}) 36 37 resp := doRequest(h, http.MethodPost, "/graphql", `{"query":"{ name }"}`) 38 assert.Equal(t, http.StatusOK, resp.Code, resp.Body.String()) 39 var respData struct { 40 Extensions struct { 41 Tracing apollotracing.TracingExtension `json:"tracing"` 42 } `json:"extensions"` 43 } 44 require.NoError(t, json.Unmarshal(resp.Body.Bytes(), &respData)) 45 46 tracing := &respData.Extensions.Tracing 47 48 require.EqualValues(t, 1, tracing.Version) 49 50 require.Zero(t, tracing.StartTime.UnixNano()) 51 require.EqualValues(t, 900, tracing.EndTime.UnixNano()) 52 require.EqualValues(t, 900, tracing.Duration) 53 54 require.EqualValues(t, 300, tracing.Parsing.StartOffset) 55 require.EqualValues(t, 100, tracing.Parsing.Duration) 56 57 require.EqualValues(t, 500, tracing.Validation.StartOffset) 58 require.EqualValues(t, 100, tracing.Validation.Duration) 59 60 require.EqualValues(t, 700, tracing.Execution.Resolvers[0].StartOffset) 61 require.EqualValues(t, 100, tracing.Execution.Resolvers[0].Duration) 62 require.EqualValues(t, ast.Path{ast.PathName("name")}, tracing.Execution.Resolvers[0].Path) 63 require.Equal(t, "Query", tracing.Execution.Resolvers[0].ParentType) 64 require.Equal(t, "name", tracing.Execution.Resolvers[0].FieldName) 65 require.Equal(t, "String!", tracing.Execution.Resolvers[0].ReturnType) 66 } 67 68 func TestApolloTracing_withFail(t *testing.T) { 69 now := time.Unix(0, 0) 70 71 graphql.Now = func() time.Time { 72 defer func() { 73 now = now.Add(100 * time.Nanosecond) 74 }() 75 return now 76 } 77 78 h := testserver.New() 79 h.AddTransport(transport.POST{}) 80 h.Use(extension.AutomaticPersistedQuery{Cache: lru.New(100)}) 81 h.Use(apollotracing.Tracer{}) 82 83 resp := doRequest(h, http.MethodPost, "/graphql", `{"operationName":"A","extensions":{"persistedQuery":{"version":1,"sha256Hash":"338bbc16ac780daf81845339fbf0342061c1e9d2b702c96d3958a13a557083a6"}}}`) 84 assert.Equal(t, http.StatusOK, resp.Code, resp.Body.String()) 85 b := resp.Body.Bytes() 86 t.Log(string(b)) 87 var respData struct { 88 Errors gqlerror.List 89 } 90 require.NoError(t, json.Unmarshal(b, &respData)) 91 require.Len(t, respData.Errors, 1) 92 require.Equal(t, "PersistedQueryNotFound", respData.Errors[0].Message) 93 } 94 95 func doRequest(handler http.Handler, method, target, body string) *httptest.ResponseRecorder { 96 r := httptest.NewRequest(method, target, strings.NewReader(body)) 97 r.Header.Set("Content-Type", "application/json") 98 w := httptest.NewRecorder() 99 100 handler.ServeHTTP(w, r) 101 return w 102 }