bigbluebutton_rails 1.4.0 → 2.0.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.
- checksums.yaml +7 -0
- data/.ruby-version +1 -1
- data/.travis.yml +10 -1
- data/CHANGELOG.md +259 -0
- data/Gemfile +14 -19
- data/Gemfile.lock +194 -188
- data/README.md +416 -0
- data/Rakefile +12 -12
- data/TODO.md +13 -0
- data/app/controllers/bigbluebutton/playback_types_controller.rb +44 -0
- data/app/controllers/bigbluebutton/recordings_controller.rb +17 -10
- data/app/controllers/bigbluebutton/rooms_controller.rb +65 -36
- data/app/controllers/bigbluebutton/servers_controller.rb +12 -8
- data/app/models/bigbluebutton_metadata.rb +1 -1
- data/app/models/bigbluebutton_playback_format.rb +22 -1
- data/app/models/bigbluebutton_playback_type.rb +29 -0
- data/app/models/bigbluebutton_recording.rb +38 -19
- data/app/models/bigbluebutton_room.rb +150 -73
- data/app/models/bigbluebutton_room_options.rb +10 -7
- data/app/models/bigbluebutton_server.rb +69 -13
- data/app/models/bigbluebutton_server_config.rb +49 -0
- data/app/views/bigbluebutton/recordings/_form.html.erb +4 -0
- data/app/views/bigbluebutton/recordings/_recordings.html.erb +10 -3
- data/app/views/bigbluebutton/rooms/_form.html.erb +18 -6
- data/app/views/bigbluebutton/rooms/_rooms.html.erb +6 -3
- data/app/views/bigbluebutton/rooms/invite.html.erb +5 -5
- data/app/views/bigbluebutton/rooms/show.html.erb +18 -6
- data/app/views/bigbluebutton/servers/_form.html.erb +1 -1
- data/app/views/bigbluebutton/servers/show.html.erb +5 -0
- data/app/workers/bigbluebutton_finish_meetings.rb +11 -0
- data/app/workers/bigbluebutton_update_recordings.rb +11 -0
- data/app/workers/bigbluebutton_update_server_configs.rb +18 -0
- data/bigbluebutton_rails.gemspec +8 -7
- data/config/locales/en.yml +52 -7
- data/config/locales/pt-br.yml +162 -0
- data/config/resque/resque.rake +27 -0
- data/config/resque/workers_schedule.yml +17 -0
- data/lib/bigbluebutton_rails.rb +30 -2
- data/lib/bigbluebutton_rails/background_tasks.rb +31 -0
- data/lib/bigbluebutton_rails/controller_methods.rb +12 -8
- data/lib/bigbluebutton_rails/dial_number.rb +48 -0
- data/lib/bigbluebutton_rails/rails/routes.rb +9 -2
- data/lib/bigbluebutton_rails/utils.rb +9 -2
- data/lib/bigbluebutton_rails/version.rb +1 -1
- data/lib/generators/bigbluebutton_rails/install_generator.rb +0 -8
- data/lib/generators/bigbluebutton_rails/templates/migration.rb +28 -6
- data/lib/generators/bigbluebutton_rails/templates/migration_2_0_0.rb +56 -0
- data/lib/tasks/bigbluebutton_rails/meetings.rake +1 -13
- data/lib/tasks/bigbluebutton_rails/recordings.rake +1 -12
- data/lib/tasks/bigbluebutton_rails/server_configs.rake +10 -0
- data/spec/bigbluebutton_rails_spec.rb +0 -13
- data/spec/controllers/bigbluebutton/playback_types_controller_spec.rb +76 -0
- data/spec/controllers/bigbluebutton/recordings_controller_spec.rb +109 -37
- data/spec/controllers/bigbluebutton/rooms_controller_exception_handling_spec.rb +1 -0
- data/spec/controllers/bigbluebutton/rooms_controller_json_responses_spec.rb +27 -3
- data/spec/controllers/bigbluebutton/rooms_controller_spec.rb +338 -77
- data/spec/controllers/bigbluebutton/servers_controller_json_responses_spec.rb +8 -0
- data/spec/controllers/bigbluebutton/servers_controller_spec.rb +182 -47
- data/spec/factories/bigbluebutton_meeting.rb +2 -2
- data/spec/factories/bigbluebutton_playback_format.rb +2 -2
- data/spec/factories/bigbluebutton_playback_type.rb +7 -0
- data/spec/factories/bigbluebutton_recording.rb +8 -0
- data/spec/factories/bigbluebutton_room.rb +10 -3
- data/spec/factories/bigbluebutton_server.rb +6 -1
- data/spec/factories/bigbluebutton_server_config.rb +6 -0
- data/spec/generators/install_generator_spec.rb +0 -16
- data/spec/lib/bigbluebutton_rails/background_tasks_spec.rb +61 -0
- data/spec/lib/bigbluebutton_rails/dial_number_spec.rb +78 -0
- data/spec/lib/bigbluebutton_rails/utils_spec.rb +56 -0
- data/spec/lib/tasks/meetings_rake_spec.rb +14 -1
- data/spec/lib/tasks/recordings_rake_spec.rb +14 -1
- data/spec/models/bigbluebutton_meeting_db_spec.rb +3 -3
- data/spec/models/bigbluebutton_meeting_spec.rb +4 -4
- data/spec/models/bigbluebutton_playback_format_db_spec.rb +0 -1
- data/spec/models/bigbluebutton_playback_format_spec.rb +75 -4
- data/spec/models/bigbluebutton_playback_type_db_spec.rb +14 -0
- data/spec/models/bigbluebutton_playback_type_spec.rb +76 -0
- data/spec/models/bigbluebutton_recording_db_spec.rb +3 -1
- data/spec/models/bigbluebutton_recording_spec.rb +234 -58
- data/spec/models/bigbluebutton_room_db_spec.rb +8 -6
- data/spec/models/bigbluebutton_room_options_db_spec.rb +1 -0
- data/spec/models/bigbluebutton_room_options_spec.rb +137 -38
- data/spec/models/bigbluebutton_room_spec.rb +540 -153
- data/spec/models/bigbluebutton_server_config_spec.rb +115 -0
- data/spec/models/bigbluebutton_server_spec.rb +180 -23
- data/spec/rails_app/app/controllers/my_playback_types_controller.rb +7 -0
- data/spec/rails_app/app/views/frontpage/show.html.erb +1 -0
- data/spec/rails_app/app/views/my_playback_types/index.html.erb +33 -0
- data/spec/rails_app/config/application.rb +0 -3
- data/spec/rails_app/config/database.yml.travis +10 -0
- data/spec/rails_app/config/environments/development.rb +1 -6
- data/spec/rails_app/config/environments/production.rb +2 -0
- data/spec/rails_app/config/environments/test.rb +2 -0
- data/spec/rails_app/config/routes.rb +5 -2
- data/spec/rails_app/db/seeds.rb +1 -1
- data/spec/rails_app/features/config.yml.example +3 -4
- data/spec/rails_app/features/join_rooms.feature +14 -14
- data/spec/rails_app/features/step_definitions/activity_monitor_servers_step.rb +2 -2
- data/spec/rails_app/features/step_definitions/create_rooms_steps.rb +4 -4
- data/spec/rails_app/features/step_definitions/destroy_rooms_steps.rb +2 -2
- data/spec/rails_app/features/step_definitions/join_rooms_steps.rb +10 -10
- data/spec/rails_app/features/step_definitions/web_steps.rb +2 -2
- data/spec/rails_app/features/support/configurations.rb +1 -1
- data/spec/rails_app/features/support/templates.rb +12 -12
- data/spec/rails_app/lib/tasks/db/populate.rake +19 -6
- data/spec/routing/bigbluebutton/custom_controllers_routing_spec.rb +1 -1
- data/spec/routing/bigbluebutton/recordings_only_routing_spec.rb +2 -2
- data/spec/routing/bigbluebutton/recordings_routing_spec.rb +2 -2
- data/spec/routing/bigbluebutton/rooms_only_routing_spec.rb +1 -1
- data/spec/routing/bigbluebutton/rooms_routing_spec.rb +15 -1
- data/spec/routing/bigbluebutton/servers_only_routing_spec.rb +1 -1
- data/spec/routing/bigbluebutton/servers_routing_spec.rb +1 -1
- data/spec/spec_helper.rb +23 -31
- data/spec/support/matchers/delegate_matcher.rb +8 -1
- data/spec/support/matchers/shoulda/respond_with_json_matcher.rb +2 -2
- data/spec/support/mocked_server.rb +2 -0
- data/spec/support/shared_contexts/rake.rb +23 -0
- data/spec/workers/bigbluebutton_finish_meetings_spec.rb +14 -0
- data/spec/workers/bigbluebutton_update_recordings_spec.rb +14 -0
- data/spec/workers/bigbluebutton_update_server_configs_spec.rb +47 -0
- metadata +70 -59
- data/CHANGELOG.rdoc +0 -111
- data/README.rdoc +0 -319
- data/TODO.rdoc +0 -16
- data/config/schedule.rb +0 -7
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Bigbluebutton::PlaybackTypesController do
|
|
4
|
+
render_views
|
|
5
|
+
let!(:playback_type) { FactoryGirl.create(:bigbluebutton_playback_type) }
|
|
6
|
+
|
|
7
|
+
describe "#update" do
|
|
8
|
+
let!(:new_playback_type) { FactoryGirl.build(:bigbluebutton_playback_type, visible: !playback_type.visible) }
|
|
9
|
+
let(:referer) { "/back" }
|
|
10
|
+
before { request.env["HTTP_REFERER"] = referer }
|
|
11
|
+
|
|
12
|
+
context "on success" do
|
|
13
|
+
before(:each) {
|
|
14
|
+
expect {
|
|
15
|
+
put :update, :id => playback_type.to_param, :bigbluebutton_playback_type => new_playback_type.attributes
|
|
16
|
+
}.not_to change{ BigbluebuttonPlaybackType.count }
|
|
17
|
+
}
|
|
18
|
+
it { should respond_with(:redirect) }
|
|
19
|
+
it { should redirect_to(referer) }
|
|
20
|
+
it {
|
|
21
|
+
saved = BigbluebuttonPlaybackType.find(playback_type)
|
|
22
|
+
saved.should have_same_attributes_as(new_playback_type, ['identifier'])
|
|
23
|
+
}
|
|
24
|
+
it { should set_the_flash.to(I18n.t('bigbluebutton_rails.playback_types.notice.update.success')) }
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
context "on failure" do
|
|
28
|
+
before(:each) {
|
|
29
|
+
BigbluebuttonPlaybackType.should_receive(:find).and_return(playback_type)
|
|
30
|
+
playback_type.should_receive(:update_attributes).and_return(false)
|
|
31
|
+
playback_type.errors.add :identifier, "first"
|
|
32
|
+
playback_type.errors.add :visible, "second"
|
|
33
|
+
put :update, :id => playback_type.to_param, :bigbluebutton_playback_type => new_playback_type.attributes
|
|
34
|
+
}
|
|
35
|
+
it { should respond_with(:redirect) }
|
|
36
|
+
it { should redirect_to(referer) }
|
|
37
|
+
it {
|
|
38
|
+
expected = "Identifier first, Visible second"
|
|
39
|
+
should set_the_flash.to(expected)
|
|
40
|
+
}
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
describe "params handling" do
|
|
44
|
+
let(:attrs) { FactoryGirl.attributes_for(:bigbluebutton_playback_type) }
|
|
45
|
+
let(:params) { { :bigbluebutton_playback_type => attrs } }
|
|
46
|
+
let(:allowed_params) {
|
|
47
|
+
[ :visible, :default ]
|
|
48
|
+
}
|
|
49
|
+
it {
|
|
50
|
+
# we just check that the rails method 'permit' is being called on the hash with the
|
|
51
|
+
# correct parameters
|
|
52
|
+
BigbluebuttonPlaybackType.stub(:find).and_return(playback_type)
|
|
53
|
+
playback_type.stub(:update_attributes).and_return(true)
|
|
54
|
+
attrs.stub(:permit).and_return(attrs)
|
|
55
|
+
controller.stub(:params).and_return(params)
|
|
56
|
+
|
|
57
|
+
put :update, :id => playback_type.to_param, :bigbluebutton_playback_type => new_playback_type.attributes
|
|
58
|
+
attrs.should have_received(:permit).with(*allowed_params)
|
|
59
|
+
}
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
context "doesn't override @playback_type" do
|
|
63
|
+
let!(:other_playback_type) { FactoryGirl.create(:bigbluebutton_playback_type) }
|
|
64
|
+
let(:format) { FactoryGirl.create(:bigbluebutton_playback_format, :playback_type => playback_type) }
|
|
65
|
+
before { controller.instance_variable_set(:@playback_type, other_playback_type) }
|
|
66
|
+
before(:each) {
|
|
67
|
+
put :update, :id => playback_type.to_param, :bigbluebutton_playback_type => new_playback_type.attributes
|
|
68
|
+
}
|
|
69
|
+
it { should assign_to(:playback_type).with(other_playback_type) }
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# important because it might break custom actions on controllers that inherit from this
|
|
74
|
+
skip "doesn't call #find_playback_type for custom actions"
|
|
75
|
+
|
|
76
|
+
end
|
|
@@ -2,60 +2,89 @@ require 'spec_helper'
|
|
|
2
2
|
|
|
3
3
|
describe Bigbluebutton::RecordingsController do
|
|
4
4
|
render_views
|
|
5
|
-
let(:recording) { FactoryGirl.create(:bigbluebutton_recording) }
|
|
5
|
+
let!(:recording) { FactoryGirl.create(:bigbluebutton_recording) }
|
|
6
6
|
|
|
7
7
|
describe "#index" do
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
context "basic" do
|
|
9
|
+
before { 3.times { FactoryGirl.create(:bigbluebutton_recording) } }
|
|
10
|
+
before(:each) { get :index }
|
|
11
|
+
it { should respond_with(:success) }
|
|
12
|
+
it { should assign_to(:recordings).with(BigbluebuttonRecording.all) }
|
|
13
|
+
it { should render_template(:index) }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
context "doesn't override @recordings" do
|
|
17
|
+
let!(:my_recordings) { [ FactoryGirl.create(:bigbluebutton_recording), FactoryGirl.create(:bigbluebutton_recording) ] }
|
|
18
|
+
before {
|
|
19
|
+
3.times { FactoryGirl.create(:bigbluebutton_recording) }
|
|
20
|
+
controller.instance_variable_set(:@recordings, my_recordings)
|
|
21
|
+
}
|
|
22
|
+
before(:each) { get :index }
|
|
23
|
+
it { should assign_to(:recordings).with(my_recordings) }
|
|
24
|
+
end
|
|
13
25
|
end
|
|
14
26
|
|
|
15
27
|
describe "#show" do
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
28
|
+
context "basic" do
|
|
29
|
+
before(:each) { get :show, :id => recording.to_param }
|
|
30
|
+
it { should respond_with(:success) }
|
|
31
|
+
it { should assign_to(:recording).with(recording) }
|
|
32
|
+
it { should render_template(:show) }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
context "doesn't override @recording" do
|
|
36
|
+
let!(:other_recording) { FactoryGirl.create(:bigbluebutton_recording) }
|
|
37
|
+
before { controller.instance_variable_set(:@recording, other_recording) }
|
|
38
|
+
before(:each) { get :show, :id => recording.to_param }
|
|
39
|
+
it { should assign_to(:recording).with(other_recording) }
|
|
40
|
+
end
|
|
20
41
|
end
|
|
21
42
|
|
|
22
43
|
describe "#edit" do
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
44
|
+
context "basic" do
|
|
45
|
+
before(:each) { get :edit, :id => recording.to_param }
|
|
46
|
+
it { should respond_with(:success) }
|
|
47
|
+
it { should assign_to(:recording).with(recording) }
|
|
48
|
+
it { should render_template(:edit) }
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
context "doesn't override @recording" do
|
|
52
|
+
let!(:other_recording) { FactoryGirl.create(:bigbluebutton_recording) }
|
|
53
|
+
before { controller.instance_variable_set(:@recording, other_recording) }
|
|
54
|
+
before(:each) { get :edit, :id => recording.to_param }
|
|
55
|
+
it { should assign_to(:recording).with(other_recording) }
|
|
56
|
+
end
|
|
27
57
|
end
|
|
28
58
|
|
|
29
59
|
describe "#update" do
|
|
30
|
-
let(:new_recording) { FactoryGirl.build(:bigbluebutton_recording) }
|
|
31
|
-
before { @recording = recording } # need this to trigger let(:recording) and actually create the object
|
|
60
|
+
let!(:new_recording) { FactoryGirl.build(:bigbluebutton_recording) }
|
|
32
61
|
|
|
33
62
|
context "on success" do
|
|
34
63
|
before(:each) {
|
|
35
64
|
expect {
|
|
36
|
-
put :update, :id =>
|
|
65
|
+
put :update, :id => recording.to_param, :bigbluebutton_recording => new_recording.attributes
|
|
37
66
|
}.not_to change{ BigbluebuttonRecording.count }
|
|
38
67
|
}
|
|
39
68
|
it { should respond_with(:redirect) }
|
|
40
69
|
it {
|
|
41
|
-
saved = BigbluebuttonRecording.find(
|
|
70
|
+
saved = BigbluebuttonRecording.find(recording)
|
|
42
71
|
should redirect_to(bigbluebutton_recording_path(saved))
|
|
43
72
|
}
|
|
44
73
|
it {
|
|
45
|
-
saved = BigbluebuttonRecording.find(
|
|
46
|
-
saved.should have_same_attributes_as(new_recording, ['room_id', 'server_id', 'meeting_id'])
|
|
74
|
+
saved = BigbluebuttonRecording.find(recording)
|
|
75
|
+
saved.should have_same_attributes_as(new_recording, ['room_id', 'server_id', 'meeting_id', 'size'])
|
|
47
76
|
}
|
|
48
77
|
it { should set_the_flash.to(I18n.t('bigbluebutton_rails.recordings.notice.update.success')) }
|
|
49
78
|
end
|
|
50
79
|
|
|
51
80
|
context "on failure" do
|
|
52
81
|
before(:each) {
|
|
53
|
-
BigbluebuttonRecording.should_receive(:find_by_recordid).and_return(
|
|
54
|
-
|
|
55
|
-
put :update, :id =>
|
|
82
|
+
BigbluebuttonRecording.should_receive(:find_by_recordid).and_return(recording)
|
|
83
|
+
recording.should_receive(:update_attributes).and_return(false)
|
|
84
|
+
put :update, :id => recording.to_param, :bigbluebutton_recording => new_recording.attributes
|
|
56
85
|
}
|
|
57
86
|
it { should render_template(:edit) }
|
|
58
|
-
it { should assign_to(:recording).with(
|
|
87
|
+
it { should assign_to(:recording).with(recording) }
|
|
59
88
|
end
|
|
60
89
|
|
|
61
90
|
describe "params handling" do
|
|
@@ -67,12 +96,12 @@ describe Bigbluebutton::RecordingsController do
|
|
|
67
96
|
it {
|
|
68
97
|
# we just check that the rails method 'permit' is being called on the hash with the
|
|
69
98
|
# correct parameters
|
|
70
|
-
BigbluebuttonRecording.stub(:find_by_recordid).and_return(
|
|
71
|
-
|
|
99
|
+
BigbluebuttonRecording.stub(:find_by_recordid).and_return(recording)
|
|
100
|
+
recording.stub(:update_attributes).and_return(true)
|
|
72
101
|
attrs.stub(:permit).and_return(attrs)
|
|
73
102
|
controller.stub(:params).and_return(params)
|
|
74
103
|
|
|
75
|
-
put :update, :id =>
|
|
104
|
+
put :update, :id => recording.to_param, :bigbluebutton_recording => attrs
|
|
76
105
|
attrs.should have_received(:permit).with(*allowed_params)
|
|
77
106
|
}
|
|
78
107
|
end
|
|
@@ -80,15 +109,15 @@ describe Bigbluebutton::RecordingsController do
|
|
|
80
109
|
# to make sure it doesn't break if the hash informed doesn't have the key :bigbluebutton_recording
|
|
81
110
|
describe "if parameters are not informed" do
|
|
82
111
|
it {
|
|
83
|
-
put :update, :id =>
|
|
84
|
-
should redirect_to(bigbluebutton_recording_path(
|
|
112
|
+
put :update, :id => recording.to_param
|
|
113
|
+
should redirect_to(bigbluebutton_recording_path(recording))
|
|
85
114
|
}
|
|
86
115
|
end
|
|
87
116
|
|
|
88
117
|
context "with :redir_url" do
|
|
89
118
|
context "on success" do
|
|
90
119
|
before(:each) {
|
|
91
|
-
put :update, :id =>
|
|
120
|
+
put :update, :id => recording.to_param, :bigbluebutton_recording => new_recording.attributes, :redir_url => '/any'
|
|
92
121
|
}
|
|
93
122
|
it { should respond_with(:redirect) }
|
|
94
123
|
it { should redirect_to "/any" }
|
|
@@ -96,15 +125,21 @@ describe Bigbluebutton::RecordingsController do
|
|
|
96
125
|
|
|
97
126
|
context "on failure" do
|
|
98
127
|
before(:each) {
|
|
99
|
-
BigbluebuttonRecording.should_receive(:find_by_recordid).and_return(
|
|
100
|
-
|
|
101
|
-
put :update, :id =>
|
|
128
|
+
BigbluebuttonRecording.should_receive(:find_by_recordid).and_return(recording)
|
|
129
|
+
recording.should_receive(:update_attributes).and_return(false)
|
|
130
|
+
put :update, :id => recording.to_param, :bigbluebutton_recording => new_recording.attributes, :redir_url => '/any'
|
|
102
131
|
}
|
|
103
132
|
it { should respond_with(:redirect) }
|
|
104
133
|
it { should redirect_to "/any" }
|
|
105
134
|
end
|
|
106
135
|
end
|
|
107
136
|
|
|
137
|
+
context "doesn't override @recording" do
|
|
138
|
+
let!(:other_recording) { FactoryGirl.create(:bigbluebutton_recording) }
|
|
139
|
+
before { controller.instance_variable_set(:@recording, other_recording) }
|
|
140
|
+
before(:each) { put :update, :id => recording.to_param, :bigbluebutton_recording => new_recording.attributes }
|
|
141
|
+
it { should assign_to(:recording).with(other_recording) }
|
|
142
|
+
end
|
|
108
143
|
end
|
|
109
144
|
|
|
110
145
|
describe "#destroy" do
|
|
@@ -172,6 +207,16 @@ describe Bigbluebutton::RecordingsController do
|
|
|
172
207
|
it { should redirect_to bigbluebutton_recordings_url }
|
|
173
208
|
it { should set_the_flash.to(I18n.t('bigbluebutton_rails.recordings.notice.destroy.success')) }
|
|
174
209
|
end
|
|
210
|
+
|
|
211
|
+
context "doesn't override @recording" do
|
|
212
|
+
let!(:other_recording) { FactoryGirl.create(:bigbluebutton_recording) }
|
|
213
|
+
before {
|
|
214
|
+
controller.instance_variable_set(:@recording, other_recording)
|
|
215
|
+
other_recording.server.stub(:send_delete_recordings)
|
|
216
|
+
}
|
|
217
|
+
before(:each) { delete :destroy, :id => recording.to_param }
|
|
218
|
+
it { should assign_to(:recording).with(other_recording) }
|
|
219
|
+
end
|
|
175
220
|
end
|
|
176
221
|
|
|
177
222
|
describe "#play" do
|
|
@@ -188,9 +233,20 @@ describe Bigbluebutton::RecordingsController do
|
|
|
188
233
|
end
|
|
189
234
|
|
|
190
235
|
context "when params[:type] is not specified plays the first format" do
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
236
|
+
context "plays the default format" do
|
|
237
|
+
before {
|
|
238
|
+
@format2.playback_type.update_attributes(default: true)
|
|
239
|
+
}
|
|
240
|
+
before(:each) { get :play, :id => recording.to_param }
|
|
241
|
+
it { should respond_with(:redirect) }
|
|
242
|
+
it { should redirect_to @format2.url }
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
context "plays the first format if there's no default" do
|
|
246
|
+
before(:each) { get :play, :id => recording.to_param }
|
|
247
|
+
it { should respond_with(:redirect) }
|
|
248
|
+
it { should redirect_to @format1.url }
|
|
249
|
+
end
|
|
194
250
|
end
|
|
195
251
|
end
|
|
196
252
|
|
|
@@ -209,6 +265,13 @@ describe Bigbluebutton::RecordingsController do
|
|
|
209
265
|
end
|
|
210
266
|
end
|
|
211
267
|
|
|
268
|
+
context "doesn't override @recording" do
|
|
269
|
+
let!(:other_recording) { FactoryGirl.create(:bigbluebutton_recording) }
|
|
270
|
+
let(:format) { FactoryGirl.create(:bigbluebutton_playback_format, :recording => recording) }
|
|
271
|
+
before { controller.instance_variable_set(:@recording, other_recording) }
|
|
272
|
+
before(:each) { get :play, :id => recording.to_param, :type => format.format_type }
|
|
273
|
+
it { should assign_to(:recording).with(other_recording) }
|
|
274
|
+
end
|
|
212
275
|
end
|
|
213
276
|
|
|
214
277
|
# these actions are essentially the same
|
|
@@ -269,7 +332,16 @@ describe Bigbluebutton::RecordingsController do
|
|
|
269
332
|
end
|
|
270
333
|
end
|
|
271
334
|
|
|
335
|
+
context "doesn't override @recording" do
|
|
336
|
+
let!(:other_recording) { FactoryGirl.create(:bigbluebutton_recording) }
|
|
337
|
+
before {
|
|
338
|
+
controller.instance_variable_set(:@recording, other_recording)
|
|
339
|
+
other_recording.server.stub(:send_publish_recordings)
|
|
340
|
+
}
|
|
341
|
+
before(:each) { post action, :id => recording.to_param }
|
|
342
|
+
it { should assign_to(:recording).with(other_recording) }
|
|
343
|
+
end
|
|
344
|
+
|
|
272
345
|
end
|
|
273
346
|
end
|
|
274
|
-
|
|
275
347
|
end
|
|
@@ -84,6 +84,7 @@ describe Bigbluebutton::RoomsController do
|
|
|
84
84
|
it "catches exception on create_meeting" do
|
|
85
85
|
mocked_api.should_receive(:"request_headers=").once
|
|
86
86
|
mocked_api.should_receive(:is_meeting_running?).exactly(3).times.and_return(false)
|
|
87
|
+
mocked_api.should_receive(:end_meeting)
|
|
87
88
|
mocked_api.should_receive(:create_meeting) { raise bbb_error }
|
|
88
89
|
end
|
|
89
90
|
|
|
@@ -105,7 +105,7 @@ describe Bigbluebutton::RoomsController do
|
|
|
105
105
|
context "room is running" do
|
|
106
106
|
before {
|
|
107
107
|
mocked_api.should_receive(:is_meeting_running?).and_return(true)
|
|
108
|
-
mocked_api.should_receive(:end_meeting).with(room.meetingid, room.
|
|
108
|
+
mocked_api.should_receive(:end_meeting).with(room.meetingid, room.moderator_api_password)
|
|
109
109
|
}
|
|
110
110
|
before(:each) { get :end, :id => room.to_param, :format => 'json' }
|
|
111
111
|
it { should respond_with(:success) }
|
|
@@ -124,7 +124,7 @@ describe Bigbluebutton::RoomsController do
|
|
|
124
124
|
context "throwing an exception" do
|
|
125
125
|
let(:msg) { "any error message" }
|
|
126
126
|
before {
|
|
127
|
-
mocked_api.should_receive(:is_meeting_running?)
|
|
127
|
+
mocked_api.should_receive(:is_meeting_running?) { raise BigBlueButton::BigBlueButtonException.new(msg) }
|
|
128
128
|
}
|
|
129
129
|
before(:each) { get :end, :id => room.to_param, :format => 'json' }
|
|
130
130
|
it { should respond_with(:error) }
|
|
@@ -156,7 +156,7 @@ describe Bigbluebutton::RoomsController do
|
|
|
156
156
|
context "throwing error" do
|
|
157
157
|
let(:msg) { "any error message" }
|
|
158
158
|
before {
|
|
159
|
-
mocked_api.should_receive(:is_meeting_running?)
|
|
159
|
+
mocked_api.should_receive(:is_meeting_running?) { raise BigBlueButton::BigBlueButtonException.new(msg) }
|
|
160
160
|
}
|
|
161
161
|
before(:each) {
|
|
162
162
|
delete :destroy, :id => room.to_param, :format => 'json'
|
|
@@ -175,5 +175,29 @@ describe Bigbluebutton::RoomsController do
|
|
|
175
175
|
it "on error"
|
|
176
176
|
end
|
|
177
177
|
|
|
178
|
+
describe "#generate_dial_number" do
|
|
179
|
+
context "on success" do
|
|
180
|
+
before(:each) {
|
|
181
|
+
BigbluebuttonRoom.any_instance.stub(:generate_dial_number!).and_return(true)
|
|
182
|
+
post :generate_dial_number, id: room.to_param, format: 'json'
|
|
183
|
+
}
|
|
184
|
+
it { should respond_with(:success) }
|
|
185
|
+
it { should respond_with_content_type('application/json') }
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
context "on error" do
|
|
189
|
+
before(:each) {
|
|
190
|
+
BigbluebuttonRoom.any_instance.stub(:generate_dial_number!).and_return(nil)
|
|
191
|
+
post :generate_dial_number, id: room.to_param, format: 'json'
|
|
192
|
+
}
|
|
193
|
+
it { should respond_with(:error) }
|
|
194
|
+
it { should respond_with_content_type('application/json') }
|
|
195
|
+
it {
|
|
196
|
+
error_msg = I18n.t('bigbluebutton_rails.rooms.errors.generate_dial_number.not_unique')
|
|
197
|
+
should respond_with_json({ :message => error_msg }.to_json)
|
|
198
|
+
}
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
178
202
|
end
|
|
179
203
|
end
|
|
@@ -8,34 +8,74 @@ describe Bigbluebutton::RoomsController do
|
|
|
8
8
|
render_views
|
|
9
9
|
let(:server) { FactoryGirl.create(:bigbluebutton_server) }
|
|
10
10
|
let(:room) { FactoryGirl.create(:bigbluebutton_room, :server => server) }
|
|
11
|
+
let(:params_to_ignore) { ['moderator_api_password', 'attendee_api_password'] }
|
|
11
12
|
|
|
12
13
|
describe "#index" do
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
context "basic" do
|
|
15
|
+
before { 3.times { FactoryGirl.create(:bigbluebutton_room) } }
|
|
16
|
+
before(:each) { get :index }
|
|
17
|
+
it { should respond_with(:success) }
|
|
18
|
+
it { should assign_to(:rooms).with(BigbluebuttonRoom.all) }
|
|
19
|
+
it { should render_template(:index) }
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
context "doesn't override @rooms" do
|
|
23
|
+
let!(:my_rooms) { [ FactoryGirl.create(:bigbluebutton_room), FactoryGirl.create(:bigbluebutton_room) ] }
|
|
24
|
+
before {
|
|
25
|
+
3.times { FactoryGirl.create(:bigbluebutton_room) }
|
|
26
|
+
controller.instance_variable_set(:@rooms, my_rooms)
|
|
27
|
+
}
|
|
28
|
+
before(:each) { get :index }
|
|
29
|
+
it { should assign_to(:rooms).with(my_rooms) }
|
|
30
|
+
end
|
|
18
31
|
end
|
|
19
32
|
|
|
20
33
|
describe "#show" do
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
34
|
+
context "basic" do
|
|
35
|
+
before(:each) { get :show, :id => room.to_param }
|
|
36
|
+
it { should respond_with(:success) }
|
|
37
|
+
it { should assign_to(:room).with(room) }
|
|
38
|
+
it { should render_template(:show) }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
context "doesn't override @room" do
|
|
42
|
+
let!(:other_room) { FactoryGirl.create(:bigbluebutton_room) }
|
|
43
|
+
before { controller.instance_variable_set(:@room, other_room) }
|
|
44
|
+
before(:each) { get :show, :id => room.to_param }
|
|
45
|
+
it { should assign_to(:room).with(other_room) }
|
|
46
|
+
end
|
|
25
47
|
end
|
|
26
48
|
|
|
27
49
|
describe "#new" do
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
50
|
+
context "basic" do
|
|
51
|
+
before(:each) { get :new }
|
|
52
|
+
it { should respond_with(:success) }
|
|
53
|
+
it { should assign_to(:room).with_kind_of(BigbluebuttonRoom) }
|
|
54
|
+
it { should render_template(:new) }
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
context "doesn't override @room" do
|
|
58
|
+
let!(:other_room) { FactoryGirl.create(:bigbluebutton_room) }
|
|
59
|
+
before { controller.instance_variable_set(:@room, other_room) }
|
|
60
|
+
before(:each) { get :new }
|
|
61
|
+
it { should assign_to(:room).with(other_room) }
|
|
62
|
+
end
|
|
32
63
|
end
|
|
33
64
|
|
|
34
65
|
describe "#edit" do
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
66
|
+
context "basic" do
|
|
67
|
+
before(:each) { get :edit, :id => room.to_param }
|
|
68
|
+
it { should respond_with(:success) }
|
|
69
|
+
it { should assign_to(:room).with(room) }
|
|
70
|
+
it { should render_template(:edit) }
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
context "doesn't override @room" do
|
|
74
|
+
let!(:other_room) { FactoryGirl.create(:bigbluebutton_room) }
|
|
75
|
+
before { controller.instance_variable_set(:@room, other_room) }
|
|
76
|
+
before(:each) { get :edit, :id => room.to_param }
|
|
77
|
+
it { should assign_to(:room).with(other_room) }
|
|
78
|
+
end
|
|
39
79
|
end
|
|
40
80
|
|
|
41
81
|
describe "#join_mobile" do
|
|
@@ -87,6 +127,13 @@ describe Bigbluebutton::RoomsController do
|
|
|
87
127
|
it("assigns join_desktop") { should assign_to(:join_desktop).with("http://test.com/join/url?desktop=1") }
|
|
88
128
|
it { should render_template(:join_mobile) }
|
|
89
129
|
end
|
|
130
|
+
|
|
131
|
+
context "doesn't override @room" do
|
|
132
|
+
let!(:other_room) { FactoryGirl.create(:bigbluebutton_room) }
|
|
133
|
+
before { controller.instance_variable_set(:@room, other_room) }
|
|
134
|
+
before(:each) { get :join_mobile, :id => room.to_param }
|
|
135
|
+
it { should assign_to(:room).with(other_room) }
|
|
136
|
+
end
|
|
90
137
|
end
|
|
91
138
|
|
|
92
139
|
describe "#create" do
|
|
@@ -105,7 +152,7 @@ describe Bigbluebutton::RoomsController do
|
|
|
105
152
|
it { should set_the_flash.to(I18n.t('bigbluebutton_rails.rooms.notice.create.success')) }
|
|
106
153
|
it {
|
|
107
154
|
saved = BigbluebuttonRoom.last
|
|
108
|
-
saved.should have_same_attributes_as(new_room)
|
|
155
|
+
saved.should have_same_attributes_as(new_room, params_to_ignore)
|
|
109
156
|
}
|
|
110
157
|
end
|
|
111
158
|
|
|
@@ -151,7 +198,7 @@ describe Bigbluebutton::RoomsController do
|
|
|
151
198
|
it {
|
|
152
199
|
saved = BigbluebuttonRoom.last
|
|
153
200
|
new_room.meetingid = new_room.name
|
|
154
|
-
saved.should have_same_attributes_as(new_room)
|
|
201
|
+
saved.should have_same_attributes_as(new_room, params_to_ignore)
|
|
155
202
|
}
|
|
156
203
|
end
|
|
157
204
|
|
|
@@ -159,10 +206,12 @@ describe Bigbluebutton::RoomsController do
|
|
|
159
206
|
let(:attrs) { FactoryGirl.attributes_for(:bigbluebutton_room) }
|
|
160
207
|
let(:params) { { :bigbluebutton_room => attrs } }
|
|
161
208
|
let(:allowed_params) {
|
|
162
|
-
[ :name, :server_id, :meetingid, :
|
|
209
|
+
[ :name, :server_id, :meetingid, :attendee_key, :moderator_key, :welcome_msg,
|
|
163
210
|
:private, :logout_url, :dial_number, :voice_bridge, :max_participants, :owner_id,
|
|
164
|
-
:owner_type, :external, :param, :
|
|
165
|
-
:auto_start_video, :auto_start_audio, :
|
|
211
|
+
:owner_type, :external, :param, :record_meeting, :duration, :default_layout, :presenter_share_only,
|
|
212
|
+
:auto_start_video, :auto_start_audio, :background,
|
|
213
|
+
:moderator_only_message, :auto_start_recording, :allow_start_stop_recording,
|
|
214
|
+
:metadata_attributes => [ :id, :name, :content, :_destroy, :owner_id ] ]
|
|
166
215
|
}
|
|
167
216
|
|
|
168
217
|
it {
|
|
@@ -187,6 +236,13 @@ describe Bigbluebutton::RoomsController do
|
|
|
187
236
|
should render_template(:new)
|
|
188
237
|
}
|
|
189
238
|
end
|
|
239
|
+
|
|
240
|
+
context "doesn't override @room" do
|
|
241
|
+
let!(:other_room) { FactoryGirl.create(:bigbluebutton_room) }
|
|
242
|
+
before { controller.instance_variable_set(:@room, other_room) }
|
|
243
|
+
before(:each) { post :create, :bigbluebutton_room => new_room.attributes }
|
|
244
|
+
it { should assign_to(:room).with(other_room) }
|
|
245
|
+
end
|
|
190
246
|
end
|
|
191
247
|
|
|
192
248
|
describe "#update" do
|
|
@@ -206,7 +262,7 @@ describe Bigbluebutton::RoomsController do
|
|
|
206
262
|
}
|
|
207
263
|
it {
|
|
208
264
|
saved = BigbluebuttonRoom.find(@room)
|
|
209
|
-
saved.should have_same_attributes_as(new_room)
|
|
265
|
+
saved.should have_same_attributes_as(new_room, params_to_ignore)
|
|
210
266
|
}
|
|
211
267
|
it { should set_the_flash.to(I18n.t('bigbluebutton_rails.rooms.notice.update.success')) }
|
|
212
268
|
end
|
|
@@ -243,10 +299,12 @@ describe Bigbluebutton::RoomsController do
|
|
|
243
299
|
let(:attrs) { FactoryGirl.attributes_for(:bigbluebutton_room) }
|
|
244
300
|
let(:params) { { :bigbluebutton_room => attrs } }
|
|
245
301
|
let(:allowed_params) {
|
|
246
|
-
[ :name, :server_id, :meetingid, :
|
|
302
|
+
[ :name, :server_id, :meetingid, :attendee_key, :moderator_key, :welcome_msg,
|
|
247
303
|
:private, :logout_url, :dial_number, :voice_bridge, :max_participants, :owner_id,
|
|
248
|
-
:owner_type, :external, :param, :
|
|
249
|
-
:auto_start_video, :auto_start_audio, :
|
|
304
|
+
:owner_type, :external, :param, :record_meeting, :duration, :default_layout, :presenter_share_only,
|
|
305
|
+
:auto_start_video, :auto_start_audio, :background,
|
|
306
|
+
:moderator_only_message, :auto_start_recording, :allow_start_stop_recording,
|
|
307
|
+
:metadata_attributes => [ :id, :name, :content, :_destroy, :owner_id ] ]
|
|
250
308
|
}
|
|
251
309
|
it {
|
|
252
310
|
# we just check that the rails method 'permit' is being called on the hash with the
|
|
@@ -269,19 +327,25 @@ describe Bigbluebutton::RoomsController do
|
|
|
269
327
|
should redirect_to(bigbluebutton_room_path(@room))
|
|
270
328
|
}
|
|
271
329
|
end
|
|
330
|
+
|
|
331
|
+
context "doesn't override @room" do
|
|
332
|
+
let!(:other_room) { FactoryGirl.create(:bigbluebutton_room) }
|
|
333
|
+
before { controller.instance_variable_set(:@room, other_room) }
|
|
334
|
+
before(:each) { put :update, :id => @room.to_param, :bigbluebutton_room => new_room.attributes }
|
|
335
|
+
it { should assign_to(:room).with(other_room) }
|
|
336
|
+
end
|
|
272
337
|
end
|
|
273
338
|
|
|
274
339
|
describe "#destroy" do
|
|
275
|
-
before {
|
|
276
|
-
controller.should_receive(:set_request_headers)
|
|
277
|
-
mock_server_and_api
|
|
278
|
-
# to make sure it calls end_meeting if the meeting is running
|
|
279
|
-
mocked_api.should_receive(:is_meeting_running?).and_return(true)
|
|
280
|
-
}
|
|
281
|
-
|
|
282
340
|
context "on success" do
|
|
341
|
+
before {
|
|
342
|
+
controller.should_receive(:set_request_headers)
|
|
343
|
+
mock_server_and_api
|
|
344
|
+
# to make sure it calls end_meeting if the meeting is running
|
|
345
|
+
mocked_api.should_receive(:is_meeting_running?).and_return(true)
|
|
346
|
+
mocked_api.should_receive(:end_meeting).with(room.meetingid, room.moderator_api_password)
|
|
347
|
+
}
|
|
283
348
|
before(:each) {
|
|
284
|
-
mocked_api.should_receive(:end_meeting).with(room.meetingid, room.moderator_password)
|
|
285
349
|
expect {
|
|
286
350
|
delete :destroy, :id => room.to_param
|
|
287
351
|
}.to change{ BigbluebuttonRoom.count }.by(-1)
|
|
@@ -294,6 +358,10 @@ describe Bigbluebutton::RoomsController do
|
|
|
294
358
|
let(:bbb_error_msg) { SecureRandom.hex(250) }
|
|
295
359
|
let(:bbb_error) { BigBlueButton::BigBlueButtonException.new(bbb_error_msg) }
|
|
296
360
|
before {
|
|
361
|
+
controller.should_receive(:set_request_headers)
|
|
362
|
+
mock_server_and_api
|
|
363
|
+
# to make sure it calls end_meeting if the meeting is running
|
|
364
|
+
mocked_api.should_receive(:is_meeting_running?).and_return(true)
|
|
297
365
|
mocked_api.should_receive(:end_meeting) { raise bbb_error }
|
|
298
366
|
}
|
|
299
367
|
before(:each) {
|
|
@@ -310,9 +378,15 @@ describe Bigbluebutton::RoomsController do
|
|
|
310
378
|
end
|
|
311
379
|
|
|
312
380
|
context "with :redir_url" do
|
|
381
|
+
before {
|
|
382
|
+
controller.should_receive(:set_request_headers)
|
|
383
|
+
mock_server_and_api
|
|
384
|
+
# to make sure it calls end_meeting if the meeting is running
|
|
385
|
+
mocked_api.should_receive(:is_meeting_running?).and_return(true)
|
|
386
|
+
mocked_api.should_receive(:end_meeting)
|
|
387
|
+
}
|
|
313
388
|
before(:each) {
|
|
314
389
|
expect {
|
|
315
|
-
mocked_api.should_receive(:end_meeting)
|
|
316
390
|
delete :destroy, :id => room.to_param, :redir_url => "/any"
|
|
317
391
|
}.to change{ BigbluebuttonRoom.count }.by(-1)
|
|
318
392
|
}
|
|
@@ -320,6 +394,12 @@ describe Bigbluebutton::RoomsController do
|
|
|
320
394
|
it { should redirect_to "/any" }
|
|
321
395
|
end
|
|
322
396
|
|
|
397
|
+
context "doesn't override @room" do
|
|
398
|
+
let!(:other_room) { FactoryGirl.create(:bigbluebutton_room) }
|
|
399
|
+
before { controller.instance_variable_set(:@room, other_room) }
|
|
400
|
+
before(:each) { delete :destroy, :id => room.to_param }
|
|
401
|
+
it { should assign_to(:room).with(other_room) }
|
|
402
|
+
end
|
|
323
403
|
end
|
|
324
404
|
|
|
325
405
|
describe "#running" do
|
|
@@ -352,8 +432,22 @@ describe Bigbluebutton::RoomsController do
|
|
|
352
432
|
it { should respond_with(:success) }
|
|
353
433
|
it { should set_the_flash.to(bbb_error_msg[0..200]) }
|
|
354
434
|
end
|
|
355
|
-
end
|
|
356
435
|
|
|
436
|
+
context "doesn't override @room" do
|
|
437
|
+
let!(:other_room) { FactoryGirl.create(:bigbluebutton_room) }
|
|
438
|
+
before {
|
|
439
|
+
controller.stub(:running)
|
|
440
|
+
controller.instance_variable_set(:@room, other_room)
|
|
441
|
+
}
|
|
442
|
+
before(:each) {
|
|
443
|
+
begin
|
|
444
|
+
get :running, :id => room.to_param
|
|
445
|
+
rescue ActionView::MissingTemplate
|
|
446
|
+
end
|
|
447
|
+
}
|
|
448
|
+
it { should assign_to(:room).with(other_room) }
|
|
449
|
+
end
|
|
450
|
+
end
|
|
357
451
|
|
|
358
452
|
describe "#join" do
|
|
359
453
|
let(:user) { FactoryGirl.build(:user) }
|
|
@@ -368,7 +462,7 @@ describe Bigbluebutton::RoomsController do
|
|
|
368
462
|
context "via #{method}" do
|
|
369
463
|
|
|
370
464
|
context "before filter #join_check_room" do
|
|
371
|
-
let(:user_hash) { { :name => "Elftor", :
|
|
465
|
+
let(:user_hash) { { :name => "Elftor", :key => room.attendee_key } }
|
|
372
466
|
let(:meetingid) { "my-meeting-id" }
|
|
373
467
|
|
|
374
468
|
context "if params[:id]" do
|
|
@@ -392,12 +486,24 @@ describe Bigbluebutton::RoomsController do
|
|
|
392
486
|
it { should redirect_to(http_referer) }
|
|
393
487
|
it { should set_the_flash.to(message) }
|
|
394
488
|
end
|
|
489
|
+
|
|
490
|
+
context "doesn't override @room" do
|
|
491
|
+
let!(:other_room) { FactoryGirl.create(:bigbluebutton_room) }
|
|
492
|
+
before {
|
|
493
|
+
controller.instance_variable_set(:@room, other_room)
|
|
494
|
+
other_room.stub(:fetch_is_running?).and_return(true)
|
|
495
|
+
}
|
|
496
|
+
before(:each) {
|
|
497
|
+
send(method, :join, :id => room.to_param, :user => user_hash)
|
|
498
|
+
}
|
|
499
|
+
it { should assign_to(:room).with(other_room) }
|
|
500
|
+
end
|
|
395
501
|
end
|
|
396
502
|
|
|
397
503
|
context "before filter #join_user_params" do
|
|
398
504
|
|
|
399
505
|
context "block access if bigbluebutton_role returns nil" do
|
|
400
|
-
let(:hash) { { :name => "Elftor", :
|
|
506
|
+
let(:hash) { { :name => "Elftor", :key => room.attendee_key } }
|
|
401
507
|
before { controller.stub(:bigbluebutton_role) { nil } }
|
|
402
508
|
it {
|
|
403
509
|
lambda {
|
|
@@ -407,24 +513,24 @@ describe Bigbluebutton::RoomsController do
|
|
|
407
513
|
end
|
|
408
514
|
|
|
409
515
|
it "if there's a user logged, should use his name" do
|
|
410
|
-
controller.stub(:bigbluebutton_role) { :
|
|
411
|
-
hash = { :name => "Elftor", :
|
|
516
|
+
controller.stub(:bigbluebutton_role) { :key }
|
|
517
|
+
hash = { :name => "Elftor", :key => room.attendee_key }
|
|
412
518
|
controller.stub(:bigbluebutton_user).and_return(user)
|
|
413
519
|
mocked_api.should_receive(:is_meeting_running?).at_least(:once).and_return(true)
|
|
414
520
|
mocked_api.should_receive(:join_meeting_url)
|
|
415
|
-
.with(room.meetingid, user.name, room.
|
|
521
|
+
.with(room.meetingid, user.name, room.attendee_api_password, anything) # here's the validation
|
|
416
522
|
.and_return("http://test.com/attendee/join")
|
|
417
523
|
send(method, :join, :id => room.to_param, :user => hash)
|
|
418
524
|
end
|
|
419
525
|
|
|
420
|
-
context "uses bigbluebutton_role when the return is not :
|
|
421
|
-
let(:hash) { { :name => "Elftor", :
|
|
526
|
+
context "uses bigbluebutton_role when the return is not :key" do
|
|
527
|
+
let(:hash) { { :name => "Elftor", :key => nil } }
|
|
422
528
|
before {
|
|
423
529
|
controller.stub(:bigbluebutton_user).and_return(nil)
|
|
424
530
|
controller.stub(:bigbluebutton_role) { :attendee }
|
|
425
531
|
mocked_api.should_receive(:is_meeting_running?).at_least(:once).and_return(true)
|
|
426
532
|
mocked_api.should_receive(:join_meeting_url)
|
|
427
|
-
.with(anything, anything, room.
|
|
533
|
+
.with(anything, anything, room.attendee_api_password, anything)
|
|
428
534
|
.and_return("http://test.com/attendee/join")
|
|
429
535
|
}
|
|
430
536
|
before(:each) { send(method, :join, :id => room.to_param, :user => hash) }
|
|
@@ -438,12 +544,12 @@ describe Bigbluebutton::RoomsController do
|
|
|
438
544
|
context "validates user input and shows error" do
|
|
439
545
|
before {
|
|
440
546
|
controller.stub(:bigbluebutton_user).and_return(nil)
|
|
441
|
-
controller.should_receive(:bigbluebutton_role).once { :
|
|
547
|
+
controller.should_receive(:bigbluebutton_role).once { :key }
|
|
442
548
|
}
|
|
443
549
|
before(:each) { send(method, :join, :id => room.to_param, :user => user_hash) }
|
|
444
550
|
|
|
445
551
|
context "when name is not set" do
|
|
446
|
-
let(:user_hash) { { :
|
|
552
|
+
let(:user_hash) { { :key => room.moderator_key } }
|
|
447
553
|
it { should respond_with(:redirect) }
|
|
448
554
|
it { should redirect_to(http_referer) }
|
|
449
555
|
it { should assign_to(:room).with(room) }
|
|
@@ -454,7 +560,7 @@ describe Bigbluebutton::RoomsController do
|
|
|
454
560
|
end
|
|
455
561
|
|
|
456
562
|
context "when name is set but empty" do
|
|
457
|
-
let(:user_hash) { { :
|
|
563
|
+
let(:user_hash) { { :key => room.moderator_key, :name => "" } }
|
|
458
564
|
it { should respond_with(:redirect) }
|
|
459
565
|
it { should redirect_to(http_referer) }
|
|
460
566
|
it { should assign_to(:room).with(room) }
|
|
@@ -464,8 +570,8 @@ describe Bigbluebutton::RoomsController do
|
|
|
464
570
|
it { should set_the_flash.to(I18n.t('bigbluebutton_rails.rooms.errors.join.failure')) }
|
|
465
571
|
end
|
|
466
572
|
|
|
467
|
-
context "when the
|
|
468
|
-
let(:user_hash) { { :name => "Elftor", :
|
|
573
|
+
context "when the key is wrong" do
|
|
574
|
+
let(:user_hash) { { :name => "Elftor", :key => nil } }
|
|
469
575
|
it { should respond_with(:redirect) }
|
|
470
576
|
it { should redirect_to(http_referer) }
|
|
471
577
|
it { should assign_to(:user_role).with(nil) }
|
|
@@ -479,7 +585,7 @@ describe Bigbluebutton::RoomsController do
|
|
|
479
585
|
end
|
|
480
586
|
|
|
481
587
|
context "before filter #join_check_can_create" do
|
|
482
|
-
let(:user_hash) { { :
|
|
588
|
+
let(:user_hash) { { :key => room.moderator_key, :name => "Elftor" } }
|
|
483
589
|
before {
|
|
484
590
|
controller.stub(:bigbluebutton_user).and_return(nil)
|
|
485
591
|
controller.should_receive(:bigbluebutton_role).once { :moderator }
|
|
@@ -507,9 +613,8 @@ describe Bigbluebutton::RoomsController do
|
|
|
507
613
|
context "in a mobile device with no flags set" do
|
|
508
614
|
before {
|
|
509
615
|
controller.stub(:bigbluebutton_role) { :moderator }
|
|
510
|
-
browser
|
|
511
|
-
|
|
512
|
-
controller.stub(:browser).and_return(browser)
|
|
616
|
+
controller.stub(:browser).and_return('my-browser')
|
|
617
|
+
BigbluebuttonRails.should_receive(:use_mobile_client?).with('my-browser').and_return(true)
|
|
513
618
|
}
|
|
514
619
|
|
|
515
620
|
context "with no parameters in the url" do
|
|
@@ -536,11 +641,8 @@ describe Bigbluebutton::RoomsController do
|
|
|
536
641
|
before {
|
|
537
642
|
controller.stub(:bigbluebutton_user) { user }
|
|
538
643
|
controller.stub(:bigbluebutton_role) { :moderator }
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
browser = double()
|
|
542
|
-
browser.should_receive(:mobile?).and_return(true)
|
|
543
|
-
controller.stub(:browser).and_return(browser)
|
|
644
|
+
controller.stub(:browser).and_return('my-browser')
|
|
645
|
+
BigbluebuttonRails.should_receive(:use_mobile_client?).with('my-browser').and_return(true)
|
|
544
646
|
|
|
545
647
|
# here's the real verification
|
|
546
648
|
controller.should_receive(:join_internal).with(user.name, :moderator, user.id)
|
|
@@ -552,11 +654,8 @@ describe Bigbluebutton::RoomsController do
|
|
|
552
654
|
before {
|
|
553
655
|
controller.stub(:bigbluebutton_user) { user }
|
|
554
656
|
controller.stub(:bigbluebutton_role) { :moderator }
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
browser = double()
|
|
558
|
-
browser.should_receive(:mobile?).and_return(true)
|
|
559
|
-
controller.stub(:browser).and_return(browser)
|
|
657
|
+
controller.stub(:browser).and_return('my-browser')
|
|
658
|
+
BigbluebuttonRails.should_receive(:use_mobile_client?).with('my-browser').and_return(true)
|
|
560
659
|
|
|
561
660
|
# here's the real verification
|
|
562
661
|
controller.should_receive(:join_internal).with(user.name, :moderator, user.id)
|
|
@@ -593,7 +692,7 @@ describe Bigbluebutton::RoomsController do
|
|
|
593
692
|
context "room is running" do
|
|
594
693
|
before {
|
|
595
694
|
mocked_api.should_receive(:is_meeting_running?).and_return(true)
|
|
596
|
-
mocked_api.should_receive(:end_meeting).with(room.meetingid, room.
|
|
695
|
+
mocked_api.should_receive(:end_meeting).with(room.meetingid, room.moderator_api_password)
|
|
597
696
|
}
|
|
598
697
|
before(:each) { get :end, :id => room.to_param }
|
|
599
698
|
it { should respond_with(:redirect) }
|
|
@@ -606,7 +705,7 @@ describe Bigbluebutton::RoomsController do
|
|
|
606
705
|
context "with :redir_url" do
|
|
607
706
|
before {
|
|
608
707
|
mocked_api.should_receive(:is_meeting_running?).and_return(true)
|
|
609
|
-
mocked_api.should_receive(:end_meeting).with(room.meetingid, room.
|
|
708
|
+
mocked_api.should_receive(:end_meeting).with(room.meetingid, room.moderator_api_password)
|
|
610
709
|
}
|
|
611
710
|
before(:each) { get :end, :id => room.to_param, :redir_url => '/any' }
|
|
612
711
|
it { should respond_with(:redirect) }
|
|
@@ -631,6 +730,16 @@ describe Bigbluebutton::RoomsController do
|
|
|
631
730
|
it { should respond_with(:redirect) }
|
|
632
731
|
it { should set_the_flash.to(bbb_error_msg[0..200]) }
|
|
633
732
|
end
|
|
733
|
+
|
|
734
|
+
context "doesn't override @room" do
|
|
735
|
+
let!(:other_room) { FactoryGirl.create(:bigbluebutton_room) }
|
|
736
|
+
before {
|
|
737
|
+
controller.instance_variable_set(:@room, other_room)
|
|
738
|
+
other_room.stub(:fetch_is_running?).and_return(true)
|
|
739
|
+
}
|
|
740
|
+
before(:each) { get :end, :id => room.to_param }
|
|
741
|
+
it { should assign_to(:room).with(other_room) }
|
|
742
|
+
end
|
|
634
743
|
end
|
|
635
744
|
|
|
636
745
|
describe "#invite" do
|
|
@@ -648,13 +757,13 @@ describe Bigbluebutton::RoomsController do
|
|
|
648
757
|
end
|
|
649
758
|
|
|
650
759
|
context "when the user's role" do
|
|
651
|
-
context "should be defined with a
|
|
652
|
-
before { controller.stub(:bigbluebutton_role) { :
|
|
760
|
+
context "should be defined with a key" do
|
|
761
|
+
before { controller.stub(:bigbluebutton_role) { :key } }
|
|
653
762
|
before(:each) { get :invite, :id => room.to_param }
|
|
654
763
|
it { should respond_with(:success) }
|
|
655
764
|
it { should render_template(:invite) }
|
|
656
765
|
it { should assign_to(:room).with(room) }
|
|
657
|
-
it { should assign_to(:user_role).with(:
|
|
766
|
+
it { should assign_to(:user_role).with(:key) }
|
|
658
767
|
end
|
|
659
768
|
|
|
660
769
|
context "is undefined, the access should be blocked" do
|
|
@@ -666,12 +775,18 @@ describe Bigbluebutton::RoomsController do
|
|
|
666
775
|
}
|
|
667
776
|
end
|
|
668
777
|
end
|
|
778
|
+
|
|
779
|
+
context "doesn't override @room" do
|
|
780
|
+
let!(:other_room) { FactoryGirl.create(:bigbluebutton_room) }
|
|
781
|
+
before { controller.instance_variable_set(:@room, other_room) }
|
|
782
|
+
before(:each) { get :invite, :id => room.to_param }
|
|
783
|
+
it { should assign_to(:room).with(other_room) }
|
|
784
|
+
end
|
|
669
785
|
end
|
|
670
786
|
|
|
671
787
|
describe "#fetch_recordings" do
|
|
672
788
|
# setup basic server and API mocks
|
|
673
789
|
before do
|
|
674
|
-
#controller.should_receive(:set_request_headers)
|
|
675
790
|
mock_server_and_api
|
|
676
791
|
end
|
|
677
792
|
let(:filter) {
|
|
@@ -729,6 +844,15 @@ describe Bigbluebutton::RoomsController do
|
|
|
729
844
|
end
|
|
730
845
|
end
|
|
731
846
|
|
|
847
|
+
context "doesn't override @room" do
|
|
848
|
+
let!(:other_room) { FactoryGirl.create(:bigbluebutton_room) }
|
|
849
|
+
before {
|
|
850
|
+
controller.instance_variable_set(:@room, other_room)
|
|
851
|
+
other_room.server = nil
|
|
852
|
+
}
|
|
853
|
+
before(:each) { post :fetch_recordings, :id => room.to_param }
|
|
854
|
+
it { should assign_to(:room).with(other_room) }
|
|
855
|
+
end
|
|
732
856
|
end
|
|
733
857
|
|
|
734
858
|
describe "#recordings" do
|
|
@@ -747,6 +871,51 @@ describe Bigbluebutton::RoomsController do
|
|
|
747
871
|
it { should assign_to(:recordings).with([@recording1, @recording2]) }
|
|
748
872
|
end
|
|
749
873
|
|
|
874
|
+
describe "#generate_dial_number" do
|
|
875
|
+
let(:http_referer) { bigbluebutton_room_path(room) }
|
|
876
|
+
before {
|
|
877
|
+
request.env["HTTP_REFERER"] = http_referer
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
context "on success" do
|
|
881
|
+
before(:each) {
|
|
882
|
+
BigbluebuttonRoom.any_instance.stub(:generate_dial_number!).and_return(true)
|
|
883
|
+
post :generate_dial_number, id: room.to_param
|
|
884
|
+
}
|
|
885
|
+
it { should respond_with(:redirect) }
|
|
886
|
+
it { should redirect_to(http_referer) }
|
|
887
|
+
it { should set_the_flash.to(I18n.t('bigbluebutton_rails.rooms.notice.generate_dial_number.success')) }
|
|
888
|
+
end
|
|
889
|
+
|
|
890
|
+
context "on error" do
|
|
891
|
+
before(:each) {
|
|
892
|
+
BigbluebuttonRoom.any_instance.stub(:generate_dial_number!).and_return(nil)
|
|
893
|
+
post :generate_dial_number, id: room.to_param
|
|
894
|
+
}
|
|
895
|
+
it { should respond_with(:redirect) }
|
|
896
|
+
it { should redirect_to(http_referer) }
|
|
897
|
+
it { should set_the_flash.to(I18n.t('bigbluebutton_rails.rooms.errors.generate_dial_number.not_unique')) }
|
|
898
|
+
end
|
|
899
|
+
|
|
900
|
+
context "uses params[:pattern]" do
|
|
901
|
+
before(:each) {
|
|
902
|
+
BigbluebuttonRoom.any_instance.stub(:generate_dial_number!).with("xxx-xxx").and_return(true)
|
|
903
|
+
post :generate_dial_number, id: room.to_param, pattern: "xxx-xxx"
|
|
904
|
+
}
|
|
905
|
+
it { should respond_with(:redirect) }
|
|
906
|
+
it { should redirect_to(http_referer) }
|
|
907
|
+
end
|
|
908
|
+
|
|
909
|
+
context "doesn't use params[:pattern] if it's blank" do
|
|
910
|
+
before(:each) {
|
|
911
|
+
BigbluebuttonRoom.any_instance.stub(:generate_dial_number!).with(nil).and_return(true)
|
|
912
|
+
post :generate_dial_number, id: room.to_param, pattern: ""
|
|
913
|
+
}
|
|
914
|
+
it { should respond_with(:redirect) }
|
|
915
|
+
it { should redirect_to(http_referer) }
|
|
916
|
+
end
|
|
917
|
+
end
|
|
918
|
+
|
|
750
919
|
describe "before filter :set_request_headers" do
|
|
751
920
|
let(:headers) { {"x-forwarded-for" => "0.0.0.0"} }
|
|
752
921
|
let(:make_request) { }
|
|
@@ -771,6 +940,26 @@ describe Bigbluebutton::RoomsController do
|
|
|
771
940
|
room.request_headers.should == headers
|
|
772
941
|
}
|
|
773
942
|
end
|
|
943
|
+
|
|
944
|
+
context "doesn't override @room" do
|
|
945
|
+
let!(:other_room) { FactoryGirl.create(:bigbluebutton_room) }
|
|
946
|
+
before { controller.instance_variable_set(:@room, other_room) }
|
|
947
|
+
before(:each) { get :recordings, :id => room.to_param }
|
|
948
|
+
it { should assign_to(:room).with(other_room) }
|
|
949
|
+
end
|
|
950
|
+
|
|
951
|
+
context "doesn't override @recordings" do
|
|
952
|
+
let!(:my_recordings) {
|
|
953
|
+
[ FactoryGirl.create(:bigbluebutton_recording, room: room),
|
|
954
|
+
FactoryGirl.create(:bigbluebutton_recording, room: room) ]
|
|
955
|
+
}
|
|
956
|
+
before {
|
|
957
|
+
3.times { FactoryGirl.create(:bigbluebutton_recording, room: room) }
|
|
958
|
+
controller.instance_variable_set(:@recordings, my_recordings)
|
|
959
|
+
}
|
|
960
|
+
before(:each) { get :recordings, :id => room.to_param }
|
|
961
|
+
it { should assign_to(:recordings).with(my_recordings) }
|
|
962
|
+
end
|
|
774
963
|
end
|
|
775
964
|
|
|
776
965
|
# Test #join_internal using #join because it's easier and cleaner than the other
|
|
@@ -796,11 +985,11 @@ describe Bigbluebutton::RoomsController do
|
|
|
796
985
|
room.should_receive(:create_meeting)
|
|
797
986
|
.with(user, controller.request, { custom: true })
|
|
798
987
|
room.should_receive(:fetch_new_token).and_return(nil)
|
|
799
|
-
room.should_receive(:join_url).and_return("http://test.com/join/url")
|
|
988
|
+
room.should_receive(:join_url).and_return("http://test.com/join/url/")
|
|
800
989
|
}
|
|
801
990
|
before(:each) { get :join, :id => room.to_param }
|
|
802
991
|
it { should respond_with(:redirect) }
|
|
803
|
-
it { should redirect_to("http://test.com/join/url") }
|
|
992
|
+
it { should redirect_to("http://test.com/join/url/") }
|
|
804
993
|
end
|
|
805
994
|
|
|
806
995
|
context "when the user doesn't have permission to create the meeting" do
|
|
@@ -856,7 +1045,7 @@ describe Bigbluebutton::RoomsController do
|
|
|
856
1045
|
room.should_receive(:fetch_new_token).and_return('fake-token')
|
|
857
1046
|
room.should_receive(:join_url)
|
|
858
1047
|
.with(user.name, :attendee, nil, hash_including(:configToken => 'fake-token'))
|
|
859
|
-
.and_return("http://test.com/join/url")
|
|
1048
|
+
.and_return("http://test.com/join/url/")
|
|
860
1049
|
}
|
|
861
1050
|
it("uses the token") { get :join, :id => room.to_param }
|
|
862
1051
|
end
|
|
@@ -865,13 +1054,87 @@ describe Bigbluebutton::RoomsController do
|
|
|
865
1054
|
before(:each) {
|
|
866
1055
|
room.should_receive(:fetch_new_token).and_return(nil)
|
|
867
1056
|
room.should_receive(:join_url)
|
|
868
|
-
.with(user.name, :attendee, nil,
|
|
869
|
-
.and_return("http://test.com/join/url")
|
|
1057
|
+
.with(user.name, :attendee, nil, hash_not_including(:configToken))
|
|
1058
|
+
.and_return("http://test.com/join/url/")
|
|
870
1059
|
}
|
|
871
1060
|
it("does not use the token") { get :join, :id => room.to_param }
|
|
872
1061
|
end
|
|
873
1062
|
end
|
|
874
1063
|
|
|
1064
|
+
context "pass createTime parameter to join_url" do
|
|
1065
|
+
let(:time) { DateTime.now }
|
|
1066
|
+
before {
|
|
1067
|
+
room.should_receive(:fetch_is_running?).at_least(:once).and_return(true)
|
|
1068
|
+
room.should_not_receive(:create_meeting)
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
context "if the createTime is not blank" do
|
|
1072
|
+
before(:each) {
|
|
1073
|
+
room.stub(:create_time).and_return(time)
|
|
1074
|
+
room.should_receive(:fetch_new_token).and_return(anything)
|
|
1075
|
+
room.should_receive(:join_url)
|
|
1076
|
+
.with(user.name, :attendee, nil, hash_including(:createTime => time))
|
|
1077
|
+
}
|
|
1078
|
+
it ("uses the createTime") { get :join, :id => room.to_param }
|
|
1079
|
+
end
|
|
1080
|
+
|
|
1081
|
+
context "if the createTime is blank" do
|
|
1082
|
+
before(:each) {
|
|
1083
|
+
room.stub(:create_time).and_return("")
|
|
1084
|
+
room.should_receive(:fetch_new_token).and_return(anything)
|
|
1085
|
+
room.should_receive(:join_url)
|
|
1086
|
+
.with(user.name, :attendee, nil, hash_not_including(:createTime))
|
|
1087
|
+
}
|
|
1088
|
+
it ("does not use the createTime") { get :join, :id => room.to_param }
|
|
1089
|
+
end
|
|
1090
|
+
|
|
1091
|
+
context "if the createTime is nil" do
|
|
1092
|
+
before(:each) {
|
|
1093
|
+
room.stub(:create_time).and_return(nil)
|
|
1094
|
+
room.should_receive(:fetch_new_token).and_return(anything)
|
|
1095
|
+
room.should_receive(:join_url)
|
|
1096
|
+
.with(user.name, :attendee, nil, hash_not_including(:createTime))
|
|
1097
|
+
}
|
|
1098
|
+
it ("does not use the createTime") { get :join, :id => room.to_param }
|
|
1099
|
+
end
|
|
1100
|
+
end
|
|
1101
|
+
|
|
1102
|
+
context "pass userID to join url" do
|
|
1103
|
+
before {
|
|
1104
|
+
room.should_receive(:fetch_is_running?).at_least(:once).and_return(true)
|
|
1105
|
+
room.should_not_receive(:create_meeting)
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
context "userID is nil" do
|
|
1109
|
+
before(:each) {
|
|
1110
|
+
user.id = nil
|
|
1111
|
+
room.should_receive(:fetch_new_token).and_return(anything)
|
|
1112
|
+
room.should_receive(:join_url)
|
|
1113
|
+
.with(user.name, :attendee, nil, hash_not_including(:userID))
|
|
1114
|
+
}
|
|
1115
|
+
it("does not use the userID") { get :join, :id => room.to_param }
|
|
1116
|
+
end
|
|
1117
|
+
|
|
1118
|
+
context "userID is blank" do
|
|
1119
|
+
before(:each) {
|
|
1120
|
+
user.id = ""
|
|
1121
|
+
room.should_receive(:fetch_new_token).and_return(anything)
|
|
1122
|
+
room.should_receive(:join_url)
|
|
1123
|
+
.with(user.name, :attendee, nil, hash_not_including(:userID))
|
|
1124
|
+
}
|
|
1125
|
+
it("does not use the userID") { get :join, :id => room.to_param }
|
|
1126
|
+
end
|
|
1127
|
+
|
|
1128
|
+
context "userID is not blank" do
|
|
1129
|
+
before(:each) {
|
|
1130
|
+
room.should_receive(:fetch_new_token).and_return(anything)
|
|
1131
|
+
room.should_receive(:join_url)
|
|
1132
|
+
.with(user.name, :attendee, nil, hash_including(:userID => user.id))
|
|
1133
|
+
}
|
|
1134
|
+
it("uses the userID") { get :join, :id => room.to_param }
|
|
1135
|
+
end
|
|
1136
|
+
end
|
|
1137
|
+
|
|
875
1138
|
context "when the user doesn't have permission to join the meeting" do
|
|
876
1139
|
before {
|
|
877
1140
|
room.should_receive(:fetch_is_running?).at_least(:once).and_return(true)
|
|
@@ -892,9 +1155,7 @@ describe Bigbluebutton::RoomsController do
|
|
|
892
1155
|
room.should_receive(:fetch_is_running?).at_least(:once).and_return(true)
|
|
893
1156
|
room.should_not_receive(:create_meeting)
|
|
894
1157
|
room.should_receive(:fetch_new_token).and_return(nil)
|
|
895
|
-
|
|
896
|
-
browser.should_receive(:mobile?).twice.and_return(true)
|
|
897
|
-
controller.stub(:browser).and_return(browser)
|
|
1158
|
+
BigbluebuttonRails.stub(:use_mobile_client?).and_return(true)
|
|
898
1159
|
}
|
|
899
1160
|
|
|
900
1161
|
context "and the url uses 'http'" do
|