bigbluebutton_rails 0.0.5 → 0.0.6

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 (56) hide show
  1. data/.gitignore +2 -0
  2. data/.rvmrc +6 -0
  3. data/.travis.yml +4 -0
  4. data/CHANGELOG.rdoc +9 -0
  5. data/Gemfile +18 -0
  6. data/Gemfile.lock +85 -65
  7. data/README.rdoc +23 -0
  8. data/Rakefile +17 -6
  9. data/app/controllers/bigbluebutton/rooms_controller.rb +79 -58
  10. data/app/controllers/bigbluebutton/servers_controller.rb +41 -24
  11. data/app/models/bigbluebutton_room.rb +45 -5
  12. data/app/models/bigbluebutton_server.rb +5 -7
  13. data/app/views/bigbluebutton/rooms/external.html.erb +24 -0
  14. data/app/views/bigbluebutton/rooms/join_mobile.html.erb +1 -1
  15. data/app/views/bigbluebutton/servers/_activity_list.html.erb +7 -7
  16. data/app/views/bigbluebutton/servers/activity.html.erb +1 -1
  17. data/bigbluebutton_rails.gemspec +2 -12
  18. data/config/locales/en.yml +3 -0
  19. data/lib/bigbluebutton_rails/rails/routes.rb +12 -6
  20. data/lib/bigbluebutton_rails/utils.rb +8 -0
  21. data/lib/bigbluebutton_rails/version.rb +1 -1
  22. data/lib/bigbluebutton_rails.rb +1 -0
  23. data/spec/bigbluebutton_rails_spec.rb +13 -0
  24. data/spec/controllers/bigbluebutton/rooms_controller_exception_handling_spec.rb +114 -0
  25. data/spec/controllers/bigbluebutton/rooms_controller_json_responses_spec.rb +167 -0
  26. data/spec/controllers/bigbluebutton/rooms_controller_spec.rb +213 -457
  27. data/spec/controllers/bigbluebutton/servers_controller_json_responses_spec.rb +148 -0
  28. data/spec/controllers/bigbluebutton/servers_controller_spec.rb +50 -76
  29. data/spec/factories/bigbluebutton_room.rb +1 -0
  30. data/spec/models/bigbluebutton_room_spec.rb +141 -17
  31. data/spec/models/bigbluebutton_server_spec.rb +27 -36
  32. data/spec/rails_app/app/controllers/application_controller.rb +4 -3
  33. data/spec/rails_app/config/initializers/rack_hotfix.rb +13 -0
  34. data/spec/rails_app/features/join_external_bigbluebutton_rooms.feature +19 -0
  35. data/spec/rails_app/features/manage_bigbluebutton_rooms.feature +3 -3
  36. data/spec/rails_app/features/manage_bigbluebutton_servers.feature +2 -2
  37. data/spec/rails_app/features/step_definitions/bigbluebutton_room_steps.rb +29 -3
  38. data/spec/rails_app/features/step_definitions/bigbluebutton_server_steps.rb +2 -7
  39. data/spec/rails_app/features/step_definitions/common_steps.rb +15 -2
  40. data/spec/rails_app/features/step_definitions/web_steps.rb +7 -3
  41. data/spec/rails_app/features/support/application_controller.rb +12 -0
  42. data/spec/rails_app/features/support/content.rb +10 -0
  43. data/spec/rails_app/features/support/env.rb +4 -4
  44. data/spec/rails_app/features/support/env_gem.rb +2 -1
  45. data/spec/rails_app/features/support/forms.rb +12 -0
  46. data/spec/rails_app/features/support/paths.rb +17 -8
  47. data/spec/rails_app/features/support/selectors.rb +57 -0
  48. data/spec/rails_app/features/support/within.rb +7 -0
  49. data/spec/routing/bigbluebutton/rooms_routing_spec.rb +60 -52
  50. data/spec/routing/bigbluebutton/servers_routing_spec.rb +8 -8
  51. data/spec/spec_helper.rb +5 -0
  52. data/spec/support/controllers/bigbluebutton/rooms_controller.rb +7 -0
  53. data/spec/support/matchers/shoulda/be_boolean.rb +1 -1
  54. data/spec/support/shared_examples/rooms_controller.rb +37 -0
  55. metadata +24 -110
  56. data/spec/rails_app/app/helpers/application_helper.rb +0 -2
@@ -0,0 +1,148 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bigbluebutton::ServersController do
4
+ render_views
5
+ let(:server) { Factory.create(:bigbluebutton_server) }
6
+
7
+ context "json responses for " do
8
+
9
+ describe "#index" do
10
+ before do
11
+ @server1 = Factory.create(:bigbluebutton_server)
12
+ @server2 = Factory.create(:bigbluebutton_server)
13
+ end
14
+ before(:each) { get :index, :format => 'json' }
15
+ it { should respond_with(:success) }
16
+ it { should respond_with_content_type(:json) }
17
+ it { should respond_with_json([@server1, @server2].to_json) }
18
+ end
19
+
20
+ describe "#new" do
21
+ before(:each) { get :new, :format => 'json' }
22
+ it { should respond_with(:success) }
23
+ it { should respond_with_content_type(:json) }
24
+ it { should respond_with_json(BigbluebuttonServer.new.to_json).ignoring_values }
25
+ end
26
+
27
+ describe "#show" do
28
+ before(:each) { get :show, :id => server.to_param, :format => 'json' }
29
+ it { should respond_with(:success) }
30
+ it { should respond_with_content_type(:json) }
31
+ it { should respond_with_json(server.to_json) }
32
+ end
33
+
34
+ describe "#create" do
35
+ let(:new_server) { Factory.build(:bigbluebutton_server) }
36
+
37
+ context "on success" do
38
+ before(:each) {
39
+ post :create, :bigbluebutton_server => new_server.attributes, :format => 'json'
40
+ }
41
+ it { should respond_with(:created) }
42
+ it { should respond_with_content_type(:json) }
43
+ it { should respond_with_json(new_server.to_json).ignoring_attributes }
44
+ end
45
+
46
+ context "on failure" do
47
+ before(:each) {
48
+ new_server.url = nil # invalid
49
+ post :create, :bigbluebutton_server => new_server.attributes, :format => 'json'
50
+ }
51
+ it { should respond_with(:unprocessable_entity) }
52
+ it { should respond_with_content_type(:json) }
53
+ it {
54
+ new_server.save # should fail
55
+ should respond_with_json(new_server.errors.full_messages.to_json)
56
+ }
57
+ end
58
+ end
59
+
60
+ describe "#update" do
61
+ let(:new_server) { Factory.build(:bigbluebutton_server) }
62
+ before { @server = server }
63
+
64
+ context "on success" do
65
+ before(:each) {
66
+ put :update, :id => @server.to_param, :bigbluebutton_server => new_server.attributes, :format => 'json'
67
+ }
68
+ it { should respond_with(:success) }
69
+ it { should respond_with_content_type(:json) }
70
+ end
71
+
72
+ context "on failure" do
73
+ before(:each) {
74
+ new_server.url = nil # invalid
75
+ put :update, :id => @server.to_param, :bigbluebutton_server => new_server.attributes, :format => 'json'
76
+ }
77
+ it { should respond_with(:unprocessable_entity) }
78
+ it { should respond_with_content_type(:json) }
79
+ it {
80
+ new_server.save # should fail
81
+ should respond_with_json(new_server.errors.full_messages.to_json)
82
+ }
83
+ end
84
+ end
85
+
86
+ describe "#destroy" do
87
+ before :each do
88
+ @server = server
89
+ delete :destroy, :id => @server.to_param, :format => 'json'
90
+ end
91
+ it { should respond_with(:success) }
92
+ it { should respond_with_content_type(:json) }
93
+ end
94
+
95
+ describe "#activity" do
96
+ let(:room1) { Factory.create(:bigbluebutton_room, :server => server) }
97
+ let(:room2) { Factory.create(:bigbluebutton_room, :server => server) }
98
+ before do
99
+ # so we return our mocked server
100
+ BigbluebuttonServer.stub!(:find_by_param).with(server.to_param).
101
+ and_return(server)
102
+ end
103
+
104
+ context "on success" do
105
+ before do
106
+ server.should_receive(:fetch_meetings).and_return({ })
107
+ server.should_receive(:meetings).twice.and_return([room1, room2])
108
+ room1.should_receive(:fetch_meeting_info)
109
+ room2.should_receive(:fetch_meeting_info)
110
+ end
111
+ before(:each) { get :activity, :id => server.to_param, :format => 'json' }
112
+ it { should respond_with(:success) }
113
+ it { should respond_with_content_type(:json) }
114
+ it { should respond_with_json([room1, room2].to_json) }
115
+ end
116
+
117
+ context "on failure" do
118
+ let(:bbb_error_msg) { "err msg" }
119
+ let(:bbb_error) { BigBlueButton::BigBlueButtonException.new(bbb_error_msg) }
120
+ before do
121
+ server.should_receive(:fetch_meetings).and_return({ })
122
+ server.should_receive(:meetings).at_least(:once).and_return([room1, room2])
123
+ room1.should_receive(:fetch_meeting_info) { raise bbb_error }
124
+ end
125
+ before(:each) { get :activity, :id => server.to_param, :format => 'json' }
126
+ it { should respond_with(:error) }
127
+ it { should respond_with_content_type(:json) }
128
+ it { should respond_with_json([{ :message => bbb_error_msg }, room1, room2].to_json) }
129
+ it { should set_the_flash.to(bbb_error_msg) }
130
+ end
131
+
132
+ context "ignores params[:update_list]" do
133
+ before do
134
+ server.should_receive(:fetch_meetings).and_return({ })
135
+ server.should_receive(:meetings).twice.and_return([room1, room2])
136
+ room1.should_receive(:fetch_meeting_info)
137
+ room2.should_receive(:fetch_meeting_info)
138
+ end
139
+ before(:each) { get :activity, :id => server.to_param, :update_list => true, :format => 'json' }
140
+ it { should respond_with(:success) }
141
+ it { should respond_with_content_type(:json) }
142
+ it { should respond_with_json([room1, room2].to_json) }
143
+ end
144
+
145
+ end
146
+
147
+ end
148
+ end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Bigbluebutton::ServersController do
4
-
5
4
  render_views
6
5
  let(:server) { Factory.create(:bigbluebutton_server) }
7
6
 
@@ -9,24 +8,28 @@ describe Bigbluebutton::ServersController do
9
8
  before(:each) { get :index }
10
9
  it { should respond_with(:success) }
11
10
  it { should assign_to(:servers).with(BigbluebuttonServer.all) }
11
+ it { should render_template(:index) }
12
12
  end
13
13
 
14
14
  describe "#show" do
15
15
  before(:each) { get :show, :id => server.to_param }
16
16
  it { should respond_with(:success) }
17
17
  it { should assign_to(:server).with(server) }
18
+ it { should render_template(:show) }
18
19
  end
19
20
 
20
21
  describe "#new" do
21
22
  before(:each) { get :new }
22
23
  it { should respond_with(:success) }
23
24
  it { should assign_to(:server).with_kind_of(BigbluebuttonServer) }
25
+ it { should render_template(:new) }
24
26
  end
25
27
 
26
28
  describe "#edit" do
27
29
  before(:each) { get :edit, :id => server.to_param }
28
30
  it { should respond_with(:success) }
29
31
  it { should assign_to(:server).with(server) }
32
+ it { should render_template(:edit) }
30
33
  end
31
34
 
32
35
  describe "#create" do
@@ -75,96 +78,67 @@ describe Bigbluebutton::ServersController do
75
78
  }
76
79
  end
77
80
 
78
- # verify all JSON responses
79
- context "json responses for " do
80
-
81
- describe "#index" do
82
- before do
83
- @server1 = Factory.create(:bigbluebutton_server)
84
- @server2 = Factory.create(:bigbluebutton_server)
85
- end
86
- before(:each) { get :index, :format => 'json' }
87
- it { should respond_with(:success) }
88
- it { should respond_with_content_type(:json) }
89
- it { should respond_with_json([@server1, @server2].to_json) }
90
- end
91
-
92
- describe "#new" do
93
- before(:each) { get :new, :format => 'json' }
94
- it { should respond_with(:success) }
95
- it { should respond_with_content_type(:json) }
96
- it { should respond_with_json(BigbluebuttonServer.new.to_json).ignoring_values }
81
+ describe "#activity" do
82
+ let(:room1) { Factory.create(:bigbluebutton_room, :server => server) }
83
+ let(:room2) { Factory.create(:bigbluebutton_room, :server => server) }
84
+ before do
85
+ # so we return our mocked server
86
+ BigbluebuttonServer.stub!(:find_by_param).with(server.to_param).
87
+ and_return(server)
97
88
  end
98
89
 
99
- describe "#show" do
100
- before(:each) { get :show, :id => server.to_param, :format => 'json' }
101
- it { should respond_with(:success) }
102
- it { should respond_with_content_type(:json) }
103
- it { should respond_with_json(server.to_json) }
104
- end
90
+ context "standard behaviour" do
105
91
 
106
- describe "#create" do
107
- let(:new_server) { Factory.build(:bigbluebutton_server) }
92
+ before do
93
+ # mock some methods that trigger BBB API calls
94
+ server.should_receive(:fetch_meetings).and_return({ })
95
+ server.should_receive(:meetings).at_least(:once).and_return([room1, room2])
96
+ room1.should_receive(:fetch_meeting_info)
97
+ room2.should_receive(:fetch_meeting_info)
98
+ end
108
99
 
109
- context "on success" do
110
- before(:each) {
111
- post :create, :bigbluebutton_server => new_server.attributes, :format => 'json'
112
- }
113
- it { should respond_with(:created) }
114
- it { should respond_with_content_type(:json) }
115
- it { should respond_with_json(new_server.to_json).ignoring_attributes }
100
+ context do
101
+ before(:each) { get :activity, :id => server.to_param }
102
+ it { should respond_with(:success) }
103
+ it { should assign_to(:server).with(server) }
104
+ it { should render_template(:activity) }
116
105
  end
117
106
 
118
- context "on failure" do
119
- before(:each) {
120
- new_server.url = nil # invalid
121
- post :create, :bigbluebutton_server => new_server.attributes, :format => 'json'
122
- }
123
- it { should respond_with(:unprocessable_entity) }
124
- it { should respond_with_content_type(:json) }
125
- it {
126
- new_server.save # should fail
127
- should respond_with_json(new_server.errors.full_messages.to_json)
128
- }
107
+ context "with params[:update_list]" do
108
+ context "and :format nil" do
109
+ before(:each) { get :activity, :id => server.to_param, :update_list => true }
110
+ it { should render_template(:activity_list) }
111
+ end
112
+ context "and :format = 'html'" do
113
+ before(:each) { get :activity, :id => server.to_param, :update_list => true, :format => "html" }
114
+ it { should render_template(:activity_list) }
115
+ end
129
116
  end
117
+
130
118
  end
131
119
 
132
- describe "#update" do
133
- let(:new_server) { Factory.build(:bigbluebutton_server) }
134
- before { @server = server }
120
+ context "exception handling" do
121
+ let(:bbb_error_msg) { "err msg" }
122
+ let(:bbb_error) { BigBlueButton::BigBlueButtonException.new(bbb_error_msg) }
135
123
 
136
- context "on success" do
137
- before(:each) {
138
- put :update, :id => @server.to_param, :bigbluebutton_server => new_server.attributes, :format => 'json'
139
- }
140
- it { should respond_with(:success) }
141
- it { should respond_with_content_type(:json) }
124
+ context "at fetch_meetings" do
125
+ before { server.should_receive(:fetch_meetings) { raise bbb_error } }
126
+ before(:each) { get :activity, :id => server.to_param }
127
+ it { should set_the_flash.to(bbb_error_msg) }
142
128
  end
143
129
 
144
- context "on failure" do
145
- before(:each) {
146
- new_server.url = nil # invalid
147
- put :update, :id => @server.to_param, :bigbluebutton_server => new_server.attributes, :format => 'json'
148
- }
149
- it { should respond_with(:unprocessable_entity) }
150
- it { should respond_with_content_type(:json) }
151
- it {
152
- new_server.save # should fail
153
- should respond_with_json(new_server.errors.full_messages.to_json)
154
- }
155
- end
156
- end
157
-
158
- describe "#destroy" do
159
- before :each do
160
- @server = server
161
- delete :destroy, :id => @server.to_param, :format => 'json'
130
+ context "at fetch_meeting_info" do
131
+ before do
132
+ server.should_receive(:fetch_meetings).and_return({ })
133
+ server.should_receive(:meetings).at_least(:once).and_return([room1, room2])
134
+ room1.should_receive(:fetch_meeting_info) { raise bbb_error }
135
+ end
136
+ before(:each) { get :activity, :id => server.to_param }
137
+ it { should set_the_flash.to(bbb_error_msg) }
162
138
  end
163
- it { should respond_with(:success) }
164
- it { should respond_with_content_type(:json) }
165
139
  end
166
140
 
167
- end # json responses
141
+ end # #activity
168
142
 
169
143
  end
170
144
 
@@ -8,4 +8,5 @@ Factory.define :bigbluebutton_room do |r|
8
8
  r.private false
9
9
  r.randomize_meetingid false
10
10
  r.sequence(:param) { |n| "meeting-#{n}" }
11
+ r.external false
11
12
  end
@@ -163,13 +163,21 @@ describe BigbluebuttonRoom do
163
163
  end
164
164
 
165
165
  context "voice_bridge" do
166
- it { room.voice_bridge.should_not be_nil }
167
- it { room.voice_bridge.length.should == 5 }
168
- it { room.voice_bridge[0].should == '7' }
169
166
  it {
170
167
  b = BigbluebuttonRoom.new(:voice_bridge => "user defined")
171
168
  b.voice_bridge.should == "user defined"
172
169
  }
170
+ context "with a random value" do
171
+ it { room.voice_bridge.should_not be_nil }
172
+ it { room.voice_bridge.should =~ /7[0-9]{4}/ }
173
+ it "tries to randomize 10 times if voice_bridge already exists" do
174
+ room = Factory.create(:bigbluebutton_room, :voice_bridge => "70000")
175
+ BigbluebuttonRoom.stub!(:find_by_voice_bridge).and_return(room)
176
+ ActiveSupport::SecureRandom.should_receive(:random_number).exactly(10).and_return(0000)
177
+ room2 = BigbluebuttonRoom.new # triggers the random_number calls
178
+ room2.voice_bridge.should == "70000"
179
+ end
180
+ end
173
181
  end
174
182
  end
175
183
 
@@ -321,22 +329,39 @@ describe BigbluebuttonRoom do
321
329
 
322
330
  it { should respond_to(:send_create) }
323
331
 
324
- it "send create_meeting" do
325
- mocked_api.should_receive(:create_meeting).
326
- with(room.name, room.meetingid, room.moderator_password,
327
- room.attendee_password, room.welcome_msg, room.dial_number,
328
- room.logout_url, room.max_participants, room.voice_bridge).
329
- and_return(hash_create)
330
- room.server = mocked_server
331
- room.send_create
332
+ context "send create_meeting" do
333
+
334
+ context "for a stored room" do
335
+ before do
336
+ mocked_api.should_receive(:create_meeting).
337
+ with(room.name, room.meetingid, room.moderator_password,
338
+ room.attendee_password, room.welcome_msg, room.dial_number,
339
+ room.logout_url, room.max_participants, room.voice_bridge).
340
+ and_return(hash_create)
341
+ room.server = mocked_server
342
+ room.send_create
343
+ end
344
+ it { room.attendee_password.should be(attendee_password) }
345
+ it { room.moderator_password.should be(moderator_password) }
346
+ it { room.changed?.should be_false }
347
+ end
332
348
 
333
- room.attendee_password.should == attendee_password
334
- room.moderator_password.should == moderator_password
349
+ context "for a new_record" do
350
+ let(:new_room) { Factory.build(:bigbluebutton_room) }
351
+ before do
352
+ mocked_api.should_receive(:create_meeting).
353
+ with(new_room.name, new_room.meetingid, new_room.moderator_password,
354
+ new_room.attendee_password, new_room.welcome_msg, new_room.dial_number,
355
+ new_room.logout_url, new_room.max_participants, new_room.voice_bridge).
356
+ and_return(hash_create)
357
+ new_room.server = mocked_server
358
+ new_room.send_create
359
+ end
360
+ it { new_room.attendee_password.should be(attendee_password) }
361
+ it { new_room.moderator_password.should be(moderator_password) }
362
+ it("do not save the record") { new_room.new_record?.should be_true }
363
+ end
335
364
 
336
- # to be sure that the model was saved
337
- saved = BigbluebuttonRoom.find(room.id)
338
- saved.attendee_password.should == attendee_password
339
- saved.moderator_password.should == moderator_password
340
365
  end
341
366
 
342
367
  context "randomizes meetingid" do
@@ -409,6 +434,13 @@ describe BigbluebuttonRoom do
409
434
  room.server = mocked_server
410
435
  room.join_url(username, :attendee)
411
436
  end
437
+
438
+ it "without a role" do
439
+ mocked_api.should_receive(:join_meeting_url).
440
+ with(room.meetingid, username, 'pass')
441
+ room.server = mocked_server
442
+ room.join_url(username, nil, 'pass')
443
+ end
412
444
  end
413
445
 
414
446
  end
@@ -427,6 +459,98 @@ describe BigbluebuttonRoom do
427
459
  end
428
460
  end
429
461
 
462
+ describe "#add_domain_to_logout_url" do
463
+ context "when logout_url has a path only" do
464
+ let(:room) { Factory.create(:bigbluebutton_room, :logout_url => '/only/path') }
465
+ before(:each) { room.add_domain_to_logout_url("HTTP://", "test.com") }
466
+ it { room.logout_url.should == "http://test.com/only/path" }
467
+ end
468
+
469
+ context "when logout_url has a path and domain" do
470
+ let(:room) { Factory.create(:bigbluebutton_room, :logout_url => 'other.com/only/path') }
471
+ before(:each) { room.add_domain_to_logout_url("HTTP://", "test.com") }
472
+ it { room.logout_url.should == "http://other.com/only/path" }
473
+ end
474
+
475
+ context "when logout_url has a path, domain and protocol" do
476
+ let(:room) { Factory.create(:bigbluebutton_room, :logout_url => 'HTTPS://other.com/only/path') }
477
+ before(:each) { room.add_domain_to_logout_url("HTTP://", "test.com") }
478
+ it { room.logout_url.should == "https://other.com/only/path" }
479
+ end
480
+
481
+ context "does nothing if logout_url is nil" do
482
+ let(:room) { Factory.create(:bigbluebutton_room, :logout_url => nil) }
483
+ before(:each) { room.add_domain_to_logout_url("HTTP://", "test.com") }
484
+ it { room.logout_url.should == nil }
485
+ end
486
+ end
487
+
488
+ describe "#perform_join" do
489
+ let(:room) { Factory.create(:bigbluebutton_room) }
490
+ let(:user) { Factory.build(:user) }
491
+
492
+ context "for an attendee" do
493
+ before { room.should_receive(:fetch_is_running?) }
494
+
495
+ context "when the conference is running" do
496
+ before {
497
+ room.should_receive(:is_running?).and_return(true)
498
+ room.should_receive(:join_url).with(user.name, :attendee).
499
+ and_return("http://test.com/attendee/join")
500
+ }
501
+ subject { room.perform_join(user.name, :attendee) }
502
+ it { should == "http://test.com/attendee/join" }
503
+ end
504
+
505
+ context "when the conference is not running" do
506
+ before { room.should_receive(:is_running?).and_return(false) }
507
+ subject { room.perform_join(user.name, :attendee) }
508
+ it { should be_nil }
509
+ end
510
+ end
511
+
512
+ context "for a moderator" do
513
+ before { room.should_receive(:fetch_is_running?) }
514
+
515
+ context "when the conference is running" do
516
+ before {
517
+ room.should_receive(:is_running?).and_return(true)
518
+ room.should_receive(:join_url).with(user.name, :moderator).
519
+ and_return("http://test.com/moderator/join")
520
+ }
521
+ subject { room.perform_join(user.name, :moderator) }
522
+ it { should == "http://test.com/moderator/join" }
523
+ end
524
+
525
+ context "when the conference is not running" do
526
+ before {
527
+ room.should_receive(:is_running?).and_return(false)
528
+ room.should_receive(:send_create)
529
+ room.should_receive(:join_url).with(user.name, :moderator).
530
+ and_return("http://test.com/moderator/join")
531
+ }
532
+ subject { room.perform_join(user.name, :moderator) }
533
+ it { should == "http://test.com/moderator/join" }
534
+ end
535
+
536
+ context "when the arg 'request' is informed" do
537
+ let(:request) { stub(ActionController::Request) }
538
+ before {
539
+ request.stub!(:protocol).and_return("HTTP://")
540
+ request.stub!(:host).and_return("test.com")
541
+ room.should_receive(:add_domain_to_logout_url).with("HTTP://", "test.com")
542
+ room.should_receive(:is_running?).and_return(true)
543
+ room.should_receive(:join_url).with(user.name, :moderator).
544
+ and_return("http://test.com/moderator/join")
545
+ }
546
+ subject { room.perform_join(user.name, :moderator, request) }
547
+ it { should == "http://test.com/moderator/join" }
548
+ end
549
+
550
+ end
551
+
552
+ end
553
+
430
554
  end
431
555
 
432
556
  end
@@ -133,8 +133,9 @@ describe BigbluebuttonServer do
133
133
  it { server.api.should == api }
134
134
 
135
135
  # updating any of these attributes should update the api
136
+ # FIXME: can't test the version updated bc only 0.7 is supported right now
136
137
  { :url => 'http://anotherurl.com/bigbluebutton/api',
137
- :salt => '12345-abcde-67890-fghijk', :version => '0.64' }.each do |k,v|
138
+ :salt => '12345-abcde-67890-fghijk', :version => '0.7' }.each do |k,v|
138
139
  it {
139
140
  server.send("#{k}=", v)
140
141
  server.api.send(k).should == v
@@ -151,14 +152,13 @@ describe BigbluebuttonServer do
151
152
  end
152
153
  end
153
154
 
155
+ it { should respond_to(:fetch_meetings) }
156
+ it { should respond_to(:meetings) }
157
+
154
158
  context "fetching info from bbb" do
155
159
  let(:server) { Factory.create(:bigbluebutton_server) }
156
160
  let(:room1) { Factory.create(:bigbluebutton_room, :server => server, :meetingid => "room1", :randomize_meetingid => true) }
157
161
  let(:room2) { Factory.create(:bigbluebutton_room, :server => server, :meetingid => "room2", :randomize_meetingid => true) }
158
- before {
159
- @api_mock = mock(BigBlueButton::BigBlueButtonApi)
160
- server.stub(:api).and_return(@api_mock)
161
- }
162
162
 
163
163
  # the hashes should be exactly as returned by bigbluebutton-api-ruby to be sure we are testing it right
164
164
  let(:meetings) {
@@ -174,41 +174,32 @@ describe BigbluebuttonServer do
174
174
  }
175
175
  }
176
176
 
177
- it { should respond_to(:fetch_meetings) }
178
- it { should respond_to(:meetings) }
179
-
180
- it "fetches meetings" do
177
+ before {
178
+ @api_mock = mock(BigBlueButton::BigBlueButtonApi)
179
+ server.stub(:api).and_return(@api_mock)
181
180
  @api_mock.should_receive(:get_meetings).and_return(hash)
182
181
  server.fetch_meetings
183
182
 
184
- server.meetings.count.should be(3)
185
-
186
- server.meetings[0].should == room1
187
- server.meetings[0].attendee_password.should == "ap"
188
- server.meetings[0].moderator_password.should == "mp"
189
- server.meetings[0].running.should == true
190
- server.meetings[0].new_record?.should be_false
191
- server.meetings[0].external.should be_false
192
- server.meetings[0].randomize_meetingid.should be_true
193
-
194
- server.meetings[1].should == room2
195
- server.meetings[1].attendee_password.should == "pass"
196
- server.meetings[1].moderator_password.should == "pass"
197
- server.meetings[1].running.should == false
198
- server.meetings[1].new_record?.should be_false
199
- server.meetings[1].external.should be_false
200
- server.meetings[1].randomize_meetingid.should be_true
201
-
202
- server.meetings[2].meetingid.should == "im not in the db"
203
- server.meetings[2].server.should == server
204
- server.meetings[2].attendee_password.should == "pass"
205
- server.meetings[2].moderator_password.should == "pass"
206
- server.meetings[2].running.should == true
207
- server.meetings[2].new_record?.should be_false
208
- server.meetings[2].external.should be_true
209
- server.meetings[2].randomize_meetingid.should be_false
210
- end
183
+ # the passwords are updated during fetch_meetings
184
+ room1.moderator_password = "mp"
185
+ room1.attendee_password = "ap"
186
+ room2.moderator_password = "pass"
187
+ room2.attendee_password = "pass"
188
+ }
211
189
 
190
+ it { server.meetings.count.should be(3) }
191
+ it { server.meetings[0].should have_same_attributes_as(room1) }
192
+ it { server.meetings[1].should have_same_attributes_as(room2) }
193
+ it { server.meetings[2].meetingid.should == "im not in the db" }
194
+ it { server.meetings[2].name.should == "im not in the db" }
195
+ it { server.meetings[2].server.should == server }
196
+ it { server.meetings[2].attendee_password.should == "pass" }
197
+ it { server.meetings[2].moderator_password.should == "pass" }
198
+ it { server.meetings[2].running.should == true }
199
+ it { server.meetings[2].new_record?.should be_true }
200
+ it { server.meetings[2].external.should be_true }
201
+ it { server.meetings[2].randomize_meetingid.should be_false }
202
+ it { server.meetings[2].private.should be_true }
212
203
  end
213
204
 
214
205
  end
@@ -1,9 +1,10 @@
1
1
  class ApplicationController < ActionController::Base
2
2
  protect_from_forgery
3
3
 
4
- # def bigbluebutton_user
5
- # User.new
6
- # end
4
+ # TODO: return a real user (use devise?)
5
+ def bigbluebutton_user
6
+ @user ||= User.new
7
+ end
7
8
 
8
9
  end
9
10
 
@@ -0,0 +1,13 @@
1
+ # FIXME: Temporary monkey-patch to solve rack warnings
2
+ # See: http://blog.enricostahn.com/warning-regexp-match-n-against-to-utf-8-strin
3
+ # This is solved in rack 1.3, but rails stills requires rack 1.2
4
+ module Rack
5
+ module Utils
6
+ def escape(s)
7
+ CGI.escape(s.to_s)
8
+ end
9
+ def unescape(s)
10
+ CGI.unescape(s)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ Feature: Join External BigBlueButton Rooms
2
+ In order to join webconferences that were created from another application
3
+ One needs to enter his name and a password
4
+
5
+ Scenario: Joining an external BigBlueButton room
6
+ Given a user named "test user"
7
+ And a server
8
+ And an external room
9
+ When the user goes to the join external room page for this room
10
+ Then he should see a form to join the external room
11
+ And be able to join the room
12
+
13
+ Scenario: Uses the user name as the default to join a room
14
+ Given a user named "test user"
15
+ And a server
16
+ And an external room
17
+ When the user goes to the join external room page for this room
18
+ Then he should see a form to join the external room
19
+ And his name should be in the appropriate input