~rvb/gomaasapi/gomaasapi-bug-1384001

4.2.4 by Jeroen Vermeulen
s/MAASObject/JSONObject/g
1
// Copyright 2013 Canonical Ltd.  This software is licensed under the
2
// GNU Lesser General Public License version 3 (see the file COPYING).
3
4
package gomaasapi
5
6
import (
19.1.2 by Jeroen Vermeulen
Test JSON (de)serialization of JSONObjects.
7
	"encoding/json"
8
	"fmt"
4.2.15 by Jeroen Vermeulen
Import gocheck as .
9
	. "launchpad.net/gocheck"
4.2.4 by Jeroen Vermeulen
s/MAASObject/JSONObject/g
10
)
11
13.2.3 by Raphael Badin
Rename test suites.
12
type JSONObjectSuite struct {
13
}
14
15
var _ = Suite(&JSONObjectSuite{})
16
4.2.4 by Jeroen Vermeulen
s/MAASObject/JSONObject/g
17
// maasify() converts nil.
13.2.3 by Raphael Badin
Rename test suites.
18
func (suite *JSONObjectSuite) TestMaasifyConvertsNil(c *C) {
18.1.2 by Jeroen Vermeulen
Move all JSONObject variations into a single class.
19
	c.Check(maasify(Client{}, nil).IsNil(), Equals, true)
4.2.4 by Jeroen Vermeulen
s/MAASObject/JSONObject/g
20
}
21
22
// maasify() converts strings.
13.2.3 by Raphael Badin
Rename test suites.
23
func (suite *JSONObjectSuite) TestMaasifyConvertsString(c *C) {
4.2.4 by Jeroen Vermeulen
s/MAASObject/JSONObject/g
24
	const text = "Hello"
18.1.1 by Jeroen Vermeulen
Reduce JSONObject tests' reliance on casting.
25
	out, err := maasify(Client{}, text).GetString()
26
	c.Assert(err, IsNil)
27
	c.Check(out, Equals, text)
4.2.4 by Jeroen Vermeulen
s/MAASObject/JSONObject/g
28
}
29
30
// maasify() converts float64 numbers.
13.2.3 by Raphael Badin
Rename test suites.
31
func (suite *JSONObjectSuite) TestMaasifyConvertsNumber(c *C) {
4.2.4 by Jeroen Vermeulen
s/MAASObject/JSONObject/g
32
	const number = 3.1415926535
18.1.1 by Jeroen Vermeulen
Reduce JSONObject tests' reliance on casting.
33
	num, err := maasify(Client{}, number).GetFloat64()
34
	c.Assert(err, IsNil)
35
	c.Check(num, Equals, number)
4.2.4 by Jeroen Vermeulen
s/MAASObject/JSONObject/g
36
}
37
38
// maasify() converts array slices.
13.2.3 by Raphael Badin
Rename test suites.
39
func (suite *JSONObjectSuite) TestMaasifyConvertsArray(c *C) {
4.2.4 by Jeroen Vermeulen
s/MAASObject/JSONObject/g
40
	original := []interface{}{3.0, 2.0, 1.0}
18.1.1 by Jeroen Vermeulen
Reduce JSONObject tests' reliance on casting.
41
	output, err := maasify(Client{}, original).GetArray()
42
	c.Assert(err, IsNil)
4.2.15 by Jeroen Vermeulen
Import gocheck as .
43
	c.Check(len(output), Equals, len(original))
4.2.4 by Jeroen Vermeulen
s/MAASObject/JSONObject/g
44
}
45
4.2.6 by Jeroen Vermeulen
Test that maasified maps and arrays contain JSONObjects.
46
// When maasify() converts an array slice, the result contains JSONObjects.
13.2.3 by Raphael Badin
Rename test suites.
47
func (suite *JSONObjectSuite) TestMaasifyArrayContainsJSONObjects(c *C) {
18.1.1 by Jeroen Vermeulen
Reduce JSONObject tests' reliance on casting.
48
	arr, err := maasify(Client{}, []interface{}{9.9}).GetArray()
49
	c.Assert(err, IsNil)
18.1.4 by Jeroen Vermeulen
Review changes.
50
	var _ JSONObject = arr[0]
18.1.2 by Jeroen Vermeulen
Move all JSONObject variations into a single class.
51
	entry, err := arr[0].GetFloat64()
52
	c.Assert(err, IsNil)
53
	c.Check(entry, Equals, 9.9)
4.2.6 by Jeroen Vermeulen
Test that maasified maps and arrays contain JSONObjects.
54
}
55
4.2.4 by Jeroen Vermeulen
s/MAASObject/JSONObject/g
56
// maasify() converts maps.
13.2.3 by Raphael Badin
Rename test suites.
57
func (suite *JSONObjectSuite) TestMaasifyConvertsMap(c *C) {
4.2.4 by Jeroen Vermeulen
s/MAASObject/JSONObject/g
58
	original := map[string]interface{}{"1": "one", "2": "two", "3": "three"}
18.1.1 by Jeroen Vermeulen
Reduce JSONObject tests' reliance on casting.
59
	output, err := maasify(Client{}, original).GetMap()
60
	c.Assert(err, IsNil)
4.2.15 by Jeroen Vermeulen
Import gocheck as .
61
	c.Check(len(output), Equals, len(original))
4.2.4 by Jeroen Vermeulen
s/MAASObject/JSONObject/g
62
}
63
4.2.6 by Jeroen Vermeulen
Test that maasified maps and arrays contain JSONObjects.
64
// When maasify() converts a map, the result contains JSONObjects.
13.2.3 by Raphael Badin
Rename test suites.
65
func (suite *JSONObjectSuite) TestMaasifyMapContainsJSONObjects(c *C) {
18.1.1 by Jeroen Vermeulen
Reduce JSONObject tests' reliance on casting.
66
	jsonobj := maasify(Client{}, map[string]interface{}{"key": "value"})
67
	mp, err := jsonobj.GetMap()
18.1.4 by Jeroen Vermeulen
Review changes.
68
	var _ JSONObject = mp["key"]
18.1.1 by Jeroen Vermeulen
Reduce JSONObject tests' reliance on casting.
69
	c.Assert(err, IsNil)
18.1.2 by Jeroen Vermeulen
Move all JSONObject variations into a single class.
70
	entry, err := mp["key"].GetString()
71
	c.Check(entry, Equals, "value")
4.2.6 by Jeroen Vermeulen
Test that maasified maps and arrays contain JSONObjects.
72
}
73
4.2.16 by Jeroen Vermeulen
Get rid of the term 'model.' Rename maasModel to jsonMAASObject.
74
// maasify() converts MAAS objects.
13.2.3 by Raphael Badin
Rename test suites.
75
func (suite *JSONObjectSuite) TestMaasifyConvertsMAASObject(c *C) {
4.2.11 by Jeroen Vermeulen
Implement full passing of Client down to MAASModels.
76
	original := map[string]interface{}{
77
		"resource_uri": "http://example.com/foo",
4.2.13 by Jeroen Vermeulen
gofmt.
78
		"size":         "3",
4.2.11 by Jeroen Vermeulen
Implement full passing of Client down to MAASModels.
79
	}
18.1.2 by Jeroen Vermeulen
Move all JSONObject variations into a single class.
80
	obj, err := maasify(Client{}, original).GetMAASObject()
18.1.1 by Jeroen Vermeulen
Reduce JSONObject tests' reliance on casting.
81
	c.Assert(err, IsNil)
18.1.2 by Jeroen Vermeulen
Move all JSONObject variations into a single class.
82
	c.Check(len(obj.GetMap()), Equals, len(original))
83
	size, err := obj.GetMap()["size"].GetString()
18.1.1 by Jeroen Vermeulen
Reduce JSONObject tests' reliance on casting.
84
	c.Assert(err, IsNil)
85
	c.Check(size, Equals, "3")
4.2.11 by Jeroen Vermeulen
Implement full passing of Client down to MAASModels.
86
}
87
8.1.1 by Raphael Badin
Use url.URL and embed the base URL in the client.
88
// maasify() passes its client to a MAASObject it creates.
18.1.1 by Jeroen Vermeulen
Reduce JSONObject tests' reliance on casting.
89
func (suite *JSONObjectSuite) TestMaasifyPassesClientToMAASObject(c *C) {
4.2.18 by Jeroen Vermeulen
Merge trunk. Resolve conflicts, semantic and syntactic.
90
	client := Client{}
7.1.1 by Raphael Badin
Implement POST/PUT/DELETE.
91
	original := map[string]interface{}{"resource_uri": "/foo"}
18.1.1 by Jeroen Vermeulen
Reduce JSONObject tests' reliance on casting.
92
	output, err := maasify(client, original).GetMAASObject()
93
	c.Assert(err, IsNil)
18.1.2 by Jeroen Vermeulen
Move all JSONObject variations into a single class.
94
	c.Check(output.client, Equals, client)
4.2.11 by Jeroen Vermeulen
Implement full passing of Client down to MAASModels.
95
}
96
8.1.1 by Raphael Badin
Use url.URL and embed the base URL in the client.
97
// maasify() passes its client into an array of MAASObjects it creates.
18.1.1 by Jeroen Vermeulen
Reduce JSONObject tests' reliance on casting.
98
func (suite *JSONObjectSuite) TestMaasifyPassesClientIntoArray(c *C) {
4.2.18 by Jeroen Vermeulen
Merge trunk. Resolve conflicts, semantic and syntactic.
99
	client := Client{}
7.1.1 by Raphael Badin
Implement POST/PUT/DELETE.
100
	obj := map[string]interface{}{"resource_uri": "/foo"}
4.2.11 by Jeroen Vermeulen
Implement full passing of Client down to MAASModels.
101
	list := []interface{}{obj}
18.1.1 by Jeroen Vermeulen
Reduce JSONObject tests' reliance on casting.
102
	jsonobj, err := maasify(client, list).GetArray()
103
	c.Assert(err, IsNil)
104
	out, err := jsonobj[0].GetMAASObject()
105
	c.Assert(err, IsNil)
18.1.2 by Jeroen Vermeulen
Move all JSONObject variations into a single class.
106
	c.Check(out.client, Equals, client)
4.2.11 by Jeroen Vermeulen
Implement full passing of Client down to MAASModels.
107
}
108
8.1.1 by Raphael Badin
Use url.URL and embed the base URL in the client.
109
// maasify() passes its client into a map of MAASObjects it creates.
18.1.1 by Jeroen Vermeulen
Reduce JSONObject tests' reliance on casting.
110
func (suite *JSONObjectSuite) TestMaasifyPassesClientIntoMap(c *C) {
4.2.18 by Jeroen Vermeulen
Merge trunk. Resolve conflicts, semantic and syntactic.
111
	client := Client{}
7.1.1 by Raphael Badin
Implement POST/PUT/DELETE.
112
	obj := map[string]interface{}{"resource_uri": "/foo"}
4.2.11 by Jeroen Vermeulen
Implement full passing of Client down to MAASModels.
113
	mp := map[string]interface{}{"key": obj}
18.1.1 by Jeroen Vermeulen
Reduce JSONObject tests' reliance on casting.
114
	jsonobj, err := maasify(client, mp).GetMap()
115
	c.Assert(err, IsNil)
116
	out, err := jsonobj["key"].GetMAASObject()
117
	c.Assert(err, IsNil)
18.1.2 by Jeroen Vermeulen
Move all JSONObject variations into a single class.
118
	c.Check(out.client, Equals, client)
4.2.11 by Jeroen Vermeulen
Implement full passing of Client down to MAASModels.
119
}
120
8.1.1 by Raphael Badin
Use url.URL and embed the base URL in the client.
121
// maasify() passes its client all the way down into any MAASObjects in the
122
// object structure it creates.
18.1.1 by Jeroen Vermeulen
Reduce JSONObject tests' reliance on casting.
123
func (suite *JSONObjectSuite) TestMaasifyPassesClientAllTheWay(c *C) {
4.2.18 by Jeroen Vermeulen
Merge trunk. Resolve conflicts, semantic and syntactic.
124
	client := Client{}
7.1.1 by Raphael Badin
Implement POST/PUT/DELETE.
125
	obj := map[string]interface{}{"resource_uri": "/foo"}
4.2.11 by Jeroen Vermeulen
Implement full passing of Client down to MAASModels.
126
	mp := map[string]interface{}{"key": obj}
127
	list := []interface{}{mp}
18.1.1 by Jeroen Vermeulen
Reduce JSONObject tests' reliance on casting.
128
	jsonobj, err := maasify(client, list).GetArray()
129
	c.Assert(err, IsNil)
130
	outerMap, err := jsonobj[0].GetMap()
131
	c.Assert(err, IsNil)
132
	out, err := outerMap["key"].GetMAASObject()
18.1.2 by Jeroen Vermeulen
Move all JSONObject variations into a single class.
133
	c.Assert(err, IsNil)
134
	c.Check(out.client, Equals, client)
4.2.11 by Jeroen Vermeulen
Implement full passing of Client down to MAASModels.
135
}
136
4.2.4 by Jeroen Vermeulen
s/MAASObject/JSONObject/g
137
// maasify() converts Booleans.
13.2.3 by Raphael Badin
Rename test suites.
138
func (suite *JSONObjectSuite) TestMaasifyConvertsBool(c *C) {
18.1.1 by Jeroen Vermeulen
Reduce JSONObject tests' reliance on casting.
139
	t, err := maasify(Client{}, true).GetBool()
140
	c.Assert(err, IsNil)
141
	f, err := maasify(Client{}, false).GetBool()
142
	c.Assert(err, IsNil)
143
	c.Check(t, Equals, true)
144
	c.Check(f, Equals, false)
4.2.4 by Jeroen Vermeulen
s/MAASObject/JSONObject/g
145
}
4.2.12 by Jeroen Vermeulen
Test conversions.
146
147
// Parse takes you from a JSON blob to a JSONObject.
13.2.3 by Raphael Badin
Rename test suites.
148
func (suite *JSONObjectSuite) TestParseMaasifiesJSONBlob(c *C) {
4.2.12 by Jeroen Vermeulen
Test conversions.
149
	blob := []byte("[12]")
8.1.1 by Raphael Badin
Use url.URL and embed the base URL in the client.
150
	obj, err := Parse(Client{}, blob)
18.1.1 by Jeroen Vermeulen
Reduce JSONObject tests' reliance on casting.
151
	c.Assert(err, IsNil)
152
153
	arr, err := obj.GetArray()
154
	c.Assert(err, IsNil)
155
	out, err := arr[0].GetFloat64()
156
	c.Assert(err, IsNil)
157
	c.Check(out, Equals, 12.0)
4.2.12 by Jeroen Vermeulen
Test conversions.
158
}
159
19.2.5 by Jeroen Vermeulen
Write initial tests.
160
func (suite *JSONObjectSuite) TestParseKeepsBinaryOriginal(c *C) {
161
	blob := []byte(`"Hi"`)
162
163
	obj, err := Parse(Client{}, blob)
164
	c.Assert(err, IsNil)
165
166
	text, err := obj.GetString()
167
	c.Assert(err, IsNil)
168
	c.Check(text, Equals, "Hi")
169
	binary, err := obj.GetBytes()
170
	c.Assert(err, IsNil)
171
	c.Check(binary, DeepEquals, blob)
172
}
173
174
func (suite *JSONObjectSuite) TestParseTreatsInvalidJSONAsBinary(c *C) {
175
	blob := []byte("?x]}y![{z")
176
177
	obj, err := Parse(Client{}, blob)
178
	c.Assert(err, IsNil)
179
180
	c.Check(obj.IsNil(), Equals, false)
181
	c.Check(obj.value, IsNil)
182
	binary, err := obj.GetBytes()
183
	c.Assert(err, IsNil)
184
	c.Check(binary, DeepEquals, blob)
185
}
186
187
func (suite *JSONObjectSuite) TestParseTreatsInvalidUTF8AsBinary(c *C) {
188
	// Arbitrary data that is definitely not UTF-8.
189
	blob := []byte{220, 8, 129}
190
191
	obj, err := Parse(Client{}, blob)
192
	c.Assert(err, IsNil)
193
194
	c.Check(obj.IsNil(), Equals, false)
195
	c.Check(obj.value, IsNil)
196
	binary, err := obj.GetBytes()
197
	c.Assert(err, IsNil)
198
	c.Check(binary, DeepEquals, blob)
199
}
200
201
func (suite *JSONObjectSuite) TestParseTreatsEmptyJSONAsBinary(c *C) {
202
	blob := []byte{}
203
204
	obj, err := Parse(Client{}, blob)
205
	c.Assert(err, IsNil)
206
207
	c.Check(obj.IsNil(), Equals, false)
208
	data, err := obj.GetBytes()
209
	c.Assert(err, IsNil)
210
	c.Check(data, DeepEquals, blob)
211
}
212
19.2.9 by Jeroen Vermeulen
Made nil input a panic instead of an error.
213
func (suite *JSONObjectSuite) TestParsePanicsOnNilJSON(c *C) {
19.2.13 by Jeroen Vermeulen
gofmt.
214
	defer func() {
19.2.9 by Jeroen Vermeulen
Made nil input a panic instead of an error.
215
		failure := recover()
216
		c.Assert(failure, NotNil)
19.2.10 by Jeroen Vermeulen
Panic if Parse() input is nil. Tests: 3 failures.
217
		c.Check(failure.(error).Error(), Matches, ".*nil input")
19.2.9 by Jeroen Vermeulen
Made nil input a panic instead of an error.
218
	}()
219
	Parse(Client{}, nil)
19.2.5 by Jeroen Vermeulen
Write initial tests.
220
}
221
222
func (suite *JSONObjectSuite) TestParseNullProducesIsNil(c *C) {
223
	blob := []byte("null")
224
	obj, err := Parse(Client{}, blob)
225
	c.Assert(err, IsNil)
226
	c.Check(obj.IsNil(), Equals, true)
227
}
228
229
func (suite *JSONObjectSuite) TestParseNonNullProducesNonIsNil(c *C) {
230
	blob := []byte("1")
231
	obj, err := Parse(Client{}, blob)
232
	c.Assert(err, IsNil)
233
	c.Check(obj.IsNil(), Equals, false)
234
}
235
19.2.12 by Jeroen Vermeulen
Keep track of the special JSON-null case. Satisfy tests.
236
func (suite *JSONObjectSuite) TestParseSpacedNullProducesIsNil(c *C) {
237
	blob := []byte("      null     ")
238
	obj, err := Parse(Client{}, blob)
239
	c.Assert(err, IsNil)
240
	c.Check(obj.IsNil(), Equals, true)
241
}
242
4.2.12 by Jeroen Vermeulen
Test conversions.
243
// String-type JSONObjects convert only to string.
13.2.3 by Raphael Badin
Rename test suites.
244
func (suite *JSONObjectSuite) TestConversionsString(c *C) {
18.1.2 by Jeroen Vermeulen
Move all JSONObject variations into a single class.
245
	obj := maasify(Client{}, "Test string")
4.2.12 by Jeroen Vermeulen
Test conversions.
246
247
	value, err := obj.GetString()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
248
	c.Check(err, IsNil)
249
	c.Check(value, Equals, "Test string")
4.2.12 by Jeroen Vermeulen
Test conversions.
250
251
	_, err = obj.GetFloat64()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
252
	c.Check(err, NotNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
253
	_, err = obj.GetMap()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
254
	c.Check(err, NotNil)
4.2.16 by Jeroen Vermeulen
Get rid of the term 'model.' Rename maasModel to jsonMAASObject.
255
	_, err = obj.GetMAASObject()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
256
	c.Check(err, NotNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
257
	_, err = obj.GetArray()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
258
	c.Check(err, NotNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
259
	_, err = obj.GetBool()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
260
	c.Check(err, NotNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
261
}
262
263
// Number-type JSONObjects convert only to float64.
13.2.3 by Raphael Badin
Rename test suites.
264
func (suite *JSONObjectSuite) TestConversionsFloat64(c *C) {
18.1.2 by Jeroen Vermeulen
Move all JSONObject variations into a single class.
265
	obj := maasify(Client{}, 1.1)
4.2.12 by Jeroen Vermeulen
Test conversions.
266
267
	value, err := obj.GetFloat64()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
268
	c.Check(err, IsNil)
269
	c.Check(value, Equals, 1.1)
4.2.12 by Jeroen Vermeulen
Test conversions.
270
271
	_, err = obj.GetString()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
272
	c.Check(err, NotNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
273
	_, err = obj.GetMap()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
274
	c.Check(err, NotNil)
4.2.16 by Jeroen Vermeulen
Get rid of the term 'model.' Rename maasModel to jsonMAASObject.
275
	_, err = obj.GetMAASObject()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
276
	c.Check(err, NotNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
277
	_, err = obj.GetArray()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
278
	c.Check(err, NotNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
279
	_, err = obj.GetBool()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
280
	c.Check(err, NotNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
281
}
282
283
// Map-type JSONObjects convert only to map.
13.2.3 by Raphael Badin
Rename test suites.
284
func (suite *JSONObjectSuite) TestConversionsMap(c *C) {
18.1.2 by Jeroen Vermeulen
Move all JSONObject variations into a single class.
285
	obj := maasify(Client{}, map[string]interface{}{"x": "y"})
4.2.12 by Jeroen Vermeulen
Test conversions.
286
287
	value, err := obj.GetMap()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
288
	c.Check(err, IsNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
289
	text, err := value["x"].GetString()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
290
	c.Check(err, IsNil)
291
	c.Check(text, Equals, "y")
4.2.12 by Jeroen Vermeulen
Test conversions.
292
293
	_, err = obj.GetString()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
294
	c.Check(err, NotNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
295
	_, err = obj.GetFloat64()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
296
	c.Check(err, NotNil)
4.2.16 by Jeroen Vermeulen
Get rid of the term 'model.' Rename maasModel to jsonMAASObject.
297
	_, err = obj.GetMAASObject()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
298
	c.Check(err, NotNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
299
	_, err = obj.GetArray()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
300
	c.Check(err, NotNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
301
	_, err = obj.GetBool()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
302
	c.Check(err, NotNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
303
}
304
305
// Array-type JSONObjects convert only to array.
13.2.3 by Raphael Badin
Rename test suites.
306
func (suite *JSONObjectSuite) TestConversionsArray(c *C) {
18.1.2 by Jeroen Vermeulen
Move all JSONObject variations into a single class.
307
	obj := maasify(Client{}, []interface{}{"item"})
4.2.12 by Jeroen Vermeulen
Test conversions.
308
309
	value, err := obj.GetArray()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
310
	c.Check(err, IsNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
311
	text, err := value[0].GetString()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
312
	c.Check(err, IsNil)
313
	c.Check(text, Equals, "item")
4.2.12 by Jeroen Vermeulen
Test conversions.
314
315
	_, err = obj.GetString()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
316
	c.Check(err, NotNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
317
	_, err = obj.GetFloat64()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
318
	c.Check(err, NotNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
319
	_, err = obj.GetMap()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
320
	c.Check(err, NotNil)
4.2.16 by Jeroen Vermeulen
Get rid of the term 'model.' Rename maasModel to jsonMAASObject.
321
	_, err = obj.GetMAASObject()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
322
	c.Check(err, NotNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
323
	_, err = obj.GetBool()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
324
	c.Check(err, NotNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
325
}
326
4.2.14 by Jeroen Vermeulen
Test model conversions in maasmodel, and test URL.
327
// Boolean-type JSONObjects convert only to bool.
13.2.3 by Raphael Badin
Rename test suites.
328
func (suite *JSONObjectSuite) TestConversionsBool(c *C) {
18.1.2 by Jeroen Vermeulen
Move all JSONObject variations into a single class.
329
	obj := maasify(Client{}, false)
4.2.12 by Jeroen Vermeulen
Test conversions.
330
331
	value, err := obj.GetBool()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
332
	c.Check(err, IsNil)
333
	c.Check(value, Equals, false)
4.2.12 by Jeroen Vermeulen
Test conversions.
334
335
	_, err = obj.GetString()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
336
	c.Check(err, NotNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
337
	_, err = obj.GetFloat64()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
338
	c.Check(err, NotNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
339
	_, err = obj.GetMap()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
340
	c.Check(err, NotNil)
4.2.16 by Jeroen Vermeulen
Get rid of the term 'model.' Rename maasModel to jsonMAASObject.
341
	_, err = obj.GetMAASObject()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
342
	c.Check(err, NotNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
343
	_, err = obj.GetArray()
4.2.15 by Jeroen Vermeulen
Import gocheck as .
344
	c.Check(err, NotNil)
4.2.12 by Jeroen Vermeulen
Test conversions.
345
}
19.1.2 by Jeroen Vermeulen
Test JSON (de)serialization of JSONObjects.
346
347
func (suite *JSONObjectSuite) TestNilSerializesToJSON(c *C) {
348
	output, err := json.Marshal(maasify(Client{}, nil))
349
	c.Assert(err, IsNil)
350
	c.Check(output, DeepEquals, []byte("null"))
351
}
352
19.2.16 by Jeroen Vermeulen
Another review change: test for the empty string.
353
func (suite *JSONObjectSuite) TestEmptyStringSerializesToJSON(c *C) {
354
	output, err := json.Marshal(maasify(Client{}, ""))
355
	c.Assert(err, IsNil)
356
	c.Check(string(output), Equals, `""`)
357
}
358
19.1.2 by Jeroen Vermeulen
Test JSON (de)serialization of JSONObjects.
359
func (suite *JSONObjectSuite) TestStringSerializesToJSON(c *C) {
360
	text := "Text wrapped in JSON"
361
	output, err := json.Marshal(maasify(Client{}, text))
362
	c.Assert(err, IsNil)
363
	c.Check(output, DeepEquals, []byte(fmt.Sprintf(`"%s"`, text)))
364
}
365
366
func (suite *JSONObjectSuite) TestStringIsEscapedInJSON(c *C) {
367
	text := `\"Quote,\" \\backslash, and \'apostrophe\'.`
368
	output, err := json.Marshal(maasify(Client{}, text))
369
	c.Assert(err, IsNil)
370
	var deserialized string
371
	err = json.Unmarshal(output, &deserialized)
372
	c.Assert(err, IsNil)
373
	c.Check(deserialized, Equals, text)
374
}
375
376
func (suite *JSONObjectSuite) TestFloat64SerializesToJSON(c *C) {
377
	number := 3.1415926535
378
	output, err := json.Marshal(maasify(Client{}, number))
379
	c.Assert(err, IsNil)
380
	var deserialized float64
381
	err = json.Unmarshal(output, &deserialized)
382
	c.Assert(err, IsNil)
383
	c.Check(deserialized, Equals, number)
384
}
385
386
func (suite *JSONObjectSuite) TestEmptyMapSerializesToJSON(c *C) {
387
	mp := map[string]interface{}{}
388
	output, err := json.Marshal(maasify(Client{}, mp))
389
	c.Assert(err, IsNil)
390
	var deserialized interface{}
391
	err = json.Unmarshal(output, &deserialized)
392
	c.Assert(err, IsNil)
393
	c.Check(deserialized.(map[string]interface{}), DeepEquals, mp)
394
}
395
396
func (suite *JSONObjectSuite) TestMapSerializesToJSON(c *C) {
397
	// Sample data: counting in Japanese.
398
	mp := map[string]interface{}{"one": "ichi", "two": "nii", "three": "san"}
399
	output, err := json.Marshal(maasify(Client{}, mp))
400
	c.Assert(err, IsNil)
401
	var deserialized interface{}
402
	err = json.Unmarshal(output, &deserialized)
403
	c.Assert(err, IsNil)
404
	c.Check(deserialized.(map[string]interface{}), DeepEquals, mp)
405
}
406
407
func (suite *JSONObjectSuite) TestEmptyArraySerializesToJSON(c *C) {
408
	arr := []interface{}{}
409
	output, err := json.Marshal(maasify(Client{}, arr))
410
	c.Assert(err, IsNil)
411
	var deserialized interface{}
412
	err = json.Unmarshal(output, &deserialized)
413
	c.Assert(err, IsNil)
414
	// The deserialized value is a slice, and it contains no elements.
415
	// Can't do a regular comparison here because at least in the current
416
	// json implementation, an empty list deserializes as a nil slice,
417
	// not as an empty slice!
418
	// (It doesn't work that way for maps though, for some reason).
419
	c.Check(len(deserialized.([]interface{})), Equals, len(arr))
420
}
421
422
func (suite *JSONObjectSuite) TestArrayOfStringsSerializesToJSON(c *C) {
423
	value := "item"
424
	output, err := json.Marshal(maasify(Client{}, []interface{}{value}))
425
	c.Assert(err, IsNil)
426
	var deserialized []string
427
	err = json.Unmarshal(output, &deserialized)
428
	c.Assert(err, IsNil)
429
	c.Check(deserialized, DeepEquals, []string{value})
430
}
431
432
func (suite *JSONObjectSuite) TestArrayOfNumbersSerializesToJSON(c *C) {
433
	value := 9.0
434
	output, err := json.Marshal(maasify(Client{}, []interface{}{value}))
435
	c.Assert(err, IsNil)
436
	var deserialized []float64
437
	err = json.Unmarshal(output, &deserialized)
438
	c.Assert(err, IsNil)
439
	c.Check(deserialized, DeepEquals, []float64{value})
440
}
441
442
func (suite *JSONObjectSuite) TestArrayPreservesOrderInJSON(c *C) {
443
	// Sample data: counting in Korean.
444
	arr := []interface{}{"jong", "il", "ee", "sam"}
445
	output, err := json.Marshal(maasify(Client{}, arr))
446
	c.Assert(err, IsNil)
447
448
	var deserialized []interface{}
449
	err = json.Unmarshal(output, &deserialized)
450
	c.Assert(err, IsNil)
451
	c.Check(deserialized, DeepEquals, arr)
452
}
453
454
func (suite *JSONObjectSuite) TestBoolSerializesToJSON(c *C) {
455
	f, err := json.Marshal(maasify(Client{}, false))
456
	c.Assert(err, IsNil)
457
	t, err := json.Marshal(maasify(Client{}, true))
458
	c.Assert(err, IsNil)
459
460
	c.Check(f, DeepEquals, []byte("false"))
461
	c.Check(t, DeepEquals, []byte("true"))
462
}