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  }