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
@@ -1,14 +1,15 @@
1
1
  class Bigbluebutton::ServersController < ApplicationController
2
2
 
3
3
  respond_to :html
4
- respond_to :json, :only => [:index, :show, :new, :create, :update, :destroy]
4
+ respond_to :json, :only => [:index, :show, :new, :create, :update, :destroy, :activity]
5
+ before_filter :find_server, :only => [:show, :edit, :activity, :update, :destroy]
5
6
 
6
7
  def index
7
8
  respond_with(@servers = BigbluebuttonServer.all)
8
9
  end
9
10
 
10
11
  def show
11
- respond_with(@server = BigbluebuttonServer.find_by_param(params[:id]))
12
+ respond_with(@server)
12
13
  end
13
14
 
14
15
  def new
@@ -16,31 +17,43 @@ class Bigbluebutton::ServersController < ApplicationController
16
17
  end
17
18
 
18
19
  def edit
19
- respond_with(@server = BigbluebuttonServer.find_by_param(params[:id]))
20
+ respond_with(@server)
20
21
  end
21
22
 
22
23
  def activity
23
- @server = BigbluebuttonServer.find_by_param(params[:id])
24
- # @new_meetings = @server.rooms
25
- @server.fetch_meetings
26
- # @new_meetings = @server.meetings.reject{ |r|
27
- # i = @new_meetings.index(r)
28
- # i.nil? ? false : r.attr_equal?(@new_meetings[i])
29
- #}
30
- @server.meetings.each do |meeting|
31
- meeting.fetch_meeting_info
24
+ error = false
25
+ begin
26
+ @server.fetch_meetings
27
+ @server.meetings.each do |meeting|
28
+ meeting.fetch_meeting_info
29
+ end
30
+ rescue BigBlueButton::BigBlueButtonException => e
31
+ error = true
32
+ message = e.to_s
32
33
  end
33
34
 
34
- # TODO catch exceptions
35
-
36
- if params[:update_list]
37
- render :partial => 'activity_list'
35
+ # update_list works only for html
36
+ if params[:update_list] && (params[:format].nil? || params[:format].to_s == "html")
37
+ render :html => 'activity_list', :server => @server
38
38
  return
39
39
  end
40
40
 
41
- # TODO json response
42
-
43
- respond_with(@server)
41
+ respond_with @server.meetings do |format|
42
+ # we return/render the fetched meetings even in case of error
43
+ # but we set the error message in the response
44
+ if error
45
+ flash[:error] = message
46
+ format.html { render :activity }
47
+ format.json {
48
+ array = @server.meetings
49
+ array.insert(0, { :message => message })
50
+ render :json => array, :status => :error
51
+ }
52
+ else
53
+ format.html
54
+ format.json
55
+ end
56
+ end
44
57
  end
45
58
 
46
59
  def create
@@ -54,15 +67,13 @@ class Bigbluebutton::ServersController < ApplicationController
54
67
  }
55
68
  format.json { render :json => @server, :status => :created }
56
69
  else
57
- format.html { render :action => "new" }
70
+ format.html { render :new }
58
71
  format.json { render :json => @server.errors.full_messages, :status => :unprocessable_entity }
59
72
  end
60
73
  end
61
74
  end
62
75
 
63
76
  def update
64
- @server = BigbluebuttonServer.find_by_param(params[:id])
65
-
66
77
  respond_with @server do |format|
67
78
  if @server.update_attributes(params[:bigbluebutton_server])
68
79
  format.html {
@@ -71,14 +82,13 @@ class Bigbluebutton::ServersController < ApplicationController
71
82
  }
72
83
  format.json { head :ok }
73
84
  else
74
- format.html { render :action => "edit" }
85
+ format.html { render :edit }
75
86
  format.json { render :json => @server.errors.full_messages, :status => :unprocessable_entity }
76
87
  end
77
88
  end
78
89
  end
79
90
 
80
91
  def destroy
81
- @server = BigbluebuttonServer.find_by_param(params[:id])
82
92
  @server.destroy
83
93
 
84
94
  respond_with do |format|
@@ -86,4 +96,11 @@ class Bigbluebutton::ServersController < ApplicationController
86
96
  format.json { head :ok }
87
97
  end
88
98
  end
99
+
100
+ protected
101
+
102
+ def find_server
103
+ @server = BigbluebuttonServer.find_by_param(params[:id])
104
+ end
105
+
89
106
  end
@@ -131,7 +131,7 @@ class BigbluebuttonRoom < ActiveRecord::Base
131
131
  unless response.nil?
132
132
  self.attendee_password = response[:attendeePW]
133
133
  self.moderator_password = response[:moderatorPW]
134
- self.save
134
+ self.save unless self.new_record?
135
135
  end
136
136
 
137
137
  response
@@ -140,13 +140,17 @@ class BigbluebuttonRoom < ActiveRecord::Base
140
140
  # Returns the URL to join this room.
141
141
  # username:: Name of the user
142
142
  # role:: Role of the user in this room. Can be <tt>[:moderator, :attendee]</tt>
143
+ # password:: Password to be use (in case role == nil)
143
144
  #
144
145
  # Uses the API but does not require a request to the server.
145
- def join_url(username, role)
146
- if role == :moderator
146
+ def join_url(username, role, password=nil)
147
+ case role
148
+ when :moderator
147
149
  self.server.api.join_meeting_url(self.meetingid, username, self.moderator_password)
148
- else
150
+ when :attendee
149
151
  self.server.api.join_meeting_url(self.meetingid, username, self.attendee_password)
152
+ else
153
+ self.server.api.join_meeting_url(self.meetingid, username, password)
150
154
  end
151
155
  end
152
156
 
@@ -191,6 +195,42 @@ class BigbluebuttonRoom < ActiveRecord::Base
191
195
  self.param
192
196
  end
193
197
 
198
+ # The join logic
199
+ # A moderator can create the meeting and join
200
+ # An attendee can only join if the meeting is running
201
+ def perform_join(username, role, request=nil)
202
+ fetch_is_running?
203
+
204
+ # if the current user is a moderator, create the room (if needed)
205
+ # and join it
206
+ if role == :moderator
207
+ add_domain_to_logout_url(request.protocol, request.host) unless request.nil?
208
+ send_create unless is_running?
209
+ ret = join_url(username, role)
210
+
211
+ # normal user only joins if the conference is running
212
+ # if it's not, wait for a moderator to create the conference
213
+ else
214
+ ret = join_url(username, role) if is_running?
215
+ end
216
+
217
+ ret
218
+ end
219
+
220
+ # add a domain name and/or protocol to the logout_url if needed
221
+ def add_domain_to_logout_url(protocol, host)
222
+ unless logout_url.nil?
223
+ url = logout_url.downcase
224
+ unless url.nil? or url =~ /^[a-z]+:\/\// # matches the protocol
225
+ unless url =~ /^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*/ # matches the host domain
226
+ url = host + url
227
+ end
228
+ url = protocol + url
229
+ end
230
+ update_attributes(:logout_url => url.downcase)
231
+ end
232
+ end
233
+
194
234
  protected
195
235
 
196
236
  def init
@@ -219,7 +259,7 @@ class BigbluebuttonRoom < ActiveRecord::Base
219
259
 
220
260
  def random_voice_bridge
221
261
  value = (70000 + ActiveSupport::SecureRandom.random_number(9999)).to_s
222
- count = 0
262
+ count = 1
223
263
  while not BigbluebuttonRoom.find_by_voice_bridge(value).nil? and count < 10
224
264
  count += 1
225
265
  value = (70000 + ActiveSupport::SecureRandom.random_number(9999)).to_s
@@ -1,4 +1,4 @@
1
- require 'bigbluebutton-api'
1
+ require 'bigbluebutton_api'
2
2
 
3
3
  class BigbluebuttonServer < ActiveRecord::Base
4
4
  has_many :rooms,
@@ -65,18 +65,16 @@ class BigbluebuttonServer < ActiveRecord::Base
65
65
  response[:meetings].each do |attr|
66
66
  room = BigbluebuttonRoom.find_by_server_id_and_meetingid(self.id, attr[:meetingID])
67
67
  if room.nil?
68
- room = BigbluebuttonRoom.create(:server => self, :meetingid => attr[:meetingID],
69
- :name => attr[:meetingID], :attendee_password => attr[:attendeePW],
70
- :moderator_password => attr[:moderatorPW], :external => true,
71
- :randomize_meetingid => false)
68
+ room = BigbluebuttonRoom.new(:server => self, :meetingid => attr[:meetingID],
69
+ :name => attr[:meetingID], :attendee_password => attr[:attendeePW],
70
+ :moderator_password => attr[:moderatorPW], :external => true,
71
+ :randomize_meetingid => false, :private => true)
72
72
  else
73
73
  room.update_attributes(:attendee_password => attr[:attendeePW],
74
74
  :moderator_password => attr[:moderatorPW])
75
75
  end
76
76
  room.running = attr[:running]
77
77
 
78
- # TODO What if the update/save above fails?
79
-
80
78
  @meetings << room
81
79
  end
82
80
  end
@@ -0,0 +1,24 @@
1
+ <h1>Join the meeting <%= @room.name %></h1>
2
+
3
+ <p id="error"><%= flash[:error] %></p>
4
+
5
+ <p>This meeting was created from another application.<br/>You must provide a name and a password to join:</p>
6
+
7
+ <%= form_tag external_bigbluebutton_server_rooms_path(@server) do %>
8
+ <%= hidden_field_tag "meeting", params[:meeting] %>
9
+
10
+ <div class="field">
11
+ Name:<br />
12
+ <% if bigbluebutton_user.nil? %>
13
+ <%= text_field_tag "user[name]", "" %>
14
+ <% else %>
15
+ <%= text_field_tag "user[name]", bigbluebutton_user.name %>
16
+ <% end %>
17
+ </div>
18
+ <div class="field">
19
+ Password:<br />
20
+ <%= password_field_tag "user[password]", "" %>
21
+ </div>
22
+
23
+ <%= submit_tag "Submit" %>
24
+ <% end %>
@@ -3,7 +3,7 @@
3
3
  <div style="text-align:center; width:250px;">
4
4
  <a href="<%= @join_url %>"><b>Click here</b><br/>to join from a mobile device</a><br><br/>
5
5
  <span>Or scan the code below:</span><br/>
6
- <img src="<%= qrcode_url(@join_url) %>" style="float:left; border:1px solid #ccc;"/>
6
+ <img src="<%= qrcode_url(@qrcode_url) %>" style="float:left; border:1px solid #ccc;"/>
7
7
  </div>
8
8
 
9
9
 
@@ -1,16 +1,16 @@
1
- <% @server.meetings.each do |room| %>
1
+ <% server.meetings.each do |room| %>
2
2
  <div class="bbbrails_meeting_description">
3
3
  <div class="title_bar">
4
4
  <% unless room.new_record? %>
5
5
  <div class="button_bar">
6
- <%= link_to 'Show', bigbluebutton_server_room_path(@server, room) %>
7
- <%= link_to 'Edit', edit_bigbluebutton_server_room_path(@server, room) %>
8
- <%= link_to 'Destroy', bigbluebutton_server_room_path(@server, room), :confirm => 'Are you sure?', :method => :delete %>
6
+ <%= link_to 'Show', bigbluebutton_server_room_path(server, room) %>
7
+ <%= link_to 'Edit', edit_bigbluebutton_server_room_path(server, room) %>
8
+ <%= link_to 'Destroy', bigbluebutton_server_room_path(server, room), :confirm => 'Are you sure?', :method => :delete %>
9
9
  </div>
10
10
  <div class="button_bar">
11
- <%= link_to 'Join', join_bigbluebutton_server_room_path(@server, room) %>
12
- <%= link_to 'Mobile Join', join_mobile_bigbluebutton_server_room_path(@server, room) %>
13
- <%= link_to 'End', end_bigbluebutton_server_room_path(@server, room), :confirm => 'Are you sure?' %>
11
+ <%= link_to 'Join', join_bigbluebutton_server_room_path(server, room) %>
12
+ <%= link_to 'Mobile Join', join_mobile_bigbluebutton_server_room_path(server, room) %>
13
+ <%= link_to 'End', end_bigbluebutton_server_room_path(server, room), :confirm => 'Are you sure?' %>
14
14
  </div>
15
15
  <% end %>
16
16
  <b><%= room.name %></b> (ID: <%= room.meetingid %>) -
@@ -47,5 +47,5 @@
47
47
  <h1>Server activity monitor:</h1>
48
48
 
49
49
  <div id="bbbrails_server_activity_meetings">
50
- <%= render :partial => 'activity_list' %>
50
+ <%= render 'activity_list', :server => @server %>
51
51
  </div>
@@ -15,16 +15,6 @@ Gem::Specification.new do |s|
15
15
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
16
  s.require_paths = ["lib"]
17
17
 
18
- s.add_runtime_dependency("rails", ">= 3.0.3")
19
- s.add_runtime_dependency("bigbluebutton-api-ruby", "~> 0.0.10")
20
-
21
- s.add_development_dependency("rspec-rails", "~> 2.6.0")
22
- s.add_development_dependency("factory_girl", "~> 1.3.2")
23
- s.add_development_dependency("sqlite3-ruby", "~> 1.3.3")
24
- s.add_development_dependency("generator_spec", "~> 0.8.2")
25
- s.add_development_dependency("shoulda-matchers", "~> 1.0.0.beta")
26
- s.add_development_dependency("forgery", "~> 0.3.7")
27
- s.add_development_dependency("cucumber-rails", "~> 0.5.2")
28
- s.add_development_dependency("database_cleaner", "~> 0.6.7")
29
- s.add_development_dependency("rdoc", "~> 3.6.0")
18
+ s.add_dependency("rails", ">= 3.0.3")
19
+ s.add_dependency("bigbluebutton-api-ruby", "~> 0.0.11")
30
20
  end
@@ -27,6 +27,9 @@ en:
27
27
  auth:
28
28
  failure: "Authentication failure."
29
29
  not_running: "The meeting is not running. You must wait for a moderator to join."
30
+ wrong_params: "Wrong params in your request."
31
+ external:
32
+ blank_meetingid: "You must specify the meetingid of the meeting you want to join"
30
33
  param_format: 'you can only use letters, numbers and the symbols "-" or "_" (not at the begin or end)'
31
34
 
32
35
  activerecord:
@@ -83,12 +83,18 @@ module ActionDispatch::Routing
83
83
  resources :servers, :controller => BigbluebuttonRails.controllers[:servers] do
84
84
  get :activity, :on => :member
85
85
  resources :rooms, :controller => BigbluebuttonRails.controllers[:rooms] do
86
- get :join, :on => :member
87
- get :running, :on => :member
88
- get :end, :on => :member
89
- get :invite, :on => :member
90
- get :join_mobile, :on => :member
91
- post :join, :on => :member, :action => :auth
86
+ collection do
87
+ get :external
88
+ post :external, :action => :external_auth
89
+ end
90
+ member do
91
+ get :join
92
+ get :running
93
+ get :end
94
+ get :invite
95
+ get :join_mobile
96
+ post :join, :action => :auth
97
+ end
92
98
  end
93
99
  end
94
100
  end
@@ -0,0 +1,8 @@
1
+ module BigbluebuttonRails
2
+
3
+ # just a wrapper around the Rails method to convert values to boolean
4
+ def self.value_to_boolean(value)
5
+ ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value)
6
+ end
7
+
8
+ end
@@ -1,3 +1,3 @@
1
1
  module BigbluebuttonRails
2
- VERSION = "0.0.5".freeze
2
+ VERSION = "0.0.6".freeze
3
3
  end
@@ -4,6 +4,7 @@ require 'classes/bigbluebutton_attendee'
4
4
 
5
5
  module BigbluebuttonRails
6
6
  require 'bigbluebutton_rails/rails'
7
+ require 'bigbluebutton_rails/utils'
7
8
  require 'bigbluebutton_rails/controller_methods'
8
9
  require 'bigbluebutton_rails/rails/routes'
9
10
  require 'bigbluebutton_rails/exceptions'
@@ -8,4 +8,17 @@ describe BigbluebuttonRails do
8
8
  it "should have an engine" do
9
9
  BigbluebuttonRails::Engine.new.should be_a_kind_of(Rails::Engine)
10
10
  end
11
+
12
+ describe "#value_to_boolean" do
13
+ it { BigbluebuttonRails::value_to_boolean("true").should be_true }
14
+ it { BigbluebuttonRails::value_to_boolean("1").should be_true }
15
+ it { BigbluebuttonRails::value_to_boolean(1).should be_true }
16
+ it { BigbluebuttonRails::value_to_boolean(true).should be_true }
17
+ it { BigbluebuttonRails::value_to_boolean("t").should be_true }
18
+ it { BigbluebuttonRails::value_to_boolean("false").should be_false }
19
+ it { BigbluebuttonRails::value_to_boolean("0").should be_false }
20
+ it { BigbluebuttonRails::value_to_boolean(0).should be_false }
21
+ it { BigbluebuttonRails::value_to_boolean(false).should be_false }
22
+ it { BigbluebuttonRails::value_to_boolean("f").should be_false }
23
+ end
11
24
  end
@@ -0,0 +1,114 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bigbluebutton::RoomsController do
4
+ render_views
5
+ let(:server) { Factory.create(:bigbluebutton_server) }
6
+ let(:room) { Factory.create(:bigbluebutton_room, :server => server) }
7
+
8
+ # make sure that the exceptions thrown by bigbluebutton-api-ruby are treated by the controller
9
+ context "exception handling" do
10
+ let(:bbb_error_msg) { "err msg" }
11
+ let(:bbb_error) { BigBlueButton::BigBlueButtonException.new(bbb_error_msg) }
12
+ let(:http_referer) { bigbluebutton_server_path(mocked_server) }
13
+ before {
14
+ mock_server_and_api
15
+ request.env["HTTP_REFERER"] = http_referer
16
+ }
17
+
18
+ describe "#destroy" do
19
+ it "catches exception on is_meeting_running" do
20
+ mocked_api.should_receive(:is_meeting_running?) { raise bbb_error }
21
+ end
22
+
23
+ it "catches exception on end_meeting" do
24
+ mocked_api.should_receive(:is_meeting_running?).and_return(true)
25
+ mocked_api.should_receive(:end_meeting) { raise bbb_error }
26
+ end
27
+
28
+ after :each do
29
+ delete :destroy, :server_id => mocked_server.to_param, :id => room.to_param
30
+ should respond_with(:redirect)
31
+ should redirect_to bigbluebutton_server_rooms_url
32
+ should set_the_flash.to(bbb_error_msg)
33
+ end
34
+ end
35
+
36
+ describe "#running" do
37
+ before { mocked_api.should_receive(:is_meeting_running?) { raise bbb_error } }
38
+ before(:each) { get :running, :server_id => mocked_server.to_param, :id => room.to_param }
39
+ it { should respond_with(:success) }
40
+ it { response.body.should == build_running_json(false, bbb_error_msg) }
41
+ it { should set_the_flash.to(bbb_error_msg) }
42
+ end
43
+
44
+ describe "#end" do
45
+ it "catches exception on is_meeting_running" do
46
+ mocked_api.should_receive(:is_meeting_running?) { raise bbb_error }
47
+ end
48
+
49
+ it "catches exception on end_meeting" do
50
+ mocked_api.should_receive(:is_meeting_running?).and_return(true)
51
+ mocked_api.should_receive(:end_meeting) { raise bbb_error }
52
+ end
53
+
54
+ after :each do
55
+ get :end, :server_id => mocked_server.to_param, :id => room.to_param
56
+ should respond_with(:redirect)
57
+ should redirect_to(http_referer)
58
+ should set_the_flash.to(bbb_error_msg)
59
+ end
60
+ end
61
+
62
+ describe "#join" do
63
+ before { controller.stub(:bigbluebutton_user) { Factory.build(:user) } }
64
+
65
+ context "as moderator" do
66
+ before { controller.should_receive(:bigbluebutton_role).with(room).and_return(:moderator) }
67
+
68
+ it "catches exception on is_meeting_running" do
69
+ mocked_api.should_receive(:is_meeting_running?) { raise bbb_error }
70
+ end
71
+
72
+ it "catches exception on create_meeting" do
73
+ mocked_api.should_receive(:is_meeting_running?).and_return(false)
74
+ mocked_api.should_receive(:create_meeting) { raise bbb_error }
75
+ end
76
+
77
+ it "catches exception on join_meeting_url" do
78
+ mocked_api.should_receive(:is_meeting_running?).and_return(true)
79
+ mocked_api.should_receive(:join_meeting_url) { raise bbb_error }
80
+ end
81
+
82
+ after :each do
83
+ get :join, :server_id => mocked_server.to_param, :id => room.to_param
84
+ should respond_with(:redirect)
85
+ should redirect_to(http_referer)
86
+ should set_the_flash.to(bbb_error_msg)
87
+ end
88
+
89
+ end
90
+
91
+ context "as moderator" do
92
+ before { controller.should_receive(:bigbluebutton_role).with(room).and_return(:attendee) }
93
+
94
+ it "catches exception on is_meeting_running" do
95
+ mocked_api.should_receive(:is_meeting_running?) { raise bbb_error }
96
+ end
97
+
98
+ it "catches exception on join_meeting_url" do
99
+ mocked_api.should_receive(:is_meeting_running?).and_return(true)
100
+ mocked_api.should_receive(:join_meeting_url) { raise bbb_error }
101
+ end
102
+
103
+ after :each do
104
+ get :join, :server_id => mocked_server.to_param, :id => room.to_param
105
+ should respond_with(:redirect)
106
+ should redirect_to(http_referer)
107
+ should set_the_flash.to(bbb_error_msg)
108
+ end
109
+ end
110
+
111
+ end # #join
112
+
113
+ end
114
+ end