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  }