github.com/shippio/gqlgen@v0.0.0-20220912092219-633ea699ef07/graphql/handler/apollofederatedtracingv1/tracing_test.go (about) 1 package apollofederatedtracingv1_test 2 3 import ( 4 "encoding/base64" 5 "encoding/json" 6 "fmt" 7 "net/http" 8 "net/http/httptest" 9 "strings" 10 "testing" 11 "time" 12 13 "github.com/99designs/gqlgen/graphql" 14 "github.com/99designs/gqlgen/graphql/handler/apollofederatedtracingv1" 15 "github.com/99designs/gqlgen/graphql/handler/apollofederatedtracingv1/generated" 16 "github.com/99designs/gqlgen/graphql/handler/apollotracing" 17 "github.com/99designs/gqlgen/graphql/handler/extension" 18 "github.com/99designs/gqlgen/graphql/handler/lru" 19 "github.com/99designs/gqlgen/graphql/handler/testserver" 20 "github.com/99designs/gqlgen/graphql/handler/transport" 21 "github.com/stretchr/testify/assert" 22 "github.com/stretchr/testify/require" 23 "github.com/vektah/gqlparser/v2/gqlerror" 24 "google.golang.org/protobuf/proto" 25 ) 26 27 func TestApolloTracing(t *testing.T) { 28 now := time.Unix(0, 0) 29 30 graphql.Now = func() time.Time { 31 defer func() { 32 now = now.Add(100 * time.Nanosecond) 33 }() 34 return now 35 } 36 37 h := testserver.New() 38 h.AddTransport(transport.POST{}) 39 h.Use(&apollofederatedtracingv1.Tracer{}) 40 41 resp := doRequest(h, http.MethodPost, "/graphql", `{"query":"{ name }"}`) 42 assert.Equal(t, http.StatusOK, resp.Code, resp.Body.String()) 43 var respData struct { 44 Extensions struct { 45 FTV1 string `json:"ftv1"` 46 } `json:"extensions"` 47 } 48 require.NoError(t, json.Unmarshal(resp.Body.Bytes(), &respData)) 49 50 tracing := respData.Extensions.FTV1 51 pbuf, _ := base64.StdEncoding.DecodeString(tracing) 52 ftv1 := &generated.Trace{} 53 err := proto.Unmarshal(pbuf, ftv1) 54 require.Nil(t, err) 55 56 require.Zero(t, ftv1.StartTime.Nanos, ftv1.StartTime.Nanos) 57 require.EqualValues(t, 900, ftv1.EndTime.Nanos) 58 require.EqualValues(t, 900, ftv1.DurationNs) 59 60 fmt.Printf("%#v\n", resp.Body.String()) 61 require.Equal(t, "Query", ftv1.Root.Child[0].ParentType) 62 require.Equal(t, "name", ftv1.Root.Child[0].GetResponseName()) 63 require.Equal(t, "String!", ftv1.Root.Child[0].Type) 64 } 65 66 func TestApolloTracing_withFail(t *testing.T) { 67 now := time.Unix(0, 0) 68 69 graphql.Now = func() time.Time { 70 defer func() { 71 now = now.Add(100 * time.Nanosecond) 72 }() 73 return now 74 } 75 76 h := testserver.New() 77 h.AddTransport(transport.POST{}) 78 h.Use(extension.AutomaticPersistedQuery{Cache: lru.New(100)}) 79 h.Use(apollotracing.Tracer{}) 80 81 resp := doRequest(h, http.MethodPost, "/graphql", `{"operationName":"A","extensions":{"persistedQuery":{"version":1,"sha256Hash":"338bbc16ac780daf81845339fbf0342061c1e9d2b702c96d3958a13a557083a6"}}}`) 82 assert.Equal(t, http.StatusOK, resp.Code, resp.Body.String()) 83 b := resp.Body.Bytes() 84 t.Log(string(b)) 85 var respData struct { 86 Errors gqlerror.List 87 } 88 require.NoError(t, json.Unmarshal(b, &respData)) 89 require.Len(t, respData.Errors, 1) 90 require.Equal(t, "PersistedQueryNotFound", respData.Errors[0].Message) 91 } 92 93 func doRequest(handler http.Handler, method, target, body string) *httptest.ResponseRecorder { 94 r := httptest.NewRequest(method, target, strings.NewReader(body)) 95 r.Header.Set("Content-Type", "application/json") 96 r.Header.Set("apollo-federation-include-trace", "ftv1") 97 w := httptest.NewRecorder() 98 99 handler.ServeHTTP(w, r) 100 return w 101 }