bigbluebutton_rails 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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 +12 -9
@@ -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