Spaces:
Running
Running
// _ _ | |
// __ _____ __ ___ ___ __ _| |_ ___ | |
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
// \ V V / __/ (_| |\ V /| | (_| | || __/ | |
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| | |
// | |
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. | |
// | |
// CONTACT: [email protected] | |
// | |
package batch_request_endpoints | |
// TODO: These tests add little value, they only test one specific error case, | |
// but don't test any happy path at all. This should probably be removed or | |
// fixed. However, they do at least assure that the order of return values matches | |
// the order of input values. | |
// Acceptance tests for the batch GraphQL endpoint | |
// There is a helper struct called GraphQLResult that helps to navigate through the output, | |
// a query generator and a few helper functions to access the GraphQL endpoint. | |
// See the end of this file for more details on how those work. | |
import ( | |
"fmt" | |
"testing" | |
"github.com/stretchr/testify/assert" | |
graphql_client "github.com/weaviate/weaviate/client/graphql" | |
"github.com/weaviate/weaviate/entities/models" | |
"github.com/weaviate/weaviate/test/helper" | |
) | |
// TODO: change this test to simulate a successful query response when the test dataset is implemented. | |
// Check if batch results are returned in the correct order by comparing result equality to predefined outcomes. | |
// This includes testing whether individual requests and the batch request are handled correctly | |
func gqlResultsOrder(t *testing.T) { | |
queryOneName := "testQuery" | |
queryTwoName := "testQuery2" | |
expectedResult := "Syntax Error GraphQL request (1:1) Unexpected Name \"%s\"\n\n1: %s\n ^\n" | |
// perform the query | |
gqlResponse, err := queryBatchEndpoint(t, nil) | |
if err != nil { | |
t.Fatalf("The returned schema is not an JSON object: %v", err) | |
} | |
// check if the batch response contains two batched responses | |
assert.Equal(t, 2, len(gqlResponse)) | |
// check if the error message matches the expected outcome (and are therefore returned in the correct order) | |
if len(gqlResponse) == 2 { | |
responseOne := gqlResponse[0].Errors[0].Message | |
responseTwo := gqlResponse[1].Errors[0].Message | |
fullExpectedOutcomeOne := fmt.Sprintf(expectedResult, queryOneName, queryOneName) | |
assert.Equal(t, fullExpectedOutcomeOne, responseOne) | |
fullExpectedOutcomeTwo := fmt.Sprintf(expectedResult, queryTwoName, queryTwoName) | |
assert.Equal(t, fullExpectedOutcomeTwo, responseTwo) | |
} | |
} | |
func gqlMalformedRequest(t *testing.T) { | |
vars := []int{1, 2, 3} | |
expectedResult := "422: expected map[string]interface{}, received %v" | |
// perform the query | |
gqlResponse, err := queryBatchEndpoint(t, vars) | |
if err != nil { | |
t.Fatalf("The returned schema is not an JSON object: %v", err) | |
} | |
// check if the batch response contains two batched responses | |
assert.Equal(t, 2, len(gqlResponse)) | |
fullExpectedOutcome := fmt.Sprintf(expectedResult, vars) | |
assert.Equal(t, fullExpectedOutcome, gqlResponse[0].Errors[0].Message) | |
assert.Equal(t, fullExpectedOutcome, gqlResponse[1].Errors[0].Message) | |
} | |
// Helper functions | |
// TODO: change this to a successful query when the test dataset is implemented. Make sure to implement a query returning 3 or more elements. | |
// Perform a batch GraphQL query | |
func queryBatchEndpoint(t *testing.T, vars interface{}) (models.GraphQLResponses, error) { | |
query1 := &models.GraphQLQuery{OperationName: "testQuery", Query: "testQuery", Variables: vars} | |
query2 := &models.GraphQLQuery{OperationName: "testQuery2", Query: "testQuery2", Variables: vars} | |
queries := models.GraphQLQueries{query1, query2} | |
params := graphql_client.NewGraphqlBatchParams().WithBody(queries) | |
response, err := helper.Client(t).Graphql.GraphqlBatch(params, nil) | |
if err != nil { | |
return nil, err | |
} | |
return response.Payload, nil | |
} | |