jubjub 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. data/README.mdown +27 -1
  2. data/lib/jubjub.rb +1 -1
  3. data/lib/jubjub/connection/xmpp_gateway.rb +9 -9
  4. data/lib/jubjub/connection/xmpp_gateway/helper.rb +5 -5
  5. data/lib/jubjub/connection/xmpp_gateway/muc.rb +127 -32
  6. data/lib/jubjub/connection/xmpp_gateway/pubsub.rb +64 -64
  7. data/lib/jubjub/data_form.rb +16 -13
  8. data/lib/jubjub/errors.rb +2 -2
  9. data/lib/jubjub/helpers.rb +32 -0
  10. data/lib/jubjub/jid.rb +8 -8
  11. data/lib/jubjub/muc.rb +3 -1
  12. data/lib/jubjub/muc/affiliation.rb +77 -0
  13. data/lib/jubjub/muc/affiliations_collection.rb +31 -0
  14. data/lib/jubjub/muc/collection.rb +12 -19
  15. data/lib/jubjub/muc/configuration.rb +2 -2
  16. data/lib/jubjub/muc/muc.rb +24 -11
  17. data/lib/jubjub/pubsub.rb +1 -1
  18. data/lib/jubjub/pubsub/affiliation.rb +20 -20
  19. data/lib/jubjub/pubsub/affiliation_collection.rb +11 -18
  20. data/lib/jubjub/pubsub/collection.rb +14 -21
  21. data/lib/jubjub/pubsub/configuration.rb +2 -2
  22. data/lib/jubjub/pubsub/item.rb +8 -8
  23. data/lib/jubjub/pubsub/item_collection.rb +10 -17
  24. data/lib/jubjub/pubsub/pubsub.rb +17 -17
  25. data/lib/jubjub/pubsub/subscription.rb +6 -6
  26. data/lib/jubjub/response.rb +1 -1
  27. data/lib/jubjub/response/error.rb +6 -6
  28. data/lib/jubjub/response/proxy.rb +8 -8
  29. data/lib/jubjub/response/response.rb +10 -10
  30. data/lib/jubjub/user.rb +16 -15
  31. data/spec/connection/xmpp_gateway_muc_spec.rb +174 -40
  32. data/spec/connection/xmpp_gateway_pubsub_spec.rb +100 -104
  33. data/spec/fixtures/vcr_cassettes/muc_configuration.yml +73 -6
  34. data/spec/fixtures/vcr_cassettes/muc_create_with_configuration.yml +8 -8
  35. data/spec/fixtures/vcr_cassettes/muc_message.yml +89 -0
  36. data/spec/fixtures/vcr_cassettes/muc_modify_affiliations.yml +367 -0
  37. data/spec/fixtures/vcr_cassettes/muc_retrieve_affiliations.yml +93 -0
  38. data/spec/fixtures/vcr_cassettes/pubsub_publish_with_dataform_payload.yml +3 -3
  39. data/spec/fixtures/vcr_cassettes/pubsub_retrieve_items.yml +24 -18
  40. data/spec/mixins/user_spec.rb +37 -37
  41. data/spec/models/data_form_spec.rb +3 -3
  42. data/spec/models/jid_spec.rb +41 -41
  43. data/spec/models/muc_affiliation_collection_spec.rb +146 -0
  44. data/spec/models/muc_affiliation_spec.rb +215 -0
  45. data/spec/models/muc_collection_spec.rb +64 -32
  46. data/spec/models/muc_configuration_spec.rb +3 -3
  47. data/spec/models/muc_spec.rb +44 -23
  48. data/spec/models/pubsub_affiliation_collection_spec.rb +65 -30
  49. data/spec/models/pubsub_affiliation_spec.rb +50 -50
  50. data/spec/models/pubsub_collection_spec.rb +65 -49
  51. data/spec/models/pubsub_item_collection_spec.rb +17 -17
  52. data/spec/models/pubsub_item_spec.rb +18 -18
  53. data/spec/models/pubsub_spec.rb +41 -41
  54. data/spec/models/pubsub_subscription_spec.rb +23 -23
  55. data/spec/models/response_error_spec.rb +19 -19
  56. data/spec/models/response_proxy_spec.rb +51 -49
  57. data/spec/models/response_spec.rb +33 -33
  58. data/spec/support/helpers.rb +21 -1
  59. data/spec/support/matchers.rb +4 -4
  60. data/spec/support/shared_examples.rb +132 -94
  61. data/spec/support/webmock_stanza_matching.rb +43 -0
  62. metadata +45 -16
@@ -4,4 +4,24 @@ end
4
4
 
5
5
  def fixture_path(location)
6
6
  File.join(File.dirname(File.dirname(__FILE__)),'fixtures',location)
7
- end
7
+ end
8
+
9
+ def muc_affiliation_factory(override = {})
10
+ options = {
11
+ :muc_jid => Jubjub::Jid.new("borogove@conference.foo.com"),
12
+ :jid => "mimsy@foo.com",
13
+ :nick => 'mimsy',
14
+ :role => 'none',
15
+ :affiliation => 'none',
16
+ :connection => 'SHHHH CONNECTION OBJECT'
17
+ }.merge( override )
18
+
19
+ Jubjub::Muc::Affiliation.new(
20
+ options[:muc_jid],
21
+ options[:jid],
22
+ options[:nick],
23
+ options[:role],
24
+ options[:affiliation],
25
+ options[:connection]
26
+ )
27
+ end
@@ -1,7 +1,7 @@
1
- RSpec::Matchers.define :be_a_kind_of_response_proxied do |secondary_class|
1
+ RSpec::Matchers.define :be_a_kind_of_response_proxied do |secondary_class|
2
2
  match do |proxy|
3
- proxy.proxy_class == Jubjub::Response::Proxy &&
4
- proxy.proxy_primary.class == Jubjub::Response &&
3
+ proxy.proxy_class == Jubjub::Response::Proxy &&
4
+ proxy.proxy_primary.class == Jubjub::Response &&
5
5
  proxy.proxy_secondary.class == secondary_class
6
6
  end
7
- end
7
+ end
@@ -1,11 +1,11 @@
1
1
  shared_examples_for "any data form" do
2
-
2
+
3
3
  describe "creating" do
4
-
4
+
5
5
  it "should understand XML to build object" do
6
6
  dataform_1 = xml_fixture 'dataform_1'
7
7
  dataform = subject.class.new(dataform_1)
8
-
8
+
9
9
  expected = {
10
10
  "public" => { :type => "boolean", :value => "", :label => "Public bot?" },
11
11
  "FORM_TYPE" => { :type => "hidden", :value => "jabber:bot", :label => nil},
@@ -17,7 +17,7 @@ shared_examples_for "any data form" do
17
17
  {:value => "contests", :label=>"Contests"},
18
18
  {:value => "news", :label=>"News"},
19
19
  {:value => "polls", :label=>"Polls"},
20
- {:value => "reminders", :label=>"Reminders"},
20
+ {:value => "reminders", :label=>"Reminders"},
21
21
  {:value => "search", :label=>"Search"}
22
22
  ]},
23
23
  "maxsubs" => { :type => "list-single", :value => "20", :label => "Maximum number of subscribers", :options => [
@@ -28,15 +28,15 @@ shared_examples_for "any data form" do
28
28
  { :value => "100", :label=>"100"},
29
29
  { :value => "none", :label=>"None"}]}
30
30
  }
31
-
31
+
32
32
  dataform.fields.should == expected
33
33
  end
34
-
34
+
35
35
  it "should understand hash to build object" do
36
- params = {
36
+ params = {
37
37
  "muc#roomconfig_allowvisitornickchange" => { :type => "boolean", :value => "1", :label => "Allow visitors to change nickname" },
38
38
  "muc#roomconfig_roomname" => { :type => "text-single", :value => "", :label => "Room title" },
39
- "muc#roomconfig_whois" => {
39
+ "muc#roomconfig_whois" => {
40
40
  :type => "list-single",
41
41
  :value => "moderators",
42
42
  :label => "Present real Jabber IDs to",
@@ -46,44 +46,35 @@ shared_examples_for "any data form" do
46
46
  },
47
47
  "muc#roomconfig_passwordprotectedroom" => { :type => "boolean", :value => "0", :label => "Make room password protected" }
48
48
  }
49
-
49
+
50
50
  config = subject.class.new params
51
-
51
+
52
52
  config.should be_a_kind_of subject.class
53
53
  config.fields.should == params
54
54
  end
55
-
56
- it "should throw an error if :type is missing" do
57
- expect{
58
- subject.class.new( "foo" => { :value => "1", :label => "Foo" } )
59
- }.to raise_error(
60
- Jubjub::ArgumentError,
61
- ":type is missing for foo"
62
- )
63
- end
64
-
55
+
65
56
  it "should throw an error if an unknown key is sent" do
66
- expect{
57
+ expect{
67
58
  subject.class.new( "foo" => { :type => "boolean", :value => "1", :label => "Foo", :oh_no => nil } )
68
- }.to raise_error(
59
+ }.to raise_error(
69
60
  Jubjub::ArgumentError,
70
61
  ":oh_no is not a recognised option for foo"
71
62
  )
72
63
  end
73
-
64
+
74
65
  it "should throw an error if a hash isn't passed in" do
75
- expect{
66
+ expect{
76
67
  subject.class.new( "config" )
77
- }.to raise_error(
68
+ }.to raise_error(
78
69
  Jubjub::ArgumentError,
79
70
  "please initialize with a hash of the format { 'foo' => {:type => 'boolean', :value => false, :label => 'Fooey'} }"
80
71
  )
81
72
  end
82
-
73
+
83
74
  end
84
-
75
+
85
76
  describe "instance method" do
86
-
77
+
87
78
  describe "[]" do
88
79
  context "for booleans" do
89
80
  before do
@@ -110,16 +101,16 @@ shared_examples_for "any data form" do
110
101
  }
111
102
  )
112
103
  end
113
-
104
+
114
105
  it "should return false or true" do
115
106
  @config['muc#roomconfig_allowinvites'].should be_false
116
107
  @config['muc#roomconfig_moderatedroom'].should be_false
117
-
108
+
118
109
  @config['muc#roomconfig_changesubject'].should be_true
119
110
  @config['muc#roomconfig_publicroom'].should be_true
120
111
  end
121
112
  end
122
-
113
+
123
114
  context "for lists" do
124
115
  before do
125
116
  @config = subject.class.new(
@@ -146,16 +137,16 @@ shared_examples_for "any data form" do
146
137
  }
147
138
  )
148
139
  end
149
-
140
+
150
141
  it "should return an array for list-multi" do
151
142
  @config["muc#roomconfig_presencebroadcast"].should == ["moderator", "participant", "visitor"]
152
143
  end
153
-
144
+
154
145
  it "should return a single item for list-single" do
155
- @config["muc#roomconfig_maxusers"].should == "20"
146
+ @config["muc#roomconfig_maxusers"].should == "20"
156
147
  end
157
148
  end
158
-
149
+
159
150
  context "for jids" do
160
151
  before do
161
152
  @config = subject.class.new(
@@ -171,15 +162,15 @@ shared_examples_for "any data form" do
171
162
  }
172
163
  )
173
164
  end
174
-
165
+
175
166
  it "should return a Jubjub::Jid" do
176
167
  jids = [Jubjub::Jid.new("wiccarocks@shakespeare.lit"), Jubjub::Jid.new("hecate@shakespeare.lit")]
177
-
168
+
178
169
  @config['muc#roomconfig_roomadmins'].should == jids
179
170
  @config['special_jid'].should == Jubjub::Jid.new("foo@bar.com")
180
171
  end
181
172
  end
182
-
173
+
183
174
  context "for non existent options" do
184
175
  before do
185
176
  @config = subject.class.new(
@@ -190,15 +181,15 @@ shared_examples_for "any data form" do
190
181
  }
191
182
  )
192
183
  end
193
-
184
+
194
185
  it "should return nil" do
195
186
  @config['made_up'].should be_nil
196
187
  end
197
188
  end
198
189
  end
199
-
190
+
200
191
  describe "[]=" do
201
-
192
+
202
193
  context "for booleans do" do
203
194
  before do
204
195
  @config = subject.class.new(
@@ -209,33 +200,33 @@ shared_examples_for "any data form" do
209
200
  }
210
201
  )
211
202
  end
212
-
203
+
213
204
  it "should convert '0' to false" do
214
205
  @config["muc#roomconfig_allowinvites"] = '0'
215
206
  @config["muc#roomconfig_allowinvites"].should be_false
216
207
  end
217
-
208
+
218
209
  it "should convert '1' to true" do
219
210
  @config["muc#roomconfig_allowinvites"] = '1'
220
211
  @config["muc#roomconfig_allowinvites"].should be_true
221
212
  end
222
-
213
+
223
214
  it "should convert 'true' to true" do
224
215
  @config["muc#roomconfig_allowinvites"] = 'true'
225
216
  @config["muc#roomconfig_allowinvites"].should be_true
226
217
  end
227
-
218
+
228
219
  it "should convert 'false' to false" do
229
220
  @config["muc#roomconfig_allowinvites"] = 'false'
230
221
  @config["muc#roomconfig_allowinvites"].should be_false
231
222
  end
232
-
223
+
233
224
  it "should return false if something else" do
234
225
  @config["muc#roomconfig_allowinvites"] = 'wibble'
235
226
  @config["muc#roomconfig_allowinvites"].should be_false
236
227
  end
237
228
  end
238
-
229
+
239
230
  context "for multi types" do
240
231
  before do
241
232
  @config = subject.class.new(
@@ -246,20 +237,20 @@ shared_examples_for "any data form" do
246
237
  }
247
238
  )
248
239
  end
249
-
240
+
250
241
  it "should accept an array" do
251
242
  @config['muc#roomconfig_roomadmins'] = ['giraffe@zoo', 'elephant@zoo']
252
-
243
+
253
244
  @config['muc#roomconfig_roomadmins'].should == [Jubjub::Jid.new('giraffe@zoo'), Jubjub::Jid.new('elephant@zoo')]
254
245
  end
255
-
246
+
256
247
  it "should convert to an array if it isn't" do
257
248
  @config['muc#roomconfig_roomadmins'] = 'giraffe@zoo'
258
-
249
+
259
250
  @config['muc#roomconfig_roomadmins'].should == [Jubjub::Jid.new('giraffe@zoo')]
260
251
  end
261
252
  end
262
-
253
+
263
254
  context "for list types" do
264
255
  before do
265
256
  @config = subject.class.new(
@@ -286,23 +277,23 @@ shared_examples_for "any data form" do
286
277
  }
287
278
  )
288
279
  end
289
-
280
+
290
281
  it "should set the value if it is a valid option" do
291
282
  @config['muc#roomconfig_maxusers'] = "10"
292
283
  @config['muc#roomconfig_maxusers'].should eql("10")
293
-
284
+
294
285
  @config['muc#roomconfig_presencebroadcast'] = ["visitor"]
295
- @config['muc#roomconfig_presencebroadcast'].should eql(["visitor"])
286
+ @config['muc#roomconfig_presencebroadcast'].should eql(["visitor"])
296
287
  end
297
-
288
+
298
289
  it "should raise an error if the value isn't one of the options" do
299
290
  expect{
300
- @config['muc#roomconfig_maxusers'] = "50000"
291
+ @config['muc#roomconfig_maxusers'] = "50000"
301
292
  }.to raise_error(
302
293
  Jubjub::ArgumentError,
303
294
  "50000 is not an accepted value please choose from 10, 20, 30, 40"
304
295
  )
305
-
296
+
306
297
  expect{
307
298
  @config['muc#roomconfig_presencebroadcast'] = ["superman", "moderators"]
308
299
  }.to raise_error(
@@ -311,7 +302,7 @@ shared_examples_for "any data form" do
311
302
  )
312
303
  end
313
304
  end
314
-
305
+
315
306
  context "for jid types" do
316
307
  before do
317
308
  @config = subject.class.new(
@@ -327,7 +318,7 @@ shared_examples_for "any data form" do
327
318
  }
328
319
  )
329
320
  end
330
-
321
+
331
322
  it "should convert strings to jids" do
332
323
  @config['muc#roomconfig_roomadmins'] = ["foo@bar.com", "bar@foo.com"]
333
324
  @config['muc#roomconfig_roomadmins'].should == [Jubjub::Jid.new('foo@bar.com'), Jubjub::Jid.new('bar@foo.com')]
@@ -335,7 +326,7 @@ shared_examples_for "any data form" do
335
326
  @config['special_jid'] = "bar@foo.com"
336
327
  @config['special_jid'].should == Jubjub::Jid.new('bar@foo.com')
337
328
  end
338
-
329
+
339
330
  it "should accept jids" do
340
331
  @config['muc#roomconfig_roomadmins'] = [Jubjub::Jid.new('foo@bar.com'), Jubjub::Jid.new('bar@foo.com')]
341
332
  @config['muc#roomconfig_roomadmins'].should == [Jubjub::Jid.new('foo@bar.com'), Jubjub::Jid.new('bar@foo.com')]
@@ -344,7 +335,7 @@ shared_examples_for "any data form" do
344
335
  @config['special_jid'].should == Jubjub::Jid.new('bar@foo.com')
345
336
  end
346
337
  end
347
-
338
+
348
339
  context "for non existent fields" do
349
340
  before do
350
341
  @config = subject.class.new(
@@ -355,9 +346,9 @@ shared_examples_for "any data form" do
355
346
  }
356
347
  )
357
348
  end
358
-
349
+
359
350
  it "should raise an error" do
360
- expect{
351
+ expect{
361
352
  @config['fooey'] = "bar"
362
353
  }.to raise_error(
363
354
  Jubjub::ArgumentError,
@@ -365,9 +356,9 @@ shared_examples_for "any data form" do
365
356
  )
366
357
  end
367
358
  end
368
-
359
+
369
360
  end
370
-
361
+
371
362
  describe "fields" do
372
363
  it "should return all of the types, values, labels and options for each field" do
373
364
  params = {
@@ -382,7 +373,7 @@ shared_examples_for "any data form" do
382
373
  ]
383
374
  }
384
375
  }
385
-
376
+
386
377
  adjusted_params = {
387
378
  "allow_query_users" => { :type => "boolean", :value => false, :label => "Allow users to query other users" },
388
379
  "muc#roomconfig_maxusers" => {
@@ -395,37 +386,37 @@ shared_examples_for "any data form" do
395
386
  ]
396
387
  }
397
388
  }
398
-
389
+
399
390
  config = subject.class.new(params)
400
391
  config.fields.should == params
401
-
392
+
402
393
  config['allow_query_users'] = false
403
394
  config.fields.should == adjusted_params
404
395
  end
405
396
  end
406
-
397
+
407
398
  describe "==" do
408
- it "should match the same room config" do
399
+ it "should match the same room config" do
409
400
  config_1 = subject.class.new("allow_query_users" => { :type => "boolean", :value => "1", :label => "Foo" } )
410
401
  config_2 = subject.class.new("allow_query_users" => { :type => "boolean", :value => "1", :label => "Foo" } )
411
-
402
+
412
403
  config_1.should == config_2
413
404
  end
414
-
405
+
415
406
  it "should not match a different room config" do
416
407
  config_1 = subject.class.new("allow_query_users" => { :type => "boolean", :value => "1", :label => "Foo" } )
417
408
  config_2 = subject.class.new("allow_query_users" => { :type => "boolean", :value => "0", :label => "Foo" } )
418
-
409
+
419
410
  config_1.should_not == config_2
420
411
  end
421
412
  end
422
-
413
+
423
414
  describe "settings" do
424
415
  before do
425
416
  @config = subject.class.new(
426
417
  "muc#roomconfig_allowvisitornickchange" => { :type => "boolean", :value => "1", :label => "Allow visitors to change nickname" },
427
418
  "muc#roomconfig_roomname" => { :type => "text-single", :value => "", :label => "Room title" },
428
- "muc#roomconfig_whois" => {
419
+ "muc#roomconfig_whois" => {
429
420
  :type => "list-single",
430
421
  :value => "moderators",
431
422
  :label => "Present real Jabber IDs to",
@@ -440,9 +431,9 @@ shared_examples_for "any data form" do
440
431
  },
441
432
  "muc#roomconfig_passwordprotectedroom" => { :type => "boolean", :value => "0", :label => "Make room password protected" }
442
433
  )
443
-
434
+
444
435
  end
445
-
436
+
446
437
  it "should generate hash of name and values" do
447
438
  @config.settings.should == {
448
439
  "muc#roomconfig_allowvisitornickchange" => [true],
@@ -455,53 +446,100 @@ shared_examples_for "any data form" do
455
446
  end
456
447
 
457
448
  describe "to_builder" do
458
-
449
+
459
450
  it "should return a Nokogiri::XML::Builder" do
460
- subject.to_builder.should be_a_kind_of Nokogiri::XML::Builder
451
+ subject.to_builder.should be_a_kind_of Nokogiri::XML::Builder
461
452
  end
462
-
453
+
454
+ it "should return a valid dataform" do
455
+ @config = subject.class.new(
456
+ "boolean_field" => { :type => "boolean", :value => "1", :label => "Boolean Field" },
457
+ "text_single_field" => { :type => "text-single", :value => "", :label => "Text Single Field" },
458
+ "list_single_field" => {
459
+ :type => "list-single",
460
+ :value => "first",
461
+ :label => "List Single Field",
462
+ :options => [
463
+ { :value => "first", :label => "The first option" },
464
+ { :value => "second", :label => "The second option" } ],
465
+ },
466
+ "jid_multi_field" => {
467
+ :type => "jid-multi",
468
+ :label => "Jid Multi Field",
469
+ :value => ["first@jid", "second@jid"]
470
+ },
471
+ "unknown_field" => { :value => "0", :label => "Unknown Field" }
472
+ )
473
+
474
+ @xml = @config.to_builder.to_xml
475
+
476
+ @expected_xml = <<-EOS
477
+ <?xml version="1.0"?>
478
+ <x xmlns="jabber:x:data" type="submit">
479
+ <field var="boolean_field" type="boolean">
480
+ <value>true</value>
481
+ </field>
482
+ <field var="text_single_field" type="text-single">
483
+ <value></value>
484
+ </field>
485
+ <field var="list_single_field" type="list-single">
486
+ <value>first</value>
487
+ </field>
488
+ <field var="jid_multi_field" type="jid-multi">
489
+ <value>first@jid</value>
490
+ <value>second@jid</value>
491
+ </field>
492
+ <field var="unknown_field">
493
+ <value>0</value>
494
+ </field>
495
+ </x>
496
+ EOS
497
+
498
+ @xml.should be_equivalent_to( @expected_xml )
499
+ end
500
+
463
501
  it "should be possible to merge this into another Nokogiri::Builder" do
464
502
  doc = Nokogiri::XML::Builder.new{|xml|
465
503
  xml.foo {
466
504
  subject.to_builder(xml.parent)
467
505
  }
468
506
  }.to_xml
469
-
507
+
470
508
  expected = "<?xml version=\"1.0\"?>\n<foo>\n <x xmlns=\"jabber:x:data\" type=\"submit\"/>\n</foo>\n"
471
-
509
+
472
510
  doc.should == expected
473
511
  end
474
-
512
+
475
513
  end
476
-
514
+
477
515
  end
478
-
516
+
479
517
  describe "dynamic methods" do
480
-
518
+
481
519
  describe "<friendly name>= " do
482
520
  it "should return the same as []="
483
521
  end
484
-
522
+
485
523
  describe "<friendly name>" do
486
524
  it "should return the same as []"
487
525
  end
488
-
526
+
489
527
  describe "<friendly name>?" do
490
528
  it "should return label"
491
529
  end
492
-
530
+
493
531
  describe "<name>=" do
494
532
  it "should return the same as []="
495
533
  end
496
-
534
+
497
535
  describe "<name>" do
498
536
  it "should return the same as []"
499
537
  end
500
-
538
+
501
539
  describe "<name>?" do
502
540
  it "should return label"
503
541
  end
504
-
542
+
505
543
  end
506
-
544
+
507
545
  end