Spaces:
Running
Running
// _ _ | |
// __ _____ __ ___ ___ __ _| |_ ___ | |
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
// \ V V / __/ (_| |\ V /| | (_| | || __/ | |
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| | |
// | |
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. | |
// | |
// CONTACT: [email protected] | |
// | |
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 | |
} | |