Files
go-simple-graphql/query_test.go
T

319 lines
7.1 KiB
Go

package gql
import (
"reflect"
"testing"
)
func (suite *Tests) TestBaseClient_convertToJSON() {
type args struct {
v any
}
tests := []struct {
name string
args args
want []byte
}{
{
name: "TestBaseClient_convertToJSON_query",
args: args{
v: `query { viewer { login } }`,
},
want: []byte(`"query { viewer { login } }"`),
},
{
name: "TestBaseClient_convertToJSON_variables",
args: args{
v: map[string]interface{}{
"login": "lukaszraczylo",
"first": 10,
},
},
want: []byte(`{"first":10,"login":"lukaszraczylo"}`),
},
}
for _, tt := range tests {
suite.T().Run(tt.name, func(t *testing.T) {
b := NewConnection()
if got := b.convertToJSON(tt.args.v); !reflect.DeepEqual(got, tt.want) {
assert.Equal(tt.want, got)
}
})
}
}
func (suite *Tests) TestBaseClient_compileQuery() {
type args struct {
query_partials []any
}
tests := []struct {
wantQ *Query
name string
args args
}{
{
name: "TestBaseClient_compileQuery_query",
args: args{
query_partials: []any{
`query { viewer { login } }`,
},
},
wantQ: &Query{
Query: `query { viewer { login } }`,
JsonQuery: []byte(`{"query":"query { viewer { login } }"}`),
},
},
{
name: "TestBaseClient_compileQuery_with_variables",
args: args{
query_partials: []any{
`query { viewer { login } }`,
map[string]interface{}{
"login": "lukaszraczylo",
"first": 10,
},
},
},
wantQ: &Query{
Query: `query { viewer { login } }`,
Variables: map[string]interface{}{
"login": "lukaszraczylo",
"first": 10,
},
JsonQuery: []byte(`{"variables":{"first":10,"login":"lukaszraczylo"},"query":"query { viewer { login } }"}`),
},
},
{
name: "TestBaseClient_compileQuery_variables_without_query",
args: args{
query_partials: []any{
map[string]interface{}{
"login": "lukaszraczylo",
"first": 10,
},
},
},
wantQ: nil,
},
}
for _, tt := range tests {
suite.T().Run(tt.name, func(t *testing.T) {
b := NewConnection()
got := b.compileQuery(tt.args.query_partials...)
assert.Equal(tt.wantQ, got)
})
}
}
func (suite *Tests) TestBaseClient_Query() {
type args struct {
variables map[string]interface{}
headers map[string]interface{}
query string
}
tests := []struct {
args args
wantReturned_value any
name string
graphQLServer string
wantType string
wantErr bool
}{
{
name: "TestBaseClient_Query_spacex_working",
graphQLServer: "https://spacex-production.up.railway.app/",
args: args{
query: `query Dragons {
dragons {
name
}
}`,
variables: nil,
headers: map[string]interface{}{
"x-apollo-operation-name": "Dragons/github.com/lukaszraczylo/go-simple-graphql",
"content-type": "application/json",
},
},
wantReturned_value: string(`{"dragons":[{"name":"Dragon 1"},{"name":"Dragon 2"}]}`),
wantErr: false,
},
{
name: "TestBaseClient_Query_spacex_invalid_query",
graphQLServer: "https://spacex-production.up.railway.app/",
args: args{
query: `query Dragons {
dragons {
name
}
`,
variables: nil,
headers: map[string]interface{}{
"x-apollo-operation-name": "Dragons/github.com/lukaszraczylo/go-simple-graphql",
"content-type": "application/json",
},
},
wantReturned_value: nil,
wantErr: true,
},
{
name: "TestBaseClient_Query_tgbotapp_working",
graphQLServer: "https://telegram-bot.app/v1/graphql",
args: args{
query: `query {
__type(name: "Query") {
name
}
}`,
},
wantReturned_value: string(`{"__type":null}`),
wantErr: false,
},
{
name: "TestBaseClient_Query_tgbotapp_invalid_query",
graphQLServer: "https://telegram-bot.app/v1/graphql",
args: args{
query: `query {
__type(name: "Query") {
name
}
`,
},
wantReturned_value: nil,
wantErr: true,
},
{
name: "TestBaseClient_Query_tgbotapp_invalid_wrong_field",
graphQLServer: "https://telegram-bot.app/v1/graphql",
args: args{
query: `query {
__type(name: "Query") {
name2
}
}`,
},
wantReturned_value: nil,
wantErr: true,
},
{
name: "TestBaseClient_Query_tgbotapp_wrong_url",
graphQLServer: "https://telegram-bot.app/v0/graphql",
args: args{
query: `query {
__type(name: "Query") {
name
}
}`,
},
wantReturned_value: nil,
wantErr: true,
},
{
name: "TestBaseClient_Query_tgbotapp_valid_query_mapstring",
graphQLServer: "https://telegram-bot.app/v1/graphql",
wantType: "mapstring",
args: args{
query: `query {
__type(name: "Query") {
name
}
}`,
},
wantReturned_value: map[string]interface{}{"__type": nil},
wantErr: false,
},
{
name: "TestBaseClient_Query_tgbotapp_valid_query_byte",
graphQLServer: "https://telegram-bot.app/v1/graphql",
wantType: "byte",
args: args{
query: `query {
__type(name: "Query") {
name
}
}`,
},
wantReturned_value: []byte(`{"__type":null}`),
wantErr: false,
},
{
name: "TestBaseClient_Query_tgbotapp_valid_query_string",
graphQLServer: "https://telegram-bot.app/v1/graphql",
wantType: "string",
args: args{
query: `query {
__type(name: "Query") {
name
}
}`,
},
wantReturned_value: string(`{"__type":null}`),
wantErr: false,
},
{
name: "TestBaseClient_Query_tgbotapp_valid_query_invalid_type",
graphQLServer: "https://telegram-bot.app/v1/graphql",
wantType: "potato",
args: args{
query: `query {
__type(name: "Query") {
name
}
}`,
},
wantReturned_value: nil,
wantErr: true,
},
{
name: "TestBaseClient_Query_tgbotapp_valid_query_cache",
graphQLServer: "https://telegram-bot.app/v1/graphql",
args: args{
query: `query {
__type(name: "Query") {
name
}
}`,
variables: map[string]interface{}{
"gqlcache": true,
},
},
wantReturned_value: string(`{"__type":null}`),
wantErr: false,
},
{
name: "TestBaseClient_Query_tgbotapp_valid_query_with_retry",
graphQLServer: "https://telegram-bot.app/v0/graphql",
wantType: "byte",
args: args{
query: `query {
__type(name: "Query") {
name
}
}`,
variables: map[string]interface{}{
"gqlretries": true,
},
},
wantReturned_value: nil,
wantErr: true,
},
}
for _, tt := range tests {
suite.T().Run(tt.name, func(t *testing.T) {
b := NewConnection()
if tt.graphQLServer != "" {
b.SetEndpoint(tt.graphQLServer)
}
if tt.wantType != "" {
b.SetOutput(tt.wantType)
}
gotReturned_value, err := b.Query(tt.args.query, tt.args.variables, tt.args.headers)
if tt.wantErr {
assert.Error(err)
} else {
assert.NoError(err)
}
assert.Equal(tt.wantReturned_value, gotReturned_value)
})
}
}