nelumba 0.0.13
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.
- data/.gitignore +6 -0
- data/.travis.yml +9 -0
- data/Gemfile +20 -0
- data/README.md +242 -0
- data/Rakefile +7 -0
- data/assets/lotus_logo_purple.png +0 -0
- data/assets/lotus_logo_purple.svg +262 -0
- data/lib/nelumba.rb +47 -0
- data/lib/nelumba/activity.rb +250 -0
- data/lib/nelumba/application.rb +11 -0
- data/lib/nelumba/article.rb +11 -0
- data/lib/nelumba/atom/account.rb +50 -0
- data/lib/nelumba/atom/address.rb +56 -0
- data/lib/nelumba/atom/author.rb +176 -0
- data/lib/nelumba/atom/category.rb +41 -0
- data/lib/nelumba/atom/comment.rb +96 -0
- data/lib/nelumba/atom/entry.rb +216 -0
- data/lib/nelumba/atom/feed.rb +198 -0
- data/lib/nelumba/atom/generator.rb +40 -0
- data/lib/nelumba/atom/link.rb +79 -0
- data/lib/nelumba/atom/name.rb +57 -0
- data/lib/nelumba/atom/organization.rb +62 -0
- data/lib/nelumba/atom/person.rb +179 -0
- data/lib/nelumba/atom/portable_contacts.rb +117 -0
- data/lib/nelumba/atom/source.rb +179 -0
- data/lib/nelumba/atom/thread.rb +60 -0
- data/lib/nelumba/audio.rb +39 -0
- data/lib/nelumba/badge.rb +11 -0
- data/lib/nelumba/binary.rb +52 -0
- data/lib/nelumba/bookmark.rb +30 -0
- data/lib/nelumba/category.rb +49 -0
- data/lib/nelumba/collection.rb +34 -0
- data/lib/nelumba/comment.rb +47 -0
- data/lib/nelumba/crypto.rb +144 -0
- data/lib/nelumba/device.rb +11 -0
- data/lib/nelumba/discover.rb +362 -0
- data/lib/nelumba/event.rb +57 -0
- data/lib/nelumba/feed.rb +173 -0
- data/lib/nelumba/file.rb +43 -0
- data/lib/nelumba/generator.rb +53 -0
- data/lib/nelumba/group.rb +11 -0
- data/lib/nelumba/identity.rb +63 -0
- data/lib/nelumba/image.rb +30 -0
- data/lib/nelumba/link.rb +56 -0
- data/lib/nelumba/note.rb +34 -0
- data/lib/nelumba/notification.rb +229 -0
- data/lib/nelumba/object.rb +251 -0
- data/lib/nelumba/person.rb +306 -0
- data/lib/nelumba/place.rb +34 -0
- data/lib/nelumba/product.rb +30 -0
- data/lib/nelumba/publisher.rb +44 -0
- data/lib/nelumba/question.rb +30 -0
- data/lib/nelumba/review.rb +30 -0
- data/lib/nelumba/service.rb +11 -0
- data/lib/nelumba/subscription.rb +117 -0
- data/lib/nelumba/version.rb +3 -0
- data/lib/nelumba/video.rb +43 -0
- data/nelumba.gemspec +28 -0
- data/spec/activity_spec.rb +116 -0
- data/spec/application_spec.rb +136 -0
- data/spec/article_spec.rb +136 -0
- data/spec/atom/comment_spec.rb +455 -0
- data/spec/atom/feed_spec.rb +684 -0
- data/spec/audio_spec.rb +164 -0
- data/spec/badge_spec.rb +136 -0
- data/spec/binary_spec.rb +218 -0
- data/spec/bookmark.rb +150 -0
- data/spec/collection_spec.rb +152 -0
- data/spec/comment_spec.rb +128 -0
- data/spec/crypto_spec.rb +126 -0
- data/spec/device_spec.rb +136 -0
- data/spec/event_spec.rb +239 -0
- data/spec/feed_spec.rb +252 -0
- data/spec/file_spec.rb +190 -0
- data/spec/group_spec.rb +136 -0
- data/spec/helper.rb +10 -0
- data/spec/identity_spec.rb +67 -0
- data/spec/image_spec.rb +150 -0
- data/spec/link_spec.rb +30 -0
- data/spec/note_spec.rb +163 -0
- data/spec/notification_spec.rb +89 -0
- data/spec/person_spec.rb +244 -0
- data/spec/place_spec.rb +162 -0
- data/spec/product_spec.rb +150 -0
- data/spec/question_spec.rb +156 -0
- data/spec/review_spec.rb +149 -0
- data/spec/service_spec.rb +136 -0
- data/spec/video_spec.rb +164 -0
- data/test/example_feed.atom +393 -0
- data/test/example_feed_empty_author.atom +336 -0
- data/test/example_feed_false_connected.atom +359 -0
- data/test/example_feed_link_without_href.atom +134 -0
- data/test/example_page.html +4 -0
- data/test/mime_type_bug_feed.atom +874 -0
- metadata +288 -0
@@ -0,0 +1,684 @@
|
|
1
|
+
require_relative '../helper'
|
2
|
+
require_relative '../../lib/nelumba/feed.rb'
|
3
|
+
require_relative '../../lib/nelumba/atom/feed.rb'
|
4
|
+
|
5
|
+
# Sanity checks on atom generation because I don't trust ratom completely.
|
6
|
+
#
|
7
|
+
# Since I can't be completely sure how to test the implementations since they
|
8
|
+
# are patchy inheritance, I'll just do big acceptance tests and overtest.
|
9
|
+
# Somehow, these are still really fast.
|
10
|
+
describe Nelumba::Atom do
|
11
|
+
before do
|
12
|
+
author = Nelumba::Person.new(:uri => "http://example.com/users/1",
|
13
|
+
:email => "user@example.com",
|
14
|
+
:name => "wilkie",
|
15
|
+
:uid => "1",
|
16
|
+
:nickname => "wilkie",
|
17
|
+
:extended_name => {:formatted => "Dave Wilkinson",
|
18
|
+
:family_name => "Wilkinson",
|
19
|
+
:given_name => "Dave",
|
20
|
+
:middle_name => "William",
|
21
|
+
:honorific_prefix => "Mr.",
|
22
|
+
:honorific_suffix => "II"},
|
23
|
+
:address => {:formatted => "123 Cherry Lane\nFoobar, PA, USA\n15206",
|
24
|
+
:street_address => "123 Cherry Lane",
|
25
|
+
:locality => "Foobar",
|
26
|
+
:region => "PA",
|
27
|
+
:postal_code => "15206",
|
28
|
+
:country => "USA"},
|
29
|
+
:organization => {:name => "Hackers of the Severed Hand",
|
30
|
+
:department => "Making Shit",
|
31
|
+
:title => "Founder",
|
32
|
+
:type => "open source",
|
33
|
+
:start_date => Date.today,
|
34
|
+
:end_date => Date.today,
|
35
|
+
:location => "everywhere",
|
36
|
+
:description => "I make ostatus work"},
|
37
|
+
:account => {:domain => "example.com",
|
38
|
+
:username => "wilkie",
|
39
|
+
:userid => "1"},
|
40
|
+
:gender => "androgynous",
|
41
|
+
:note => "cool dude",
|
42
|
+
:display_name => "Dave Wilkinson",
|
43
|
+
:preferred_username => "wilkie",
|
44
|
+
:updated => Time.now,
|
45
|
+
:published => Time.now,
|
46
|
+
:birthday => Date.today,
|
47
|
+
:anniversary => Date.today)
|
48
|
+
|
49
|
+
source_feed = Nelumba::Feed.new(:title => "moo",
|
50
|
+
:authors => [author],
|
51
|
+
:rights => "CC")
|
52
|
+
|
53
|
+
reply_to = Nelumba::Activity.new(:type => :note,
|
54
|
+
:actor => author,
|
55
|
+
:object => Nelumba::Note.new(
|
56
|
+
:title => "My First Entry",
|
57
|
+
:html => "Hello"),
|
58
|
+
:uid => "54321",
|
59
|
+
:url => "http://example.com/entries/1",
|
60
|
+
:published => Time.now,
|
61
|
+
:updated => Time.now)
|
62
|
+
|
63
|
+
entry = Nelumba::Activity.new(:actor => author,
|
64
|
+
:type => :note,
|
65
|
+
:object => Nelumba::Note.new(
|
66
|
+
:title => "My Entry",
|
67
|
+
:html => "Hello"),
|
68
|
+
:source => source_feed,
|
69
|
+
:uid => "54321",
|
70
|
+
:url => "http://example.com/entries/1",
|
71
|
+
:published => Time.now,
|
72
|
+
:in_reply_to => reply_to,
|
73
|
+
:updated => Time.now)
|
74
|
+
|
75
|
+
@master = Nelumba::Feed.new(:title => "My Feed",
|
76
|
+
:title_type => "html",
|
77
|
+
:subtitle => "Subtitle",
|
78
|
+
:subtitle_type => "html",
|
79
|
+
:url => "http://example.com/feeds/1",
|
80
|
+
:rights => "CC0",
|
81
|
+
:icon => "http://example.com/icon.png",
|
82
|
+
:logo => "http://example.com/logo.png",
|
83
|
+
:hubs => ["http://hub.example.com",
|
84
|
+
"http://hub2.example.com"],
|
85
|
+
:published => Time.now,
|
86
|
+
:updated => Time.now,
|
87
|
+
:authors => [author],
|
88
|
+
:items => [entry],
|
89
|
+
:uid => "12345")
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should be able to reform canonical structure using Atom" do
|
93
|
+
xml = Nelumba::Atom::Feed.from_canonical(@master).to_xml
|
94
|
+
new_feed = Nelumba::Atom::Feed.new(XML::Reader.string(xml)).to_canonical
|
95
|
+
|
96
|
+
old_hash = @master.to_hash
|
97
|
+
new_hash = new_feed.to_hash
|
98
|
+
|
99
|
+
old_hash[:authors] = old_hash[:authors].map(&:to_hash)
|
100
|
+
new_hash[:authors] = new_hash[:authors].map(&:to_hash)
|
101
|
+
|
102
|
+
old_hash[:items] = old_hash[:items].map(&:to_hash)
|
103
|
+
new_hash[:items] = new_hash[:items].map(&:to_hash)
|
104
|
+
|
105
|
+
old_hash[:items][0][:in_reply_to] = []
|
106
|
+
new_hash[:items][0][:in_reply_to] = []
|
107
|
+
|
108
|
+
old_hash[:items][0][:actor] = old_hash[:items][0][:actor].to_hash
|
109
|
+
new_hash[:items][0][:actor] = new_hash[:items][0][:actor].to_hash
|
110
|
+
|
111
|
+
old_hash[:items][0][:source] = old_hash[:items][0][:source].to_hash
|
112
|
+
new_hash[:items][0][:source] = new_hash[:items][0][:source].to_hash
|
113
|
+
|
114
|
+
old_hash[:items][0][:object] = old_hash[:items][0][:object].to_hash
|
115
|
+
new_hash[:items][0][:object] = new_hash[:items][0][:object].to_hash
|
116
|
+
|
117
|
+
old_hash[:items][0][:source][:authors] = old_hash[:items][0][:source][:authors].map(&:to_hash)
|
118
|
+
new_hash[:items][0][:source][:authors] = new_hash[:items][0][:source][:authors].map(&:to_hash)
|
119
|
+
|
120
|
+
# Flatten all keys to their to_s
|
121
|
+
# We want to compare the to_s for all keys
|
122
|
+
def flatten_keys!(hash)
|
123
|
+
hash.keys.each do |k|
|
124
|
+
if hash[k].is_a? Array
|
125
|
+
# Go inside arrays (doesn't handle arrays of arrays)
|
126
|
+
hash[k].map! do |e|
|
127
|
+
if e.is_a? Hash
|
128
|
+
flatten_keys! e
|
129
|
+
e
|
130
|
+
else
|
131
|
+
e.to_s
|
132
|
+
end
|
133
|
+
end
|
134
|
+
elsif hash[k].is_a? Hash
|
135
|
+
# Go inside hashes
|
136
|
+
flatten_keys!(hash[k])
|
137
|
+
elsif hash[k].is_a? Time
|
138
|
+
# Ensure all Time classes become DateTimes for comparison
|
139
|
+
hash[k] = hash[k].to_datetime.to_s
|
140
|
+
else
|
141
|
+
# Ensure all fields become Strings
|
142
|
+
hash[k] = hash[k].to_s
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
flatten_keys!(old_hash)
|
148
|
+
flatten_keys!(new_hash)
|
149
|
+
|
150
|
+
old_hash.must_equal new_hash
|
151
|
+
end
|
152
|
+
|
153
|
+
describe "<xml>" do
|
154
|
+
before do
|
155
|
+
@xml_str = Nelumba::Atom::Feed.from_canonical(@master).to_xml
|
156
|
+
@xml = XML::Parser.string(@xml_str).parse
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should publish a version of 1.0" do
|
160
|
+
@xml_str.must_match /^<\?xml[^>]*\sversion="1\.0"/
|
161
|
+
end
|
162
|
+
|
163
|
+
it "should encode in utf-8" do
|
164
|
+
@xml_str.must_match /^<\?xml[^>]*\sencoding="UTF-8"/
|
165
|
+
end
|
166
|
+
|
167
|
+
describe "<feed>" do
|
168
|
+
before do
|
169
|
+
@feed = @xml.root
|
170
|
+
end
|
171
|
+
|
172
|
+
it "should contain the Atom namespace" do
|
173
|
+
@feed.namespaces.find_by_href("http://www.w3.org/2005/Atom").to_s
|
174
|
+
.must_equal "http://www.w3.org/2005/Atom"
|
175
|
+
end
|
176
|
+
|
177
|
+
it "should contain the PortableContacts namespace" do
|
178
|
+
@feed.namespaces.find_by_prefix('poco').to_s
|
179
|
+
.must_equal "poco:http://portablecontacts.net/spec/1.0"
|
180
|
+
end
|
181
|
+
|
182
|
+
it "should contain the ActivityStreams namespace" do
|
183
|
+
@feed.namespaces.find_by_prefix('activity').to_s
|
184
|
+
.must_equal "activity:http://activitystrea.ms/spec/1.0/"
|
185
|
+
end
|
186
|
+
|
187
|
+
describe "<id>" do
|
188
|
+
it "should contain the id from Nelumba::Feed" do
|
189
|
+
@feed.find_first('xmlns:id', 'xmlns:http://www.w3.org/2005/Atom')
|
190
|
+
.content.must_equal @master.uid
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
describe "<rights>" do
|
195
|
+
it "should contain the rights from Nelumba::Feed" do
|
196
|
+
@feed.find_first('xmlns:rights', 'xmlns:http://www.w3.org/2005/Atom')
|
197
|
+
.content.must_equal @master.rights
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
describe "<logo>" do
|
202
|
+
it "should contain the logo from Nelumba::Feed" do
|
203
|
+
@feed.find_first('xmlns:logo', 'xmlns:http://www.w3.org/2005/Atom')
|
204
|
+
.content.must_equal @master.logo
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
describe "<icon>" do
|
209
|
+
it "should contain the icon from Nelumba::Feed" do
|
210
|
+
@feed.find_first('xmlns:icon', 'xmlns:http://www.w3.org/2005/Atom')
|
211
|
+
.content.must_equal @master.icon
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
describe "<published>" do
|
216
|
+
it "should contain the time in the published field in Nelumba::Feed" do
|
217
|
+
time = @feed.find_first('xmlns:published',
|
218
|
+
'xmlns:http://www.w3.org/2005/Atom').content
|
219
|
+
DateTime::rfc3339(time).to_s.must_equal @master.published.to_datetime.to_s
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
describe "<updated>" do
|
224
|
+
it "should contain the time in the updated field in Nelumba::Feed" do
|
225
|
+
time = @feed.find_first('xmlns:updated',
|
226
|
+
'xmlns:http://www.w3.org/2005/Atom').content
|
227
|
+
DateTime::rfc3339(time).to_s.must_equal @master.updated.to_datetime.to_s
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
describe "<link>" do
|
232
|
+
it "should contain a link for the hub" do
|
233
|
+
@feed.find_first('xmlns:link[@rel="hub"]',
|
234
|
+
'xmlns:http://www.w3.org/2005/Atom').attributes
|
235
|
+
.get_attribute('href').value.must_equal(@master.hubs.first)
|
236
|
+
end
|
237
|
+
|
238
|
+
it "should allow a second link for the hub" do
|
239
|
+
@feed.find('xmlns:link[@rel="hub"]',
|
240
|
+
'xmlns:http://www.w3.org/2005/Atom')[1].attributes
|
241
|
+
.get_attribute('href').value.must_equal(@master.hubs[1])
|
242
|
+
end
|
243
|
+
|
244
|
+
it "should contain a link for self" do
|
245
|
+
@feed.find_first('xmlns:link[@rel="self"]',
|
246
|
+
'xmlns:http://www.w3.org/2005/Atom').attributes
|
247
|
+
.get_attribute('href').value.must_equal(@master.url)
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
describe "<title>" do
|
252
|
+
before do
|
253
|
+
@title = @feed.find_first('xmlns:title', 'xmlns:http://www.w3.org/2005/Atom')
|
254
|
+
end
|
255
|
+
|
256
|
+
it "should contain the title from Nelumba::Feed" do
|
257
|
+
@title.content.must_equal @master.title
|
258
|
+
end
|
259
|
+
|
260
|
+
it "should contain the type attribute from Nelumba::Feed" do
|
261
|
+
@title.attributes.get_attribute('type').value.must_equal @master.title_type
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
describe "<subtitle>" do
|
266
|
+
before do
|
267
|
+
@subtitle = @feed.find_first('xmlns:subtitle', 'xmlns:http://www.w3.org/2005/Atom')
|
268
|
+
end
|
269
|
+
|
270
|
+
it "should contain the subtitle from Nelumba::Feed" do
|
271
|
+
@subtitle.content.must_equal @master.subtitle
|
272
|
+
end
|
273
|
+
|
274
|
+
it "should contain the type attribute from Nelumba::Feed" do
|
275
|
+
@subtitle.attributes.get_attribute('type').value.must_equal @master.subtitle_type
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
describe "<author>" do
|
280
|
+
before do
|
281
|
+
@author = @feed.find_first('xmlns:author', 'xmlns:http://www.w3.org/2005/Atom')
|
282
|
+
end
|
283
|
+
|
284
|
+
describe "<activity:object-type>" do
|
285
|
+
it "should identify this tag as a person object" do
|
286
|
+
@author.find_first('activity:object-type').content
|
287
|
+
.must_equal "http://activitystrea.ms/schema/1.0/person"
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
describe "<email>" do
|
292
|
+
it "should list the author's email" do
|
293
|
+
@author.find_first('xmlns:email',
|
294
|
+
'xmlns:http://www.w3.org/2005/Atom').content.must_equal @master.authors.first.email
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
describe "<uri>" do
|
299
|
+
it "should list the author's uri" do
|
300
|
+
@author.find_first('xmlns:uri',
|
301
|
+
'xmlns:http://www.w3.org/2005/Atom').content.must_equal @master.authors.first.uri
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
describe "<name>" do
|
306
|
+
it "should list the author's name" do
|
307
|
+
@author.find_first('xmlns:name',
|
308
|
+
'xmlns:http://www.w3.org/2005/Atom').content.must_equal @master.authors.first.name
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
describe "<poco:id>" do
|
313
|
+
it "should list the author's portable contact id" do
|
314
|
+
@author.find_first('poco:id',
|
315
|
+
'http://portablecontacts.net/spec/1.0').content.must_equal @master.authors.first.uid
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
describe "<poco:name>" do
|
320
|
+
before do
|
321
|
+
@poco_name = @author.find_first('poco:name',
|
322
|
+
'http://portablecontacts.net/spec/1.0')
|
323
|
+
end
|
324
|
+
|
325
|
+
describe "<formatted>" do
|
326
|
+
it "should list the author's portable contact formatted name" do
|
327
|
+
@poco_name.find_first('xmlns:formatted',
|
328
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
329
|
+
.content.must_equal @master.authors.first.extended_name[:formatted]
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
describe "<familyName>" do
|
334
|
+
it "should list the author's portable contact family name" do
|
335
|
+
@poco_name.find_first('xmlns:familyName',
|
336
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
337
|
+
.content.must_equal @master.authors.first.extended_name[:family_name]
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
341
|
+
describe "<givenName>" do
|
342
|
+
it "should list the author's portable contact given name" do
|
343
|
+
@poco_name.find_first('xmlns:givenName',
|
344
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
345
|
+
.content.must_equal @master.authors.first.extended_name[:given_name]
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
describe "<middleName>" do
|
350
|
+
it "should list the author's portable contact middle name" do
|
351
|
+
@poco_name.find_first('xmlns:middleName',
|
352
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
353
|
+
.content.must_equal @master.authors.first.extended_name[:middle_name]
|
354
|
+
end
|
355
|
+
end
|
356
|
+
|
357
|
+
describe "<honorificPrefix>" do
|
358
|
+
it "should list the author's portable contact honorific prefix" do
|
359
|
+
@poco_name.find_first('xmlns:honorificPrefix',
|
360
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
361
|
+
.content.must_equal @master.authors.first.extended_name[:honorific_prefix]
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
365
|
+
describe "<honorificSuffix>" do
|
366
|
+
it "should list the author's portable contact honorific suffix" do
|
367
|
+
@poco_name.find_first('xmlns:honorificSuffix',
|
368
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
369
|
+
.content.must_equal @master.authors.first.extended_name[:honorific_suffix]
|
370
|
+
end
|
371
|
+
end
|
372
|
+
end
|
373
|
+
|
374
|
+
describe "<poco:organization>" do
|
375
|
+
before do
|
376
|
+
@poco_org = @author.find_first('poco:organization',
|
377
|
+
'http://portablecontacts.net/spec/1.0')
|
378
|
+
end
|
379
|
+
|
380
|
+
describe "<name>" do
|
381
|
+
it "should list the author's portable contact organization name" do
|
382
|
+
@poco_org.find_first('xmlns:name',
|
383
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
384
|
+
.content.must_equal @master.authors.first.organization[:name]
|
385
|
+
end
|
386
|
+
end
|
387
|
+
|
388
|
+
describe "<department>" do
|
389
|
+
it "should list the author's portable contact organization department" do
|
390
|
+
@poco_org.find_first('xmlns:department',
|
391
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
392
|
+
.content.must_equal @master.authors.first.organization[:department]
|
393
|
+
end
|
394
|
+
end
|
395
|
+
|
396
|
+
describe "<title>" do
|
397
|
+
it "should list the author's portable contact organization title" do
|
398
|
+
@poco_org.find_first('xmlns:title',
|
399
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
400
|
+
.content.must_equal @master.authors.first.organization[:title]
|
401
|
+
end
|
402
|
+
end
|
403
|
+
|
404
|
+
describe "<type>" do
|
405
|
+
it "should list the author's portable contact organization type" do
|
406
|
+
@poco_org.find_first('xmlns:type',
|
407
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
408
|
+
.content.must_equal @master.authors.first.organization[:type]
|
409
|
+
end
|
410
|
+
end
|
411
|
+
|
412
|
+
describe "<startDate>" do
|
413
|
+
it "should list the author's portable contact organization startDate" do
|
414
|
+
time = @poco_org.find_first('xmlns:startDate',
|
415
|
+
'xmlns:http://www.w3.org/2005/Atom').content
|
416
|
+
DateTime::parse(time).to_s
|
417
|
+
.must_equal @master.authors.first.organization[:start_date].to_datetime.to_s
|
418
|
+
end
|
419
|
+
end
|
420
|
+
|
421
|
+
describe "<endDate>" do
|
422
|
+
it "should list the author's portable contact organization endDate" do
|
423
|
+
time = @poco_org.find_first('xmlns:endDate',
|
424
|
+
'xmlns:http://www.w3.org/2005/Atom').content
|
425
|
+
DateTime::parse(time).to_s
|
426
|
+
.must_equal @master.authors.first.organization[:end_date].to_datetime.to_s
|
427
|
+
end
|
428
|
+
end
|
429
|
+
|
430
|
+
describe "<location>" do
|
431
|
+
it "should list the author's portable contact organization location" do
|
432
|
+
@poco_org.find_first('xmlns:location',
|
433
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
434
|
+
.content.must_equal @master.authors.first.organization[:location]
|
435
|
+
end
|
436
|
+
end
|
437
|
+
|
438
|
+
describe "<description>" do
|
439
|
+
it "should list the author's portable contact organization description" do
|
440
|
+
@poco_org.find_first('xmlns:description',
|
441
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
442
|
+
.content.must_equal @master.authors.first.organization[:description]
|
443
|
+
end
|
444
|
+
end
|
445
|
+
end
|
446
|
+
|
447
|
+
describe "<poco:address>" do
|
448
|
+
before do
|
449
|
+
@poco_address = @author.find_first('poco:address',
|
450
|
+
'http://portablecontacts.net/spec/1.0')
|
451
|
+
end
|
452
|
+
|
453
|
+
describe "<formatted>" do
|
454
|
+
it "should list the author's portable contact formatted address" do
|
455
|
+
@poco_address.find_first('xmlns:formatted',
|
456
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
457
|
+
.content.must_equal @master.authors.first.address[:formatted]
|
458
|
+
end
|
459
|
+
end
|
460
|
+
|
461
|
+
describe "<streetAddress>" do
|
462
|
+
it "should list the author's portable contact address streetAddress" do
|
463
|
+
@poco_address.find_first('xmlns:streetAddress',
|
464
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
465
|
+
.content.must_equal @master.authors.first.address[:street_address]
|
466
|
+
end
|
467
|
+
end
|
468
|
+
|
469
|
+
describe "<locality>" do
|
470
|
+
it "should list the author's portable contact address locality" do
|
471
|
+
@poco_address.find_first('xmlns:locality',
|
472
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
473
|
+
.content.must_equal @master.authors.first.address[:locality]
|
474
|
+
end
|
475
|
+
end
|
476
|
+
|
477
|
+
describe "<region>" do
|
478
|
+
it "should list the author's portable contact address region" do
|
479
|
+
@poco_address.find_first('xmlns:region',
|
480
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
481
|
+
.content.must_equal @master.authors.first.address[:region]
|
482
|
+
end
|
483
|
+
end
|
484
|
+
|
485
|
+
describe "<postalCode>" do
|
486
|
+
it "should list the author's portable contact address postalCode" do
|
487
|
+
@poco_address.find_first('xmlns:postalCode',
|
488
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
489
|
+
.content.must_equal @master.authors.first.address[:postal_code]
|
490
|
+
end
|
491
|
+
end
|
492
|
+
|
493
|
+
describe "<country>" do
|
494
|
+
it "should list the author's portable contact address country" do
|
495
|
+
@poco_address.find_first('xmlns:country',
|
496
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
497
|
+
.content.must_equal @master.authors.first.address[:country]
|
498
|
+
end
|
499
|
+
end
|
500
|
+
end
|
501
|
+
|
502
|
+
describe "<poco:account>" do
|
503
|
+
before do
|
504
|
+
@poco_account = @author.find_first('poco:account',
|
505
|
+
'http://portablecontacts.net/spec/1.0')
|
506
|
+
end
|
507
|
+
|
508
|
+
describe "<domain>" do
|
509
|
+
it "should list the author's portable contact account domain" do
|
510
|
+
@poco_account.find_first('xmlns:domain',
|
511
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
512
|
+
.content.must_equal @master.authors.first.account[:domain]
|
513
|
+
end
|
514
|
+
end
|
515
|
+
|
516
|
+
describe "<username>" do
|
517
|
+
it "should list the author's portable contact account username" do
|
518
|
+
@poco_account.find_first('xmlns:username',
|
519
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
520
|
+
.content.must_equal @master.authors.first.account[:username]
|
521
|
+
end
|
522
|
+
end
|
523
|
+
|
524
|
+
describe "<userid>" do
|
525
|
+
it "should list the author's portable contact account userid" do
|
526
|
+
@poco_account.find_first('xmlns:userid',
|
527
|
+
'xmlns:http://www.w3.org/2005/Atom')
|
528
|
+
.content.must_equal @master.authors.first.account[:userid]
|
529
|
+
end
|
530
|
+
end
|
531
|
+
end
|
532
|
+
|
533
|
+
describe "<poco:displayName>" do
|
534
|
+
it "should list the author's portable contact display name" do
|
535
|
+
@author.find_first('poco:displayName',
|
536
|
+
'http://portablecontacts.net/spec/1.0')
|
537
|
+
.content.must_equal @master.authors.first.display_name
|
538
|
+
end
|
539
|
+
end
|
540
|
+
|
541
|
+
describe "<poco:nickname>" do
|
542
|
+
it "should list the author's portable contact nickname" do
|
543
|
+
@author.find_first('poco:nickname',
|
544
|
+
'http://portablecontacts.net/spec/1.0')
|
545
|
+
.content.must_equal @master.authors.first.nickname
|
546
|
+
end
|
547
|
+
end
|
548
|
+
|
549
|
+
describe "<poco:gender>" do
|
550
|
+
it "should list the author's portable contact gender" do
|
551
|
+
@author.find_first('poco:gender',
|
552
|
+
'http://portablecontacts.net/spec/1.0')
|
553
|
+
.content.must_equal @master.authors.first.gender
|
554
|
+
end
|
555
|
+
end
|
556
|
+
|
557
|
+
describe "<poco:note>" do
|
558
|
+
it "should list the author's portable contact note" do
|
559
|
+
@author.find_first('poco:note',
|
560
|
+
'http://portablecontacts.net/spec/1.0')
|
561
|
+
.content.must_equal @master.authors.first.note
|
562
|
+
end
|
563
|
+
end
|
564
|
+
|
565
|
+
describe "<poco:preferredUsername>" do
|
566
|
+
it "should list the author's portable contact preferred username" do
|
567
|
+
@author.find_first('poco:preferredUsername',
|
568
|
+
'http://portablecontacts.net/spec/1.0')
|
569
|
+
.content.must_equal @master.authors.first.preferred_username
|
570
|
+
end
|
571
|
+
end
|
572
|
+
|
573
|
+
describe "<poco:birthday>" do
|
574
|
+
it "should list the author's portable contact birthday" do
|
575
|
+
time = @author.find_first('poco:birthday',
|
576
|
+
'http://portablecontacts.net/spec/1.0').content
|
577
|
+
DateTime::parse(time).to_s.must_equal @master.authors.first
|
578
|
+
.birthday.to_datetime.to_s
|
579
|
+
end
|
580
|
+
end
|
581
|
+
|
582
|
+
describe "<poco:anniversary>" do
|
583
|
+
it "should list the author's portable contact anniversary" do
|
584
|
+
time = @author.find_first('poco:anniversary',
|
585
|
+
'http://portablecontacts.net/spec/1.0').content
|
586
|
+
DateTime::parse(time).to_s.must_equal @master.authors.first
|
587
|
+
.anniversary.to_datetime.to_s
|
588
|
+
end
|
589
|
+
end
|
590
|
+
|
591
|
+
describe "<poco:published>" do
|
592
|
+
it "should list the author's portable contact published date" do
|
593
|
+
time = @author.find_first('poco:published',
|
594
|
+
'http://portablecontacts.net/spec/1.0').content
|
595
|
+
DateTime::parse(time).to_s.must_equal @master.authors.first
|
596
|
+
.published.to_datetime.to_s
|
597
|
+
end
|
598
|
+
end
|
599
|
+
|
600
|
+
describe "<poco:updated>" do
|
601
|
+
it "should list the author's portable contact updated date" do
|
602
|
+
time = @author.find_first('poco:updated',
|
603
|
+
'http://portablecontacts.net/spec/1.0').content
|
604
|
+
DateTime::parse(time).to_s.must_equal @master.authors.first
|
605
|
+
.updated.to_datetime.to_s
|
606
|
+
end
|
607
|
+
end
|
608
|
+
end
|
609
|
+
|
610
|
+
describe "<entry>" do
|
611
|
+
before do
|
612
|
+
@entry = @feed.find_first('xmlns:entry', 'xmlns:http://www.w3.org/2005/Atom')
|
613
|
+
end
|
614
|
+
|
615
|
+
it "should have the thread namespace" do
|
616
|
+
@entry.namespaces.find_by_prefix('thr').to_s
|
617
|
+
.must_equal "thr:http://purl.org/syndication/thread/1.0"
|
618
|
+
end
|
619
|
+
|
620
|
+
it "should have the activity streams namespace" do
|
621
|
+
@entry.namespaces.find_by_prefix('activity').to_s
|
622
|
+
.must_equal "activity:http://activitystrea.ms/spec/1.0/"
|
623
|
+
end
|
624
|
+
|
625
|
+
describe "<title>" do
|
626
|
+
it "should contain the entry title" do
|
627
|
+
@entry.find_first('xmlns:title', 'xmlns:http://www.w3.org/2005/Atom')
|
628
|
+
.content.must_equal @master.items.first.object.title
|
629
|
+
end
|
630
|
+
end
|
631
|
+
|
632
|
+
describe "<id>" do
|
633
|
+
it "should contain the entry id" do
|
634
|
+
@entry.find_first('xmlns:id', 'xmlns:http://www.w3.org/2005/Atom')
|
635
|
+
.content.must_equal @master.items.first.uid
|
636
|
+
end
|
637
|
+
end
|
638
|
+
|
639
|
+
describe "<link>" do
|
640
|
+
it "should contain a link for self" do
|
641
|
+
@entry.find_first('xmlns:link[@rel="self"]',
|
642
|
+
'xmlns:http://www.w3.org/2005/Atom').attributes
|
643
|
+
.get_attribute('href').value.must_equal(@master.items.first.url)
|
644
|
+
end
|
645
|
+
end
|
646
|
+
|
647
|
+
describe "<updated>" do
|
648
|
+
it "should contain the entry updated date" do
|
649
|
+
time = @entry.find_first('xmlns:updated',
|
650
|
+
'xmlns:http://www.w3.org/2005/Atom').content
|
651
|
+
DateTime.parse(time).to_s.must_equal @master.items.first.updated.to_datetime.to_s
|
652
|
+
end
|
653
|
+
end
|
654
|
+
|
655
|
+
describe "<published>" do
|
656
|
+
it "should contain the entry published date" do
|
657
|
+
time = @entry.find_first('xmlns:published',
|
658
|
+
'xmlns:http://www.w3.org/2005/Atom').content
|
659
|
+
DateTime.parse(time).to_s.must_equal @master.items.first.published.to_datetime.to_s
|
660
|
+
end
|
661
|
+
end
|
662
|
+
|
663
|
+
describe "<activity:object-type>" do
|
664
|
+
it "should reflect the activity for this entry" do
|
665
|
+
@entry.find_first('activity:object-type').content
|
666
|
+
.must_equal "http://activitystrea.ms/schema/1.0/note"
|
667
|
+
end
|
668
|
+
end
|
669
|
+
|
670
|
+
describe "<content>" do
|
671
|
+
it "should contain the entry content" do
|
672
|
+
@entry.find_first('xmlns:content', 'xmlns:http://www.w3.org/2005/Atom')
|
673
|
+
.content.must_equal @master.items.first.object.html
|
674
|
+
end
|
675
|
+
|
676
|
+
it "should have the corresponding type attribute" do
|
677
|
+
@entry.find_first('xmlns:content', 'xmlns:http://www.w3.org/2005/Atom')
|
678
|
+
.attributes.get_attribute('type').value.must_equal "html"
|
679
|
+
end
|
680
|
+
end
|
681
|
+
end
|
682
|
+
end
|
683
|
+
end
|
684
|
+
end
|