bigbluebutton_rails 1.1.0 → 1.2.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.
- data/.gitignore +1 -0
- data/.rvmrc +1 -1
- data/CHANGELOG.rdoc +6 -0
- data/Gemfile.lock +7 -7
- data/app/controllers/bigbluebutton/rooms_controller.rb +13 -18
- data/app/helpers/bigbluebutton_rails_helper.rb +7 -2
- data/app/models/bigbluebutton_room.rb +14 -3
- data/app/views/bigbluebutton/rooms/invite.html.erb +19 -7
- data/bigbluebutton_rails.gemspec +1 -1
- data/config/locales/en.yml +1 -0
- data/lib/bigbluebutton_rails/version.rb +1 -1
- data/public/stylesheets/bigbluebutton_rails.css +10 -0
- data/spec/controllers/bigbluebutton/rooms_controller_spec.rb +30 -58
- data/spec/factories/bigbluebutton_room.rb +14 -12
- data/spec/factories/bigbluebutton_server.rb +8 -6
- data/spec/factories/user.rb +4 -2
- data/spec/models/bigbluebutton_room_spec.rb +20 -0
- data/spec/rails_app/features/activity_monitor_servers.feature +0 -4
- data/spec/rails_app/features/join_rooms.feature +76 -15
- data/spec/rails_app/features/step_definitions/activity_monitor_servers_step.rb +3 -0
- data/spec/rails_app/features/step_definitions/join_rooms_steps.rb +40 -2
- data/spec/rails_app/features/support/factories/bigbluebutton_server_integration.rb +6 -4
- data/spec/rails_app/features/support/paths.rb +10 -5
- data/spec/rails_app/public/stylesheets/bigbluebutton_rails.css +10 -0
- data/spec/spec_helper.rb +1 -0
- metadata +20 -10
data/.gitignore
CHANGED
data/.rvmrc
CHANGED
data/CHANGELOG.rdoc
CHANGED
data/Gemfile.lock
CHANGED
@@ -7,8 +7,8 @@ GIT
|
|
7
7
|
PATH
|
8
8
|
remote: .
|
9
9
|
specs:
|
10
|
-
bigbluebutton_rails (1.
|
11
|
-
bigbluebutton-api-ruby (~>
|
10
|
+
bigbluebutton_rails (1.2.0)
|
11
|
+
bigbluebutton-api-ruby (~> 1.1.0)
|
12
12
|
rails (>= 3.0.0)
|
13
13
|
|
14
14
|
GEM
|
@@ -43,7 +43,7 @@ GEM
|
|
43
43
|
activesupport (3.0.11)
|
44
44
|
addressable (2.2.6)
|
45
45
|
arel (2.0.10)
|
46
|
-
bigbluebutton-api-ruby (
|
46
|
+
bigbluebutton-api-ruby (1.1.0)
|
47
47
|
xml-simple (>= 1.1.1)
|
48
48
|
builder (2.1.2)
|
49
49
|
capybara (1.1.2)
|
@@ -57,7 +57,7 @@ GEM
|
|
57
57
|
capybara (~> 1.1.0)
|
58
58
|
mechanize (~> 2.0.0)
|
59
59
|
capybara-webkit (0.7.2)
|
60
|
-
capybara (
|
60
|
+
capybara (>= 1.0.0, < 1.2)
|
61
61
|
childprocess (0.2.3)
|
62
62
|
ffi (~> 1.0.6)
|
63
63
|
colored (1.2)
|
@@ -80,7 +80,7 @@ GEM
|
|
80
80
|
ffi (1.0.11)
|
81
81
|
forgery (0.5.0)
|
82
82
|
generator_spec (0.8.4)
|
83
|
-
rails (
|
83
|
+
rails (>= 3.0, < 4.0)
|
84
84
|
rspec-rails
|
85
85
|
gherkin (2.7.1)
|
86
86
|
json (>= 1.4.6)
|
@@ -94,10 +94,10 @@ GEM
|
|
94
94
|
mime-types (~> 1.16)
|
95
95
|
treetop (~> 1.4.8)
|
96
96
|
mechanize (2.0.1)
|
97
|
-
net-http-digest_auth (
|
97
|
+
net-http-digest_auth (~> 1.1, >= 1.1.1)
|
98
98
|
net-http-persistent (~> 1.8)
|
99
99
|
nokogiri (~> 1.4)
|
100
|
-
webrobots (
|
100
|
+
webrobots (~> 0.0, >= 0.0.9)
|
101
101
|
mime-types (1.17.2)
|
102
102
|
multi_json (1.0.4)
|
103
103
|
net-http-digest_auth (1.2)
|
@@ -113,16 +113,16 @@ class Bigbluebutton::RoomsController < ApplicationController
|
|
113
113
|
|
114
114
|
# Used by logged users to join public rooms.
|
115
115
|
def join
|
116
|
-
|
117
|
-
if
|
116
|
+
@user_role = bigbluebutton_role(@room)
|
117
|
+
if @user_role.nil?
|
118
118
|
raise BigbluebuttonRails::RoomAccessDenied.new
|
119
119
|
|
120
120
|
# anonymous users or users with the role :password join through #invite
|
121
|
-
elsif bigbluebutton_user.nil? or
|
122
|
-
redirect_to :action => :invite
|
121
|
+
elsif bigbluebutton_user.nil? or @user_role == :password
|
122
|
+
redirect_to :action => :invite, :mobile => params[:mobile]
|
123
123
|
|
124
124
|
else
|
125
|
-
join_internal(bigbluebutton_user.name,
|
125
|
+
join_internal(bigbluebutton_user.name, @user_role, :join)
|
126
126
|
end
|
127
127
|
end
|
128
128
|
|
@@ -130,14 +130,9 @@ class Bigbluebutton::RoomsController < ApplicationController
|
|
130
130
|
def invite
|
131
131
|
respond_with @room do |format|
|
132
132
|
|
133
|
-
|
134
|
-
if
|
133
|
+
@user_role = bigbluebutton_role(@room)
|
134
|
+
if @user_role.nil?
|
135
135
|
raise BigbluebuttonRails::RoomAccessDenied.new
|
136
|
-
|
137
|
-
# if there's already a logged user with a role in the room, join through #join
|
138
|
-
elsif !bigbluebutton_user.nil? and role != :password
|
139
|
-
format.html { redirect_to :action => :join }
|
140
|
-
|
141
136
|
else
|
142
137
|
format.html
|
143
138
|
end
|
@@ -156,15 +151,15 @@ class Bigbluebutton::RoomsController < ApplicationController
|
|
156
151
|
end
|
157
152
|
|
158
153
|
name = bigbluebutton_user.nil? ? params[:user][:name] : bigbluebutton_user.name
|
159
|
-
|
160
|
-
if
|
154
|
+
@user_role = bigbluebutton_role(@room)
|
155
|
+
if @user_role.nil?
|
161
156
|
raise BigbluebuttonRails::RoomAccessDenied.new
|
162
|
-
elsif
|
163
|
-
|
157
|
+
elsif @user_role == :password
|
158
|
+
@user_role = @room.user_role(params[:user])
|
164
159
|
end
|
165
160
|
|
166
|
-
unless
|
167
|
-
join_internal(name,
|
161
|
+
unless @user_role.nil? or name.nil? or name.empty?
|
162
|
+
join_internal(name, @user_role, :invite)
|
168
163
|
else
|
169
164
|
flash[:error] = t('bigbluebutton_rails.rooms.errors.auth.failure')
|
170
165
|
render :invite, :status => :unauthorized
|
@@ -7,6 +7,11 @@ module BigbluebuttonRailsHelper
|
|
7
7
|
"https://chart.googleapis.com/chart?cht=qr&chs=#{size}&chl=#{content}&choe=UTF-8"
|
8
8
|
end
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
# TODO: improve it, showing all flashes
|
11
|
+
def bbb_rails_error_explanation
|
12
|
+
if flash.has_key?(:error) and !flash[:error].blank?
|
13
|
+
content_tag(:div, flash[:error], { :id => "error_explanation" })
|
14
|
+
end
|
15
|
+
end
|
12
16
|
|
17
|
+
end
|
@@ -302,13 +302,24 @@ class BigbluebuttonRoom < ActiveRecord::Base
|
|
302
302
|
end
|
303
303
|
|
304
304
|
def do_create_meeting
|
305
|
-
|
306
|
-
|
305
|
+
msg = (self.welcome_msg.nil? or self.welcome_msg.empty?) ? default_welcome_message : self.welcome_msg
|
306
|
+
opts = {
|
307
|
+
:moderatorPW => self.moderator_password, :attendeePW => self.attendee_password,
|
308
|
+
:welcome => msg, :dialNumber => self.dial_number,
|
307
309
|
:logoutURL => self.full_logout_url || self.logout_url,
|
308
|
-
:maxParticipants => self.max_participants, :voiceBridge => self.voice_bridge
|
310
|
+
:maxParticipants => self.max_participants, :voiceBridge => self.voice_bridge
|
311
|
+
}
|
309
312
|
self.server.api.create_meeting(self.name, self.meetingid, opts)
|
310
313
|
end
|
311
314
|
|
315
|
+
# Returns the default welcome message to be shown in a conference in case
|
316
|
+
# there's no message set in this room.
|
317
|
+
# Can be used to easily set a default message format for all rooms.
|
318
|
+
def default_welcome_message
|
319
|
+
I18n.t('bigbluebutton_rails.rooms.default_welcome_msg',
|
320
|
+
:name => self.name, :voice_number => self.voice_bridge)
|
321
|
+
end
|
322
|
+
|
312
323
|
# if :param wasn't set, sets it as :name downcase and parameterized
|
313
324
|
def set_param
|
314
325
|
if self.param.blank?
|
@@ -28,27 +28,39 @@ $(document).ready(function(){
|
|
28
28
|
|
29
29
|
<h1>Invite to the meeting <%= @room.name %></h1>
|
30
30
|
|
31
|
-
|
31
|
+
<%= bbb_rails_error_explanation %>
|
32
32
|
|
33
33
|
<p>Meeting status: <span id="meeting_status">-</span> (<a href="javascript:ajax_request();">refresh</a>)</p>
|
34
|
-
<p><%= @room.name %> requires a name and/or password to join:</p>
|
35
34
|
|
36
|
-
|
35
|
+
<div class="bbbrails_invite_device_type">
|
36
|
+
<% if params[:mobile] %>
|
37
|
+
In this page you can join the conference from a <b>mobile device</b>.
|
38
|
+
To join from a desktop <%= link_to "click here", invite_bigbluebutton_room_path(@room) %>.
|
39
|
+
<% else %>
|
40
|
+
In this page you can join the conference from a <b>desktop</b>.
|
41
|
+
To join from a mobile device <%= link_to "click here", invite_bigbluebutton_room_path(@room, :mobile => true) %>.
|
42
|
+
<% end %>
|
43
|
+
</div>
|
44
|
+
|
45
|
+
<p><%= @room.name %> requires a name and/or password to join:</p>
|
46
|
+
<%= form_tag join_bigbluebutton_room_path(@room, :mobile => params[:mobile]) do %>
|
37
47
|
|
38
48
|
<div class="field">
|
39
49
|
<label for="user_name">Name:</label><br />
|
40
50
|
<% if bigbluebutton_user.nil? %>
|
41
51
|
<%= text_field_tag "user[name]", "" %>
|
42
52
|
<% else %>
|
43
|
-
<%= text_field_tag "user[name]", bigbluebutton_user.name %>
|
53
|
+
<%= text_field_tag "user[name]", bigbluebutton_user.name, :readonly => true %>
|
44
54
|
<% end %>
|
45
55
|
</div>
|
46
56
|
<div class="field">
|
47
57
|
<label for="user_password">Password:</label><br />
|
48
|
-
<% if @
|
49
|
-
<%= password_field_tag "user[password]",
|
58
|
+
<% if @user_role == :attendee %>
|
59
|
+
<%= password_field_tag "user[password]", @room.attendee_password, :readonly => true %>
|
60
|
+
<% elsif @user_role == :moderator %>
|
61
|
+
<%= password_field_tag "user[password]", @room.moderator_password, :readonly => true %>
|
50
62
|
<% else %>
|
51
|
-
<%= password_field_tag "user[password]",
|
63
|
+
<%= password_field_tag "user[password]", "" %>
|
52
64
|
<% end %>
|
53
65
|
</div>
|
54
66
|
|
data/bigbluebutton_rails.gemspec
CHANGED
data/config/locales/en.yml
CHANGED
@@ -11,6 +11,7 @@ en:
|
|
11
11
|
param_format: 'you can only use letters, numbers and the symbols "-" or "_" (not at the begin or end)'
|
12
12
|
url_format: 'should use the pattern http://<server>/bigbluebutton/api'
|
13
13
|
rooms:
|
14
|
+
default_welcome_msg: "Welcome to the conference <b>%{name}!</b><br/><br/>To join the audio conference from a SIP phone, dial %{voice_number}.<br/><br/>If you need help using the conference client <u><a href=\"http://www.bigbluebutton.org/videos/\">check out these videos</a></u>."
|
14
15
|
notice:
|
15
16
|
create:
|
16
17
|
success: "Your room was successfully created."
|
@@ -238,12 +238,11 @@ describe Bigbluebutton::RoomsController do
|
|
238
238
|
|
239
239
|
context "for an anonymous user" do
|
240
240
|
before { controller.stub(:bigbluebutton_user) { nil } }
|
241
|
-
before { controller.stub(:bigbluebutton_role) { :
|
241
|
+
before { controller.stub(:bigbluebutton_role) { :password } }
|
242
242
|
before(:each) { get :join, :id => room.to_param }
|
243
|
-
it {
|
244
|
-
|
245
|
-
|
246
|
-
}
|
243
|
+
it { should assign_to(:user_role).with(:password) }
|
244
|
+
it { should respond_with(:redirect) }
|
245
|
+
it { should redirect_to(invite_bigbluebutton_room_path(room)) }
|
247
246
|
end
|
248
247
|
|
249
248
|
context "when the user's role" do
|
@@ -253,6 +252,7 @@ describe Bigbluebutton::RoomsController do
|
|
253
252
|
before { controller.stub(:bigbluebutton_role) { :password } }
|
254
253
|
before(:each) { get :join, :id => room.to_param }
|
255
254
|
it { should respond_with(:redirect) }
|
255
|
+
it { should assign_to(:user_role).with(:password) }
|
256
256
|
it { should redirect_to(invite_bigbluebutton_room_path(room)) }
|
257
257
|
end
|
258
258
|
|
@@ -316,68 +316,36 @@ describe Bigbluebutton::RoomsController do
|
|
316
316
|
describe "#invite" do
|
317
317
|
before { mock_server_and_api }
|
318
318
|
let(:user) { Factory.build(:user) }
|
319
|
+
before { controller.stub(:bigbluebutton_user).and_return(user) }
|
319
320
|
|
320
|
-
context "
|
321
|
-
before { controller.stub(:
|
321
|
+
context "when the user has a role defined" do
|
322
|
+
before { controller.stub(:bigbluebutton_role).and_return(:attendee) }
|
323
|
+
before(:each) { get :invite, :id => room.to_param }
|
324
|
+
it { should respond_with(:success) }
|
325
|
+
it { should render_template(:invite) }
|
326
|
+
it { should assign_to(:room).with(room) }
|
327
|
+
it { should assign_to(:user_role).with(:attendee) }
|
328
|
+
end
|
322
329
|
|
323
|
-
|
324
|
-
|
330
|
+
context "when the user's role" do
|
331
|
+
context "should be defined with a password" do
|
332
|
+
before { controller.stub(:bigbluebutton_role) { :password } }
|
325
333
|
before(:each) { get :invite, :id => room.to_param }
|
326
334
|
it { should respond_with(:success) }
|
327
335
|
it { should render_template(:invite) }
|
328
336
|
it { should assign_to(:room).with(room) }
|
337
|
+
it { should assign_to(:user_role).with(:password) }
|
329
338
|
end
|
330
339
|
|
331
|
-
context "
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
end
|
339
|
-
|
340
|
-
context "is undefined, the access should be blocked" do
|
341
|
-
before { controller.stub(:bigbluebutton_role) { nil } }
|
342
|
-
it {
|
343
|
-
lambda {
|
344
|
-
get :invite, :id => room.to_param
|
345
|
-
}.should raise_error(BigbluebuttonRails::RoomAccessDenied)
|
346
|
-
}
|
347
|
-
end
|
348
|
-
end
|
349
|
-
end
|
350
|
-
|
351
|
-
context "for a logged user" do
|
352
|
-
before { controller.stub(:bigbluebutton_user).and_return(user) }
|
353
|
-
|
354
|
-
context "with a role defined" do
|
355
|
-
before { controller.stub(:bigbluebutton_role).and_return(:attendee) }
|
356
|
-
before(:each) { get :invite, :id => room.to_param }
|
357
|
-
it { should respond_with(:redirect) }
|
358
|
-
it { should redirect_to(join_bigbluebutton_room_path(room)) }
|
359
|
-
end
|
360
|
-
|
361
|
-
context "when the user's role" do
|
362
|
-
context "should be defined with a password" do
|
363
|
-
before { controller.stub(:bigbluebutton_role) { :password } }
|
364
|
-
before(:each) { get :invite, :id => room.to_param }
|
365
|
-
it { should respond_with(:success) }
|
366
|
-
it { should render_template(:invite) }
|
367
|
-
it { should assign_to(:room).with(room) }
|
368
|
-
end
|
369
|
-
|
370
|
-
context "is undefined, the access should be blocked" do
|
371
|
-
before { controller.stub(:bigbluebutton_role) { nil } }
|
372
|
-
it {
|
373
|
-
lambda {
|
374
|
-
get :invite, :id => room.to_param
|
375
|
-
}.should raise_error(BigbluebuttonRails::RoomAccessDenied)
|
376
|
-
}
|
377
|
-
end
|
340
|
+
context "is undefined, the access should be blocked" do
|
341
|
+
before { controller.stub(:bigbluebutton_role) { nil } }
|
342
|
+
it {
|
343
|
+
lambda {
|
344
|
+
get :invite, :id => room.to_param
|
345
|
+
}.should raise_error(BigbluebuttonRails::RoomAccessDenied)
|
346
|
+
}
|
378
347
|
end
|
379
348
|
end
|
380
|
-
|
381
349
|
end
|
382
350
|
|
383
351
|
describe "#auth" do
|
@@ -441,7 +409,7 @@ describe Bigbluebutton::RoomsController do
|
|
441
409
|
should redirect_to("http://test.com/attendee/join")
|
442
410
|
end
|
443
411
|
|
444
|
-
it "
|
412
|
+
it "uses bigbluebutton_role when the return is not :password" do
|
445
413
|
controller.stub(:bigbluebutton_role) { :attendee }
|
446
414
|
hash = { :name => "Elftor", :password => nil }
|
447
415
|
mocked_api.should_receive(:is_meeting_running?).and_return(true)
|
@@ -451,6 +419,7 @@ describe Bigbluebutton::RoomsController do
|
|
451
419
|
post :auth, :id => room.to_param, :user => hash
|
452
420
|
should respond_with(:redirect)
|
453
421
|
should redirect_to("http://test.com/attendee/join")
|
422
|
+
should assign_to(:user_role).with(:attendee)
|
454
423
|
end
|
455
424
|
|
456
425
|
context "validates user input and shows error" do
|
@@ -461,6 +430,7 @@ describe Bigbluebutton::RoomsController do
|
|
461
430
|
let(:user_hash) { { :password => room.moderator_password } }
|
462
431
|
it { should respond_with(:unauthorized) }
|
463
432
|
it { should assign_to(:room).with(room) }
|
433
|
+
it { should assign_to(:user_role).with(:moderator) }
|
464
434
|
it { should render_template(:invite) }
|
465
435
|
it { should set_the_flash.to(I18n.t('bigbluebutton_rails.rooms.errors.auth.failure')) }
|
466
436
|
end
|
@@ -469,6 +439,7 @@ describe Bigbluebutton::RoomsController do
|
|
469
439
|
let(:user_hash) { { :password => room.moderator_password, :name => "" } }
|
470
440
|
it { should respond_with(:unauthorized) }
|
471
441
|
it { should assign_to(:room).with(room) }
|
442
|
+
it { should assign_to(:user_role).with(:moderator) }
|
472
443
|
it { should render_template(:invite) }
|
473
444
|
it { should set_the_flash.to(I18n.t('bigbluebutton_rails.rooms.errors.auth.failure')) }
|
474
445
|
end
|
@@ -476,6 +447,7 @@ describe Bigbluebutton::RoomsController do
|
|
476
447
|
context "when the password is wrong" do
|
477
448
|
let(:user_hash) { { :name => "Elftor", :password => nil } }
|
478
449
|
it { should respond_with(:unauthorized) }
|
450
|
+
it { should assign_to(:user_role).with(nil) }
|
479
451
|
it { should assign_to(:room).with(room) }
|
480
452
|
it { should render_template(:invite) }
|
481
453
|
it { should set_the_flash.to(I18n.t('bigbluebutton_rails.rooms.errors.auth.failure')) }
|
@@ -1,14 +1,16 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
FactoryGirl.define do
|
2
|
+
factory :bigbluebutton_room do |r|
|
3
|
+
# meetingid with a random factor to avoid duplicated ids in consecutive test runs
|
4
|
+
r.sequence(:meetingid) { |n| "meeting-#{n}-" + SecureRandom.hex(4) }
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
r.association :server, :factory => :bigbluebutton_server
|
7
|
+
r.sequence(:name) { |n| "Name#{n}" }
|
8
|
+
r.attendee_password { Forgery(:basic).password :at_least => 10, :at_most => 16 }
|
9
|
+
r.moderator_password { Forgery(:basic).password :at_least => 10, :at_most => 16 }
|
10
|
+
r.welcome_msg { Forgery(:lorem_ipsum).sentences(2) }
|
11
|
+
r.private false
|
12
|
+
r.randomize_meetingid false
|
13
|
+
r.sequence(:param) { |n| "meeting-#{n}" }
|
14
|
+
r.external false
|
15
|
+
end
|
14
16
|
end
|
@@ -1,7 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
FactoryGirl.define do
|
2
|
+
factory :bigbluebutton_server do |s|
|
3
|
+
s.sequence(:name) { |n| "Server #{n}" }
|
4
|
+
s.sequence(:url) { |n| "http://bigbluebutton#{n}.test.com/bigbluebutton/api" }
|
5
|
+
s.salt { Forgery(:basic).password :at_least => 30, :at_most => 40 }
|
6
|
+
s.version '0.7'
|
7
|
+
s.sequence(:param) { |n| "server-#{n}" }
|
8
|
+
end
|
7
9
|
end
|
data/spec/factories/user.rb
CHANGED
@@ -302,9 +302,29 @@ describe BigbluebuttonRoom do
|
|
302
302
|
:hasBeenForciblyEnded => "false", :messageKey => {}, :message => {}
|
303
303
|
}
|
304
304
|
}
|
305
|
+
before { room.update_attributes(:welcome_msg => "Anything") }
|
305
306
|
|
306
307
|
it { should respond_to(:send_create) }
|
307
308
|
|
309
|
+
context "calls #default_welcome_msg if welcome_msg is" do
|
310
|
+
before do
|
311
|
+
room.should_receive(:default_welcome_message).and_return("Hi!")
|
312
|
+
mocked_api.should_receive(:create_meeting).
|
313
|
+
with(anything, anything, hash_including(:welcome => "Hi!"))
|
314
|
+
room.stub(:select_server).and_return(mocked_server)
|
315
|
+
room.server = mocked_server
|
316
|
+
end
|
317
|
+
|
318
|
+
context "nil" do
|
319
|
+
before { room.welcome_msg = nil }
|
320
|
+
it { room.send_create }
|
321
|
+
end
|
322
|
+
context "empty" do
|
323
|
+
before { room.welcome_msg = "" }
|
324
|
+
it { room.send_create }
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
308
328
|
context "sends create_meeting" do
|
309
329
|
|
310
330
|
context "for a stored room" do
|
@@ -34,8 +34,6 @@ Feature: Monitor the active in the webconference servers
|
|
34
34
|
When he goes to the server activity monitor page
|
35
35
|
Then he should see the external room in the list
|
36
36
|
|
37
|
-
# Note: This will only work for bbb servers with removeMeetingWhenEnded=false
|
38
|
-
# See: http://code.google.com/p/bigbluebutton/issues/detail?id=980
|
39
37
|
@need-bot
|
40
38
|
Scenario: Contains a link to partially refresh the meeting list
|
41
39
|
Given an anonymous user
|
@@ -46,8 +44,6 @@ Feature: Monitor the active in the webconference servers
|
|
46
44
|
And he clicks in the link to update the meeting list
|
47
45
|
Then he should see one meeting running and the other meeting not running
|
48
46
|
|
49
|
-
# Note: This will only work for bbb servers with removeMeetingWhenEnded=false
|
50
|
-
# Also defaultMeetingExpireDuration should be >= 2
|
51
47
|
@need-bot @webkit
|
52
48
|
Scenario: Partially refresh the meeting list periodically
|
53
49
|
Given an anonymous user
|
@@ -10,8 +10,8 @@ Feature: Join webconference rooms
|
|
10
10
|
# :moderator
|
11
11
|
# end
|
12
12
|
|
13
|
-
# First
|
14
|
-
# BigbluebuttonRoom#invite
|
13
|
+
# First the scenarios for BigbluebuttonRoom#join (and the redirects to
|
14
|
+
# BigbluebuttonRoom#invite)
|
15
15
|
|
16
16
|
@mechanize
|
17
17
|
Scenario: Joining a public room
|
@@ -21,14 +21,6 @@ Feature: Join webconference rooms
|
|
21
21
|
When the user goes to the join room page
|
22
22
|
Then he should join the conference room
|
23
23
|
|
24
|
-
Scenario: Joining a public room as an anonymous user
|
25
|
-
Given an anonymous user
|
26
|
-
And a real server
|
27
|
-
And a public room in this server
|
28
|
-
When the user goes to the join room page
|
29
|
-
Then he should be at the invite room URL
|
30
|
-
And the password field was pre-filled with the attendee password
|
31
|
-
|
32
24
|
Scenario: Joining a private room requires a password
|
33
25
|
Given a user named "test user"
|
34
26
|
And a real server
|
@@ -96,19 +88,62 @@ Feature: Join webconference rooms
|
|
96
88
|
Then he should see his name in the user name input
|
97
89
|
|
98
90
|
|
99
|
-
#
|
100
|
-
# or anonymous users. Other cases were already tested above
|
91
|
+
# Scenarios for BigbluebuttonRoom#invite
|
101
92
|
|
102
|
-
|
103
|
-
|
93
|
+
# The pre-filling depends on the role of the user, that's defined
|
94
|
+
# by bigbluebutton_role(), see the comment on the top of this file.
|
95
|
+
|
96
|
+
Scenario: The invite view shows a link to join from a mobile device when joining from a desktop
|
104
97
|
Given a user named "test user"
|
105
98
|
And a real server
|
106
99
|
And a public room in this server
|
100
|
+
When the user goes to the invite room page
|
101
|
+
Then he should see a link to join the conference from a mobile device
|
102
|
+
|
103
|
+
# Test the invite view with a user logged
|
104
|
+
|
105
|
+
Scenario: The invite page is pre-filled with the user name and moderator password
|
106
|
+
Given a user named "test user"
|
107
|
+
And a real server
|
108
|
+
# Public room = user is a moderator
|
109
|
+
And a public room in this server
|
110
|
+
When the user goes to the invite room page (no view check)
|
111
|
+
Then he should be at the invite room URL
|
112
|
+
And the read-only name field was pre-filled with "test user"
|
113
|
+
And the read-only password field was pre-filled with the moderator password
|
114
|
+
|
115
|
+
Scenario: The invite page is pre-filled with the user name only
|
116
|
+
Given a user named "test user"
|
117
|
+
And a real server
|
118
|
+
# Private room = ask for a password
|
119
|
+
And a private room in this server
|
107
120
|
When the user goes to the invite room page (no view check)
|
121
|
+
Then the read-only name field was pre-filled with "test user"
|
122
|
+
And the password field was NOT pre-filled
|
123
|
+
|
124
|
+
# Test the invite view without a user logged
|
125
|
+
|
126
|
+
Scenario: The invite page is not pre-filled when there's no user logged
|
127
|
+
Given an anonymous user
|
128
|
+
And a real server
|
129
|
+
And a public room in this server
|
130
|
+
When the user goes to the invite room page
|
131
|
+
Then the name field was NOT pre-filled
|
132
|
+
And the password field was NOT pre-filled
|
133
|
+
|
134
|
+
# Test if the user can actually join the conference
|
135
|
+
|
136
|
+
@mechanize
|
137
|
+
Scenario: A logged user may join the meeting using the invite page
|
138
|
+
Given a user named "test user"
|
139
|
+
And a real server
|
140
|
+
And a public room in this server
|
141
|
+
When the user goes to the invite room page
|
142
|
+
And clicks in the button "Submit"
|
108
143
|
Then he should join the conference room
|
109
144
|
|
110
145
|
@mechanize
|
111
|
-
Scenario: An anonymous user may join the meeting
|
146
|
+
Scenario: An anonymous user may join the meeting using the invite page
|
112
147
|
Given an anonymous user
|
113
148
|
And a real server
|
114
149
|
And a public room in this server
|
@@ -116,3 +151,29 @@ Feature: Join webconference rooms
|
|
116
151
|
And enters his name and the moderator password
|
117
152
|
And clicks in the button "Submit"
|
118
153
|
Then he should join the conference room
|
154
|
+
|
155
|
+
# Tests when the user is accessing from a mobile client
|
156
|
+
|
157
|
+
Scenario: Accessing from a mobile device the invite form should point to the join with mobile=true
|
158
|
+
Given a user named "test user"
|
159
|
+
And a real server
|
160
|
+
And a public room in this server
|
161
|
+
When the user goes to the invite room with mobile page
|
162
|
+
Then the action in the form should point to the mobile join
|
163
|
+
|
164
|
+
@mechanize
|
165
|
+
Scenario: Accessing from a mobile device the user should be redirected to the url
|
166
|
+
Given a user named "test user"
|
167
|
+
And a real server
|
168
|
+
And a public room in this server
|
169
|
+
When the user goes to the invite room with mobile page
|
170
|
+
And enters his name and the moderator password
|
171
|
+
And clicks in the button to join the conference from a mobile device
|
172
|
+
Then he should be redirected to the conference using the "bigbluebutton://" protocol
|
173
|
+
|
174
|
+
Scenario: The invite view shows a link to join from a desktop when joining from a mobile
|
175
|
+
Given a user named "test user"
|
176
|
+
And a real server
|
177
|
+
And a public room in this server
|
178
|
+
When the user goes to the invite room with mobile page
|
179
|
+
Then he should see a link to join the conference from a desktop
|
@@ -53,6 +53,9 @@ When /^he should see one meeting running and the other meeting not running$/ do
|
|
53
53
|
@rooms.last.fetch_is_running?
|
54
54
|
@rooms.last.is_running?.should be_true
|
55
55
|
|
56
|
+
# the ended meeting won't appear in the list in BBB 0.8
|
57
|
+
@rooms.delete(@rooms.first) if @server.version >= "0.8"
|
58
|
+
|
56
59
|
check_server_activity_monitor_rooms(@rooms)
|
57
60
|
end
|
58
61
|
|
@@ -40,6 +40,44 @@ When /^enters only the user name$/ do
|
|
40
40
|
fill_in("user[name]", :with => name)
|
41
41
|
end
|
42
42
|
|
43
|
-
When /^the password field was pre-filled with the
|
44
|
-
has_element("input", { :name => 'user[password]', :type => 'password', :value => @room.
|
43
|
+
When /^the read-only password field was pre-filled with the moderator password$/ do
|
44
|
+
has_element("input", { :name => 'user[password]', :type => 'password', :value => @room.moderator_password, :readonly => 'readonly' })
|
45
|
+
end
|
46
|
+
|
47
|
+
When /^the password field was not pre-filled$/i do
|
48
|
+
has_element("input", { :name => 'user[password]', :type => 'password', :value => '' })
|
49
|
+
end
|
50
|
+
|
51
|
+
When /^the read-only name field was pre-filled with "(.+)"$/ do |name|
|
52
|
+
has_element("input", { :name => 'user[name]', :type => 'text', :value => name, :readonly => 'readonly' })
|
53
|
+
end
|
54
|
+
|
55
|
+
When /^the name field was not pre-filled$/i do
|
56
|
+
has_element("input", { :name => 'user[name]', :type => 'text', :value => ''})
|
57
|
+
end
|
58
|
+
|
59
|
+
When /^the action in the form should point to the mobile join$/i do
|
60
|
+
action = join_bigbluebutton_room_path(@room, :mobile => true)
|
61
|
+
has_element("form", { :action => action, :method => 'post' })
|
62
|
+
end
|
63
|
+
|
64
|
+
When /^he should see a link to join the conference from a desktop$/i do
|
65
|
+
has_element("a", { :href => invite_bigbluebutton_room_path(@room) })
|
66
|
+
end
|
67
|
+
|
68
|
+
When /^he should see a link to join the conference from a mobile device$/i do
|
69
|
+
has_element("a", { :href => invite_bigbluebutton_room_path(@room, :mobile => true) })
|
70
|
+
end
|
71
|
+
|
72
|
+
# Joining a conference with mobile=true will redirect the user to a url
|
73
|
+
# using the protocol "bigbluebutton://" and Mechanize will throw an exception
|
74
|
+
# because it doesn't know the protocol. So we check the url using this exception.
|
75
|
+
When /^clicks in the button to join the conference from a mobile device$/i do
|
76
|
+
begin
|
77
|
+
click_button("Submit")
|
78
|
+
rescue Exception => @exception
|
79
|
+
end
|
80
|
+
end
|
81
|
+
When /^he should be redirected to the conference using the "bigbluebutton:\/\/" protocol$/i do
|
82
|
+
@exception.message.should match(/bigbluebutton:\/\//)
|
45
83
|
end
|
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
FactoryGirl.define do
|
2
|
+
factory :bigbluebutton_server_integration, :parent => :bigbluebutton_server do |s|
|
3
|
+
s.url { FeaturesConfig.server["url"] }
|
4
|
+
s.salt { FeaturesConfig.server["salt"] }
|
5
|
+
s.version { FeaturesConfig.server["version"] }
|
6
|
+
end
|
5
7
|
end
|
@@ -5,9 +5,7 @@ module NavigationHelpers
|
|
5
5
|
#
|
6
6
|
# step definition in web_steps.rb
|
7
7
|
#
|
8
|
-
def path_to(page_name, params=
|
9
|
-
params = "?" + params.map{ |k,v| "#{k}=#{CGI::escape(v.to_s)}" }.join("&") if params
|
10
|
-
|
8
|
+
def path_to(page_name, params={})
|
11
9
|
case page_name
|
12
10
|
|
13
11
|
when /^home\s?$/
|
@@ -40,8 +38,12 @@ module NavigationHelpers
|
|
40
38
|
p = bigbluebutton_room_path(@room)
|
41
39
|
when /join room/i
|
42
40
|
p = join_bigbluebutton_room_path(@room)
|
43
|
-
when /invite room
|
41
|
+
when /invite room$/i
|
42
|
+
p = invite_bigbluebutton_room_path(@room)
|
43
|
+
when /invite room with mobile$/i
|
44
44
|
p = invite_bigbluebutton_room_path(@room)
|
45
|
+
params = {} if params.nil?
|
46
|
+
params[:mobile] = true
|
45
47
|
when /mobile join/i
|
46
48
|
p = join_mobile_bigbluebutton_room_path(@room)
|
47
49
|
|
@@ -56,7 +58,10 @@ module NavigationHelpers
|
|
56
58
|
end
|
57
59
|
end
|
58
60
|
|
59
|
-
|
61
|
+
unless params.nil? or params.empty?
|
62
|
+
params = "?" + params.map{ |k,v| "#{k}=#{CGI::escape(v.to_s)}" }.join("&")
|
63
|
+
p += params
|
64
|
+
end
|
60
65
|
p
|
61
66
|
end
|
62
67
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bigbluebutton_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-05-05 00:00:00.
|
13
|
+
date: 2012-05-05 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rails
|
17
|
-
requirement:
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,18 +22,28 @@ dependencies:
|
|
22
22
|
version: 3.0.0
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements:
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: 3.0.0
|
26
31
|
- !ruby/object:Gem::Dependency
|
27
32
|
name: bigbluebutton-api-ruby
|
28
|
-
requirement:
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
29
34
|
none: false
|
30
35
|
requirements:
|
31
36
|
- - ~>
|
32
37
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
38
|
+
version: 1.1.0
|
34
39
|
type: :runtime
|
35
40
|
prerelease: false
|
36
|
-
version_requirements:
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 1.1.0
|
37
47
|
description: It allows you to interact with BigBlueButton from your Ruby on Rails
|
38
48
|
application
|
39
49
|
email: mconf-dev@googlegroups.com
|
@@ -225,7 +235,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
225
235
|
version: '0'
|
226
236
|
segments:
|
227
237
|
- 0
|
228
|
-
hash:
|
238
|
+
hash: 342654963
|
229
239
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
230
240
|
none: false
|
231
241
|
requirements:
|
@@ -234,10 +244,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
234
244
|
version: '0'
|
235
245
|
segments:
|
236
246
|
- 0
|
237
|
-
hash:
|
247
|
+
hash: 342654963
|
238
248
|
requirements: []
|
239
249
|
rubyforge_project:
|
240
|
-
rubygems_version: 1.8.
|
250
|
+
rubygems_version: 1.8.24
|
241
251
|
signing_key:
|
242
252
|
specification_version: 3
|
243
253
|
summary: BigBlueButton integration for Ruby on Rails
|