bigbluebutton_rails 0.0.5 → 0.0.6

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