// _ _ // __ _____ __ ___ ___ __ _| |_ ___ // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ // \ V V / __/ (_| |\ V /| | (_| | || __/ // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| // // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. // // CONTACT: hello@weaviate.io // package test import ( "bytes" "encoding/json" "fmt" "net/http" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/weaviate/weaviate/test/helper" graphqlhelper "github.com/weaviate/weaviate/test/helper/graphql" ) // run by setup_test.go func gettingObjects(t *testing.T) { t.Run("listing cities without references", func(t *testing.T) { result := graphqlhelper.AssertGraphQL(t, helper.RootAuth, "{ Get { City { name } } }") cities := result.Get("Get", "City").AsSlice() expected := []interface{}{ map[string]interface{}{"name": "Amsterdam"}, map[string]interface{}{"name": "Rotterdam"}, map[string]interface{}{"name": "Berlin"}, map[string]interface{}{"name": "Dusseldorf"}, map[string]interface{}{"name": "Missing Island"}, map[string]interface{}{"name": nil}, } assert.ElementsMatch(t, expected, cities) }) t.Run("listing cities with relations", func(t *testing.T) { result := graphqlhelper.AssertGraphQL(t, helper.RootAuth, "{ Get { City { name, inCountry { ... on Country { name } } } } }") cities := result.Get("Get", "City").AsSlice() expected := parseJSONSlice(`[ { "name": "Amsterdam", "inCountry": [{ "name": "Netherlands" }] }, { "name": "Rotterdam", "inCountry": [{ "name": "Netherlands" }] }, { "name": "Berlin", "inCountry": [{ "name": "Germany" }] }, { "name": "Dusseldorf", "inCountry": [{ "name": "Germany" }] }, { "name": "Missing Island", "inCountry": null }, { "name": null, "inCountry": null } ]`) assert.ElementsMatch(t, expected, cities) }) t.Run("make sure raw response contains no error key", func(t *testing.T) { // This test prevents a regression on gh-1535 query := []byte(`{"query":"{ Get { City { name } } }"}`) res, err := http.Post(fmt.Sprintf("%s%s", helper.GetWeaviateURL(), "/v1/graphql"), "application/json", bytes.NewReader(query)) require.Nil(t, err) defer res.Body.Close() var body map[string]interface{} err = json.NewDecoder(res.Body).Decode(&body) require.Nil(t, err) _, ok := body["errors"] assert.False(t, ok) cities := body["data"].(map[string]interface{})["Get"].(map[string]interface{})["City"].([]interface{}) assert.Greater(t, len(cities), 0) }) t.Run("listing cities with limit", func(t *testing.T) { result := graphqlhelper.AssertGraphQL(t, helper.RootAuth, "{ Get { City(limit: 2) { name } } }") cities := result.Get("Get", "City").AsSlice() expected := []interface{}{ map[string]interface{}{"name": "Rotterdam"}, map[string]interface{}{"name": "Dusseldorf"}, } assert.ElementsMatch(t, expected, cities) }) t.Run("listing cities with offset and limit", func(t *testing.T) { result := graphqlhelper.AssertGraphQL(t, helper.RootAuth, "{ Get { City(offset: 2 limit: 2) { name } } }") cities := result.Get("Get", "City").AsSlice() expected := []interface{}{ map[string]interface{}{"name": "Missing Island"}, map[string]interface{}{"name": nil}, } assert.ElementsMatch(t, expected, cities) }) t.Run("listing cities with offset", func(t *testing.T) { result := graphqlhelper.AssertGraphQL(t, helper.RootAuth, "{ Get { City(offset: 2) { name } } }") cities := result.Get("Get", "City").AsSlice() expected := []interface{}{ map[string]interface{}{"name": "Missing Island"}, map[string]interface{}{"name": nil}, map[string]interface{}{"name": "Amsterdam"}, map[string]interface{}{"name": "Berlin"}, } assert.ElementsMatch(t, expected, cities) }) t.Run("listing cities with offset and limit beyond results size", func(t *testing.T) { result := graphqlhelper.AssertGraphQL(t, helper.RootAuth, "{ Get { City(offset: 5 limit: 10) { name } } }") cities := result.Get("Get", "City").AsSlice() expected := []interface{}{ map[string]interface{}{"name": "Berlin"}, } assert.ElementsMatch(t, expected, cities) }) t.Run("listing cities with offset beyond results size", func(t *testing.T) { result := graphqlhelper.AssertGraphQL(t, helper.RootAuth, "{ Get { City(offset: 6) { name } } }") cities := result.Get("Get", "City").AsSlice() expected := []interface{}{} assert.ElementsMatch(t, expected, cities) }) }