ratom-instructure 0.6.9

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.txt +135 -0
  2. data/LICENSE +20 -0
  3. data/README.rdoc +293 -0
  4. data/Rakefile +59 -0
  5. data/VERSION.yml +5 -0
  6. data/lib/atom.rb +796 -0
  7. data/lib/atom/configuration.rb +24 -0
  8. data/lib/atom/pub.rb +251 -0
  9. data/lib/atom/version.rb +7 -0
  10. data/lib/atom/xml/parser.rb +413 -0
  11. data/ratom.gemspec +95 -0
  12. data/spec/app/member_entry.atom +31 -0
  13. data/spec/app/service.xml +36 -0
  14. data/spec/app/service_xml_base.xml +37 -0
  15. data/spec/atom/pub_spec.rb +517 -0
  16. data/spec/atom_spec.rb +1385 -0
  17. data/spec/conformance/baseuri.atom +19 -0
  18. data/spec/conformance/divtest.atom +32 -0
  19. data/spec/conformance/linktests.xml +103 -0
  20. data/spec/conformance/nondefaultnamespace-baseline.atom +25 -0
  21. data/spec/conformance/nondefaultnamespace-xhtml.atom +25 -0
  22. data/spec/conformance/nondefaultnamespace.atom +25 -0
  23. data/spec/conformance/ordertest.xml +112 -0
  24. data/spec/conformance/title/html-cdata.atom +22 -0
  25. data/spec/conformance/title/html-entity.atom +22 -0
  26. data/spec/conformance/title/html-ncr.atom +22 -0
  27. data/spec/conformance/title/text-cdata.atom +22 -0
  28. data/spec/conformance/title/text-entity.atom +21 -0
  29. data/spec/conformance/title/text-ncr.atom +21 -0
  30. data/spec/conformance/title/xhtml-entity.atom +21 -0
  31. data/spec/conformance/title/xhtml-ncr.atom +21 -0
  32. data/spec/conformance/unknown-namespace.atom +25 -0
  33. data/spec/conformance/xmlbase.atom +133 -0
  34. data/spec/fixtures/complex_single_entry.atom +45 -0
  35. data/spec/fixtures/created_entry.atom +31 -0
  36. data/spec/fixtures/entry.atom +30 -0
  37. data/spec/fixtures/entry_with_custom_extensions.atom +8 -0
  38. data/spec/fixtures/entry_with_simple_extensions.atom +31 -0
  39. data/spec/fixtures/entry_with_single_custom_extension.atom +6 -0
  40. data/spec/fixtures/multiple_entry.atom +0 -0
  41. data/spec/fixtures/simple_single_entry.atom +21 -0
  42. data/spec/fixtures/with_stylesheet.atom +8 -0
  43. data/spec/paging/first_paged_feed.atom +21 -0
  44. data/spec/paging/last_paged_feed.atom +21 -0
  45. data/spec/paging/middle_paged_feed.atom +22 -0
  46. data/spec/property.rb +31 -0
  47. data/spec/spec.opts +1 -0
  48. data/spec/spec_helper.rb +46 -0
  49. metadata +147 -0
@@ -0,0 +1,1385 @@
1
+ # Copyright (c) 2008 The Kaphan Foundation
2
+ #
3
+ # For licensing information see LICENSE.
4
+ #
5
+ # Please visit http://www.peerworks.org/contact for further information.
6
+ #
7
+
8
+ require File.dirname(__FILE__) + '/spec_helper.rb'
9
+ require 'net/http'
10
+ require 'time'
11
+ require 'spec/property'
12
+
13
+ shared_examples_for 'simple_single_entry.atom attributes' do
14
+ it "should parse title" do
15
+ @feed.title.should == 'Example Feed'
16
+ end
17
+
18
+ it "should parse updated" do
19
+ @feed.updated.should == Time.parse('2003-12-13T18:30:02Z')
20
+ end
21
+
22
+ it "should parse id" do
23
+ @feed.id.should == 'urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6'
24
+ end
25
+
26
+ it "should have an entries array" do
27
+ @feed.entries.should be_an_instance_of(Array)
28
+ end
29
+
30
+ it "should have one element in the entries array" do
31
+ @feed.entries.size.should == 1
32
+ end
33
+
34
+ it "should have an alternate" do
35
+ @feed.alternate.should_not be_nil
36
+ end
37
+
38
+ it "should have an Atom::Link as the alternate" do
39
+ @feed.alternate.should be_an_instance_of(Atom::Link)
40
+ end
41
+
42
+ it "should have the correct href in the alternate" do
43
+ @feed.alternate.href.should == 'http://example.org/'
44
+ end
45
+
46
+ it "should have 1 author" do
47
+ @feed.should have(1).authors
48
+ end
49
+
50
+ it "should have 'John Doe' as the author's name" do
51
+ @feed.authors.first.name.should == "John Doe"
52
+ end
53
+
54
+ it "should parse title" do
55
+ @entry.title.should == 'Atom-Powered Robots Run Amok'
56
+ end
57
+
58
+ it "should have an alternate" do
59
+ @entry.alternate.should_not be_nil
60
+ end
61
+
62
+ it "should have an Atom::Link as the alternate" do
63
+ @entry.alternate.should be_an_instance_of(Atom::Link)
64
+ end
65
+
66
+ it "should have the correct href on the alternate" do
67
+ @entry.alternate.href.should == 'http://example.org/2003/12/13/atom03'
68
+ end
69
+
70
+ it "should parse id" do
71
+ @entry.id.should == 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a'
72
+ end
73
+
74
+ it "should parse updated" do
75
+ @entry.updated.should == Time.parse('2003-12-13T18:30:02Z')
76
+ end
77
+
78
+ it "should parse summary" do
79
+ @entry.summary.should == 'Some text.'
80
+ end
81
+
82
+ it "should parse content" do
83
+ @entry.content.should == 'This <em>is</em> html.'
84
+ end
85
+
86
+ it "should parse content type" do
87
+ @entry.content.type.should == 'html'
88
+ end
89
+ end
90
+
91
+ describe Atom do
92
+ describe "Atom::Feed.load_feed" do
93
+ it "should accept an IO" do
94
+ lambda { Atom::Feed.load_feed(File.open('spec/fixtures/simple_single_entry.atom')) }.should_not raise_error
95
+ end
96
+
97
+ it "should raise ArgumentError with something other than IO or URI" do
98
+ lambda { Atom::Feed.load_feed(nil) }.should raise_error(ArgumentError)
99
+ end
100
+
101
+ it "should accept a String" do
102
+ Atom::Feed.load_feed(File.read('spec/fixtures/simple_single_entry.atom')).should be_an_instance_of(Atom::Feed)
103
+ end
104
+
105
+ it "should accept a URI" do
106
+ uri = URI.parse('http://example.com/feed.atom')
107
+ response = Net::HTTPSuccess.new(nil, nil, nil)
108
+ response.stub!(:body).and_return(File.read('spec/fixtures/simple_single_entry.atom'))
109
+ mock_http_get(uri, response)
110
+
111
+ Atom::Feed.load_feed(uri).should be_an_instance_of(Atom::Feed)
112
+ end
113
+
114
+ it "should accept a URI with query parameters" do
115
+ uri = URI.parse('http://example.com/feed.atom?page=2')
116
+ response = Net::HTTPSuccess.new(nil, nil, nil)
117
+ response.stub!(:body).and_return(File.read('spec/fixtures/simple_single_entry.atom'))
118
+ mock_http_get(uri, response)
119
+
120
+ Atom::Feed.load_feed(uri).should be_an_instance_of(Atom::Feed)
121
+ end
122
+
123
+ it "should raise ArgumentError with non-http uri" do
124
+ uri = URI.parse('file:/tmp')
125
+ lambda { Atom::Feed.load_feed(uri) }.should raise_error(ArgumentError)
126
+ end
127
+
128
+ it "should return an Atom::Feed" do
129
+ feed = Atom::Feed.load_feed(File.open('spec/fixtures/simple_single_entry.atom'))
130
+ feed.should be_an_instance_of(Atom::Feed)
131
+ end
132
+
133
+ it "should not raise an error with a String and basic-auth credentials" do
134
+ lambda { Atom::Feed.load_feed(File.read('spec/fixtures/simple_single_entry.atom'), :user => 'user', :pass => 'pass') }.should_not raise_error
135
+ end
136
+
137
+ it "should not raise an error with a URI with basic-auth credentials" do
138
+ uri = URI.parse('http://example.com/feed.atom')
139
+
140
+ response = Net::HTTPSuccess.new(nil, nil, nil)
141
+ response.stub!(:body).and_return(File.read('spec/fixtures/simple_single_entry.atom'))
142
+ mock_http_get(uri, response, 'user', 'pass')
143
+
144
+ lambda { Atom::Feed.load_feed(uri, :user => 'user', :pass => 'pass') }.should_not raise_error
145
+ end
146
+ end
147
+
148
+ describe 'Atom::Entry.load_entry' do
149
+ it "should accept an IO" do
150
+ Atom::Entry.load_entry(File.open('spec/fixtures/entry.atom')).should be_an_instance_of(Atom::Entry)
151
+ end
152
+
153
+ it "should accept a URI" do
154
+ uri = URI.parse('http://example.org/entry.atom')
155
+ response = Net::HTTPSuccess.new(nil, nil, nil)
156
+ response.stub!(:body).and_return(File.read('spec/fixtures/entry.atom'))
157
+ mock_http_get(uri, response)
158
+
159
+ Atom::Entry.load_entry(uri).should be_an_instance_of(Atom::Entry)
160
+ end
161
+
162
+ it "should accept a String" do
163
+ Atom::Entry.load_entry(File.read('spec/fixtures/entry.atom')).should be_an_instance_of(Atom::Entry)
164
+ end
165
+
166
+ it "should raise ArgumentError with something other than IO, String or URI" do
167
+ lambda { Atom::Entry.load_entry(nil) }.should raise_error(ArgumentError)
168
+ end
169
+
170
+ it "should raise ArgumentError with non-http uri" do
171
+ lambda { Atom::Entry.load_entry(URI.parse('file:/tmp')) }.should raise_error(ArgumentError)
172
+ end
173
+ end
174
+
175
+ describe 'SimpleSingleFeed' do
176
+ before(:all) do
177
+ @feed = Atom::Feed.load_feed(File.open('spec/fixtures/simple_single_entry.atom'))
178
+ @entry = @feed.entries.first
179
+ end
180
+
181
+ it_should_behave_like "simple_single_entry.atom attributes"
182
+ end
183
+
184
+ describe 'FeedWithStyleSheet' do
185
+ it "should load without failure" do
186
+ lambda { feed = Atom::Feed.load_feed(File.open('spec/fixtures/with_stylesheet.atom')) }.should_not raise_error
187
+ end
188
+ end
189
+
190
+ describe 'ComplexFeed' do
191
+ before(:all) do
192
+ @feed = Atom::Feed.load_feed(File.open('spec/fixtures/complex_single_entry.atom'))
193
+ end
194
+
195
+ describe Atom::Feed do
196
+ it "should have a title" do
197
+ @feed.title.should == 'dive into mark'
198
+ end
199
+
200
+ it "should have type on the title" do
201
+ @feed.title.type.should == 'text'
202
+ end
203
+
204
+ it "should have a subtitle" do
205
+ @feed.subtitle.should == 'A <em>lot</em> of effort went into making this effortless'
206
+ end
207
+
208
+ it "should have a type for the subtitle" do
209
+ @feed.subtitle.type.should == 'html'
210
+ end
211
+
212
+ it "should have an updated date" do
213
+ @feed.updated.should == Time.parse('2005-07-31T12:29:29Z')
214
+ end
215
+
216
+ it "should have an id" do
217
+ @feed.id.should == 'tag:example.org,2003:3'
218
+ end
219
+
220
+ it "should have 2 links" do
221
+ @feed.should have(2).links
222
+ end
223
+
224
+ it "should have an alternate link" do
225
+ @feed.alternate.should_not be_nil
226
+ end
227
+
228
+ it "should have the right url for the alternate" do
229
+ @feed.alternate.to_s.should == 'http://example.org/'
230
+ end
231
+
232
+ it "should have a self link" do
233
+ @feed.self.should_not be_nil
234
+ end
235
+
236
+ it "should have the right url for self" do
237
+ @feed.self.to_s.should == 'http://example.org/feed.atom'
238
+ end
239
+
240
+ it "should have rights" do
241
+ @feed.rights.should == 'Copyright (c) 2003, Mark Pilgrim'
242
+ end
243
+
244
+ it "should have a generator" do
245
+ @feed.generator.should_not be_nil
246
+ end
247
+
248
+ it "should have a generator uri" do
249
+ @feed.generator.uri.should == 'http://www.example.com/'
250
+ end
251
+
252
+ it "should have a generator version" do
253
+ @feed.generator.version.should == '1.0'
254
+ end
255
+
256
+ it "should have a generator name" do
257
+ @feed.generator.name.should == 'Example Toolkit'
258
+ end
259
+
260
+ it "should have an entry" do
261
+ @feed.should have(1).entries
262
+ end
263
+
264
+ it "should have a category" do
265
+ @feed.should have(1).categories
266
+ end
267
+ end
268
+
269
+ describe "FeedWithXmlBase" do
270
+ before(:all) do
271
+ @feed = Atom::Feed.load_feed(File.open('spec/conformance/xmlbase.atom'))
272
+ end
273
+
274
+ subject { @feed }
275
+
276
+ its(:title) { should == "xml:base support tests" }
277
+ it { should have(16).entries }
278
+
279
+ it "should resolve all alternate links to the same location" do
280
+ @feed.entries.each do |entry|
281
+ entry.links.first.href.should == "http://example.org/tests/base/result.html"
282
+ end
283
+ end
284
+
285
+ it "should resolve all links in content to what their label says" do
286
+ pending "support xml:base in content XHTML"
287
+ end
288
+ end
289
+
290
+ describe Atom::Entry do
291
+ before(:each) do
292
+ @entry = @feed.entries.first
293
+ end
294
+
295
+ it "should have a title" do
296
+ @entry.title.should == 'Atom draft-07 snapshot'
297
+ end
298
+
299
+ it "should have an id" do
300
+ @entry.id.should == 'tag:example.org,2003:3.2397'
301
+ end
302
+
303
+ it "should have an updated date" do
304
+ @entry.updated.should == Time.parse('2005-07-31T12:29:29Z')
305
+ end
306
+
307
+ it "should have a published date" do
308
+ @entry.published.should == Time.parse('2003-12-13T08:29:29-04:00')
309
+ end
310
+
311
+ it "should have an author" do
312
+ @entry.should have(1).authors
313
+ end
314
+
315
+ it "should have two links" do
316
+ @entry.should have(2).links
317
+ end
318
+
319
+ it "should have one alternate link" do
320
+ @entry.should have(1).alternates
321
+ end
322
+
323
+ it "should have one enclosure link" do
324
+ @entry.should have(1).enclosures
325
+ end
326
+
327
+ it "should have 2 contributors" do
328
+ @entry.should have(2).contributors
329
+ end
330
+
331
+ it "should have names for the contributors" do
332
+ @entry.contributors[0].name.should == 'Sam Ruby'
333
+ @entry.contributors[1].name.should == 'Joe Gregorio'
334
+ end
335
+
336
+ it "should have content" do
337
+ @entry.content.should_not be_nil
338
+ end
339
+
340
+ it "should have 2 categories" do
341
+ @entry.should have(2).categories
342
+ end
343
+ end
344
+
345
+ describe Atom::Category do
346
+ describe 'atom category' do
347
+ before(:each) do
348
+ @category = @feed.entries.first.categories.first
349
+ end
350
+
351
+ it "should have a term" do
352
+ @category.term.should == "atom"
353
+ end
354
+
355
+ it "should have a scheme" do
356
+ @category.scheme.should == "http://example.org"
357
+ end
358
+
359
+ it "should have a label" do
360
+ @category.label.should == "Atom"
361
+ end
362
+ end
363
+
364
+ describe 'draft category' do
365
+ before(:each) do
366
+ @category = @feed.entries.first.categories.last
367
+ end
368
+
369
+ it "should have a term" do
370
+ @category.term.should == "drafts"
371
+ end
372
+
373
+ it "should have a scheme" do
374
+ @category.scheme.should == "http://example2.org"
375
+ end
376
+
377
+ it "should have a label" do
378
+ @category.label.should == "Drafts"
379
+ end
380
+ end
381
+ end
382
+
383
+ describe Atom::Link do
384
+ describe 'alternate link' do
385
+ before(:each) do
386
+ @entry = @feed.entries.first
387
+ @link = @entry.alternate
388
+ end
389
+
390
+ it "should have text/html type" do
391
+ @link.type.should == 'text/html'
392
+ end
393
+
394
+ it "should have alternate rel" do
395
+ @link.rel.should == 'alternate'
396
+ end
397
+
398
+ it "should have href 'http://example.org/2005/04/02/atom'" do
399
+ @link.href.should == 'http://example.org/2005/04/02/atom'
400
+ end
401
+
402
+ it "should have 'http://example.org/2005/04/02/atom' string representation" do
403
+ @link.to_s.should == 'http://example.org/2005/04/02/atom'
404
+ end
405
+
406
+ it "should have title 'Alternate link'" do
407
+ @link.title.should == "Alternate link"
408
+ end
409
+ end
410
+
411
+ describe 'enclosure link' do
412
+ before(:each) do
413
+ @entry = @feed.entries.first
414
+ @link = @entry.enclosures.first
415
+ end
416
+
417
+ it "should have audio/mpeg type" do
418
+ @link.type.should == 'audio/mpeg'
419
+ end
420
+
421
+ it "should have enclosure rel" do
422
+ @link.rel.should == 'enclosure'
423
+ end
424
+
425
+ it "should have length 1337" do
426
+ @link.length.should == 1337
427
+ end
428
+
429
+ it "should have href 'http://example.org/audio/ph34r_my_podcast.mp3'" do
430
+ @link.href.should == 'http://example.org/audio/ph34r_my_podcast.mp3'
431
+ end
432
+
433
+ it "should have 'http://example.org/audio/ph34r_my_podcast.mp3' string representation" do
434
+ @link.to_s.should == 'http://example.org/audio/ph34r_my_podcast.mp3'
435
+ end
436
+ end
437
+ end
438
+
439
+ describe Atom::Person do
440
+ before(:each) do
441
+ @entry = @feed.entries.first
442
+ @person = @entry.authors.first
443
+ end
444
+
445
+ it "should have a name" do
446
+ @person.name.should == 'Mark Pilgrim'
447
+ end
448
+
449
+ it "should have a uri" do
450
+ @person.uri.should == 'http://example.org/'
451
+ end
452
+
453
+ it "should have an email address" do
454
+ @person.email.should == 'f8dy@example.com'
455
+ end
456
+ end
457
+
458
+ describe Atom::Content do
459
+ before(:each) do
460
+ @entry = @feed.entries.first
461
+ @content = @entry.content
462
+ end
463
+
464
+ it "should have 'xhtml' type" do
465
+ @content.type.should == 'xhtml'
466
+ end
467
+
468
+ it "should have 'en' language" do
469
+ @content.xml_lang.should == 'en'
470
+ end
471
+
472
+ it "should have the content as the string representation" do
473
+ @content.should == '<p xmlns="http://www.w3.org/1999/xhtml"><i>[Update: The Atom draft is finished.]</i></p>'
474
+ end
475
+ end
476
+ end
477
+
478
+ describe 'ConformanceTests' do
479
+ describe 'nondefaultnamespace.atom' do
480
+ before(:all) do
481
+ @feed = Atom::Feed.load_feed(File.open('spec/conformance/nondefaultnamespace.atom'))
482
+ end
483
+
484
+ it "should have a title" do
485
+ @feed.title.should == 'Non-default namespace test'
486
+ end
487
+
488
+ it "should have 1 entry" do
489
+ @feed.should have(1).entries
490
+ end
491
+
492
+ describe Atom::Entry do
493
+ before(:all) do
494
+ @entry = @feed.entries.first
495
+ end
496
+
497
+ it "should have a title" do
498
+ @entry.title.should == 'If you can read the content of this entry, your aggregator works fine.'
499
+ end
500
+
501
+ it "should have content" do
502
+ @entry.content.should_not be_nil
503
+ end
504
+
505
+ it "should have 'xhtml' for the type of the content" do
506
+ @entry.content.type.should == 'xhtml'
507
+ end
508
+
509
+ it "should strip the outer div of the content" do
510
+ @entry.content.should_not match(/div/)
511
+ end
512
+
513
+ it "should keep inner xhtml of content" do
514
+ @entry.content.should == '<p xmlns="http://www.w3.org/1999/xhtml">For information, see:</p> ' +
515
+ '<ul xmlns="http://www.w3.org/1999/xhtml"> ' +
516
+ '<li><a href="http://plasmasturm.org/log/376/">Who knows an <abbr title="Extensible Markup Language">XML</abbr> document from a hole in the ground?</a></li> ' +
517
+ '<li><a href="http://plasmasturm.org/log/377/">More on Atom aggregator <abbr title="Extensible Markup Language">XML</abbr> namespace conformance tests</a></li> ' +
518
+ '<li><a href="http://www.intertwingly.net/wiki/pie/XmlNamespaceConformanceTests"><abbr title="Extensible Markup Language">XML</abbr> Namespace Conformance Tests</a></li> ' +
519
+ '</ul>'
520
+ end
521
+ end
522
+ end
523
+
524
+ describe 'unknown-namespace.atom' do
525
+ before(:all) do
526
+ @feed = Atom::Feed.load_feed(File.open('spec/conformance/unknown-namespace.atom'))
527
+ @entry = @feed.entries.first
528
+ @content = @entry.content
529
+ end
530
+
531
+ it "should have content" do
532
+ @content.should_not be_nil
533
+ end
534
+
535
+ it "should strip surrounding div" do
536
+ @content.should_not match(/div/)
537
+ end
538
+
539
+ it "should keep inner lists" do
540
+ @content.should match(/<h:ul/)
541
+ @content.should match(/<ul/)
542
+ end
543
+
544
+ it "should have xhtml type" do
545
+ @content.type.should == 'xhtml'
546
+ end
547
+ end
548
+
549
+ describe 'linktests.atom' do
550
+ before(:all) do
551
+ @feed = Atom::Feed.load_feed(File.open('spec/conformance/linktests.xml'))
552
+ @entries = @feed.entries
553
+ end
554
+
555
+ describe 'linktest1' do
556
+ before(:all) do
557
+ @entry = @entries[0]
558
+ end
559
+
560
+ it "should pick single alternate link without rel" do
561
+ @entry.alternate.href.should == 'http://www.snellspace.com/public/linktests/alternate'
562
+ end
563
+ end
564
+
565
+ describe 'linktest2' do
566
+ before(:all) do
567
+ @entry = @entries[1]
568
+ end
569
+
570
+ it "should be picky about case of alternate rel" do
571
+ @entry.alternate.href.should == 'http://www.snellspace.com/public/linktests/alternate'
572
+ end
573
+
574
+ it "should be picky when picking the alternate by type" do
575
+ @entry.alternate('text/plain').href.should == 'http://www.snellspace.com/public/linktests/alternate2'
576
+ end
577
+ end
578
+
579
+ describe 'linktest3' do
580
+ before(:all) do
581
+ @entry = @entries[2]
582
+ end
583
+
584
+ it "should parse all links" do
585
+ @entry.should have(5).links
586
+ end
587
+
588
+ it "should pick the alternate from a full list of core types" do
589
+ @entry.alternate.href.should == 'http://www.snellspace.com/public/linktests/alternate'
590
+ end
591
+ end
592
+
593
+ describe 'linktest4' do
594
+ before(:all) do
595
+ @entry = @entries[3]
596
+ end
597
+
598
+ it "should parse all links" do
599
+ @entry.should have(6).links
600
+ end
601
+
602
+ it "should pick the first alternate from a full list of core types with an extra alternate" do
603
+ @entry.alternate.href.should == 'http://www.snellspace.com/public/linktests/alternate'
604
+ end
605
+
606
+ it "should pick the alternate by type from a full list of core types with an extra alternate" do
607
+ @entry.alternate('text/plain').href.should == 'http://www.snellspace.com/public/linktests/alternate2'
608
+ end
609
+ end
610
+
611
+ describe 'linktest5' do
612
+ before(:all) do
613
+ @entry = @entries[4]
614
+ end
615
+
616
+ it "should parse all links" do
617
+ @entry.should have(2).links
618
+ end
619
+
620
+ it "should pick the alternate without choking on a non-core type" do
621
+ @entry.alternate.href.should == 'http://www.snellspace.com/public/linktests/alternate'
622
+ end
623
+
624
+ it "should include the non-core type in the list of links" do
625
+ @entry.links.map{|l| l.href }.should include('http://www.snellspace.com/public/linktests/license')
626
+ end
627
+ end
628
+
629
+ describe 'linktest6' do
630
+ before(:all) do
631
+ @entry = @entries[5]
632
+ end
633
+
634
+ it "should parse all links" do
635
+ @entry.should have(2).links
636
+ end
637
+
638
+ it "should pick the alternate without choking on a non-core type identified by a uri" do
639
+ @entry.alternate.href.should == 'http://www.snellspace.com/public/linktests/alternate'
640
+ end
641
+
642
+ it "should include the non-core type in the list of links identified by a uri" do
643
+ @entry.links.map{|l| l.href }.should include('http://www.snellspace.com/public/linktests/example')
644
+ end
645
+ end
646
+
647
+ describe 'linktest7' do
648
+ before(:all) do
649
+ @entry = @entries[6]
650
+ end
651
+
652
+ it "should parse all links" do
653
+ @entry.should have(2).links
654
+ end
655
+
656
+ it "should pick the alternate without choking on a non-core type" do
657
+ @entry.alternate.href.should == 'http://www.snellspace.com/public/linktests/alternate'
658
+ end
659
+
660
+ it "should include the non-core type in the list of links" do
661
+ @entry.links.map{|l| l.href }.should include('http://www.snellspace.com/public/linktests/license')
662
+ end
663
+ end
664
+
665
+ describe 'linktest8' do
666
+ before(:all) do
667
+ @entry = @entries[7]
668
+ end
669
+
670
+ it "should parse all links" do
671
+ @entry.should have(2).links
672
+ end
673
+
674
+ it "should pick the alternate without choking on a non-core type identified by a uri" do
675
+ @entry.alternate.href.should == 'http://www.snellspace.com/public/linktests/alternate'
676
+ end
677
+
678
+ it "should include the non-core type in the list of links identified by a uri" do
679
+ @entry.links.map{|l| l.href }.should include('http://www.snellspace.com/public/linktests/example')
680
+ end
681
+ end
682
+
683
+ describe 'linktest9' do
684
+ before(:all) do
685
+ @entry = @entries[8]
686
+ end
687
+
688
+ it "should parse all links" do
689
+ @entry.should have(3).links
690
+ end
691
+
692
+ it "should pick the alternate without hreflang" do
693
+ @entry.alternate.href.should == 'http://www.snellspace.com/public/linktests/alternate'
694
+ end
695
+ end
696
+ end
697
+
698
+ describe 'ordertest.atom' do
699
+ before(:all) do
700
+ @feed = Atom::Feed.load_feed(File.open('spec/conformance/ordertest.xml'))
701
+ end
702
+
703
+ it 'should have 9 entries' do
704
+ @feed.should have(9).entries
705
+ end
706
+
707
+ describe 'ordertest1' do
708
+ before(:each) do
709
+ @entry = @feed.entries[0]
710
+ end
711
+
712
+ it "should have the correct title" do
713
+ @entry.title.should == 'Simple order, nothing fancy'
714
+ end
715
+ end
716
+
717
+ describe 'ordertest2' do
718
+ before(:each) do
719
+ @entry = @feed.entries[1]
720
+ end
721
+
722
+ it "should have the correct title" do
723
+ @entry.title.should == 'Same as the first, only mixed up a bit'
724
+ end
725
+ end
726
+
727
+ describe "ordertest3" do
728
+ before(:each) do
729
+ @entry = @feed.entries[2]
730
+ end
731
+
732
+ it "should have the correct title" do
733
+ @entry.title.should == 'Multiple alt link elements, which one does your reader show?'
734
+ end
735
+
736
+ it "should pick the first alternate" do
737
+ @entry.alternate.href.should == 'http://www.snellspace.com/public/alternate'
738
+ end
739
+ end
740
+
741
+ describe 'ordertest4' do
742
+ before(:each) do
743
+ @entry = @feed.entries[3]
744
+ end
745
+
746
+ it "should have the correct title" do
747
+ @entry.title.should == 'Multiple link elements, does your feed reader show the "alternate" correctly?'
748
+ end
749
+
750
+ it "should pick the right link" do
751
+ @entry.alternate.href.should == 'http://www.snellspace.com/public/alternate'
752
+ end
753
+ end
754
+
755
+ describe 'ordertest5' do
756
+ before(:each) do
757
+ @entry = @feed.entries[4]
758
+ end
759
+
760
+ it "should have a source" do
761
+ @entry.source.should_not be_nil
762
+ end
763
+
764
+ it "should have the correct title" do
765
+ @entry.title.should == 'Entry with a source first'
766
+ end
767
+
768
+ it "should have the correct updated" do
769
+ @entry.updated.should == Time.parse('2006-01-26T09:20:05Z')
770
+ end
771
+
772
+ it "should have the correct alt link" do
773
+ @entry.alternate.href.should == 'http://www.snellspace.com/public/alternate'
774
+ end
775
+
776
+ describe Atom::Source do
777
+ before(:each) do
778
+ @source = @entry.source
779
+ end
780
+
781
+ it "should have an id" do
782
+ @source.id.should == 'tag:example.org,2006:atom/conformance/element_order'
783
+ end
784
+
785
+ it "should have a title" do
786
+ @source.title.should == 'Order Matters'
787
+ end
788
+
789
+ it "should have a subtitle" do
790
+ @source.subtitle.should == 'Testing how feed readers handle the order of entry elements'
791
+ end
792
+
793
+ it "should have a updated" do
794
+ @source.updated.should == Time.parse('2006-01-26T09:16:00Z')
795
+ end
796
+
797
+ it "should have an author" do
798
+ @source.should have(1).authors
799
+ end
800
+
801
+ it "should have the right name for the author" do
802
+ @source.authors.first.name.should == 'James Snell'
803
+ end
804
+
805
+ it "should have 2 links" do
806
+ @source.should have(2).links
807
+ end
808
+
809
+ it "should have an alternate" do
810
+ @source.alternate.href.should == 'http://www.snellspace.com/wp/?p=255'
811
+ end
812
+
813
+ it "should have a self" do
814
+ @source.self.href.should == 'http://www.snellspace.com/public/ordertest.xml'
815
+ end
816
+ end
817
+ end
818
+
819
+ describe 'ordertest6' do
820
+ before(:each) do
821
+ @entry = @feed.entries[5]
822
+ end
823
+
824
+ it "should have a source" do
825
+ @entry.source.should_not be_nil
826
+ end
827
+
828
+ it "should have the correct title" do
829
+ @entry.title.should == 'Entry with a source last'
830
+ end
831
+
832
+ it "should have the correct updated" do
833
+ @entry.updated.should == Time.parse('2006-01-26T09:20:06Z')
834
+ end
835
+
836
+ it "should have the correct alt link" do
837
+ @entry.alternate.href.should == 'http://www.snellspace.com/public/alternate'
838
+ end
839
+ end
840
+
841
+ describe 'ordetest7' do
842
+ before(:each) do
843
+ @entry = @feed.entries[6]
844
+ end
845
+
846
+ it "should have a source" do
847
+ @entry.source.should_not be_nil
848
+ end
849
+
850
+ it "should have the correct title" do
851
+ @entry.title.should == 'Entry with a source in the middle'
852
+ end
853
+
854
+ it "should have the correct updated" do
855
+ @entry.updated.should == Time.parse('2006-01-26T09:20:07Z')
856
+ end
857
+
858
+ it "should have the correct alt link" do
859
+ @entry.alternate.href.should == 'http://www.snellspace.com/public/alternate'
860
+ end
861
+ end
862
+
863
+ describe 'ordertest8' do
864
+ before(:each) do
865
+ @entry = @feed.entries[7]
866
+ end
867
+
868
+ it "should have the right title" do
869
+ @entry.title.should == 'Atom elements in an extension element'
870
+ end
871
+
872
+ it "should have right id" do
873
+ @entry.id.should == 'tag:example.org,2006:atom/conformance/element_order/8'
874
+ end
875
+ end
876
+
877
+ describe 'ordertest9' do
878
+ before(:each) do
879
+ @entry = @feed.entries[8]
880
+ end
881
+
882
+ it "should have the right title" do
883
+ @entry.title.should == 'Atom elements in an extension element'
884
+ end
885
+
886
+ it 'should have the right id' do
887
+ @entry.id.should == 'tag:example.org,2006:atom/conformance/element_order/9'
888
+ end
889
+ end
890
+ end
891
+ end
892
+
893
+ describe 'pagination' do
894
+ describe 'first_paged_feed.atom' do
895
+ before(:all) do
896
+ @feed = Atom::Feed.load_feed(File.open('spec/paging/first_paged_feed.atom'))
897
+ end
898
+
899
+ it "should be first?" do
900
+ @feed.should be_first
901
+ end
902
+
903
+ it "should not be last?" do
904
+ @feed.should_not be_last
905
+ end
906
+
907
+ it "should have next" do
908
+ @feed.next_page.href.should == 'http://example.org/index.atom?page=2'
909
+ end
910
+
911
+ it "should not have prev" do
912
+ @feed.prev_page.should be_nil
913
+ end
914
+
915
+ it "should have last" do
916
+ @feed.last_page.href.should == 'http://example.org/index.atom?page=10'
917
+ end
918
+
919
+ it "should have first" do
920
+ @feed.first_page.href.should == 'http://example.org/index.atom'
921
+ end
922
+ end
923
+
924
+ describe 'middle_paged_feed.atom' do
925
+ before(:all) do
926
+ @feed = Atom::Feed.load_feed(File.open('spec/paging/middle_paged_feed.atom'))
927
+ end
928
+
929
+ it "should not be last?" do
930
+ @feed.should_not be_last
931
+ end
932
+
933
+ it "should not be first?" do
934
+ @feed.should_not be_first
935
+ end
936
+
937
+ it "should have next_page" do
938
+ @feed.next_page.href.should == 'http://example.org/index.atom?page=4'
939
+ end
940
+
941
+ it "should have prev_page" do
942
+ @feed.prev_page.href.should == 'http://example.org/index.atom?page=2'
943
+ end
944
+
945
+ it "should have last_page" do
946
+ @feed.last_page.href.should == 'http://example.org/index.atom?page=10'
947
+ end
948
+
949
+ it "should have first_page" do
950
+ @feed.first_page.href.should == 'http://example.org/index.atom'
951
+ end
952
+ end
953
+
954
+ describe 'last_paged_feed.atom' do
955
+ before(:all) do
956
+ @feed = Atom::Feed.load_feed(File.open('spec/paging/last_paged_feed.atom'))
957
+ end
958
+
959
+ it "should not be first?" do
960
+ @feed.should_not be_first
961
+ end
962
+
963
+ it "should be last?" do
964
+ @feed.should be_last
965
+ end
966
+
967
+ it "should have prev_page" do
968
+ @feed.prev_page.href.should == 'http://example.org/index.atom?page=9'
969
+ end
970
+
971
+ it "should not have next_page" do
972
+ @feed.next_page.should be_nil
973
+ end
974
+
975
+ it "should have first_page" do
976
+ @feed.first_page.href.should == 'http://example.org/index.atom'
977
+ end
978
+
979
+ it "should have last_page" do
980
+ @feed.last_page.href.should == 'http://example.org/index.atom?page=10'
981
+ end
982
+ end
983
+
984
+ describe 'pagination using each_entry' do
985
+ before(:each) do
986
+ @feed = Atom::Feed.load_feed(File.open('spec/paging/first_paged_feed.atom'))
987
+ end
988
+
989
+ it "should paginate through each entry" do
990
+ feed1 = Atom::Feed.load_feed(File.read('spec/paging/middle_paged_feed.atom'))
991
+ feed2 = Atom::Feed.load_feed(File.read('spec/paging/last_paged_feed.atom'))
992
+
993
+ Atom::Feed.should_receive(:load_feed).
994
+ with(URI.parse('http://example.org/index.atom?page=2'), an_instance_of(Hash)).
995
+ and_return(feed1)
996
+ Atom::Feed.should_receive(:load_feed).
997
+ with(URI.parse('http://example.org/index.atom?page=4'), an_instance_of(Hash)).
998
+ and_return(feed2)
999
+
1000
+ entry_count = 0
1001
+ @feed.each_entry(:paginate => true) do |entry|
1002
+ entry_count += 1
1003
+ end
1004
+
1005
+ entry_count.should == 3
1006
+ end
1007
+
1008
+ it "should not paginate through each entry when paginate not true" do
1009
+ entry_count = 0
1010
+ @feed.each_entry do |entry|
1011
+ entry_count += 1
1012
+ end
1013
+
1014
+ entry_count.should == 1
1015
+ end
1016
+
1017
+ it "should only paginate up to since" do
1018
+ response1 = Net::HTTPSuccess.new(nil, nil, nil)
1019
+ response1.stub!(:body).and_return(File.read('spec/paging/middle_paged_feed.atom'))
1020
+ mock_http_get(URI.parse('http://example.org/index.atom?page=2'), response1)
1021
+
1022
+ entry_count = 0
1023
+ @feed.each_entry(:paginate => true, :since => Time.parse('2003-11-19T18:30:02Z')) do |entry|
1024
+ entry_count += 1
1025
+ end
1026
+
1027
+ entry_count.should == 1
1028
+ end
1029
+ end
1030
+
1031
+ describe "entry_with_simple_extensions.atom" do
1032
+ before(:each) do
1033
+ @feed = Atom::Feed.load_feed(File.open('spec/fixtures/entry_with_simple_extensions.atom'))
1034
+ @entry = @feed.entries.first
1035
+ end
1036
+
1037
+ it "should load simple extension for feed" do
1038
+ @feed["http://example.org/example", 'simple1'].should == ['Simple1 Value']
1039
+ end
1040
+
1041
+ it "should load empty simple extension for feed" do
1042
+ @feed["http://example.org/example", 'simple-empty'].should == ['']
1043
+ end
1044
+
1045
+ it "should load simple extension 1 for entry" do
1046
+ @entry["http://example.org/example", 'simple1'].should == ['Simple1 Entry Value']
1047
+ end
1048
+
1049
+ it "should load simple extension 2 for entry" do
1050
+ @entry["http://example.org/example", 'simple2'].should == ['Simple2', 'Simple2a']
1051
+ end
1052
+
1053
+ it "should find a simple extension in another namespace" do
1054
+ @entry["http://example2.org/example2", 'simple1'].should == ['Simple Entry Value (NS2)']
1055
+ end
1056
+
1057
+ it "should load simple extension attribute on a category" do
1058
+ @entry.categories.first["http://example.org/example", "attribute"].first.should == "extension"
1059
+ end
1060
+
1061
+ it "should write a simple extension attribute as an attribute" do
1062
+ @entry.categories.first.to_xml(true)['ns1:attribute'].should == 'extension'
1063
+ end
1064
+
1065
+ it "should read an extension with the same local name as an Atom element" do
1066
+ @feed['http://example.org/example', 'title'].should == ['Extension Title']
1067
+ end
1068
+
1069
+ it "should find simple extension with dashes in the name" do
1070
+ @entry["http://example.org/example", 'simple-with-dash'].should == ['Simple with dash Value']
1071
+ end
1072
+
1073
+ it_should_behave_like 'simple_single_entry.atom attributes'
1074
+
1075
+ it "should load simple extension 3 xml for entry" do
1076
+ @entry["http://example.org/example3", 'simple3'].should == ['<ContinuityOfCareRecord xmlns="urn:astm-org:CCR">Simple Entry Value (NS2)</ContinuityOfCareRecord>']
1077
+ end
1078
+
1079
+ describe "when only namespace is provided" do
1080
+ before :each do
1081
+ @example_elements = @entry["http://example.org/example"]
1082
+ @example2_elements = @entry['http://example2.org/example2']
1083
+ @example3_elements = @entry['http://example.org/example3']
1084
+ end
1085
+
1086
+ it "should return namespace elements as a hash" do
1087
+ @example_elements.should == {
1088
+ 'simple1' => ['Simple1 Entry Value'],
1089
+ 'simple2' => ['Simple2', 'Simple2a'],
1090
+ 'simple-with-dash' => ["Simple with dash Value"]
1091
+ }
1092
+
1093
+ @example2_elements.should == {
1094
+ 'simple1' => ['Simple Entry Value (NS2)']
1095
+ }
1096
+
1097
+ @example3_elements.should == {
1098
+ 'simple3' => ['<ContinuityOfCareRecord xmlns="urn:astm-org:CCR">Simple Entry Value (NS2)</ContinuityOfCareRecord>']
1099
+ }
1100
+ end
1101
+ end
1102
+ end
1103
+
1104
+ describe 'writing simple extensions' do
1105
+ it "should recode and re-read a simple extension element" do
1106
+ entry = Atom::Entry.new do |entry|
1107
+ entry.id = 'urn:test'
1108
+ entry.title = 'Simple Ext. Test'
1109
+ entry.updated = Time.now
1110
+ entry['http://example.org', 'title'] << 'Example title'
1111
+ end
1112
+
1113
+ entry2 = Atom::Entry.load_entry(entry.to_xml)
1114
+ entry2['http://example.org', 'title'].should == ['Example title']
1115
+ end
1116
+ end
1117
+ end
1118
+
1119
+ describe 'custom_extensions' do
1120
+ before(:all) do
1121
+ Atom::Entry.add_extension_namespace :ns_alias, "http://custom.namespace"
1122
+ Atom::Entry.elements "ns_alias:property", :class => Atom::Extensions::Property
1123
+ Atom::Entry.elements "ns_alias:property-with-dash", :class => Atom::Extensions::Property
1124
+ @entry = Atom::Entry.load_entry(File.open('spec/fixtures/entry_with_custom_extensions.atom'))
1125
+ end
1126
+
1127
+ it "should_load_custom_extensions_for_entry" do
1128
+ @entry.ns_alias_property.should_not == []
1129
+ end
1130
+
1131
+ it "should_load_2_custom_extensions_for_entry" do
1132
+ @entry.ns_alias_property.size.should == 2
1133
+ end
1134
+
1135
+ it "should load correct_data_for_custom_extensions_for_entry" do
1136
+ @entry.ns_alias_property.map { |x| [x.name, x.value] }.should == [['foo', 'bar'], ['baz', 'bat']]
1137
+ end
1138
+ end
1139
+
1140
+ describe 'single custom_extensions' do
1141
+ before(:all) do
1142
+ Atom::Entry.add_extension_namespace :custom, "http://single.custom.namespace"
1143
+ Atom::Entry.element "custom:singleproperty", :class => Atom::Extensions::Property
1144
+ @entry = Atom::Entry.load_entry(File.open('spec/fixtures/entry_with_single_custom_extension.atom'))
1145
+ end
1146
+
1147
+ it "should load single custom extensions for entry" do
1148
+ @entry.custom_singleproperty.should_not be_nil
1149
+ end
1150
+
1151
+ it "should load correct data for custom extensions for entry" do
1152
+ @entry.custom_singleproperty.name.should == 'foo'
1153
+ @entry.custom_singleproperty.value.should == 'bar'
1154
+ end
1155
+ end
1156
+
1157
+ describe 'write_support' do
1158
+ # FIXME this example depends on "custom_extensions" for configuring Atom::Entry
1159
+ before(:all) do
1160
+ @entry = Atom::Entry.new
1161
+ @entry.ns_alias_property << Atom::Extensions::Property.new('ratom', 'rocks')
1162
+ @entry.ns_alias_property << Atom::Extensions::Property.new('custom extensions', 'also rock')
1163
+ @node = @entry.to_xml(true)
1164
+ end
1165
+
1166
+ it "should_write_custom_extensions_on_to_xml" do
1167
+ @node.children.size.should == 2
1168
+ ratom, custom_extensions = @node.children
1169
+ ratom.attributes["name"].should == "ratom"
1170
+ ratom.attributes["value"].should == "rocks"
1171
+ custom_extensions.attributes["name"].should == "custom extensions"
1172
+ custom_extensions.attributes["value"].should == "also rock"
1173
+ end
1174
+ end
1175
+
1176
+ describe Atom::Link do
1177
+ before(:each) do
1178
+ @href = 'http://example.org/next'
1179
+ @link = Atom::Link.new(:rel => 'next', :href => @href)
1180
+ end
1181
+
1182
+ it "should fetch feed for fetch_next" do
1183
+ Atom::Feed.should_receive(:load_feed).with(URI.parse(@href), an_instance_of(Hash))
1184
+ @link.fetch
1185
+ end
1186
+
1187
+ it "should fetch content when response is not xml" do
1188
+ Atom::Feed.should_receive(:load_feed).and_raise(Atom::LoadError)
1189
+ response = Net::HTTPSuccess.new(nil, nil, nil)
1190
+ response.stub!(:body).and_return('some text.')
1191
+ Net::HTTP.should_receive(:get_response).with(URI.parse(@href)).and_return(response)
1192
+ @link.fetch.should == 'some text.'
1193
+ end
1194
+ end
1195
+
1196
+ describe Atom::Entry do
1197
+ before(:all) do
1198
+ @entry = Atom::Entry.load_entry(File.read('spec/fixtures/entry.atom'))
1199
+ end
1200
+
1201
+ it "should be == to itself" do
1202
+ @entry.should == Atom::Entry.load_entry(File.read('spec/fixtures/entry.atom'))
1203
+ end
1204
+
1205
+ it "should be != if something changes" do
1206
+ @other = Atom::Entry.load_entry(File.read('spec/fixtures/entry.atom'))
1207
+ @other.title = 'foo'
1208
+ @entry.should_not == @other
1209
+ end
1210
+
1211
+ it "should be != if content changes" do
1212
+ @other = Atom::Entry.load_entry(File.read('spec/fixtures/entry.atom'))
1213
+ @other.content.type = 'html'
1214
+ @entry.should_not == @other
1215
+ end
1216
+
1217
+ it "should output itself" do
1218
+ other = Atom::Entry.load_entry(@entry.to_xml)
1219
+ @entry.should == other
1220
+ end
1221
+
1222
+ it "should properly escape titles" do
1223
+ @entry.title = "Breaking&nbsp;Space"
1224
+ other = Atom::Entry.load_entry(@entry.to_xml)
1225
+ @entry.should == other
1226
+ end
1227
+
1228
+ it "should raise error when to_xml'ing non-utf8 content" do
1229
+ lambda {
1230
+ puts(Atom::Entry.new do |entry|
1231
+ entry.title = "My entry"
1232
+ entry.id = "urn:entry:1"
1233
+ entry.content = Atom::Content::Html.new("this is not \227 utf8")
1234
+ end.to_xml)
1235
+ }.should raise_error(Atom::SerializationError)
1236
+ end
1237
+ end
1238
+
1239
+ describe 'Atom::Feed initializer' do
1240
+ it "should create an empty Feed" do
1241
+ lambda { Atom::Feed.new }.should_not raise_error
1242
+ end
1243
+
1244
+ it "should yield to a block" do
1245
+ lambda do
1246
+ Atom::Feed.new do |f|
1247
+ f.should be_an_instance_of(Atom::Feed)
1248
+ throw :yielded
1249
+ end
1250
+ end.should throw_symbol(:yielded)
1251
+ end
1252
+ end
1253
+
1254
+ describe 'Atom::Entry initializer' do
1255
+ it "should create an empty feed" do
1256
+ lambda { Atom::Entry.new }.should_not raise_error
1257
+ end
1258
+
1259
+ it "should yield to a block" do
1260
+ lambda do
1261
+ Atom::Entry.new do |f|
1262
+ f.should be_an_instance_of(Atom::Entry)
1263
+ throw :yielded
1264
+ end
1265
+ end.should throw_symbol(:yielded)
1266
+ end
1267
+ end
1268
+
1269
+ describe Atom::Content::Html do
1270
+ it "should escape ampersands in entities" do
1271
+ Atom::Content::Html.new("&nbsp;").to_xml.to_s.should == "<content type=\"html\">&amp;nbsp;</content>"
1272
+ end
1273
+ end
1274
+
1275
+ describe Atom::Content::Text do
1276
+ it "should be createable from a string" do
1277
+ txt = Atom::Content::Text.new("This is some text")
1278
+ txt.should == "This is some text"
1279
+ txt.type.should == "text"
1280
+ end
1281
+ end
1282
+
1283
+ describe Atom::Content::Xhtml do
1284
+ it "should be createable from a string" do
1285
+ txt = Atom::Content::Xhtml.new("<p>This is some text</p>")
1286
+ txt.should == "<p>This is some text</p>"
1287
+ txt.type.should == "xhtml"
1288
+ end
1289
+
1290
+ it "should be renderable to xml" do
1291
+ txt = Atom::Content::Xhtml.new("<p>This is some text</p>")
1292
+ txt.to_xml.should_not raise_error("TypeError")
1293
+ end
1294
+ end
1295
+
1296
+ describe Atom::Content::External do
1297
+ before(:each) do
1298
+ feed = nil
1299
+ lambda { feed = Atom::Feed.load_feed(File.open('spec/fixtures/external_content_single_entry.atom')) }.should_not raise_error
1300
+ entry = feed.entries.first
1301
+ entry.content.should_not be_nil
1302
+ @content = entry.content
1303
+ @content.class.should == Atom::Content::External
1304
+ end
1305
+
1306
+ it "should capture the src" do
1307
+ @content.type.should == 'application/pdf'
1308
+ @content.src.should == 'http://example.org/pdfs/robots-run-amok.pdf'
1309
+ end
1310
+
1311
+ it "should include type and src in the serialized xml" do
1312
+ xml = @content.to_xml
1313
+ xml['type'].should == 'application/pdf'
1314
+ xml['src'].should == 'http://example.org/pdfs/robots-run-amok.pdf'
1315
+ end
1316
+ end
1317
+
1318
+ describe 'Atom::Category initializer' do
1319
+ it "should create a empty category" do
1320
+ lambda { Atom::Category.new }.should_not raise_error
1321
+ end
1322
+
1323
+ it "should create from a hash" do
1324
+ category = Atom::Category.new(:term => 'term', :scheme => 'scheme', :label => 'label')
1325
+ category.term.should == 'term'
1326
+ category.scheme.should == 'scheme'
1327
+ category.label.should == 'label'
1328
+ end
1329
+
1330
+ it "should create from a block" do
1331
+ category = Atom::Category.new do |cat|
1332
+ cat.term = 'term'
1333
+ end
1334
+
1335
+ category.term.should == 'term'
1336
+ end
1337
+ end
1338
+
1339
+ describe Atom::Source do
1340
+ it "should create an empty source" do
1341
+ lambda { Atom::Source.new }.should_not raise_error
1342
+ end
1343
+
1344
+ it "should create from a hash" do
1345
+ source = Atom::Source.new(:title => 'title', :id => 'sourceid')
1346
+ source.title.should == 'title'
1347
+ source.id.should == 'sourceid'
1348
+ end
1349
+
1350
+ it "should create from a block" do
1351
+ source = Atom::Source.new do |source|
1352
+ source.title = 'title'
1353
+ source.id = 'sourceid'
1354
+ end
1355
+ source.title.should == 'title'
1356
+ source.id.should == 'sourceid'
1357
+ end
1358
+ end
1359
+
1360
+ describe Atom::Generator do
1361
+ it "should create an empty generator" do
1362
+ lambda { Atom::Generator.new }.should_not raise_error
1363
+ end
1364
+
1365
+ it "should create from a hash" do
1366
+ generator = Atom::Generator.new(:name => 'generator', :uri => 'http://generator')
1367
+ generator.name.should == 'generator'
1368
+ generator.uri.should == 'http://generator'
1369
+ end
1370
+
1371
+ it "should create from a block" do
1372
+ generator = Atom::Generator.new do |generator|
1373
+ generator.name = 'generator'
1374
+ generator.uri = 'http://generator'
1375
+ end
1376
+ generator.name.should == 'generator'
1377
+ generator.uri.should == 'http://generator'
1378
+ end
1379
+
1380
+ it "should output the name as the text of the generator element" do
1381
+ generator = Atom::Generator.new({:name => "My Generator"})
1382
+ generator.to_xml(true).to_s.should == "<generator>My Generator</generator>"
1383
+ end
1384
+ end
1385
+ end