diff options
author | Martin Polden <mpolden@mpolden.no> | 2023-02-03 15:20:23 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2023-02-03 15:35:25 +0100 |
commit | e1e94812425a487069bf33f781bec987e9e49874 (patch) | |
tree | 4a892c3b5c0a7dee2cb76f9971e538cb4aba8a16 /client/go/internal/cli/cmd/query_test.go | |
parent | a08ae588d6035b69f0961dff596fc871fd1c4e58 (diff) |
Re-organize Go code
Diffstat (limited to 'client/go/internal/cli/cmd/query_test.go')
-rw-r--r-- | client/go/internal/cli/cmd/query_test.go | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/client/go/internal/cli/cmd/query_test.go b/client/go/internal/cli/cmd/query_test.go new file mode 100644 index 00000000000..94b5a485b9d --- /dev/null +++ b/client/go/internal/cli/cmd/query_test.go @@ -0,0 +1,115 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// query command tests +// Author: bratseth + +package cmd + +import ( + "strconv" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/vespa-engine/vespa/client/go/internal/mock" +) + +func TestQuery(t *testing.T) { + assertQuery(t, + "?timeout=10s&yql=select+from+sources+%2A+where+title+contains+%27foo%27", + "select from sources * where title contains 'foo'") +} + +func TestQueryVerbose(t *testing.T) { + client := &mock.HTTPClient{} + client.NextResponseString(200, "{\"query\":\"result\"}") + + cli, stdout, stderr := newTestCLI(t) + cli.httpClient = client + + assert.Nil(t, cli.Run("query", "-v", "select from sources * where title contains 'foo'")) + assert.Equal(t, "curl http://127.0.0.1:8080/search/\\?timeout=10s\\&yql=select+from+sources+%2A+where+title+contains+%27foo%27\n", stderr.String()) + assert.Equal(t, "{\n \"query\": \"result\"\n}\n", stdout.String()) +} + +func TestQueryNonJsonResult(t *testing.T) { + assertQuery(t, + "?timeout=10s&yql=select+from+sources+%2A+where+title+contains+%27foo%27", + "select from sources * where title contains 'foo'") +} + +func TestQueryWithMultipleParameters(t *testing.T) { + assertQuery(t, + "?hits=5&timeout=20s&yql=select+from+sources+%2A+where+title+contains+%27foo%27+and+year+%3D+2000", + "select from sources * where title contains 'foo' and year = 2000", "hits=5", "timeout=20s") +} + +func TestQueryWithEquals(t *testing.T) { + assertQuery(t, + "?timeout=10s&yql=SELECT+from+sources+%2A+where+title+contains+%27foo%27+and+year+%3D+2000", + "SELECT from sources * where title contains 'foo' and year = 2000") +} + +func TestQuerySelect(t *testing.T) { + assertQuery(t, + "?hits=5&select=%7B%22select%22%3A%7B%22where%22%3A%7B%22contains%22%3A%5B%22title%22%2C%22a%22%5D%7D%7D%7D&timeout=10s", + `select={"select":{"where":{"contains":["title","a"]}}}`, "hits=5") +} + +func TestQueryWithExplicitYqlParameter(t *testing.T) { + assertQuery(t, + "?timeout=10s&yql=select+from+sources+%2A+where+title+contains+%27foo%27", + "yql=select from sources * where title contains 'foo'") +} + +func TestIllegalQuery(t *testing.T) { + assertQueryError(t, 401, "query error message") +} + +func TestServerError(t *testing.T) { + assertQueryServiceError(t, 501, "server error message") +} + +func assertQuery(t *testing.T, expectedQuery string, query ...string) { + client := &mock.HTTPClient{} + client.NextResponseString(200, "{\"query\":\"result\"}") + cli, stdout, _ := newTestCLI(t) + cli.httpClient = client + + args := []string{"query"} + assert.Nil(t, cli.Run(append(args, query...)...)) + assert.Equal(t, + "{\n \"query\": \"result\"\n}\n", + stdout.String(), + "query output") + queryURL, err := queryServiceURL(client) + require.Nil(t, err) + assert.Equal(t, queryURL+"/search/"+expectedQuery, client.LastRequest.URL.String()) +} + +func assertQueryError(t *testing.T, status int, errorMessage string) { + client := &mock.HTTPClient{} + client.NextResponseString(status, errorMessage) + cli, _, stderr := newTestCLI(t) + cli.httpClient = client + assert.NotNil(t, cli.Run("query", "yql=select from sources * where title contains 'foo'")) + assert.Equal(t, + "Error: invalid query: Status "+strconv.Itoa(status)+"\n"+errorMessage+"\n", + stderr.String(), + "error output") +} + +func assertQueryServiceError(t *testing.T, status int, errorMessage string) { + client := &mock.HTTPClient{} + client.NextResponseString(status, errorMessage) + cli, _, stderr := newTestCLI(t) + cli.httpClient = client + assert.NotNil(t, cli.Run("query", "yql=select from sources * where title contains 'foo'")) + assert.Equal(t, + "Error: Status "+strconv.Itoa(status)+" from container at 127.0.0.1:8080\n"+errorMessage+"\n", + stderr.String(), + "error output") +} + +func queryServiceURL(client *mock.HTTPClient) (string, error) { + return "http://127.0.0.1:8080", nil +} |