bigbluebutton_rails 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. data/CHANGELOG.rdoc +11 -0
  2. data/Gemfile.lock +1 -1
  3. data/README.rdoc +46 -32
  4. data/Rakefile +0 -1
  5. data/app/controllers/bigbluebutton/rooms_controller.rb +17 -16
  6. data/app/controllers/bigbluebutton/servers_controller.rb +6 -2
  7. data/app/models/bigbluebutton_room.rb +35 -1
  8. data/app/models/bigbluebutton_server.rb +1 -1
  9. data/app/views/bigbluebutton/rooms/_form.html.erb +7 -3
  10. data/app/views/bigbluebutton/rooms/_rooms.html.erb +37 -0
  11. data/app/views/bigbluebutton/rooms/edit.html.erb +2 -2
  12. data/app/views/bigbluebutton/rooms/external.html.erb +2 -1
  13. data/app/views/bigbluebutton/rooms/index.html.erb +2 -37
  14. data/app/views/bigbluebutton/rooms/invite.html.erb +2 -2
  15. data/app/views/bigbluebutton/rooms/join.html.erb +1 -1
  16. data/app/views/bigbluebutton/rooms/new.html.erb +1 -1
  17. data/app/views/bigbluebutton/rooms/show.html.erb +10 -4
  18. data/app/views/bigbluebutton/servers/_activity_list.html.erb +6 -6
  19. data/app/views/bigbluebutton/servers/index.html.erb +4 -3
  20. data/app/views/bigbluebutton/servers/rooms.html.erb +2 -0
  21. data/app/views/bigbluebutton/servers/show.html.erb +3 -4
  22. data/config/locales/en.yml +7 -3
  23. data/lib/bigbluebutton_rails/exceptions.rb +4 -0
  24. data/lib/bigbluebutton_rails/rails/routes.rb +28 -35
  25. data/lib/bigbluebutton_rails/version.rb +1 -1
  26. data/spec/controllers/bigbluebutton/rooms_controller_exception_handling_spec.rb +13 -10
  27. data/spec/controllers/bigbluebutton/rooms_controller_json_responses_spec.rb +13 -13
  28. data/spec/controllers/bigbluebutton/rooms_controller_spec.rb +114 -115
  29. data/spec/controllers/bigbluebutton/servers_controller_json_responses_spec.rb +12 -1
  30. data/spec/controllers/bigbluebutton/servers_controller_spec.rb +11 -0
  31. data/spec/generators/install_generator_spec.rb +1 -1
  32. data/spec/models/bigbluebutton_room_spec.rb +166 -80
  33. data/spec/models/bigbluebutton_server_spec.rb +4 -4
  34. data/spec/rails_app/features/activity_monitor_servers.feature +6 -0
  35. data/spec/rails_app/features/create_rooms.feature +5 -0
  36. data/spec/rails_app/features/create_servers.feature +7 -2
  37. data/spec/rails_app/features/edit_rooms.feature +7 -0
  38. data/spec/rails_app/features/edit_servers.feature +8 -2
  39. data/spec/rails_app/features/join_rooms.feature +1 -0
  40. data/spec/rails_app/features/list_and_show_rooms.feature +10 -2
  41. data/spec/rails_app/features/step_definitions/activity_monitor_servers_step.rb +10 -10
  42. data/spec/rails_app/features/step_definitions/common_steps.rb +6 -4
  43. data/spec/rails_app/features/step_definitions/create_rooms_steps.rb +1 -0
  44. data/spec/rails_app/features/step_definitions/join_mobile_steps.rb +1 -3
  45. data/spec/rails_app/features/step_definitions/join_rooms_steps.rb +3 -7
  46. data/spec/rails_app/features/step_definitions/list_and_show_rooms_steps.rb +12 -5
  47. data/spec/rails_app/features/step_definitions/list_and_show_servers_steps.rb +1 -5
  48. data/spec/rails_app/features/support/{application_controller.rb → patches/application_controller.rb} +0 -0
  49. data/spec/rails_app/features/support/patches/bigbluebutton_room.rb +9 -0
  50. data/spec/rails_app/features/support/paths.rb +12 -10
  51. data/spec/rails_app/features/support/templates.rb +90 -46
  52. data/spec/routing/bigbluebutton/custom_controllers_routing_spec.rb +38 -22
  53. data/spec/routing/bigbluebutton/rooms_routing_spec.rb +142 -58
  54. data/spec/routing/bigbluebutton/servers_routing_spec.rb +9 -1
  55. metadata +11 -8
@@ -4,7 +4,7 @@ describe Bigbluebutton::ServersController do
4
4
  render_views
5
5
  let(:server) { Factory.create(:bigbluebutton_server) }
6
6
 
7
- context "json responses for " do
7
+ context "json responses for" do
8
8
 
9
9
  describe "#index" do
10
10
  before do
@@ -144,5 +144,16 @@ describe Bigbluebutton::ServersController do
144
144
 
145
145
  end
146
146
 
147
+ describe "#rooms" do
148
+ before do
149
+ @room1 = Factory.create(:bigbluebutton_room, :server => server)
150
+ @room2 = Factory.create(:bigbluebutton_room, :server => server)
151
+ end
152
+ before(:each) { get :rooms, :id => server.to_param, :format => 'json' }
153
+ it { should respond_with(:success) }
154
+ it { should respond_with_content_type(:json) }
155
+ it { should respond_with_json([@room1, @room2].to_json) }
156
+ end
157
+
147
158
  end
148
159
  end
@@ -140,5 +140,16 @@ describe Bigbluebutton::ServersController do
140
140
 
141
141
  end # #activity
142
142
 
143
+ describe "#rooms" do
144
+ before do
145
+ @room1 = Factory.create(:bigbluebutton_room, :server => server)
146
+ @room2 = Factory.create(:bigbluebutton_room, :server => server)
147
+ end
148
+ before(:each) { get :rooms, :id => server.to_param }
149
+ it { should respond_with(:success) }
150
+ it { should render_template(:rooms) }
151
+ it { should assign_to(:rooms).with([@room1, @room2]) }
152
+ end
153
+
143
154
  end
144
155
 
@@ -21,8 +21,8 @@ describe BigbluebuttonRails::Generators::InstallGenerator do
21
21
 
22
22
  it "all files are properly destroyed" do
23
23
  run_generator %w(), :behavior => :revoke
24
- assert_no_file "config/locales/bigbluebutton_rails.en.yml"
25
24
  assert_no_migration "db/migrate/create_bigbluebutton_rails.rb"
25
+ assert_no_file "config/locales/bigbluebutton_rails.en.yml"
26
26
  assert_no_file "public/stylesheets/bigbluebutton_rails.css"
27
27
  assert_no_file "public/javascripts/jquery.min.js"
28
28
  assert_no_file "public/images/loading.gif"
@@ -13,7 +13,7 @@ describe BigbluebuttonRoom do
13
13
  it { should_not validate_presence_of(:owner_id) }
14
14
  it { should_not validate_presence_of(:owner_type) }
15
15
 
16
- it { should validate_presence_of(:server_id) }
16
+ it { should_not validate_presence_of(:server_id) }
17
17
  it { should validate_presence_of(:meetingid) }
18
18
  it { should validate_presence_of(:voice_bridge) }
19
19
  it { should validate_presence_of(:name) }
@@ -22,10 +22,10 @@ describe BigbluebuttonRoom do
22
22
  it { should be_boolean(:private) }
23
23
  it { should be_boolean(:randomize_meetingid) }
24
24
 
25
- [:name, :server_id, :meetingid, :attendee_password, :moderator_password,
26
- :welcome_msg, :owner, :server, :private, :logout_url, :dial_number,
27
- :voice_bridge, :max_participants, :owner_id, :owner_type,
28
- :randomize_meetingid, :param].
25
+ [:name, :server_id, :meetingid, :attendee_password,
26
+ :moderator_password, :welcome_msg, :owner, :private, :logout_url,
27
+ :dial_number, :voice_bridge, :max_participants, :owner_id,
28
+ :owner_type, :randomize_meetingid, :param].
29
29
  each do |attribute|
30
30
  it { should allow_mass_assignment_of(attribute) }
31
31
  end
@@ -36,11 +36,6 @@ describe BigbluebuttonRoom do
36
36
  it { should validate_uniqueness_of(:voice_bridge) }
37
37
  it { should validate_uniqueness_of(:param) }
38
38
 
39
- it {
40
- room = Factory.create(:bigbluebutton_room)
41
- room.server.should_not be_nil
42
- }
43
-
44
39
  it { should ensure_length_of(:meetingid).is_at_least(1).is_at_most(100) }
45
40
  it { should ensure_length_of(:name).is_at_least(1).is_at_most(150) }
46
41
  it { should ensure_length_of(:attendee_password).is_at_most(16) }
@@ -50,7 +45,8 @@ describe BigbluebuttonRoom do
50
45
 
51
46
  # attr_accessors
52
47
  [:running, :participant_count, :moderator_count, :attendees,
53
- :has_been_forcibly_ended, :start_time, :end_time, :external].each do |attr|
48
+ :has_been_forcibly_ended, :start_time, :end_time,
49
+ :external, :server].each do |attr|
54
50
  it { should respond_to(attr) }
55
51
  it { should respond_to("#{attr}=") }
56
52
  end
@@ -192,20 +188,26 @@ describe BigbluebuttonRoom do
192
188
 
193
189
  it { should respond_to(:fetch_is_running?) }
194
190
 
195
- it "fetches is_running? when not running" do
196
- mocked_api.should_receive(:is_meeting_running?).with(room.meetingid).and_return(false)
197
- room.server = mocked_server
198
- room.fetch_is_running?
199
- room.running.should == false
200
- room.is_running?.should == false
191
+ context "fetches is_running? when not running" do
192
+ before {
193
+ mocked_api.should_receive(:is_meeting_running?).with(room.meetingid).and_return(false)
194
+ room.should_receive(:require_server)
195
+ room.server = mocked_server
196
+ }
197
+ before(:each) { room.fetch_is_running? }
198
+ it { room.running.should == false }
199
+ it { room.is_running?.should == false }
201
200
  end
202
201
 
203
- it "fetches is_running? when running" do
204
- mocked_api.should_receive(:is_meeting_running?).with(room.meetingid).and_return(true)
205
- room.server = mocked_server
206
- room.fetch_is_running?
207
- room.running.should == true
208
- room.is_running?.should == true
202
+ context "fetches is_running? when running" do
203
+ before {
204
+ mocked_api.should_receive(:is_meeting_running?).with(room.meetingid).and_return(true)
205
+ room.should_receive(:require_server)
206
+ room.server = mocked_server
207
+ }
208
+ before(:each) { room.fetch_is_running? }
209
+ it { room.running.should == true }
210
+ it { room.is_running?.should == true }
209
211
  end
210
212
 
211
213
  end
@@ -237,53 +239,57 @@ describe BigbluebuttonRoom do
237
239
 
238
240
  it { should respond_to(:fetch_meeting_info) }
239
241
 
240
- it "fetches meeting info when the meeting is not running" do
241
- mocked_api.should_receive(:get_meeting_info).
242
- with(room.meetingid, room.moderator_password).and_return(hash_info)
243
- room.server = mocked_server
244
-
245
- room.fetch_meeting_info
246
- room.running.should == false
247
- room.has_been_forcibly_ended.should == false
248
- room.participant_count.should == 0
249
- room.moderator_count.should == 0
250
- room.start_time.should == nil
251
- room.end_time.should == nil
252
- room.attendees.should == []
242
+ context "fetches meeting info when the meeting is not running" do
243
+ before {
244
+ mocked_api.should_receive(:get_meeting_info).
245
+ with(room.meetingid, room.moderator_password).and_return(hash_info)
246
+ room.should_receive(:require_server)
247
+ room.server = mocked_server
248
+ }
249
+ before(:each) { room.fetch_meeting_info }
250
+ it { room.running.should == false }
251
+ it { room.has_been_forcibly_ended.should == false }
252
+ it { room.participant_count.should == 0 }
253
+ it { room.moderator_count.should == 0 }
254
+ it { room.start_time.should == nil }
255
+ it { room.end_time.should == nil }
256
+ it { room.attendees.should == [] }
253
257
  end
254
258
 
255
- it "fetches meeting info when the meeting is running" do
256
- mocked_api.should_receive(:get_meeting_info).
257
- with(room.meetingid, room.moderator_password).and_return(hash_info2)
258
- room.server = mocked_server
259
-
260
- room.fetch_meeting_info
261
- room.running.should == true
262
- room.has_been_forcibly_ended.should == false
263
- room.participant_count.should == 4
264
- room.moderator_count.should == 2
265
- room.start_time.should == DateTime.parse("Wed Apr 06 17:09:57 UTC 2011")
266
- room.end_time.should == nil
267
-
268
- users.each do |att|
269
- attendee = BigbluebuttonAttendee.new
270
- attendee.from_hash(att)
271
- room.attendees.should include(attendee)
272
- end
259
+ context "fetches meeting info when the meeting is running" do
260
+ before {
261
+ mocked_api.should_receive(:get_meeting_info).
262
+ with(room.meetingid, room.moderator_password).and_return(hash_info2)
263
+ room.should_receive(:require_server)
264
+ room.server = mocked_server
265
+ }
266
+ before(:each) { room.fetch_meeting_info }
267
+ it { room.running.should == true }
268
+ it { room.has_been_forcibly_ended.should == false }
269
+ it { room.participant_count.should == 4 }
270
+ it { room.moderator_count.should == 2 }
271
+ it { room.start_time.should == DateTime.parse("Wed Apr 06 17:09:57 UTC 2011") }
272
+ it { room.end_time.should == nil }
273
+ it {
274
+ users.each do |att|
275
+ attendee = BigbluebuttonAttendee.new
276
+ attendee.from_hash(att)
277
+ room.attendees.should include(attendee)
278
+ end
279
+ }
273
280
  end
274
281
 
275
282
  end
276
283
 
277
284
  describe "#send_end" do
278
-
279
285
  it { should respond_to(:send_end) }
280
286
 
281
287
  it "send end_meeting" do
282
288
  mocked_api.should_receive(:end_meeting).with(room.meetingid, room.moderator_password)
289
+ room.should_receive(:require_server)
283
290
  room.server = mocked_server
284
291
  room.send_end
285
292
  end
286
-
287
293
  end
288
294
 
289
295
  describe "#send_create" do
@@ -299,7 +305,7 @@ describe BigbluebuttonRoom do
299
305
 
300
306
  it { should respond_to(:send_create) }
301
307
 
302
- context "send create_meeting" do
308
+ context "sends create_meeting" do
303
309
 
304
310
  context "for a stored room" do
305
311
  before do
@@ -309,6 +315,7 @@ describe BigbluebuttonRoom do
309
315
  :voiceBridge => room.voice_bridge)
310
316
  mocked_api.should_receive(:create_meeting).
311
317
  with(room.name, room.meetingid, hash).and_return(hash_create)
318
+ room.stub(:select_server).and_return(mocked_server)
312
319
  room.server = mocked_server
313
320
  room.send_create
314
321
  end
@@ -326,6 +333,7 @@ describe BigbluebuttonRoom do
326
333
  :voiceBridge => new_room.voice_bridge)
327
334
  mocked_api.should_receive(:create_meeting).
328
335
  with(new_room.name, new_room.meetingid, hash).and_return(hash_create)
336
+ new_room.stub(:select_server).and_return(mocked_server)
329
337
  new_room.server = mocked_server
330
338
  new_room.send_create
331
339
  end
@@ -337,13 +345,12 @@ describe BigbluebuttonRoom do
337
345
  end
338
346
 
339
347
  context "randomizes meetingid" do
340
- let(:fail_hash) { { :returncode => true, :meetingID => "new id",
341
- :messageKey => "duplicateWarning" } }
342
- let(:success_hash) { { :returncode => true, :meetingID => "new id",
343
- :messageKey => "" } }
348
+ let(:fail_hash) { { :returncode => true, :meetingID => "new id", :messageKey => "duplicateWarning" } }
349
+ let(:success_hash) { { :returncode => true, :meetingID => "new id", :messageKey => "" } }
344
350
  let(:new_id) { "new id" }
345
351
  before {
346
352
  room.randomize_meetingid = true
353
+ room.stub(:select_server).and_return(mocked_server)
347
354
  room.server = mocked_server
348
355
  }
349
356
 
@@ -358,7 +365,7 @@ describe BigbluebuttonRoom do
358
365
  end
359
366
 
360
367
  it "and tries again on error" do
361
- # fails twice and them succeds
368
+ # fails twice and then succeds
362
369
  room.should_receive(:random_meetingid).exactly(3).times.and_return(new_id)
363
370
  hash = hash_including(:moderatorPW => room.moderator_password, :attendeePW => room.attendee_password,
364
371
  :welcome => room.welcome_msg, :dialNumber => room.dial_number,
@@ -392,37 +399,72 @@ describe BigbluebuttonRoom do
392
399
  :voiceBridge => room.voice_bridge)
393
400
  mocked_api.should_receive(:create_meeting).
394
401
  with(room.name, room.meetingid, hash).and_return(hash_create)
402
+ room.stub(:select_server).and_return(mocked_server)
395
403
  room.server = mocked_server
396
404
  end
397
405
  it { room.send_create }
398
406
  end
399
407
 
400
- end
408
+ context "selects and requires a server" do
409
+ let(:another_server) { Factory.create(:bigbluebutton_server) }
410
+
411
+ context "and saves the result" do
412
+ before do
413
+ room.randomize_meetingid = false # take the shortest path inside #send_create
414
+ room.should_receive(:select_server).and_return(another_server)
415
+ room.should_receive(:require_server)
416
+ room.should_receive(:do_create_meeting)
417
+ room.server = mocked_server
418
+ room.send_create
419
+ end
420
+ it { BigbluebuttonRoom.find(room.id).server_id.should == another_server.id }
421
+ end
422
+
423
+ context "and does not save when is a new record" do
424
+ let(:new_room) { Factory.build(:bigbluebutton_room) }
425
+ before do
426
+ new_room.randomize_meetingid = false # take the shortest path inside #send_create
427
+ new_room.should_receive(:select_server).and_return(another_server)
428
+ new_room.should_receive(:require_server)
429
+ new_room.should_receive(:do_create_meeting).and_return(nil)
430
+ new_room.should_not_receive(:save)
431
+ new_room.server = mocked_server
432
+ new_room.send_create
433
+ end
434
+ it { new_room.new_record?.should be_true }
435
+ end
436
+ end
437
+
438
+ end # #send_create
401
439
 
402
440
  describe "#join_url" do
403
441
  let(:username) { Forgery(:name).full_name }
404
442
 
405
443
  it { should respond_to(:join_url) }
406
444
 
407
- it "with moderator role" do
408
- mocked_api.should_receive(:join_meeting_url).
409
- with(room.meetingid, username, room.moderator_password)
410
- room.server = mocked_server
411
- room.join_url(username, :moderator)
412
- end
445
+ context do
446
+ before { room.should_receive(:require_server) }
413
447
 
414
- it "with attendee role" do
415
- mocked_api.should_receive(:join_meeting_url).
416
- with(room.meetingid, username, room.attendee_password)
417
- room.server = mocked_server
418
- room.join_url(username, :attendee)
419
- end
448
+ it "with moderator role" do
449
+ mocked_api.should_receive(:join_meeting_url).
450
+ with(room.meetingid, username, room.moderator_password)
451
+ room.server = mocked_server
452
+ room.join_url(username, :moderator)
453
+ end
420
454
 
421
- it "without a role" do
422
- mocked_api.should_receive(:join_meeting_url).
423
- with(room.meetingid, username, 'pass')
424
- room.server = mocked_server
425
- room.join_url(username, nil, 'pass')
455
+ it "with attendee role" do
456
+ mocked_api.should_receive(:join_meeting_url).
457
+ with(room.meetingid, username, room.attendee_password)
458
+ room.server = mocked_server
459
+ room.join_url(username, :attendee)
460
+ end
461
+
462
+ it "without a role" do
463
+ mocked_api.should_receive(:join_meeting_url).
464
+ with(room.meetingid, username, 'pass')
465
+ room.server = mocked_server
466
+ room.join_url(username, nil, 'pass')
467
+ end
426
468
  end
427
469
  end
428
470
 
@@ -548,4 +590,48 @@ describe BigbluebuttonRoom do
548
590
  it { should respond_to(:"full_logout_url=") }
549
591
  end
550
592
 
593
+ describe "#require_server" do
594
+ let(:room) { Factory.create(:bigbluebutton_room) }
595
+ it { should respond_to(:require_server) }
596
+
597
+ context "throws exception when the room has no server associated" do
598
+ before { room.server = nil }
599
+ it {
600
+ lambda {
601
+ room.send(:require_server)
602
+ }.should raise_error(BigbluebuttonRails::ServerRequired)
603
+ }
604
+ end
605
+
606
+ context "does nothing if the room has a server associated" do
607
+ before { room.server = Factory.create(:bigbluebutton_server) }
608
+ it {
609
+ lambda {
610
+ room.send(:require_server)
611
+ }.should_not raise_error(BigbluebuttonRails::ServerRequired)
612
+ }
613
+ end
614
+ end
615
+
616
+ describe "#select_server" do
617
+ let(:room) { Factory.create(:bigbluebutton_room, :server => nil) }
618
+ it { should respond_to(:select_server) }
619
+
620
+ context "selects the server with less rooms" do
621
+ before {
622
+ BigbluebuttonServer.destroy_all
623
+ s1 = Factory.create(:bigbluebutton_server)
624
+ @s2 = Factory.create(:bigbluebutton_server)
625
+ 3.times{ Factory.create(:bigbluebutton_room, :server => s1) }
626
+ 2.times{ Factory.create(:bigbluebutton_room, :server => @s2) }
627
+ }
628
+ it { room.send(:select_server).should == @s2 }
629
+ end
630
+
631
+ context "returns nil of there are no servers" do
632
+ before(:each) { BigbluebuttonServer.destroy_all }
633
+ it { room.send(:select_server).should == nil }
634
+ end
635
+ end
636
+
551
637
  end
@@ -36,15 +36,15 @@ describe BigbluebuttonServer do
36
36
  server.rooms.should_not be_empty
37
37
  end
38
38
 
39
- it "destroys associated rooms" do
39
+ it "nullifies associated rooms" do
40
40
  server = Factory.create(:bigbluebutton_server)
41
- Factory.create(:bigbluebutton_room, :server => server)
42
- Factory.create(:bigbluebutton_room, :server => server)
41
+ room = Factory.create(:bigbluebutton_room, :server => server)
43
42
  expect {
44
43
  expect {
45
44
  server.destroy
46
45
  }.to change{ BigbluebuttonServer.count }.by(-1)
47
- }.to change{ BigbluebuttonRoom.count }.by(-2)
46
+ }.to change{ BigbluebuttonRoom.count }.by(0)
47
+ BigbluebuttonRoom.find(room.id).server_id.should == nil
48
48
  end
49
49
 
50
50
  it { should ensure_length_of(:name).is_at_least(1).is_at_most(500) }
@@ -2,6 +2,12 @@ Feature: Monitor the active in the webconference servers
2
2
  To check the current status of a server
3
3
  One needs a real-time activity monitor
4
4
 
5
+ Scenario: View the activity monitor page
6
+ Given an anonymous user
7
+ And a real server
8
+ When he goes to the server activity monitor page
9
+ Then he should see the server activity monitor page
10
+
5
11
  @need-bot
6
12
  Scenario: View the list of meetings running in a server
7
13
  Given an anonymous user