bigbluebutton_rails 2.0.0 → 2.1.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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -0
  3. data/Gemfile.lock +5 -5
  4. data/app/controllers/bigbluebutton/rooms_controller.rb +0 -5
  5. data/app/controllers/bigbluebutton/servers_controller.rb +1 -1
  6. data/app/models/bigbluebutton_meeting.rb +2 -2
  7. data/app/models/bigbluebutton_recording.rb +16 -12
  8. data/app/models/bigbluebutton_room.rb +109 -42
  9. data/app/models/bigbluebutton_server.rb +10 -9
  10. data/app/views/bigbluebutton/servers/_form.html.erb +2 -2
  11. data/app/views/bigbluebutton/servers/index.html.erb +1 -1
  12. data/app/views/bigbluebutton/servers/show.html.erb +2 -2
  13. data/app/workers/bigbluebutton_meeting_updater.rb +7 -14
  14. data/bigbluebutton_rails.gemspec +1 -1
  15. data/config/locales/en.yml +1 -1
  16. data/config/locales/pt-br.yml +1 -1
  17. data/lib/bigbluebutton_rails.rb +17 -10
  18. data/lib/bigbluebutton_rails/background_tasks.rb +9 -5
  19. data/lib/bigbluebutton_rails/version.rb +1 -1
  20. data/lib/generators/bigbluebutton_rails/templates/migration.rb +6 -2
  21. data/lib/generators/bigbluebutton_rails/templates/migration_2_1_0.rb +21 -0
  22. data/spec/controllers/bigbluebutton/rooms_controller_spec.rb +1 -13
  23. data/spec/controllers/bigbluebutton/servers_controller_spec.rb +2 -2
  24. data/spec/factories/bigbluebutton_meeting.rb +2 -0
  25. data/spec/factories/bigbluebutton_metadata.rb +1 -1
  26. data/spec/factories/bigbluebutton_room.rb +1 -0
  27. data/spec/factories/bigbluebutton_server.rb +1 -1
  28. data/spec/lib/bigbluebutton_rails/background_tasks_spec.rb +106 -15
  29. data/spec/models/bigbluebutton_meeting_db_spec.rb +9 -4
  30. data/spec/models/bigbluebutton_meeting_spec.rb +2 -2
  31. data/spec/models/bigbluebutton_recording_spec.rb +19 -4
  32. data/spec/models/bigbluebutton_room_options_spec.rb +1 -1
  33. data/spec/models/bigbluebutton_room_spec.rb +396 -97
  34. data/spec/models/bigbluebutton_server_db_spec.rb +1 -1
  35. data/spec/models/bigbluebutton_server_spec.rb +38 -16
  36. data/spec/rails_app/db/seeds.rb +0 -1
  37. data/spec/rails_app/features/config.yml.example +2 -4
  38. data/spec/rails_app/features/step_definitions/activity_monitor_servers_step.rb +2 -4
  39. data/spec/rails_app/features/step_definitions/common_steps.rb +1 -2
  40. data/spec/rails_app/features/step_definitions/create_servers_steps.rb +2 -2
  41. data/spec/rails_app/features/step_definitions/destroy_servers_steps.rb +1 -2
  42. data/spec/rails_app/features/support/factories/bigbluebutton_server_integration.rb +1 -1
  43. data/spec/rails_app/features/support/templates.rb +5 -5
  44. data/spec/rails_app/lib/tasks/db/populate.rake +1 -1
  45. data/spec/workers/bigbluebutton_meeting_updater_spec.rb +86 -5
  46. metadata +5 -4
@@ -12,7 +12,7 @@
12
12
  <div><label><%= BigbluebuttonServer.human_attribute_name(:id) %></label> <%= server.id %></div>
13
13
  <div><label><%= BigbluebuttonServer.human_attribute_name(:name) %></label> <%= server.name %></div>
14
14
  <div><label><%= BigbluebuttonServer.human_attribute_name(:url) %></label> <%= server.url %></div>
15
- <div><label><%= BigbluebuttonServer.human_attribute_name(:salt) %></label> <%= server.salt %></div>
15
+ <div><label><%= BigbluebuttonServer.human_attribute_name(:secret) %></label> <%= server.secret %></div>
16
16
  <div><label><%= BigbluebuttonServer.human_attribute_name(:version) %></label> <%= server.version %></div>
17
17
  <div><label><%= BigbluebuttonServer.human_attribute_name(:param) %></label> <%= server.param %></div>
18
18
  <div><label>Access</label>
@@ -45,8 +45,8 @@
45
45
  </p>
46
46
 
47
47
  <p>
48
- <b><%= BigbluebuttonServer.human_attribute_name(:salt) %>:</b>
49
- <%= @server.salt %>
48
+ <b><%= BigbluebuttonServer.human_attribute_name(:secret) %>:</b>
49
+ <%= @server.secret %>
50
50
  </p>
51
51
 
52
52
  <p>
@@ -1,6 +1,6 @@
1
1
  # A resque worker to get information about a meeting with `getMeetingInfo` and update
2
- # the associated `BigbluebuttonMeeting` object. This should be triggered whenever a,
3
- # meeting is created, ended, or when a user joins.
2
+ # the associated `BigbluebuttonMeeting` object. This should be called to speed up the
3
+ # update of a meeting object (usually on creates and ends).
4
4
  class BigbluebuttonMeetingUpdater
5
5
  @queue = :bigbluebutton_rails
6
6
 
@@ -12,20 +12,13 @@ class BigbluebuttonMeetingUpdater
12
12
  if room.nil?
13
13
  Rails.logger.info "BigbluebuttonMeetingUpdater worker: room #{room_id} not found!"
14
14
  else
15
- begin
16
- room.fetch_meeting_info
17
- rescue BigBlueButton::BigBlueButtonException => e
18
- Rails.logger.info "BigbluebuttonMeetingUpdater worker: getMeetingInfo generated an error (usually means that the meeting doesn't exist): #{e}"
19
-
20
- # an error usually means that no meeting was found, so it is not running anymore
21
- room.finish_meetings
22
- else
23
- Rails.logger.info "BigbluebuttonMeetingUpdater worker: updating the meetings for the room #{room_id}"
24
- room.update_current_meeting
25
- end
15
+ # `fetch_meeting_info` will automatically update the meeting by
16
+ # calling `room.update_current_meeting_record`
17
+ room.fetch_meeting_info
26
18
  end
27
19
  Rails.logger.flush
28
20
 
29
- # TODO: if the meeting is not found (or is not running), try again a few more times?
21
+ # note: don't need to keep trying because there's a worker that runs periodically
22
+ # for each meeting that still hasn't ended
30
23
  end
31
24
  end
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.require_paths = ["lib"]
19
19
 
20
20
  s.add_dependency("rails", ">= 4.0.0")
21
- s.add_dependency("bigbluebutton-api-ruby", "~> 1.4.0")
21
+ s.add_dependency("bigbluebutton-api-ruby", "~> 1.6")
22
22
  s.add_dependency("resque", "~> 1.25.1")
23
23
  s.add_dependency("resque-scheduler", "~> 3.0")
24
24
  s.add_dependency("browser", "~> 0.8.0")
@@ -56,7 +56,7 @@ en:
56
56
  bigbluebutton_server:
57
57
  name: Name
58
58
  param: "String ID"
59
- salt: "Security Salt"
59
+ secret: "Shared Secret"
60
60
  url: URL
61
61
  version: Version
62
62
  bigbluebutton_server_config:
@@ -56,7 +56,7 @@ pt-br:
56
56
  bigbluebutton_server:
57
57
  name: Nome
58
58
  param: Identificador
59
- salt: "Chave de segurança"
59
+ secret: "Chave de segurança"
60
60
  url: URL
61
61
  version: Versão
62
62
  bigbluebutton_server_config:
@@ -47,6 +47,12 @@ module BigbluebuttonRails
47
47
  mattr_accessor :metadata_user_name
48
48
  @@metadata_user_name = :'bbbrails-user-name'
49
49
 
50
+ # Name of the metadata parameter that will contain the room's invitation
51
+ # URL, in case `invitation_url_method` is implemented by the application.
52
+ # Has to be a symbol!
53
+ mattr_accessor :metadata_invitation_url
54
+ @@metadata_invitation_url = :'invitation-url'
55
+
50
56
  # List of invalid metadata keys. Invalid keys are usually keys that are
51
57
  # used by the gem and by the application. The application using this gem
52
58
  # can add items to this list as well.
@@ -55,30 +61,31 @@ module BigbluebuttonRails
55
61
  @@metadata_invalid_keys =
56
62
  [ @@metadata_room_id,
57
63
  @@metadata_user_id,
58
- @@metadata_user_name ]
59
-
60
- # Name of the metadata parameter that will contain the room's invitation
61
- # URL, in case `invitation_url_method` is implemented by the application.
62
- # Has to be a symbol!
63
- mattr_accessor :metadata_invitation_url
64
- @@metadata_invitation_url = :'invitation-url'
64
+ @@metadata_user_name,
65
+ @@metadata_invitation_url ]
65
66
 
66
67
  # Name of the attribute of a user that defines his name/username.
67
- # Has to be a symbol!
68
68
  mattr_accessor :user_attr_name
69
69
  @@user_attr_name = :'name'
70
70
 
71
71
  # Name of the attribute of a user that defines his ID.
72
- # Has to be a symbol!
73
72
  mattr_accessor :user_attr_id
74
73
  @@user_attr_id = :'id'
75
74
 
76
75
  # Name of the method that returns the invitation URL of a room.
77
76
  # Must be implemented by the application, there's no default implemented in this gem.
78
- # Has to be a symbol!
79
77
  mattr_accessor :invitation_url_method
80
78
  @@invitation_url_method = :'invitation_url'
81
79
 
80
+ # Name of the method that returns a hash of metadata to be added to create calls.
81
+ # By default only the metadata created in the database and associated with the room
82
+ # will be used. This method can be used to dynamically decide on which metadata to
83
+ # use when a meeting is about to be created.
84
+ # Receives the meeting as argument and must return a hash where keys are metadata keys
85
+ # and values are the metadata values.
86
+ mattr_accessor :dynamic_metadata_method
87
+ @@dynamic_metadata_method = :'dynamic_metadata'
88
+
82
89
  # Whether or not the gem should pass the voice bridges set in the rooms when making
83
90
  # API calls. By default it is false, meaning that the voice bridge will never be
84
91
  # passed, so it will be generated by the web conference server. Setting it to true
@@ -3,12 +3,16 @@ module BigbluebuttonRails
3
3
  # Helper methods to execute tasks that run in resque and rake.
4
4
  class BackgroundTasks
5
5
 
6
+ # For each meeting that hasn't ended yet, call `getMeetingInfo` and update
7
+ # the meeting attributes or end it.
6
8
  def self.finish_meetings
7
- BigbluebuttonMeeting.where(running: true).find_each do |meeting|
9
+ BigbluebuttonMeeting.where(ended: false).find_each do |meeting|
8
10
  Rails.logger.info "BackgroundTasks: Checking if the meeting has ended: #{meeting.inspect}"
9
- if meeting.room and !meeting.room.fetch_is_running?
10
- Rails.logger.info "BackgroundTasks: Setting meeting as ended: #{meeting.inspect}"
11
- meeting.update_attributes(running: false)
11
+ room = meeting.room
12
+ if room.present? #and !meeting.room.fetch_is_running?
13
+ # `fetch_meeting_info` will automatically update the meeting by
14
+ # calling `room.update_current_meeting_record`
15
+ room.fetch_meeting_info
12
16
  end
13
17
  end
14
18
  end
@@ -16,7 +20,7 @@ module BigbluebuttonRails
16
20
  def self.update_recordings
17
21
  BigbluebuttonServer.find_each do |server|
18
22
  begin
19
- server.fetch_recordings
23
+ server.fetch_recordings(nil, true)
20
24
  Rails.logger.info "BackgroundTasks: List of recordings from #{server.url} updated successfully"
21
25
  rescue Exception => e
22
26
  Rails.logger.info "BackgroundTasks: Failure fetching recordings from #{server.inspect}"
@@ -1,3 +1,3 @@
1
1
  module BigbluebuttonRails
2
- VERSION = "2.0.0".freeze
2
+ VERSION = "2.1.0".freeze
3
3
  end
@@ -4,7 +4,7 @@ class CreateBigbluebuttonRails < ActiveRecord::Migration
4
4
  create_table :bigbluebutton_servers do |t|
5
5
  t.string :name
6
6
  t.string :url
7
- t.string :salt
7
+ t.string :secret
8
8
  t.string :version
9
9
  t.string :param
10
10
  t.timestamps
@@ -93,17 +93,21 @@ class CreateBigbluebuttonRails < ActiveRecord::Migration
93
93
 
94
94
  create_table :bigbluebutton_meetings do |t|
95
95
  t.integer :server_id
96
+ t.string :server_url
97
+ t.string :server_secret
96
98
  t.integer :room_id
97
99
  t.string :meetingid
98
100
  t.string :name
99
101
  t.datetime :start_time
102
+ t.decimal :create_time, precision: 14, scale: 0
100
103
  t.boolean :running, :default => false
101
104
  t.boolean :recorded, :default => false
102
105
  t.integer :creator_id
103
106
  t.string :creator_name
107
+ t.boolean :ended, :default => false
104
108
  t.timestamps
105
109
  end
106
- add_index :bigbluebutton_meetings, [:meetingid, :start_time], :unique => true
110
+ add_index :bigbluebutton_meetings, [:meetingid, :create_time], :unique => true
107
111
 
108
112
  create_table :bigbluebutton_server_configs do |t|
109
113
  t.integer :server_id
@@ -0,0 +1,21 @@
1
+ class BigbluebuttonRailsTo210 < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :bigbluebutton_meetings, :server_url, :string
4
+ add_column :bigbluebutton_meetings, :server_secret, :string
5
+ add_column :bigbluebutton_meetings, :create_time, :decimal, precision: 14, scale: 0
6
+ add_column :bigbluebutton_meetings, :ended, :boolean, :default => false
7
+ remove_index :bigbluebutton_meetings, [:meetingid, :start_time]
8
+ add_index :bigbluebutton_meetings, [:meetingid, :create_time], :unique => true
9
+ rename_column :bigbluebutton_servers, :salt, :secret
10
+ end
11
+
12
+ def self.down
13
+ remove_column :bigbluebutton_meetings, :server_url
14
+ remove_column :bigbluebutton_meetings, :server_secret
15
+ remove_column :bigbluebutton_meetings, :create_time
16
+ remove_column :bigbluebutton_meetings, :ended
17
+ remove_index :bigbluebutton_meetings, [:meetingid, :create_time]
18
+ add_index :bigbluebutton_meetings, [:meetingid, :start_time], :unique => true
19
+ rename_column :bigbluebutton_servers, :secret, :salt
20
+ end
21
+ end
@@ -8,7 +8,7 @@ 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
+ let(:params_to_ignore) { ['moderator_api_password', 'attendee_api_password', 'create_time'] }
12
12
 
13
13
  describe "#index" do
14
14
  context "basic" do
@@ -1020,18 +1020,6 @@ describe Bigbluebutton::RoomsController do
1020
1020
  it { should respond_with(:redirect) }
1021
1021
  it { should redirect_to("http://test.com/join/url") }
1022
1022
  end
1023
-
1024
- context "schedules a BigbluebuttonMeetingUpdater" do
1025
- before(:each) {
1026
- expect {
1027
- get :join, :id => room.to_param
1028
- }.to change{ Resque.info[:pending] }.by(1)
1029
- }
1030
- subject { Resque.peek(:bigbluebutton_rails) }
1031
- it("should have a job schedule") { subject.should_not be_nil }
1032
- it("the job should be the right one") { subject['class'].should eq('BigbluebuttonMeetingUpdater') }
1033
- it("the job should have the correct parameters") { subject['args'].should eq([room.id, 15]) }
1034
- end
1035
1023
  end
1036
1024
 
1037
1025
  context "gets a new config token before joining" do
@@ -88,7 +88,7 @@ describe Bigbluebutton::ServersController do
88
88
  let(:attrs) { FactoryGirl.attributes_for(:bigbluebutton_server) }
89
89
  let(:params) { { :bigbluebutton_server => attrs } }
90
90
  let(:allowed_params) {
91
- [ :name, :url, :salt, :param ]
91
+ [ :name, :url, :secret, :param ]
92
92
  }
93
93
 
94
94
  it {
@@ -179,7 +179,7 @@ describe Bigbluebutton::ServersController do
179
179
  let(:attrs) { FactoryGirl.attributes_for(:bigbluebutton_server) }
180
180
  let(:params) { { :bigbluebutton_server => attrs } }
181
181
  let(:allowed_params) {
182
- [ :name, :url, :salt, :param ]
182
+ [ :name, :url, :secret, :param ]
183
183
  }
184
184
 
185
185
  it {
@@ -6,7 +6,9 @@ FactoryGirl.define do
6
6
  m.sequence(:name) { |n| "Name#{n}" }
7
7
  m.recorded false
8
8
  m.running false
9
+ m.ended false
9
10
  m.start_time { Time.at(Time.now.to_i + rand(999999)) }
11
+ m.create_time { Time.now.to_i + rand(999999) }
10
12
  # m.creator_id
11
13
  # m.creator_name
12
14
  end
@@ -1,5 +1,5 @@
1
1
  FactoryGirl.define do
2
- factory :bigbluebutton_metadata do |r|
2
+ factory :bigbluebutton_metadata do |r|
3
3
  r.association :owner, :factory => :bigbluebutton_recording
4
4
  r.sequence(:name) { |n| "#{Forgery(:name).first_name.downcase}-#{n}" }
5
5
  r.content { Forgery(:name).full_name }
@@ -19,6 +19,7 @@ FactoryGirl.define do
19
19
  r.dial_number { SecureRandom.random_number(9999999).to_s }
20
20
  r.sequence(:logout_url) { |n| "http://bigbluebutton#{n}.test.com/logout" }
21
21
  r.sequence(:max_participants) { |n| n }
22
+ r.create_time { Time.now.to_i + rand(999999) }
22
23
 
23
24
  after(:create) do |r|
24
25
  r.updated_at = r.updated_at.change(:usec => 0)
@@ -2,7 +2,7 @@ FactoryGirl.define do
2
2
  factory :bigbluebutton_server do |s|
3
3
  s.sequence(:name) { |n| "Server #{n}" }
4
4
  s.sequence(:url) { |n| "http://bigbluebutton#{n}.test.com/bigbluebutton/api" }
5
- s.salt { Forgery(:basic).password :at_least => 30, :at_most => 40 }
5
+ s.secret { Forgery(:basic).password :at_least => 30, :at_most => 40 }
6
6
  s.version '0.9'
7
7
  s.sequence(:param) { |n| "server-#{n}" }
8
8
  end
@@ -3,55 +3,146 @@ require 'spec_helper'
3
3
  describe BigbluebuttonRails::BackgroundTasks do
4
4
 
5
5
  describe ".finish_meetings" do
6
+ let!(:api) { double(BigBlueButton::BigBlueButtonApi) }
6
7
 
7
- context "set meetings that ended as not running" do
8
+ context "set meetings that ended as not running and ended" do
8
9
  let(:room) { FactoryGirl.create(:bigbluebutton_room) }
9
- let!(:meeting) { FactoryGirl.create(:bigbluebutton_meeting, running: true, room: room) }
10
+ let!(:meeting) { FactoryGirl.create(:bigbluebutton_meeting, ended: false, running: true, room: room) }
11
+ let!(:exception) {
12
+ e = BigBlueButton::BigBlueButtonException.new('Test error')
13
+ e.key = 'notFound'
14
+ e
15
+ }
16
+
10
17
  before {
11
18
  BigBlueButton::BigBlueButtonApi.any_instance
12
19
  .stub(:get_api_version).and_return("0.9")
13
20
  BigBlueButton::BigBlueButtonApi.any_instance
14
- .should_receive(:is_meeting_running?).once.with(room.meetingid).and_return(false)
21
+ .should_receive(:get_meeting_info).once { raise exception }
15
22
  }
16
23
  before(:each) { BigbluebuttonRails::BackgroundTasks.finish_meetings }
17
- it { meeting.reload.running.should be false }
24
+ it { meeting.reload.running.should be(false) }
25
+ it { meeting.reload.ended.should be(true) }
18
26
  end
19
27
 
20
28
  context "doesn't change meetings that are still running" do
21
29
  let(:room) { FactoryGirl.create(:bigbluebutton_room) }
22
- let!(:meeting) { FactoryGirl.create(:bigbluebutton_meeting, running: true, room: room) }
30
+ let!(:meeting) { FactoryGirl.create(:bigbluebutton_meeting, ended: false, running: true, room: room) }
23
31
  before {
24
32
  BigBlueButton::BigBlueButtonApi.any_instance
25
33
  .stub(:get_api_version).and_return("0.9")
26
34
  BigBlueButton::BigBlueButtonApi.any_instance
27
- .should_receive(:is_meeting_running?).once.with(room.meetingid).and_return(true)
35
+ .should_receive(:get_meeting_info).once.and_return({ running: true })
28
36
  }
29
37
  before(:each) { BigbluebuttonRails::BackgroundTasks.finish_meetings }
30
- it { meeting.reload.running.should be true }
38
+ it { meeting.reload.running.should be(true) }
39
+ it { meeting.reload.ended.should be(false) }
31
40
  end
32
41
 
33
- context "ignores meetings that are not running" do
42
+ context "ignores meetings that already ended" do
34
43
  let(:room) { FactoryGirl.create(:bigbluebutton_room) }
35
- let!(:meeting) { FactoryGirl.create(:bigbluebutton_meeting, running: false, room: room) }
44
+ let!(:meeting) { FactoryGirl.create(:bigbluebutton_meeting, ended: true, room: room) }
45
+ before(:each) {
46
+ BigbluebuttonRoom.any_instance.should_not_receive(:fetch_meeting_info)
47
+ BigbluebuttonRails::BackgroundTasks.finish_meetings
48
+ }
49
+ it { meeting.reload.running.should be(false) }
50
+ end
51
+
52
+ context "considers both meetings running and not running" do
53
+ let(:room1) { FactoryGirl.create(:bigbluebutton_room) }
54
+ let(:room2) { FactoryGirl.create(:bigbluebutton_room) }
55
+ let!(:meeting1) { FactoryGirl.create(:bigbluebutton_meeting, ended: false, running: true, room: room1) }
56
+ let!(:meeting2) { FactoryGirl.create(:bigbluebutton_meeting, ended: false, running: false, room: room2) }
57
+ let!(:exception) {
58
+ e = BigBlueButton::BigBlueButtonException.new('Test error')
59
+ e.key = 'notFound'
60
+ e
61
+ }
62
+
36
63
  before {
37
- BigBlueButton::BigBlueButtonApi.any_instance.should_not_receive(:is_meeting_running?)
64
+ BigBlueButton::BigBlueButtonApi.any_instance
65
+ .stub(:get_api_version).and_return("0.9")
66
+ BigBlueButton::BigBlueButtonApi.any_instance.stub(:get_meeting_info) { raise exception }
38
67
  }
39
68
  before(:each) { BigbluebuttonRails::BackgroundTasks.finish_meetings }
40
- it { meeting.reload.running.should be false }
69
+ it { meeting1.reload.running.should be(false) }
70
+ it { meeting1.reload.ended.should be(true) }
71
+ it { meeting1.reload.running.should be(false) }
72
+ it { meeting1.reload.ended.should be(true) }
73
+ end
74
+
75
+ context "ignore meetings that have no room" do
76
+ let(:room) { FactoryGirl.create(:bigbluebutton_room) }
77
+ let!(:meeting) { FactoryGirl.create(:bigbluebutton_meeting, ended: false, running: true, room: room) }
78
+ before(:each) {
79
+ BigbluebuttonRoom.any_instance.should_not_receive(:fetch_meeting_info)
80
+ meeting.room.delete
81
+ BigbluebuttonRails::BackgroundTasks.finish_meetings
82
+ }
83
+ it { meeting.reload.running.should be(true) }
41
84
  end
42
85
 
43
- it "works for multiple meetings"
86
+ context "calls finish_meetings if an exception 'notFound' is raised" do
87
+ let!(:room) { FactoryGirl.create(:bigbluebutton_room) }
88
+ let!(:meeting) { FactoryGirl.create(:bigbluebutton_meeting, ended: false, running: true, room: room) }
89
+ let!(:exception) {
90
+ e = BigBlueButton::BigBlueButtonException.new('Test error')
91
+ e.key = 'notFound'
92
+ e
93
+ }
94
+
95
+ before {
96
+ BigbluebuttonServer.any_instance.should_receive(:api) { api }
97
+ expect(api).to receive(:get_meeting_info).once { raise exception }
98
+ BigbluebuttonRoom.any_instance.should_receive(:finish_meetings).once
99
+ }
100
+ it { expect { BigbluebuttonRails::BackgroundTasks.finish_meetings }.not_to raise_exception }
101
+ end
102
+
103
+ context "calls finish_meetings if an exception other than 'notFound' is raised" do
104
+ let!(:room) { FactoryGirl.create(:bigbluebutton_room) }
105
+ let!(:meeting) { FactoryGirl.create(:bigbluebutton_meeting, ended: false, running: true, room: room) }
106
+ let!(:exception) {
107
+ e = BigBlueButton::BigBlueButtonException.new('Test error')
108
+ e.key = 'anythingElse'
109
+ e
110
+ }
111
+
112
+ before {
113
+ BigbluebuttonServer.any_instance.should_receive(:api) { api }
114
+ expect(api).to receive(:get_meeting_info).once { raise exception }
115
+ BigbluebuttonRoom.any_instance.should_receive(:finish_meetings)
116
+ }
117
+ it { expect { BigbluebuttonRails::BackgroundTasks.finish_meetings }.not_to raise_exception }
118
+ end
119
+
120
+ context "calls finish_meetings if an exception with a blank key is raised" do
121
+ let!(:room) { FactoryGirl.create(:bigbluebutton_room) }
122
+ let!(:meeting) { FactoryGirl.create(:bigbluebutton_meeting, ended: false, running: true, room: room) }
123
+ let!(:exception) {
124
+ e = BigBlueButton::BigBlueButtonException.new('Test error')
125
+ e.key = ''
126
+ e
127
+ }
128
+
129
+ before {
130
+ BigbluebuttonServer.any_instance.should_receive(:api) { api }
131
+ expect(api).to receive(:get_meeting_info).once { raise exception }
132
+ BigbluebuttonRoom.any_instance.should_receive(:finish_meetings)
133
+ }
134
+ it { expect { BigbluebuttonRails::BackgroundTasks.finish_meetings }.not_to raise_exception }
135
+ end
44
136
  end
45
137
 
46
138
  describe ".update_recordings" do
47
-
48
139
  context "fetches the meetings for all servers" do
49
140
  let!(:server1) { FactoryGirl.create(:bigbluebutton_server) }
50
141
  let!(:server2) { FactoryGirl.create(:bigbluebutton_server) }
51
142
  before {
52
143
  BigbluebuttonServer.stub(:find_each).and_yield(server1).and_yield(server2)
53
- server1.should_receive(:fetch_recordings).once
54
- server2.should_receive(:fetch_recordings).once
144
+ server1.should_receive(:fetch_recordings).once.with(nil, true)
145
+ server2.should_receive(:fetch_recordings).once.with(nil, true)
55
146
  }
56
147
  it { BigbluebuttonRails::BackgroundTasks.update_recordings }
57
148
  end