ideaoforder-www-delicious 0.2.0

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/CHANGELOG.rdoc +46 -0
  2. data/Manifest +49 -0
  3. data/README.rdoc +209 -0
  4. data/Rakefile +55 -0
  5. data/lib/www/delicious/bundle.rb +73 -0
  6. data/lib/www/delicious/element.rb +73 -0
  7. data/lib/www/delicious/errors.rb +46 -0
  8. data/lib/www/delicious/post.rb +123 -0
  9. data/lib/www/delicious/tag.rb +101 -0
  10. data/lib/www/delicious/version.rb +29 -0
  11. data/lib/www/delicious.rb +949 -0
  12. data/setup.rb +1585 -0
  13. data/test/fixtures/net_response_invalid_account.yml +25 -0
  14. data/test/fixtures/net_response_success.yml +23 -0
  15. data/test/helper.rb +49 -0
  16. data/test/test_all.rb +18 -0
  17. data/test/test_offline.rb +18 -0
  18. data/test/test_online.rb +20 -0
  19. data/test/testcases/element/bundle.xml +1 -0
  20. data/test/testcases/element/invalid_root.xml +2 -0
  21. data/test/testcases/element/post.xml +2 -0
  22. data/test/testcases/element/post_unshared.xml +2 -0
  23. data/test/testcases/element/tag.xml +1 -0
  24. data/test/testcases/response/bundles_all.xml +5 -0
  25. data/test/testcases/response/bundles_all_empty.xml +2 -0
  26. data/test/testcases/response/bundles_delete.xml +2 -0
  27. data/test/testcases/response/bundles_set.xml +2 -0
  28. data/test/testcases/response/bundles_set_error.xml +2 -0
  29. data/test/testcases/response/posts_add.xml +2 -0
  30. data/test/testcases/response/posts_all.xml +12 -0
  31. data/test/testcases/response/posts_dates.xml +14 -0
  32. data/test/testcases/response/posts_dates_with_tag.xml +14 -0
  33. data/test/testcases/response/posts_delete.xml +2 -0
  34. data/test/testcases/response/posts_get.xml +7 -0
  35. data/test/testcases/response/posts_get_with_tag.xml +6 -0
  36. data/test/testcases/response/posts_recent.xml +19 -0
  37. data/test/testcases/response/posts_recent_with_tag.xml +19 -0
  38. data/test/testcases/response/tags_get.xml +5 -0
  39. data/test/testcases/response/tags_get_empty.xml +2 -0
  40. data/test/testcases/response/tags_rename.xml +2 -0
  41. data/test/testcases/response/update.delicious1.xml +2 -0
  42. data/test/testcases/response/update.xml +3 -0
  43. data/test/unit/bundle_test.rb +63 -0
  44. data/test/unit/delicious_test.rb +369 -0
  45. data/test/unit/online/online_test.rb +148 -0
  46. data/test/unit/post_test.rb +68 -0
  47. data/test/unit/tag_test.rb +69 -0
  48. data/www-delicious.gemspec +146 -0
  49. metadata +143 -0
@@ -0,0 +1,369 @@
1
+ #
2
+ # = WWW::Delicious
3
+ #
4
+ # Ruby client for del.icio.us API.
5
+ #
6
+ #
7
+ # Category:: WWW
8
+ # Package:: WWW::Delicious
9
+ # Author:: Simone Carletti <weppos@weppos.net>
10
+ # License:: MIT License
11
+ #
12
+ #--
13
+ # SVN: $Id$
14
+ #++
15
+
16
+
17
+ require File.dirname(__FILE__) + '/../helper'
18
+
19
+
20
+ class DeliciousTest < Test::Unit::TestCase
21
+
22
+ TEST_USERNAME = 'username'
23
+ TEST_PASSWORD = 'password'
24
+
25
+
26
+ def setup
27
+ @delicious = instance
28
+ end
29
+
30
+
31
+ def test_initialize_raises_without_account
32
+ assert_raise(ArgumentError) { WWW::Delicious.new() }
33
+ assert_raise(ArgumentError) { WWW::Delicious.new(TEST_USERNAME) }
34
+ end
35
+
36
+ def test_initialize_account
37
+ assert_equal(TEST_USERNAME, @delicious.username)
38
+ assert_equal(TEST_PASSWORD, @delicious.password)
39
+ end
40
+
41
+ def test_initialize_option_user_agent
42
+ useragent = 'MyClass/1.0 (Foo/Bar +http://foo.com/)'
43
+ delicious = instance(:user_agent => useragent)
44
+ assert_equal(useragent, delicious.user_agent)
45
+ end
46
+
47
+ def test_initialize_option_user_agent_default
48
+ useragent = instance.user_agent
49
+ assert_match("Ruby/#{RUBY_VERSION}", useragent)
50
+ assert_match("#{WWW::Delicious::NAME}/#{WWW::Delicious::VERSION}", useragent)
51
+ end
52
+
53
+ def test_initialize_option_base_uri
54
+ base_uri = 'https://ma.gnolia.com/api/mirrord'
55
+ delicious = instance(:base_uri => base_uri)
56
+ assert_equal(URI.parse(base_uri), delicious.base_uri)
57
+ end
58
+
59
+ def test_initialize_option_base_uri_default
60
+ base_uri = instance.base_uri
61
+ assert_equal(URI.parse('https://api.del.icio.us'), base_uri)
62
+ end
63
+
64
+
65
+ # =========================================================================
66
+ # HTTP Request common checks
67
+ # =========================================================================
68
+
69
+ def test_request_raises_without_http_client
70
+ @delicious.http_client = nil
71
+ assert_raise(WWW::Delicious::Error) { @delicious.update }
72
+ end
73
+
74
+ def test_request_waits_necessary_time_between_requests
75
+ @delicious.expects(:make_request).times(4).returns(load_fixture('/net_response_success.yml'))
76
+ @delicious.valid_account? # 1st request
77
+ 3.times do |time|
78
+ lr = @delicious.instance_variable_get(:@last_request)
79
+ @delicious.valid_account? # N request
80
+ nr = @delicious.instance_variable_get(:@last_request)
81
+ assert((nr - lr) > WWW::Delicious::SECONDS_BEFORE_NEW_REQUEST)
82
+ end
83
+ end
84
+
85
+
86
+ def test_valid_account
87
+ @delicious.expects(:make_request).once.returns(load_fixture('/net_response_success.yml'))
88
+ assert(@delicious.valid_account?)
89
+ end
90
+
91
+ def test_invalid_account
92
+ @delicious.expects(:make_request).once.returns(load_fixture('/net_response_invalid_account.yml'))
93
+ assert(!@delicious.valid_account?)
94
+ end
95
+
96
+
97
+ # =========================================================================
98
+ # Update
99
+ # =========================================================================
100
+
101
+ def test_update
102
+ @delicious.expects(:request).once.returns(mock_response('/response/update.xml'))
103
+ assert_equal(@delicious.update, Time.parse("2008-08-02T11:55:35Z"))
104
+ end
105
+
106
+ def test_update_raises_without_update_root_node
107
+ @delicious.expects(:request).once.returns(mock_response('/response/bundles_all.xml'))
108
+ error = assert_raise(WWW::Delicious::ResponseError) do
109
+ @delicious.update
110
+ end
111
+ assert_match(/`update`/, error.message)
112
+ end
113
+
114
+ def test_update_delicious1
115
+ @delicious.expects(:request).once.returns(mock_response('/response/update.delicious1.xml'))
116
+ assert_equal(@delicious.update, Time.parse("2008-03-12T08:41:20Z"))
117
+ end
118
+
119
+
120
+ # =========================================================================
121
+ # Bundles
122
+ # =========================================================================
123
+
124
+ def test_bundles_all
125
+ @delicious.expects(:request).once.returns(mock_response('/response/bundles_all.xml'))
126
+ expected = [ ['music', %w(ipod mp3 music)], ['pc', %w(computer software hardware)] ]
127
+
128
+ results = @delicious.bundles_all
129
+ assert_instance_of(Array, results)
130
+ assert_equal(2, results.length)
131
+
132
+ results.each_with_index do |bundle, index|
133
+ assert_instance_of(WWW::Delicious::Bundle, bundle)
134
+ name, tags = expected[index]
135
+ assert_equal(name, bundle.name)
136
+ assert_equal(tags, bundle.tags)
137
+ end
138
+ end
139
+
140
+ def test_bundles_all_empty
141
+ @delicious.expects(:request).once.returns(mock_response('/response/bundles_all_empty.xml'))
142
+ results = @delicious.bundles_all
143
+ assert_instance_of(Array, results)
144
+ assert_equal(0, results.length)
145
+ end
146
+
147
+ def test_bundles_all_raises_without_bundles_root_node
148
+ @delicious.expects(:request).once.returns(mock_response('/response/update.xml'))
149
+ error = assert_raise(WWW::Delicious::ResponseError) do
150
+ @delicious.bundles_all
151
+ end
152
+ assert_match(/`bundles`/, error.message)
153
+ end
154
+
155
+
156
+ def test_bundles_set
157
+ @delicious.expects(:request).once.returns(mock_response('/response/bundles_set.xml'))
158
+ assert(@delicious.bundles_set('name', %w(foo bar)))
159
+ end
160
+
161
+ def test_bundles_set_raises_with_response_error
162
+ @delicious.expects(:request).once.returns(mock_response('/response/bundles_set_error.xml'))
163
+ error = assert_raise(WWW::Delicious::Error) do
164
+ @delicious.bundles_set('name', %w(foo bar))
165
+ end
166
+ assert_match(/you must supply a bundle name/, error.message)
167
+ end
168
+
169
+ def test_bundles_set_raises_without_result_root_node
170
+ @delicious.expects(:request).once.returns(mock_response('/response/update.xml'))
171
+ error = assert_raise(WWW::Delicious::ResponseError) do
172
+ @delicious.bundles_set('name', %w(foo bar))
173
+ end
174
+ assert_match(/`result`/, error.message)
175
+ end
176
+
177
+
178
+ def test_bundles_delete
179
+ @delicious.expects(:request).once.returns(mock_response('/response/bundles_delete.xml'))
180
+ assert(@delicious.bundles_delete('name'))
181
+ end
182
+
183
+ def test_bundles_delete_raises_without_result_root_node
184
+ @delicious.expects(:request).once.returns(mock_response('/response/update.xml'))
185
+ error = assert_raise(WWW::Delicious::ResponseError) do
186
+ @delicious.bundles_delete('name')
187
+ end
188
+ assert_match(/`result`/, error.message)
189
+ end
190
+
191
+
192
+ # =========================================================================
193
+ # Tags
194
+ # =========================================================================
195
+
196
+ def test_tags_get
197
+ @delicious.expects(:request).once.returns(mock_response('/response/tags_get.xml'))
198
+ expected = [ ['activedesktop', 1], ['business', 14] ]
199
+
200
+ results = @delicious.tags_get
201
+ assert_instance_of(Array, results)
202
+ assert_equal(2, results.length)
203
+
204
+ results.each_with_index do |tag, index|
205
+ assert_instance_of(WWW::Delicious::Tag, tag)
206
+ name, count = expected[index]
207
+ assert_equal(name, tag.name)
208
+ assert_equal(count, tag.count)
209
+ end
210
+ end
211
+
212
+ def test_tags_get_empty
213
+ @delicious.expects(:request).once.returns(mock_response('/response/tags_get_empty.xml'))
214
+ results = @delicious.tags_get
215
+ assert_instance_of(Array, results)
216
+ assert_equal(0, results.length)
217
+ end
218
+
219
+ def test_tags_get_raises_without_bundles_root_node
220
+ @delicious.expects(:request).once.returns(mock_response('/response/update.xml'))
221
+ error = assert_raise(WWW::Delicious::ResponseError) do
222
+ @delicious.tags_get
223
+ end
224
+ assert_match(/`tags`/, error.message)
225
+ end
226
+
227
+
228
+ def test_tags_rename
229
+ @delicious.expects(:request).once.returns(mock_response('/response/tags_rename.xml'))
230
+ assert(@delicious.tags_rename('old', 'new'))
231
+ end
232
+
233
+ def test_tags_rename_raises_without_result_root_node
234
+ @delicious.expects(:request).once.returns(mock_response('/response/update.xml'))
235
+ error = assert_raise(WWW::Delicious::ResponseError) do
236
+ @delicious.tags_rename('foo', 'bar')
237
+ end
238
+ assert_match(/`result`/, error.message)
239
+ end
240
+
241
+
242
+ # =========================================================================
243
+ # Posts
244
+ # =========================================================================
245
+
246
+ def test_posts_get
247
+ @delicious.expects(:request).once.returns(mock_response('/response/posts_get.xml'))
248
+ results = @delicious.posts_get
249
+ assert_instance_of(Array, results)
250
+ assert_equal(3, results.length)
251
+ assert_equal('New to Git? — GitHub', results.first.title)
252
+ assert_equal('.c( whytheluckystiff )o. -- The Fully Upturned Bin', results.last.title)
253
+ end
254
+
255
+ def test_posts_get_raises_without_posts_root_node
256
+ @delicious.expects(:request).once.returns(mock_response('/response/update.xml'))
257
+ error = assert_raise(WWW::Delicious::ResponseError) do
258
+ @delicious.posts_get
259
+ end
260
+ assert_match(/`posts`/, error.message)
261
+ end
262
+
263
+
264
+ def test_posts_recent
265
+ @delicious.expects(:request).once.returns(mock_response('/response/posts_recent.xml'))
266
+ results = @delicious.posts_recent
267
+ assert_instance_of(Array, results)
268
+ assert_equal(15, results.length)
269
+ assert_equal('New to Git? — GitHub', results.first.title)
270
+ assert_equal('RichText | Lightview for modal dialogs on Rails', results.last.title)
271
+ end
272
+
273
+ def test_posts_recent_raises_without_posts_root_node
274
+ @delicious.expects(:request).once.returns(mock_response('/response/update.xml'))
275
+ error = assert_raise(WWW::Delicious::ResponseError) do
276
+ @delicious.posts_recent
277
+ end
278
+ assert_match(/`posts`/, error.message)
279
+ end
280
+
281
+
282
+ def test_posts_all
283
+ @delicious.expects(:request).once.returns(mock_response('/response/posts_all.xml'))
284
+ results = @delicious.posts_all
285
+ assert_instance_of(Array, results)
286
+ assert_equal(8, results.length)
287
+ assert_equal('New to Git? — GitHub', results.first.title)
288
+ assert_equal('ASP 101 - Object Oriented ASP: Using Classes in Classic ASP', results.last.title)
289
+ end
290
+
291
+ def test_posts_all_raises_without_posts_root_node
292
+ @delicious.expects(:request).once.returns(mock_response('/response/update.xml'))
293
+ error = assert_raise(WWW::Delicious::ResponseError) do
294
+ @delicious.posts_all
295
+ end
296
+ assert_match(/`posts`/, error.message)
297
+ end
298
+
299
+
300
+ def test_posts_dates
301
+ @delicious.expects(:request).once.returns(mock_response('/response/posts_dates.xml'))
302
+ results = @delicious.posts_dates
303
+ assert_instance_of(Hash, results)
304
+ assert_equal(10, results.length)
305
+ end
306
+
307
+ def test_posts_dates_raises_without_dates_root_node
308
+ @delicious.expects(:request).once.returns(mock_response('/response/update.xml'))
309
+ error = assert_raise(WWW::Delicious::ResponseError) do
310
+ @delicious.posts_dates
311
+ end
312
+ assert_match(/`dates`/, error.message)
313
+ end
314
+
315
+
316
+ def test_posts_add
317
+ params = {:url => 'http://localhost', :title => 'Just a test'}
318
+ @delicious.expects(:request).times(2).returns(mock_response('/response/posts_add.xml'))
319
+ assert(@delicious.posts_add(WWW::Delicious::Post.new(params)))
320
+ assert(@delicious.posts_add(params))
321
+ end
322
+
323
+
324
+ def test_posts_delete
325
+ @delicious.expects(:request).once.returns(mock_response('/response/posts_delete.xml'))
326
+ assert(@delicious.posts_delete('test'))
327
+ end
328
+
329
+ def test_posts_delete_raises_without_result_root_node
330
+ @delicious.expects(:request).once.returns(mock_response('/response/update.xml'))
331
+ error = assert_raise(WWW::Delicious::ResponseError) do
332
+ @delicious.posts_delete('test')
333
+ end
334
+ assert_match(/`result`/, error.message)
335
+ end
336
+
337
+
338
+
339
+ protected
340
+
341
+ # returns a stub instance
342
+ def instance(options = {}, &block)
343
+ WWW::Delicious.new(TEST_USERNAME, TEST_PASSWORD, options, &block)
344
+ end
345
+
346
+ def load_testcase(file)
347
+ File.read(TESTCASES_PATH + file)
348
+ end
349
+
350
+ def load_fixture(file)
351
+ YAML.load(File.read(FIXTURES_PATH + file))
352
+ end
353
+
354
+ def mock_response(file_or_content)
355
+ content = case
356
+ when file_or_content =~ /\.xml$/
357
+ load_testcase(file_or_content)
358
+ when file_or_content =~ /\.yml$/
359
+ load_fixture(file_or_content)
360
+ else
361
+ file_or_content.to_s
362
+ end
363
+
364
+ response = mock()
365
+ response.expects(:body).at_least(1).returns(content)
366
+ response
367
+ end
368
+
369
+ end
@@ -0,0 +1,148 @@
1
+ #
2
+ # = WWW::Delicious
3
+ #
4
+ # Ruby client for del.icio.us API.
5
+ #
6
+ #
7
+ # Category:: WWW
8
+ # Package:: WWW::Delicious
9
+ # Author:: Simone Carletti <weppos@weppos.net>
10
+ # License:: MIT License
11
+ #
12
+ #--
13
+ # SVN: $Id$
14
+ #++
15
+
16
+
17
+ require File.dirname(__FILE__) + '/../../helper'
18
+
19
+
20
+ # overwrite if file is called alone
21
+ RUN_ONLINE_TESTS = ($0 == __FILE__) unless defined? RUN_ONLINE_TESTS and RUN_ONLINE_TESTS
22
+
23
+ puts "Online test #{__FILE__} skipped.\n" +
24
+ "Use `ONLINE=1` to run online tests.\n" unless RUN_ONLINE_TESTS
25
+
26
+
27
+ class OnlineTest < Test::Unit::TestCase
28
+
29
+ def setup
30
+ init_account
31
+ end
32
+
33
+
34
+ def test_update
35
+ response = @delicious.update
36
+ assert_instance_of(Time, response)
37
+ end
38
+
39
+
40
+ def test_bundles_all
41
+ response = @delicious.bundles_all
42
+ assert_kind_of(Array, response)
43
+
44
+ response.each do |bundle|
45
+ assert_instance_of(WWW::Delicious::Bundle, bundle)
46
+ assert_instance_of(Array, bundle.tags)
47
+ assert_not_nil(bundle.name)
48
+ end
49
+ end
50
+
51
+ def test_bundles_set
52
+ bundle = WWW::Delicious::Bundle.new(:name => 'test_bundle', :tags => %w(ruby python).sort)
53
+ assert_nothing_raised() { @delicious.bundles_set(bundle) }
54
+ end
55
+
56
+ def test_bundles_delete
57
+ bundle = WWW::Delicious::Bundle.new(:name => 'test_bundle')
58
+ assert_nothing_raised() { @delicious.bundles_delete(bundle) }
59
+ end
60
+
61
+
62
+ def test_tags_get
63
+ response = @delicious.tags_get
64
+ assert_kind_of(Array, response)
65
+
66
+ response.each do |tag|
67
+ assert_instance_of(WWW::Delicious::Tag, tag)
68
+ assert_not_nil(tag.name)
69
+ assert_not_nil(tag.count)
70
+ end
71
+ end
72
+
73
+ def test_tags_rename
74
+ ftag = WWW::Delicious::Tag.new(:name => 'old_tag')
75
+ otag = WWW::Delicious::Tag.new(:name => 'new_tag')
76
+ assert_nothing_raised() { @delicious.tags_rename(ftag, otag) }
77
+ end
78
+
79
+
80
+ def test_post_add
81
+ # TODO
82
+ end
83
+
84
+ def test_post_all
85
+ response = @delicious.posts_get
86
+ assert_kind_of(Array, response)
87
+
88
+ response.each do |post|
89
+ assert_kind_of(WWW::Delicious::Post, post)
90
+ end
91
+ end
92
+
93
+ def test_post_dates
94
+ response = @delicious.posts_dates
95
+ assert_kind_of(Hash, response)
96
+
97
+ response.each do |item, value|
98
+ assert_match(/[\d]{4}-[\d]{2}-[\d]{2}/, item)
99
+ assert_match(/[\d]+/, value.to_s)
100
+ end
101
+ end
102
+
103
+ def test_post_delete
104
+ # TODO
105
+ end
106
+
107
+ def test_posts_get
108
+ response = @delicious.posts_get
109
+ assert_kind_of(Array, response)
110
+
111
+ response.each do |post|
112
+ assert_kind_of(WWW::Delicious::Post, post)
113
+ end
114
+ end
115
+
116
+ def test_posts_recent
117
+ response = @delicious.posts_recent
118
+ assert_kind_of(Array, response)
119
+
120
+ response.each do |post|
121
+ assert_kind_of(WWW::Delicious::Post, post)
122
+ end
123
+ end
124
+
125
+
126
+ protected
127
+
128
+ def init_account(options = {}, &block)
129
+ @delicious_username ||= ENV['DELICIOUS_USERNAME'] || self.class.prompt('Delicious Username') { |value| abort('Value cannot be blank') if value.blank?; value }
130
+ @delicious_password ||= ENV['DELICIOUS_PASSWORD'] || self.class.prompt('Delicious Password') { |value| abort('Value cannot be blank') if value.blank?; value }
131
+ @delicious = WWW::Delicious.new(@delicious_username, @delicious_password, options, &block)
132
+ end
133
+
134
+ # Convenient method for collecting user input
135
+ def self.prompt(text, options = {}, &block)
136
+ default = options[:default] || ''
137
+ value = nil
138
+ while value.blank?
139
+ print "#{text} [#{default}]: "
140
+ value = STDIN.gets.chomp!
141
+ value = default if value.blank?
142
+ value = yield value if block_given?
143
+ value
144
+ end
145
+ value
146
+ end
147
+
148
+ end if RUN_ONLINE_TESTS
@@ -0,0 +1,68 @@
1
+ #
2
+ # = WWW::Delicious
3
+ #
4
+ # Ruby client for del.icio.us API.
5
+ #
6
+ #
7
+ # Category:: WWW
8
+ # Package:: WWW::Delicious
9
+ # Author:: Simone Carletti <weppos@weppos.net>
10
+ # License:: MIT License
11
+ #
12
+ #--
13
+ # SVN: $Id$
14
+ #++
15
+
16
+
17
+ require File.dirname(__FILE__) + '/../helper'
18
+ require 'www/delicious/post'
19
+
20
+
21
+ class PostTest < Test::Unit::TestCase
22
+
23
+ def test_post
24
+ expected = { :title => 'JavaScript DOM reference', :url => URI.parse('http://www.howtocreate.co.uk/tutorials/texterise.php?dom=1') }
25
+ assert_attributes(instance(expected), expected)
26
+ end
27
+
28
+ def test_post_shared_defaults_to_true
29
+ assert(instance(:title => 'Foo').shared)
30
+ end
31
+
32
+ def test_post_shared_is_false
33
+ assert(!instance(:title => 'Foo', :shared => false).shared)
34
+ end
35
+
36
+ def test_post_from_rexml
37
+ dom = REXML::Document.new(File.read(TESTCASES_PATH + '/element/post.xml'))
38
+ element = WWW::Delicious::Post.from_rexml(dom.root)
39
+
40
+ assert_equal(URI.parse('http://www.howtocreate.co.uk/tutorials/texterise.php?dom=1'), element.url)
41
+ assert_equal("JavaScript DOM reference", element.title)
42
+ assert_equal("dom reference", element.notes)
43
+ assert_equal("c0238dc0c44f07daedd9a1fd9bbdeebd", element.uid)
44
+ assert_equal(55, element.others)
45
+ assert_equal(%w(dom javascript webdev), element.tags)
46
+ assert_equal(Time.parse("2005-11-28T05:26:09Z"), element.time)
47
+ end
48
+
49
+ def test_post_from_rexml_not_shared
50
+ dom = REXML::Document.new(File.read(TESTCASES_PATH + '/element/post_unshared.xml'))
51
+ element = WWW::Delicious::Post.from_rexml(dom.root)
52
+
53
+ assert(!element.shared)
54
+ end
55
+
56
+
57
+ # def test_valid
58
+ # end
59
+
60
+
61
+ protected
62
+
63
+ # returns a stub instance
64
+ def instance(values = {}, &block)
65
+ WWW::Delicious::Post.new(values)
66
+ end
67
+
68
+ end
@@ -0,0 +1,69 @@
1
+ #
2
+ # = WWW::Delicious
3
+ #
4
+ # Ruby client for del.icio.us API.
5
+ #
6
+ #
7
+ # Category:: WWW
8
+ # Package:: WWW::Delicious
9
+ # Author:: Simone Carletti <weppos@weppos.net>
10
+ # License:: MIT License
11
+ #
12
+ #--
13
+ # SVN: $Id$
14
+ #++
15
+
16
+
17
+ require File.dirname(__FILE__) + '/../helper'
18
+ require 'www/delicious/tag'
19
+
20
+
21
+ class TagTest < Test::Unit::TestCase
22
+
23
+ def test_tag
24
+ expected = { :name => 'MyTag', :count => 2 }
25
+ assert_attributes(instance(expected), expected)
26
+ end
27
+
28
+ def test_tag_from_rexml
29
+ dom = REXML::Document.new(File.read(TESTCASES_PATH + '/element/tag.xml'))
30
+ expected = { :count => 1, :name => 'activedesktop' }
31
+
32
+ element = WWW::Delicious::Tag.from_rexml(dom.root)
33
+ assert_attributes(element, expected)
34
+ end
35
+
36
+
37
+ def test_tag_name_strips_whitespaces
38
+ [' foo ', 'foo ', ' foo ', ' foo'].each do |v|
39
+ assert_equal('foo', instance(:name => v).name) # => 'foo'
40
+ end
41
+ end
42
+
43
+ def test_to_s_returns_name_as_string
44
+ assert_equal('foobar', instance(:name => 'foobar', :count => 4).to_s)
45
+ end
46
+
47
+ def test_to_s_returns_empty_string_with_name_nil
48
+ assert_equal('', instance(:name => nil).to_s)
49
+ end
50
+
51
+
52
+ # def test_api_valid
53
+ # ['foo', ' foo '].each do |v|
54
+ # assert(instance(v).api_valid?)
55
+ # end
56
+ # ['', ' '].each do |v|
57
+ # assert(!instance(v).api_valid?)
58
+ # end
59
+ # end
60
+
61
+
62
+ protected
63
+
64
+ # returns a stub instance
65
+ def instance(values = {}, &block)
66
+ WWW::Delicious::Tag.new(values)
67
+ end
68
+
69
+ end