smugmug 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. data/HISTORY +2 -0
  2. data/LICENSE +19 -0
  3. data/MANIFEST +48 -0
  4. data/README +30 -0
  5. data/Rakefile +100 -0
  6. data/bin/smcli +225 -0
  7. data/bin/smugmug2sql +158 -0
  8. data/doc/API +310 -0
  9. data/doc/TODO +32 -0
  10. data/lib/net/httpz.rb +31 -0
  11. data/lib/smugmug.rb +179 -0
  12. data/lib/smugmug/album/info.rb +131 -0
  13. data/lib/smugmug/album/stats.rb +31 -0
  14. data/lib/smugmug/albums.rb +39 -0
  15. data/lib/smugmug/base.rb +104 -0
  16. data/lib/smugmug/cache.rb +33 -0
  17. data/lib/smugmug/config.rb +48 -0
  18. data/lib/smugmug/image/exif.rb +72 -0
  19. data/lib/smugmug/image/info.rb +88 -0
  20. data/lib/smugmug/image/stats.rb +32 -0
  21. data/lib/smugmug/images.rb +52 -0
  22. data/lib/smugmug/table.rb +133 -0
  23. data/lib/smugmug/util.rb +12 -0
  24. data/test/album.rb +359 -0
  25. data/test/config.rb +39 -0
  26. data/test/httpz.rb +120 -0
  27. data/test/image.rb +540 -0
  28. data/test/login.rb +24 -0
  29. data/test/runner.rb +83 -0
  30. data/test/servlet.rb +257 -0
  31. data/test/table.rb +113 -0
  32. data/xml/canned +212 -0
  33. data/xml/fail/empty.set.xml +4 -0
  34. data/xml/fail/invalid.apikey.xml +4 -0
  35. data/xml/fail/invalid.login.xml +4 -0
  36. data/xml/fail/invalid.method.xml +4 -0
  37. data/xml/fail/invalid.user.xml +4 -0
  38. data/xml/fail/system.error.xml +4 -0
  39. data/xml/standard/albums.get.xml +24 -0
  40. data/xml/standard/albums.getInfo.xml +38 -0
  41. data/xml/standard/albums.getStats.xml +43 -0
  42. data/xml/standard/categories.get.xml +213 -0
  43. data/xml/standard/images.get.xml +9 -0
  44. data/xml/standard/images.getEXIF.xml +34 -0
  45. data/xml/standard/images.getInfo.xml +29 -0
  46. data/xml/standard/images.getStats.xml +15 -0
  47. data/xml/standard/login.withHash.xml +7 -0
  48. data/xml/standard/login.withPassword.xml +10 -0
  49. metadata +103 -0
data/test/config.rb ADDED
@@ -0,0 +1,39 @@
1
+ # -*- ruby -*-
2
+ # $Hg$
3
+
4
+ require 'test/unit'
5
+ require 'smugmug/config'
6
+
7
+ class TC_Config < Test::Unit::TestCase
8
+
9
+ def setup
10
+ @config = SmugMug::Config.new
11
+ end
12
+
13
+ def teardown
14
+ File.unlink(ENV['SMUGMUG_RC'])
15
+ end
16
+
17
+ def test_default
18
+ # setters
19
+ @config.AccountType = 'Standard'
20
+ @config.EmailAddress = 'foo@example.net'
21
+ @config.PasswordHash = 'feedface'
22
+ @config.UserID = '1234'
23
+
24
+ assert(!File.exists?(ENV['SMUGMUG_RC']))
25
+ # save
26
+ @config.save
27
+ assert(File.exists?(ENV['SMUGMUG_RC']))
28
+
29
+ # getters
30
+ assert_equal('Standard', @config.AccountType)
31
+ assert_equal('foo@example.net', @config.EmailAddress)
32
+ assert_equal('feedface', @config.PasswordHash)
33
+ assert_equal('1234', @config.UserID)
34
+
35
+ # restore
36
+ restore = SmugMug::Config.new
37
+ assert_equal('Standard', restore.AccountType)
38
+ end
39
+ end
data/test/httpz.rb ADDED
@@ -0,0 +1,120 @@
1
+ # -*- Mode: ruby; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2
+ # $Hg$
3
+ #
4
+ # The idea/code for this test came from a soap4r unit test.
5
+
6
+ require 'test/unit'
7
+ require 'webrick'
8
+ require 'net/httpz'
9
+ require 'stringio'
10
+ require 'zlib'
11
+
12
+ class TC_HTTPZ < Test::Unit::TestCase
13
+ HOST = '127.0.0.1'
14
+ PORT = 45554
15
+ PORT_GZ = 45555
16
+ DATA = 'the quick brown fox jumps over the lazy dog'
17
+
18
+ def setup
19
+ setup_server
20
+ setup_server_gz
21
+ setup_client
22
+ setup_client_gz
23
+ end
24
+
25
+ def teardown
26
+ teardown_server
27
+ teardown_server_gz
28
+ end
29
+
30
+ def _setup_server(port, proc)
31
+ server = WEBrick::HTTPServer.new(
32
+ :BindAddress => HOST,
33
+ :Port => port,
34
+ :Logger => WEBrick::Log.new(StringIO.new, 0),
35
+ :AccessLog => [],
36
+ :DocumentRoot => File.dirname(File.expand_path(__FILE__))
37
+ )
38
+ server.mount(
39
+ '/',
40
+ WEBrick::HTTPServlet::ProcHandler.new(proc)
41
+ )
42
+ server_thread = Thread.new{
43
+ Thread.current.abort_on_exception = true
44
+ server.start
45
+ }
46
+ return server, server_thread
47
+ end
48
+
49
+ ## setup/teardown #####################
50
+
51
+ def setup_server
52
+ @server, @server_thread = _setup_server(PORT, method(:do_server_proc).to_proc)
53
+ end
54
+
55
+ def teardown_server
56
+ @server.shutdown
57
+ @server_thread.kill
58
+ @server_thread.join
59
+ end
60
+
61
+ def setup_client
62
+ @client = Net::HTTP.new(HOST, PORT)
63
+ end
64
+
65
+ def do_server_proc(req, res)
66
+ assert_not_nil(req['Accept-Encoding'])
67
+ assert_equal('identity', req['Accept-Encoding'])
68
+ res['Content-Encoding'] = 'identity'
69
+ res.body = DATA
70
+ end
71
+
72
+ ## setup/teardown (gz) #####################
73
+
74
+ def setup_server_gz
75
+ @server_gz, @server_thread_gz = _setup_server(PORT_GZ, method(:do_server_proc_gz).to_proc)
76
+ end
77
+
78
+ def teardown_server_gz
79
+ @server_gz.shutdown
80
+ @server_thread_gz.kill
81
+ @server_thread_gz.join
82
+ end
83
+
84
+ def setup_client_gz
85
+ @client_gz = Net::HTTP.new(HOST, PORT_GZ)
86
+ end
87
+
88
+ def do_server_proc_gz(req, res)
89
+ assert_not_nil(req['Accept-Encoding'])
90
+ assert_equal('gzip', req['Accept-Encoding'])
91
+ res['Content-Encoding'] = 'gzip'
92
+
93
+ s = ''
94
+ gz = Zlib::GzipWriter.new(StringIO.new(s))
95
+ gz.write(DATA)
96
+ gz.close()
97
+
98
+ res.body = s
99
+ end
100
+
101
+ ## tests ################################
102
+
103
+ def _http_get(client, type)
104
+ client.start {
105
+ response = client.get('/', {'Accept-Encoding' => type})
106
+ assert_equal(200, response.code.to_i)
107
+ assert_not_nil(response['Content-Encoding'])
108
+ assert_equal(type, response['Content-Encoding'])
109
+ assert_equal(DATA, response.body)
110
+ }
111
+ end
112
+
113
+ def test_http_get
114
+ _http_get(@client, 'identity')
115
+ end
116
+
117
+ def test_http_get_gz
118
+ _http_get(@client_gz, 'gzip')
119
+ end
120
+ end
data/test/image.rb ADDED
@@ -0,0 +1,540 @@
1
+ # -*- Mode: ruby; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2
+ # $Hg: image.rb,v 7ee85ec830b2 2007/08/11 07:39:15 boumenot $
3
+
4
+ require 'test/unit'
5
+ require 'smugmug'
6
+ require 'smugmug/albums'
7
+ require 'smugmug/album/info'
8
+ require 'smugmug/images'
9
+ require 'smugmug/image/exif'
10
+ require 'smugmug/image/info'
11
+ require 'smugmug/image/stats'
12
+
13
+ class TC_ImageInfo < Test::Unit::TestCase
14
+ def setup
15
+ $smugmug.each do |album|
16
+ @album = album
17
+ album.each do |image|
18
+ @image = image
19
+ end
20
+ end
21
+ end
22
+
23
+ def teardown
24
+ end
25
+
26
+ ## tests
27
+
28
+ def test_method
29
+ assert('smugmug.images.getInfo', @image.method)
30
+ end
31
+
32
+ def test_image_append
33
+ start = 1001
34
+ $smugmug.each do |album|
35
+ album.each do |image|
36
+ assert_equal(start, image.image_id)
37
+ start += 1
38
+ end
39
+ break
40
+ end
41
+ end
42
+
43
+ ## ----------
44
+ ## dynamic accessors (method_missing)
45
+
46
+ ## Fixnum ################################################
47
+
48
+
49
+ def test_AlbumID
50
+ val = @image.AlbumID
51
+ assert_kind_of(Fixnum, val)
52
+ assert_kind_of(Fixnum, @image.album_id)
53
+ assert_equal(1001, val)
54
+ assert_equal(val, @image.album_id)
55
+ end
56
+
57
+ def test_Height
58
+ val = @image.Height
59
+ assert_kind_of(Fixnum, val)
60
+ assert_kind_of(Fixnum, @image.height)
61
+ assert_equal(2304, val)
62
+ assert_equal(val, @image.height)
63
+ end
64
+
65
+ def test_ImageID
66
+ val = @image.ImageID
67
+ assert_kind_of(Fixnum, val)
68
+ assert_kind_of(Fixnum, @image.image_id)
69
+ assert_equal(1001, val)
70
+ assert_equal(val, @image.image_id)
71
+ end
72
+
73
+ def test_Position
74
+ val = @image.Position
75
+ assert_kind_of(Fixnum, val)
76
+ assert_kind_of(Fixnum, @image.position)
77
+ assert_equal(1, val)
78
+ assert_equal(val, @image.position)
79
+ end
80
+
81
+ def test_Serial
82
+ val = @image.Serial
83
+ assert_kind_of(Fixnum, val)
84
+ assert_kind_of(Fixnum, @image.serial)
85
+ assert_equal(0, val)
86
+ assert_equal(val, @image.serial)
87
+ end
88
+
89
+ def test_Size
90
+ val = @image.Size
91
+ assert_kind_of(Fixnum, val)
92
+ assert_kind_of(Fixnum, @image.size)
93
+ assert_equal(2250102, val)
94
+ assert_equal(val, @image.size)
95
+ end
96
+
97
+ def test_Watermark
98
+ val = @image.Watermark
99
+ assert_kind_of(Fixnum, val)
100
+ assert_kind_of(Fixnum, @image.watermark)
101
+ assert_equal(0, val)
102
+ assert_equal(val, @image.watermark)
103
+ end
104
+
105
+ def test_Width
106
+ val = @image.Width
107
+ assert_kind_of(Fixnum, val)
108
+ assert_kind_of(Fixnum, @image.width)
109
+ assert_equal(3072, val)
110
+ assert_equal(val, @image.width)
111
+ end
112
+
113
+ ## String ################################################
114
+
115
+ def test_AlbumURL
116
+ val = @image.AlbumURL
117
+ assert_kind_of(String, val)
118
+ assert_kind_of(String, @image.album_url)
119
+ assert_equal('http://example.smugmug.com/gallery/1001/1/1001', val)
120
+ assert_equal(val, @image.album_url)
121
+ end
122
+
123
+ def test_Caption
124
+ val = @image.Caption
125
+ assert_kind_of(String, val)
126
+ assert_kind_of(String, @image.caption)
127
+ assert_equal('caption', val)
128
+ assert_equal(val, @image.caption)
129
+ end
130
+
131
+ def test_Date
132
+ val = @image.Date
133
+ assert_kind_of(String, val)
134
+ assert_kind_of(String, @image.date)
135
+ assert_equal('1970-01-01 00:00:00', val)
136
+ assert_equal(val, @image.date)
137
+ end
138
+
139
+ def test_FileName
140
+ val = @image.FileName
141
+ assert_kind_of(String, val)
142
+ assert_kind_of(String, @image.file_name)
143
+ assert_equal('example.JPG', val)
144
+ assert_equal(val, @image.file_name)
145
+ end
146
+
147
+ def test_Format
148
+ val = @image.Format
149
+ assert_kind_of(String, val)
150
+ assert_kind_of(String, @image.format)
151
+ assert_equal('JPG', val)
152
+ assert_equal(val, @image.format)
153
+ end
154
+
155
+ def test_Keywords
156
+ val = @image.Keywords
157
+ assert_kind_of(String, val)
158
+ assert_kind_of(String, @image.keywords)
159
+ assert_equal('keywords', val)
160
+ assert_equal(val, @image.keywords)
161
+ end
162
+
163
+ def test_LargeURL
164
+ val = @image.LargeURL
165
+ assert_kind_of(String, val)
166
+ assert_kind_of(String, @image.large_url)
167
+ assert_equal('http://example.smugmug.com/photos/1001-L.jpg', val)
168
+ assert_equal(val, @image.large_url)
169
+ end
170
+
171
+ def test_LastUpdated
172
+ val = @image.LastUpdated
173
+ assert_kind_of(String, val)
174
+ assert_kind_of(String, @image.last_updated)
175
+ assert_equal('1970-01-01 00:00:00', val)
176
+ assert_equal(val, @image.last_updated)
177
+ end
178
+
179
+ def test_MD5Sum
180
+ val = @image.MD5Sum
181
+ assert_kind_of(String, val)
182
+ assert_kind_of(String, @image.md5_sum)
183
+ assert_equal('06a22c22b8984c07b91992bc891fe2d6', val)
184
+ assert_equal(val, @image.md5_sum)
185
+ end
186
+
187
+ def test_MediumURL
188
+ val = @image.MediumURL
189
+ assert_kind_of(String, val)
190
+ assert_kind_of(String, @image.medium_url)
191
+ assert_equal('http://example.smugmug.com/photos/1001-M.jpg', val)
192
+ assert_equal(val, @image.medium_url)
193
+ end
194
+
195
+ def test_OriginalURL
196
+ val = @image.OriginalURL
197
+ assert_kind_of(String, val)
198
+ assert_kind_of(String, @image.original_url)
199
+ assert_equal('http://example.smugmug.com/photos/1001-O.jpg', val)
200
+ assert_equal(val, @image.original_url)
201
+ end
202
+
203
+ def test_SmallURL
204
+ val = @image.SmallURL
205
+ assert_kind_of(String, val)
206
+ assert_kind_of(String, @image.small_url)
207
+ assert_equal('http://example.smugmug.com/photos/1001-S.jpg', val)
208
+ assert_equal(val, @image.small_url)
209
+ end
210
+
211
+ def test_ThumbURL
212
+ val = @image.ThumbURL
213
+ assert_kind_of(String, val)
214
+ assert_kind_of(String, @image.thumb_url)
215
+ assert_equal('http://example.smugmug.com/photos/1001-Th.jpg', val)
216
+ assert_equal(val, @image.thumb_url)
217
+ end
218
+
219
+ def test_TinyURL
220
+ val = @image.TinyURL
221
+ assert_kind_of(String, val)
222
+ assert_kind_of(String, @image.tiny_url)
223
+ assert_equal('http://example.smugmug.com/photos/1001-Ti.jpg', val)
224
+ assert_equal(val, @image.tiny_url)
225
+ end
226
+ end
227
+
228
+ class TC_ImageEXIF < Test::Unit::TestCase
229
+ def setup
230
+ $smugmug.each do |album|
231
+ album.each do |image|
232
+ @exif = image.exif
233
+ end
234
+ end
235
+ end
236
+
237
+ def teardown
238
+ end
239
+
240
+ ## tests
241
+
242
+ def test_method
243
+ assert_equal('smugmug.images.getEXIF', @exif.method)
244
+ end
245
+
246
+ ## ----------
247
+ ## dynamic accessors (method_missing)
248
+
249
+ ## Fixnum ################################################
250
+
251
+ def test_ISO
252
+ val = @exif.ISO
253
+ assert_kind_of(Fixnum, val)
254
+ assert_kind_of(Fixnum, @exif.iso)
255
+ assert_equal(400, val)
256
+ assert_equal(val, @exif.iso)
257
+ end
258
+
259
+ def test_Flash
260
+ val = @exif.Flash
261
+ assert_kind_of(Fixnum, val)
262
+ assert_kind_of(Fixnum, @exif.flash)
263
+ assert_equal(89, val)
264
+ assert_equal(val, @exif.flash)
265
+ end
266
+
267
+ def test_Metering
268
+ val = @exif.Metering
269
+ assert_kind_of(Fixnum, val)
270
+ assert_kind_of(Fixnum, @exif.metering)
271
+ assert_equal(761, val)
272
+ assert_equal(val, @exif.metering)
273
+ end
274
+
275
+ def test_ExposureProgram
276
+ val = @exif.ExposureProgram
277
+ assert_kind_of(Fixnum, val)
278
+ assert_kind_of(Fixnum, @exif.exposure_program)
279
+ assert_equal(100, val)
280
+ assert_equal(val, @exif.exposure_program)
281
+ end
282
+
283
+ def test_ExposureMode
284
+ val = @exif.ExposureMode
285
+ assert_kind_of(Fixnum, val)
286
+ assert_kind_of(Fixnum, @exif.exposure_mode)
287
+ assert_equal(0, val)
288
+ assert_equal(val, @exif.exposure_mode)
289
+ end
290
+
291
+ def test_LightSource
292
+ val = @exif.LightSource
293
+ assert_kind_of(Fixnum, val)
294
+ assert_kind_of(Fixnum, @exif.light_source)
295
+ assert_equal(505, val)
296
+ assert_equal(val, @exif.light_source)
297
+ end
298
+
299
+ def test_WhiteBalance
300
+ val = @exif.WhiteBalance
301
+ assert_kind_of(Fixnum, val)
302
+ assert_kind_of(Fixnum, @exif.white_balance)
303
+ assert_equal(0, val)
304
+ assert_equal(val, @exif.white_balance)
305
+ end
306
+
307
+ def test_Contrast
308
+ assert_nil(@exif.Contrast)
309
+ assert_kind_of(NilClass, @exif.Contrast)
310
+ assert_kind_of(NilClass, @exif.contrast)
311
+ end
312
+
313
+ def test_Saturation
314
+ val = @exif.Saturation
315
+ assert_kind_of(Fixnum, val)
316
+ assert_kind_of(Fixnum, @exif.saturation)
317
+ assert_equal(1001, val)
318
+ assert_equal(val, @exif.saturation)
319
+ end
320
+
321
+ def test_Sharpness
322
+ val = @exif.Sharpness
323
+ assert_kind_of(Fixnum, val)
324
+ assert_kind_of(Fixnum, @exif.sharpness)
325
+ assert_equal(1001, val)
326
+ assert_equal(val, @exif.sharpness)
327
+ end
328
+
329
+ def test_SensingMethod
330
+ val = @exif.SensingMethod
331
+ assert_kind_of(Fixnum, val)
332
+ assert_kind_of(Fixnum, @exif.sensing_method)
333
+ assert_equal(2, val)
334
+ assert_equal(val, @exif.sensing_method)
335
+ end
336
+
337
+ ## String ################################################
338
+
339
+ def test_DateTime
340
+ val = @exif.DateTime
341
+ assert_kind_of(String, val)
342
+ assert_kind_of(String, @exif.date_time)
343
+ assert_equal('1970-01-01 00:00:00', val)
344
+ assert_equal(val, @exif.date_time)
345
+ end
346
+
347
+ def test_DateTimeOriginal
348
+ val = @exif.DateTimeOriginal
349
+ assert_kind_of(String, val)
350
+ assert_kind_of(String, @exif.date_time_original)
351
+ assert_equal('1970-01-01 00:00:00', val)
352
+ assert_equal(val, @exif.date_time_original)
353
+ end
354
+
355
+ def test_DateTimeDigitized
356
+ val = @exif.DateTimeDigitized
357
+ assert_kind_of(String, val)
358
+ assert_kind_of(String, @exif.date_time_digitized)
359
+ assert_equal('1970-01-01 00:00:00', val)
360
+ assert_equal(val, @exif.date_time_digitized)
361
+ end
362
+
363
+ def test_Make
364
+ val = @exif.Make
365
+ assert_kind_of(String, val)
366
+ assert_kind_of(String, @exif.make)
367
+ assert_equal('Canon', val)
368
+ assert_equal(val, @exif.make)
369
+ end
370
+
371
+ def test_Model
372
+ val = @exif.Model
373
+ assert_kind_of(String, val)
374
+ assert_kind_of(String, @exif.model)
375
+ assert_equal('Canon PowerShot SD500', val)
376
+ assert_equal(val, @exif.model)
377
+ end
378
+
379
+ def test_ExposureTime
380
+ val = @exif.ExposureTime
381
+ assert_kind_of(String, val)
382
+ assert_kind_of(String, @exif.exposure_time)
383
+ assert_equal('1/60', val)
384
+ assert_equal(val, @exif.exposure_time)
385
+ end
386
+
387
+ def test_Aperture
388
+ val = @exif.Aperture
389
+ assert_kind_of(String, val)
390
+ assert_kind_of(String, @exif.aperture)
391
+ assert_equal('f/2.8', val)
392
+ assert_equal(val, @exif.aperture)
393
+ end
394
+
395
+ def test_FocalLength
396
+ val = @exif.FocalLength
397
+ assert_kind_of(String, val)
398
+ assert_kind_of(String, @exif.focal_length)
399
+ assert_equal('7700/1000', val)
400
+ assert_equal(val, @exif.focal_length)
401
+ end
402
+
403
+ def test_FocalLength35mmFilm
404
+ val = @exif.FocalLength35mmFilm
405
+ assert_kind_of(String, val)
406
+ assert_kind_of(String, @exif.focal_length35mm_film)
407
+ assert_equal('focallength35mmfilm', val)
408
+ assert_equal(val, @exif.focal_length35mm_film)
409
+ end
410
+
411
+ def test_CCDWidth
412
+ val = @exif.CCDWidth
413
+ assert_kind_of(String, val)
414
+ assert_kind_of(String, @exif.ccdwidth)
415
+ assert_equal('7mm', val)
416
+ assert_equal(val, @exif.ccdwidth)
417
+ end
418
+
419
+ def test_CompressedBitsPerPixel
420
+ val = @exif.CompressedBitsPerPixel
421
+ assert_kind_of(String, val)
422
+ assert_kind_of(String, @exif.compressed_bits_per_pixel)
423
+ assert_equal('5/1', val)
424
+ assert_equal(val, @exif.compressed_bits_per_pixel)
425
+ end
426
+
427
+ def test_ExposureBiasValue
428
+ val = @exif.ExposureBiasValue
429
+ assert_kind_of(String, val)
430
+ assert_kind_of(String, @exif.exposure_bias_value)
431
+ assert_equal('0/3', val)
432
+ assert_equal(val, @exif.exposure_bias_value)
433
+ end
434
+
435
+ def test_DigitalZoomRatio
436
+ val = @exif.DigitalZoomRatio
437
+ assert_kind_of(String, val)
438
+ assert_kind_of(String, @exif.digital_zoom_ratio)
439
+ assert_equal('3072/3072', val)
440
+ assert_equal(val, @exif.digital_zoom_ratio)
441
+ end
442
+
443
+ def test_SubjectDistance
444
+ val = @exif.SubjectDistance
445
+ assert_kind_of(String, val)
446
+ assert_kind_of(String, @exif.subject_distance)
447
+ assert_equal('subjectdistance', val)
448
+ assert_equal(val, @exif.subject_distance)
449
+ end
450
+
451
+ def test_SubjectDistanceRange
452
+ assert_nil(@exif.SubjectDistanceRange)
453
+ assert_kind_of(NilClass, @exif.SubjectDistanceRange)
454
+ assert_kind_of(NilClass, @exif.subject_distance_range)
455
+ end
456
+
457
+ def test_ColorSpace
458
+ val = @exif.ColorSpace
459
+ assert_kind_of(String, val)
460
+ assert_kind_of(String, @exif.color_space)
461
+ assert_equal('1', val)
462
+ assert_equal(val, @exif.color_space)
463
+ end
464
+ def test_Brightness
465
+ val = @exif.Brightness
466
+ assert_kind_of(String, val)
467
+ assert_kind_of(String, @exif.brightness)
468
+ assert_equal('brightness', val)
469
+ assert_equal(val, @exif.brightness)
470
+ end
471
+ end
472
+
473
+ class TC_ImageStats < Test::Unit::TestCase
474
+ def setup
475
+ $smugmug.each do |album|
476
+ album.each do |image|
477
+ @stats = image.stats
478
+ end
479
+ end
480
+ end
481
+
482
+ def teardown
483
+ end
484
+
485
+ ## tests
486
+
487
+ def test_method
488
+ assert_equal('smugmug.images.getStats', @stats.method)
489
+ end
490
+
491
+ def test_bytes
492
+ assert_kind_of(Fixnum, @stats.bytes)
493
+ assert_equal(83593, @stats.bytes)
494
+ assert_kind_of(Fixnum, @stats.Bytes)
495
+ assert_equal(83593, @stats.Bytes)
496
+ end
497
+
498
+ def test_medium
499
+ assert_kind_of(Fixnum, @stats.medium)
500
+ assert_equal(1, @stats.medium)
501
+ assert_kind_of(Fixnum, @stats.Medium)
502
+ assert_equal(1, @stats.Medium)
503
+ end
504
+
505
+ def test_original
506
+ assert_kind_of(Float, @stats.original)
507
+ assert_equal(0, @stats.original)
508
+ assert_kind_of(Float, @stats.original)
509
+ assert_equal(0, @stats.original)
510
+ end
511
+
512
+ def test_small
513
+ assert_kind_of(Fixnum, @stats.small)
514
+ assert_equal(0, @stats.small)
515
+ assert_kind_of(Fixnum, @stats.Small)
516
+ assert_equal(0, @stats.Small)
517
+ end
518
+
519
+ ## XXX: should I support this?
520
+ # def test_status
521
+ # assert_kind_of(String, @stats.status)
522
+ # assert_equal('Open', @stats.status)
523
+ # assert_kind_of(String, @stats.Status)
524
+ # assert_equal('Open', @stats.Status)
525
+ # end
526
+
527
+ def test_thumb
528
+ assert_kind_of(Fixnum, @stats.thumb)
529
+ assert_equal(0, @stats.thumb)
530
+ assert_kind_of(Fixnum, @stats.Thumb)
531
+ assert_equal(0, @stats.Thumb)
532
+ end
533
+
534
+ def test_tiny
535
+ assert_kind_of(Fixnum, @stats.tiny)
536
+ assert_equal(1, @stats.tiny)
537
+ assert_kind_of(Fixnum, @stats.Tiny)
538
+ assert_equal(1, @stats.Tiny)
539
+ end
540
+ end