// _ _ // __ _____ __ ___ ___ __ _| |_ ___ // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ // \ V V / __/ (_| |\ V /| | (_| | || __/ // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| // // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. // // CONTACT: hello@weaviate.io // package graphqlhelper import ( "encoding/json" "fmt" "strings" "testing" "github.com/go-openapi/runtime" "github.com/stretchr/testify/require" "github.com/weaviate/weaviate/client/graphql" graphql_client "github.com/weaviate/weaviate/client/graphql" "github.com/weaviate/weaviate/entities/models" "github.com/weaviate/weaviate/test/helper" ) type GraphQLResult struct { Result interface{} } // Perform a GraphQL request func QueryGraphQL(t *testing.T, auth runtime.ClientAuthInfoWriterFunc, operation string, query string, variables map[string]interface{}) (*models.GraphQLResponse, error) { var vars interface{} = variables params := graphql_client.NewGraphqlPostParams().WithBody(&models.GraphQLQuery{OperationName: operation, Query: query, Variables: vars}) response, err := helper.Client(t).Graphql.GraphqlPost(params, nil) if err != nil { return nil, err } return response.Payload, nil } // Perform a GraphQL request and call fatal on failure func QueryGraphQLOrFatal(t *testing.T, auth runtime.ClientAuthInfoWriterFunc, operation string, query string, variables map[string]interface{}) *models.GraphQLResponse { response, err := QueryGraphQL(t, auth, operation, query, variables) if err != nil { parsedErr, ok := err.(*graphql.GraphqlPostUnprocessableEntity) if !ok { t.Fatalf("Expected the query to succeed, but failed due to: %#v", err) } t.Fatalf("Expected the query to succeed, but failed with unprocessable entity: %v", parsedErr.Payload.Error[0]) } return response } // Perform a query and assert that it is successful func AssertGraphQL(t *testing.T, auth runtime.ClientAuthInfoWriterFunc, query string) *GraphQLResult { response := QueryGraphQLOrFatal(t, auth, "", query, nil) if len(response.Errors) != 0 { j, _ := json.Marshal(response.Errors) t.Fatal("GraphQL resolved to an error:", string(j)) } data := make(map[string]interface{}) // get rid of models.JSONData for key, value := range response.Data { data[key] = value } return &GraphQLResult{Result: data} } // Perform a query and assert that it has errors func ErrorGraphQL(t *testing.T, auth runtime.ClientAuthInfoWriterFunc, query string) []*models.GraphQLError { response := QueryGraphQLOrFatal(t, auth, "", query, nil) if len(response.Errors) == 0 { j, _ := json.Marshal(response.Errors) t.Fatal("GraphQL resolved to data:", string(j)) } return response.Errors } // Drill down in the result func (g GraphQLResult) Get(paths ...string) *GraphQLResult { current := g.Result for _, path := range paths { var ok bool currentAsMap := (current.(map[string]interface{})) current, ok = currentAsMap[path] if !ok { panic(fmt.Sprintf("Cannot get element %s in %#v; result: %#v", path, paths, g.Result)) } } return &GraphQLResult{ Result: current, } } // Cast the result to a slice func (g *GraphQLResult) AsSlice() []interface{} { return g.Result.([]interface{}) } func Vec2String(v []float32) (s string) { for _, n := range v { s = fmt.Sprintf("%s, %f", s, n) } s = strings.TrimLeft(s, ", ") return fmt.Sprintf("[%s]", s) } func ParseVec(t *testing.T, iVec []interface{}) []float32 { vec := make([]float32, len(iVec)) for i, val := range iVec { parsed, err := val.(json.Number).Float64() require.Nil(t, err) vec[i] = float32(parsed) } return vec }