KevinStephenson
Adding in weaviate code
b110593
raw
history blame
3.78 kB
// _ _
// __ _____ __ ___ ___ __ _| |_ ___
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
// \ 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
}