-
Notifications
You must be signed in to change notification settings - Fork 0
/
client_test.go
166 lines (147 loc) · 3.89 KB
/
client_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
package shopify
import (
"context"
"encoding/json"
"os"
"testing"
"time"
)
var client *Client
func init() {
src := Oauth2StaticTokenSource(
&Oauth2Token{AccessToken: os.Getenv("SHOPIFY_TOKEN")},
)
httpClient := Oauth2NewClient(context.Background(), src)
client = NewClient(os.Getenv("SHOPIFY_SHOP"), httpClient)
client.Debug = os.Getenv("DEBUG") == "1"
}
func TestQuery(t *testing.T) {
const gql = `
query ($n: Int, $cursor: String) { customers(first: $n, after: $cursor) {
pageInfo { hasNextPage }
edges { cursor node { id } }
} }`
var results []struct {
Id string `json:"id"`
}
var cursor string
var hasNextPage bool
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
client.New(gql, "n", 3).WithContext(ctx).MustDo(
&results, "customers.edges.*.node",
&cursor, "customers.edges.*.cursor",
&hasNextPage, "customers.pageInfo.hasNextPage",
)
t.Logf("results: %+v", results)
t.Logf("cursor: %+v", cursor)
t.Logf("hasNextPage: %+v", hasNextPage)
if len(results) != 3 {
t.Errorf("ERROR: length should be %d instead of %d", 3, len(results))
}
if cursor == "" {
t.Error("ERROR: cursor should not be empty")
}
if !hasNextPage {
t.Error("ERROR: it should have next page")
}
}
func TestNull(t *testing.T) {
var resp1 []string
var resp2 []*string
var resp3 string
var resp4 *string
client.New(`query ($ids: [ID!]!) { nodes(ids: $ids) { ...on ProductVariant { id } } }`,
"ids", []string{"gid://shopify/ProductVariant/1"}).
MustDo(
&resp1, "nodes.*.id", &resp2, "nodes.*.id",
&resp3, "nodes.*.id", &resp4, "nodes.*.id",
)
if len(resp1) != 1 {
t.Error("ERROR: length should be 1")
} else {
if resp1[0] != "" {
t.Error("ERROR: string must be empty")
}
}
if len(resp2) != 1 {
t.Error("ERROR: length should be 1")
} else {
if resp2[0] != nil {
t.Error("ERROR: string must be nil")
}
}
if resp3 != "" {
t.Error("ERROR: string must be empty")
}
if resp4 != nil {
t.Error("ERROR: string must be nil")
}
}
func TestMutation(t *testing.T) {
const example = "https://example.com/"
const q = `
query ($query: URL) { scriptTags(first: 10, src: $query) { edges { node { id src } } } }
`
var ids []string
client.New(q, "query", example).MustDo(&ids, "scriptTags.edges.*.node.id")
t.Log("existing ids:", ids)
for _, id := range ids {
deleteScriptTag(t, id)
}
const cm = `
mutation ($input: ScriptTagInput!) { scriptTagCreate(input: $input) {
userErrors { field message } scriptTag { id } } }
`
err := client.New(cm, "input", map[string]string{
"displayScope": "ALL",
"src": "http://test-user-error",
}).Do()
if err == nil || err.Error() != "Source must be secure (HTTPS)" {
t.Error("ERROR: wrong user error returned")
}
var id string
client.New(cm, "input", map[string]string{
"displayScope": "ALL",
"src": "https://example.com",
}).MustDo(&id, "scriptTagCreate.scriptTag.id")
if id == "" {
t.Error("ERROR: id should not be empty")
} else {
t.Log("created", id)
deleteScriptTag(t, id)
}
}
func TestSlice(t *testing.T) {
if toJSON(Slice([]string{"a", "b"})) != `["a","b"]` {
t.Error("incorrect Slice()")
}
if toJSON(Slice([]int{2, 0, 1})) != `[2,0,1]` {
t.Error("incorrect Slice()")
}
}
func TestRemoveZeroValues(t *testing.T) {
if toJSON(RemoveZeroValues([]string{"a", "", "b"})) != `["a","b"]` {
t.Error("incorrect RemoveZeroValues()")
}
if toJSON(RemoveZeroValues([]int{0, 1, 0, 3, 0})) != `[1,3]` {
t.Error("incorrect RemoveZeroValues()")
}
}
func deleteScriptTag(t *testing.T, id string) {
const gql = `
mutation ($id: ID!) { scriptTagDelete(id: $id) {
userErrors { field message } deletedScriptTagId } }
`
var deleted string
client.New(gql, "id", id).MustDo(&deleted, "scriptTagDelete.deletedScriptTagId")
if deleted == id {
t.Log("deleted", id)
} else {
t.Error("ERROR: wrong deleted id")
}
}
func toJSON(i interface{}) string {
b, _ := json.Marshal(i)
return string(b)
}