bigbluebutton_rails 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +7 -1
- data/Gemfile.lock +30 -30
- data/app/controllers/bigbluebutton/rooms_controller.rb +13 -41
- data/app/models/bigbluebutton_room.rb +64 -1
- data/app/models/bigbluebutton_server.rb +17 -0
- data/bigbluebutton_rails.gemspec +1 -1
- data/lib/bigbluebutton_rails/version.rb +1 -1
- data/lib/bigbluebutton_rails.rb +4 -1
- data/lib/classes/bigbluebutton_attendee.rb +19 -0
- data/lib/classes/bigbluebutton_meeting.rb +18 -0
- data/spec/classes/bigbluebutton_attendee_spec.rb +76 -0
- data/spec/classes/bigbluebutton_meeting_spec.rb +62 -0
- data/spec/controllers/bigbluebutton/rooms_controller_spec.rb +1 -1
- data/spec/models/bigbluebutton_room_spec.rb +193 -10
- data/spec/models/bigbluebutton_server_spec.rb +43 -0
- metadata +25 -21
data/CHANGELOG.rdoc
CHANGED
@@ -1,4 +1,10 @@
|
|
1
|
-
== 0.
|
1
|
+
== 0.0.2
|
2
|
+
|
3
|
+
* New "fetch" methods in BigbluebuttonRooms to fetch info about meetings from BBB and store in the model.
|
4
|
+
* New class BigbluebuttonAttendee to store attendee information returned by BBB in get_meeting_info.
|
5
|
+
* New class BigbluebuttonMeeting to store meeting information returned by BBB in get_meetings.
|
6
|
+
|
7
|
+
== 0.0.1
|
2
8
|
|
3
9
|
* First version
|
4
10
|
* DB models for BigBlueButton servers and rooms
|
data/Gemfile.lock
CHANGED
@@ -1,42 +1,42 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
bigbluebutton_rails (0.0.
|
5
|
-
bigbluebutton-api-ruby (~> 0.0.
|
4
|
+
bigbluebutton_rails (0.0.2)
|
5
|
+
bigbluebutton-api-ruby (~> 0.0.9)
|
6
6
|
rails (~> 3.0.3)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: http://rubygems.org/
|
10
10
|
specs:
|
11
11
|
abstract (1.0.0)
|
12
|
-
actionmailer (3.0.
|
13
|
-
actionpack (= 3.0.
|
12
|
+
actionmailer (3.0.6)
|
13
|
+
actionpack (= 3.0.6)
|
14
14
|
mail (~> 2.2.15)
|
15
|
-
actionpack (3.0.
|
16
|
-
activemodel (= 3.0.
|
17
|
-
activesupport (= 3.0.
|
15
|
+
actionpack (3.0.6)
|
16
|
+
activemodel (= 3.0.6)
|
17
|
+
activesupport (= 3.0.6)
|
18
18
|
builder (~> 2.1.2)
|
19
19
|
erubis (~> 2.6.6)
|
20
|
-
i18n (~> 0.
|
20
|
+
i18n (~> 0.5.0)
|
21
21
|
rack (~> 1.2.1)
|
22
|
-
rack-mount (~> 0.6.
|
22
|
+
rack-mount (~> 0.6.14)
|
23
23
|
rack-test (~> 0.5.7)
|
24
24
|
tzinfo (~> 0.3.23)
|
25
|
-
activemodel (3.0.
|
26
|
-
activesupport (= 3.0.
|
25
|
+
activemodel (3.0.6)
|
26
|
+
activesupport (= 3.0.6)
|
27
27
|
builder (~> 2.1.2)
|
28
|
-
i18n (~> 0.
|
29
|
-
activerecord (3.0.
|
30
|
-
activemodel (= 3.0.
|
31
|
-
activesupport (= 3.0.
|
28
|
+
i18n (~> 0.5.0)
|
29
|
+
activerecord (3.0.6)
|
30
|
+
activemodel (= 3.0.6)
|
31
|
+
activesupport (= 3.0.6)
|
32
32
|
arel (~> 2.0.2)
|
33
33
|
tzinfo (~> 0.3.23)
|
34
|
-
activeresource (3.0.
|
35
|
-
activemodel (= 3.0.
|
36
|
-
activesupport (= 3.0.
|
37
|
-
activesupport (3.0.
|
34
|
+
activeresource (3.0.6)
|
35
|
+
activemodel (= 3.0.6)
|
36
|
+
activesupport (= 3.0.6)
|
37
|
+
activesupport (3.0.6)
|
38
38
|
arel (2.0.9)
|
39
|
-
bigbluebutton-api-ruby (0.0.
|
39
|
+
bigbluebutton-api-ruby (0.0.9)
|
40
40
|
nokogiri (~> 1.4.0)
|
41
41
|
builder (2.1.2)
|
42
42
|
diff-lcs (1.1.2)
|
@@ -62,17 +62,17 @@ GEM
|
|
62
62
|
rack (>= 1.0.0)
|
63
63
|
rack-test (0.5.7)
|
64
64
|
rack (>= 1.0)
|
65
|
-
rails (3.0.
|
66
|
-
actionmailer (= 3.0.
|
67
|
-
actionpack (= 3.0.
|
68
|
-
activerecord (= 3.0.
|
69
|
-
activeresource (= 3.0.
|
70
|
-
activesupport (= 3.0.
|
65
|
+
rails (3.0.6)
|
66
|
+
actionmailer (= 3.0.6)
|
67
|
+
actionpack (= 3.0.6)
|
68
|
+
activerecord (= 3.0.6)
|
69
|
+
activeresource (= 3.0.6)
|
70
|
+
activesupport (= 3.0.6)
|
71
71
|
bundler (~> 1.0)
|
72
|
-
railties (= 3.0.
|
73
|
-
railties (3.0.
|
74
|
-
actionpack (= 3.0.
|
75
|
-
activesupport (= 3.0.
|
72
|
+
railties (= 3.0.6)
|
73
|
+
railties (3.0.6)
|
74
|
+
actionpack (= 3.0.6)
|
75
|
+
activesupport (= 3.0.6)
|
76
76
|
rake (>= 0.8.7)
|
77
77
|
thor (~> 0.14.4)
|
78
78
|
rake (0.8.7)
|
@@ -2,8 +2,6 @@ require 'bigbluebutton-api'
|
|
2
2
|
|
3
3
|
class Bigbluebutton::RoomsController < ApplicationController
|
4
4
|
|
5
|
-
# TODO create filter find_room
|
6
|
-
|
7
5
|
before_filter :find_server
|
8
6
|
respond_to :html, :except => :running
|
9
7
|
respond_to :json, :only => :running
|
@@ -70,10 +68,11 @@ class Bigbluebutton::RoomsController < ApplicationController
|
|
70
68
|
def destroy
|
71
69
|
@room = BigbluebuttonRoom.find(params[:id])
|
72
70
|
|
73
|
-
# TODO Destroy room even if end_meeting failed?
|
71
|
+
# TODO Destroy the room record even if end_meeting failed?
|
74
72
|
|
75
73
|
begin
|
76
|
-
|
74
|
+
@room.fetch_is_running?
|
75
|
+
@room.send_end if @room.is_running?
|
77
76
|
rescue BigBlueButton::BigBlueButtonException => e
|
78
77
|
flash[:error] = e.to_s
|
79
78
|
# TODO Better error message: "Room destroyed in DB, but not in BBB..."
|
@@ -88,19 +87,20 @@ class Bigbluebutton::RoomsController < ApplicationController
|
|
88
87
|
role = bigbluebutton_role(@room)
|
89
88
|
|
90
89
|
begin
|
90
|
+
@room.fetch_is_running?
|
91
91
|
|
92
92
|
# if the current user is a moderator, create the room (if needed)
|
93
93
|
# and join it
|
94
94
|
if role == :moderator
|
95
|
-
|
96
|
-
join_url =
|
95
|
+
@room.send_create unless @room.is_running?
|
96
|
+
join_url = @room.join_url(bigbluebutton_user.name, role)
|
97
97
|
redirect_to(join_url)
|
98
98
|
|
99
99
|
# normal user only joins if the conference is running
|
100
100
|
# if it's not, wait for a moderator to create the conference
|
101
101
|
else
|
102
|
-
if
|
103
|
-
join_url =
|
102
|
+
if @room.is_running?
|
103
|
+
join_url = @room.join_url(bigbluebutton_user.name, role)
|
104
104
|
redirect_to(join_url)
|
105
105
|
else
|
106
106
|
render :action => :join_wait
|
@@ -121,13 +121,13 @@ class Bigbluebutton::RoomsController < ApplicationController
|
|
121
121
|
@room = BigbluebuttonRoom.find(params[:id])
|
122
122
|
|
123
123
|
begin
|
124
|
-
|
124
|
+
@room.fetch_is_running?
|
125
125
|
rescue BigBlueButton::BigBlueButtonException => e
|
126
126
|
flash[:error] = e.to_s
|
127
127
|
render :json => { running: "false", error: "#{e.to_s}" }
|
128
128
|
#redirect_to request.referer
|
129
129
|
else
|
130
|
-
render :json => { running: "#{
|
130
|
+
render :json => { running: "#{@room.is_running?}" }
|
131
131
|
end
|
132
132
|
|
133
133
|
end
|
@@ -136,8 +136,9 @@ class Bigbluebutton::RoomsController < ApplicationController
|
|
136
136
|
@room = BigbluebuttonRoom.find(params[:id])
|
137
137
|
|
138
138
|
begin
|
139
|
-
|
140
|
-
|
139
|
+
@room.fetch_is_running?
|
140
|
+
if @room.is_running?
|
141
|
+
@room.send_end
|
141
142
|
message = t('bigbluebutton_rails.rooms.notice.end.success')
|
142
143
|
else
|
143
144
|
message = t('bigbluebutton_rails.rooms.notice.end.not_running')
|
@@ -161,33 +162,4 @@ class Bigbluebutton::RoomsController < ApplicationController
|
|
161
162
|
end
|
162
163
|
end
|
163
164
|
|
164
|
-
|
165
|
-
#
|
166
|
-
# Functions that directly call the BBB API. All prefixed with bbb_
|
167
|
-
#
|
168
|
-
|
169
|
-
def bbb_is_meeting_running?
|
170
|
-
@server.api.is_meeting_running?(@room.meeting_id)
|
171
|
-
end
|
172
|
-
|
173
|
-
def bbb_end_meeting
|
174
|
-
@server.api.end_meeting(@room.meeting_id, @room.moderator_password)
|
175
|
-
end
|
176
|
-
|
177
|
-
def bbb_create_room
|
178
|
-
@server.api.create_meeting(@room.name, @room.meeting_id,
|
179
|
-
@room.moderator_password, @room.attendee_password,
|
180
|
-
@room.welcome_msg)
|
181
|
-
end
|
182
|
-
|
183
|
-
def bbb_join_url(username, role)
|
184
|
-
if role == :moderator
|
185
|
-
@server.api.join_meeting_url(@room.meeting_id, username,
|
186
|
-
@room.moderator_password)
|
187
|
-
else
|
188
|
-
@server.api.join_meeting_url(@room.meeting_id, username,
|
189
|
-
@room.attendee_password)
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
165
|
end
|
@@ -12,5 +12,68 @@ class BigbluebuttonRoom < ActiveRecord::Base
|
|
12
12
|
validates :welcome_msg, :length => { :maximum => 250 }
|
13
13
|
|
14
14
|
attr_accessible :name, :server_id, :meeting_id, :attendee_password,
|
15
|
-
:moderator_password, :welcome_msg
|
15
|
+
:moderator_password, :welcome_msg, :owner, :server
|
16
|
+
|
17
|
+
# Note: these params need to be fetched before being accessed
|
18
|
+
attr_reader :running, :participant_count, :moderator_count, :attendees,
|
19
|
+
:has_been_forcibly_ended, :start_time, :end_time
|
20
|
+
|
21
|
+
def is_running?
|
22
|
+
@running
|
23
|
+
end
|
24
|
+
|
25
|
+
def fetch_meeting_info
|
26
|
+
response = self.server.api.get_meeting_info(self.meeting_id, self.moderator_password)
|
27
|
+
|
28
|
+
@participant_count = response[:participantCount]
|
29
|
+
@moderator_count = response[:moderatorCount]
|
30
|
+
@running = response[:running].downcase == "true"
|
31
|
+
@has_been_forcibly_ended = response[:hasBeenForciblyEnded].downcase == "true"
|
32
|
+
@start_time = response[:startTime] == "null" ?
|
33
|
+
nil : DateTime.parse(response[:startTime])
|
34
|
+
@end_time = response[:endTime] == "null" ?
|
35
|
+
nil : DateTime.parse(response[:endTime])
|
36
|
+
@attendees = []
|
37
|
+
response[:attendees].each do |att|
|
38
|
+
attendee = BigbluebuttonAttendee.new
|
39
|
+
attendee.from_hash(att)
|
40
|
+
@attendees << attendee
|
41
|
+
end
|
42
|
+
|
43
|
+
response
|
44
|
+
end
|
45
|
+
|
46
|
+
def fetch_is_running?
|
47
|
+
@running = self.server.api.is_meeting_running?(self.meeting_id)
|
48
|
+
end
|
49
|
+
|
50
|
+
def send_end
|
51
|
+
self.server.api.end_meeting(self.meeting_id, self.moderator_password)
|
52
|
+
end
|
53
|
+
|
54
|
+
def send_create
|
55
|
+
response = self.server.api.create_meeting(self.name, self.meeting_id, self.moderator_password,
|
56
|
+
self.attendee_password, self.welcome_msg)
|
57
|
+
|
58
|
+
# updates model information with data returned by BBB
|
59
|
+
unless response.nil?
|
60
|
+
self.attendee_password = response[:attendeePW].to_s
|
61
|
+
self.moderator_password = response[:moderatorPW].to_s
|
62
|
+
self.save
|
63
|
+
end
|
64
|
+
|
65
|
+
response
|
66
|
+
end
|
67
|
+
|
68
|
+
# uses the API but does not require a request to the server
|
69
|
+
def join_url(username, role)
|
70
|
+
if role == :moderator
|
71
|
+
self.server.api.join_meeting_url(self.meeting_id, username,
|
72
|
+
self.moderator_password)
|
73
|
+
else
|
74
|
+
self.server.api.join_meeting_url(self.meeting_id, username,
|
75
|
+
self.attendee_password)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
16
79
|
end
|
@@ -22,4 +22,21 @@ class BigbluebuttonServer < ActiveRecord::Base
|
|
22
22
|
@api
|
23
23
|
end
|
24
24
|
|
25
|
+
attr_reader :meetings
|
26
|
+
|
27
|
+
def fetch_meetings
|
28
|
+
response = self.api.get_meetings
|
29
|
+
|
30
|
+
# updates the information in the rooms that are currently in BBB
|
31
|
+
@meetings = []
|
32
|
+
response[:meetings].each do |attr|
|
33
|
+
room = BigbluebuttonRoom.find_by_server_id_and_meeting_id(self.id, attr[:meetingID])
|
34
|
+
|
35
|
+
meeting = BigbluebuttonMeeting.new
|
36
|
+
meeting.from_hash(attr)
|
37
|
+
meeting.room = room
|
38
|
+
@meetings << meeting
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
25
42
|
end
|
data/bigbluebutton_rails.gemspec
CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.require_paths = ["lib"]
|
17
17
|
|
18
18
|
s.add_runtime_dependency("rails", "~> 3.0.3")
|
19
|
-
s.add_runtime_dependency("bigbluebutton-api-ruby", "~> 0.0.
|
19
|
+
s.add_runtime_dependency("bigbluebutton-api-ruby", "~> 0.0.9")
|
20
20
|
|
21
21
|
s.add_development_dependency("rspec-rails", "~> 2.5.0")
|
22
22
|
s.add_development_dependency("factory_girl", "~> 1.3.2")
|
data/lib/bigbluebutton_rails.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
require 'rails'
|
2
2
|
|
3
|
+
require 'classes/bigbluebutton_attendee'
|
4
|
+
require 'classes/bigbluebutton_meeting'
|
5
|
+
|
3
6
|
module BigbluebuttonRails
|
4
7
|
require 'bigbluebutton_rails/rails'
|
5
8
|
require 'bigbluebutton_rails/controller_methods'
|
6
|
-
require 'bigbluebutton_rails/rails/routes
|
9
|
+
require 'bigbluebutton_rails/rails/routes'
|
7
10
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class BigbluebuttonAttendee
|
2
|
+
|
3
|
+
attr_accessor :user_id, :full_name, :role
|
4
|
+
|
5
|
+
def from_hash(hash)
|
6
|
+
self.user_id = hash[:userID].to_s
|
7
|
+
self.full_name = hash[:fullName].to_s
|
8
|
+
self.role = hash[:role].downcase == "moderator" ? :moderator : :attendee
|
9
|
+
end
|
10
|
+
|
11
|
+
def ==(other)
|
12
|
+
r = true
|
13
|
+
[:user_id, :full_name, :role].each do |param|
|
14
|
+
r = r && self.send(param) == other.send(param)
|
15
|
+
end
|
16
|
+
r
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class BigbluebuttonMeeting
|
2
|
+
|
3
|
+
attr_accessor :running, :has_been_forcibly_ended, :room
|
4
|
+
|
5
|
+
def from_hash(hash)
|
6
|
+
self.running = hash[:running].downcase == "true"
|
7
|
+
self.has_been_forcibly_ended = hash[:hasBeenForciblyEnded].downcase == "true"
|
8
|
+
end
|
9
|
+
|
10
|
+
def ==(other)
|
11
|
+
r = true
|
12
|
+
[:running, :has_been_forcibly_ended, :room].each do |param|
|
13
|
+
r = r && self.send(param) == other.send(param)
|
14
|
+
end
|
15
|
+
r
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe BigbluebuttonAttendee do
|
4
|
+
|
5
|
+
it "should be reconized" do
|
6
|
+
lambda { BigbluebuttonAttendee.new }.should_not raise_error
|
7
|
+
end
|
8
|
+
|
9
|
+
[:user_id, :full_name, :role].each do |attr|
|
10
|
+
it { should respond_to(attr) }
|
11
|
+
it { should respond_to(:"#{attr}=") }
|
12
|
+
end
|
13
|
+
|
14
|
+
context "equality" do
|
15
|
+
let(:attendee1) {
|
16
|
+
attendee = BigbluebuttonAttendee.new
|
17
|
+
attendee.user_id = Forgery(:basic).password
|
18
|
+
attendee.full_name = Forgery(:name).full_name
|
19
|
+
attendee.role = :attendee
|
20
|
+
attendee
|
21
|
+
}
|
22
|
+
let(:attendee2) {
|
23
|
+
attendee = BigbluebuttonAttendee.new
|
24
|
+
attendee.user_id = Forgery(:basic).password
|
25
|
+
attendee.full_name = Forgery(:name).full_name
|
26
|
+
attendee.role = :moderator
|
27
|
+
attendee
|
28
|
+
}
|
29
|
+
let(:attendee3) {
|
30
|
+
attendee = BigbluebuttonAttendee.new
|
31
|
+
attendee.user_id = attendee1.user_id
|
32
|
+
attendee.full_name = attendee1.full_name
|
33
|
+
attendee.role = attendee1.role
|
34
|
+
attendee
|
35
|
+
}
|
36
|
+
|
37
|
+
it { attendee1.should == attendee3 }
|
38
|
+
it { attendee1.should_not == attendee2 }
|
39
|
+
it { attendee2.should_not == attendee3 }
|
40
|
+
end
|
41
|
+
|
42
|
+
context "gets params from hash" do
|
43
|
+
let(:hash) { {:userID=>"user_id", :fullName=>"House M.D.", :role=>"MODERATOR"} }
|
44
|
+
let(:attendee) { BigbluebuttonAttendee.new }
|
45
|
+
|
46
|
+
it "standard case" do
|
47
|
+
attendee.from_hash(hash)
|
48
|
+
attendee.user_id.should == "user_id"
|
49
|
+
attendee.full_name.should == "House M.D."
|
50
|
+
attendee.role.should == :moderator
|
51
|
+
end
|
52
|
+
|
53
|
+
it "converts user_id to string" do
|
54
|
+
hash[:userID] = 123
|
55
|
+
attendee.from_hash(hash)
|
56
|
+
attendee.user_id.should == "123"
|
57
|
+
end
|
58
|
+
|
59
|
+
it "role is not case sensitive" do
|
60
|
+
hash[:role] = "mODErAtOR"
|
61
|
+
attendee.from_hash(hash)
|
62
|
+
attendee.role.should == :moderator
|
63
|
+
end
|
64
|
+
|
65
|
+
it "any role other than 'moderator' is attendee" do
|
66
|
+
hash[:role] = "VIEWER"
|
67
|
+
attendee.from_hash(hash)
|
68
|
+
attendee.role.should == :attendee
|
69
|
+
|
70
|
+
hash[:role] = "whatever"
|
71
|
+
attendee.from_hash(hash)
|
72
|
+
attendee.role.should == :attendee
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe BigbluebuttonMeeting do
|
4
|
+
|
5
|
+
it "should be reconized" do
|
6
|
+
lambda { BigbluebuttonMeeting.new }.should_not raise_error
|
7
|
+
end
|
8
|
+
|
9
|
+
[:running, :has_been_forcibly_ended, :room].each do |attr|
|
10
|
+
it { should respond_to(attr) }
|
11
|
+
it { should respond_to(:"#{attr}=") }
|
12
|
+
end
|
13
|
+
|
14
|
+
context "equality" do
|
15
|
+
let(:meeting1) {
|
16
|
+
m = BigbluebuttonMeeting.new
|
17
|
+
m.running = true
|
18
|
+
m.has_been_forcibly_ended = false
|
19
|
+
m.room = nil
|
20
|
+
m
|
21
|
+
}
|
22
|
+
let(:meeting2) {
|
23
|
+
m = BigbluebuttonMeeting.new
|
24
|
+
m.running = false
|
25
|
+
m.has_been_forcibly_ended = true
|
26
|
+
m.room = nil
|
27
|
+
m
|
28
|
+
}
|
29
|
+
let(:meeting3) {
|
30
|
+
m = BigbluebuttonMeeting.new
|
31
|
+
m.running = meeting1.running
|
32
|
+
m.has_been_forcibly_ended = meeting1.has_been_forcibly_ended
|
33
|
+
m.room = meeting1.room
|
34
|
+
m
|
35
|
+
}
|
36
|
+
|
37
|
+
it { meeting1.should == meeting3 }
|
38
|
+
it { meeting1.should_not == meeting2 }
|
39
|
+
it { meeting2.should_not == meeting3 }
|
40
|
+
end
|
41
|
+
|
42
|
+
context "gets params from hash" do
|
43
|
+
let(:hash) { {:running=>"false", :hasBeenForciblyEnded=>"true"} }
|
44
|
+
let(:meeting) { BigbluebuttonMeeting.new }
|
45
|
+
|
46
|
+
it "standard case" do
|
47
|
+
meeting.from_hash(hash)
|
48
|
+
meeting.running.should == false
|
49
|
+
meeting.has_been_forcibly_ended.should == true
|
50
|
+
end
|
51
|
+
|
52
|
+
it "case insensitive" do
|
53
|
+
hash[:running] = "TRue"
|
54
|
+
hash[:hasBeenForciblyEnded] = "FalSE"
|
55
|
+
meeting.from_hash(hash)
|
56
|
+
meeting.running.should == true
|
57
|
+
meeting.has_been_forcibly_ended.should == false
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
@@ -11,7 +11,7 @@ def mock_server_and_api
|
|
11
11
|
@api_mock = mock(BigBlueButton::BigBlueButtonApi)
|
12
12
|
@server_mock = mock_model(BigbluebuttonServer)
|
13
13
|
@server_mock.stub(:api).and_return(@api_mock)
|
14
|
-
BigbluebuttonServer.stub(:find).
|
14
|
+
BigbluebuttonServer.stub(:find).and_return(@server_mock)
|
15
15
|
end
|
16
16
|
|
17
17
|
def mocked_server
|
@@ -1,5 +1,20 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
def mock_server_and_api
|
4
|
+
@api_mock = mock(BigBlueButton::BigBlueButtonApi)
|
5
|
+
@server_mock = mock_model(BigbluebuttonServer)
|
6
|
+
@server_mock.stub(:api).and_return(@api_mock)
|
7
|
+
BigbluebuttonServer.stub(:find).with(@server_mock.id.to_s).and_return(@server_mock)
|
8
|
+
end
|
9
|
+
|
10
|
+
def mocked_server
|
11
|
+
@server_mock
|
12
|
+
end
|
13
|
+
|
14
|
+
def mocked_api
|
15
|
+
@api_mock
|
16
|
+
end
|
17
|
+
|
3
18
|
describe BigbluebuttonRoom do
|
4
19
|
it "loaded correctly" do
|
5
20
|
BigbluebuttonRoom.new.should be_a_kind_of(ActiveRecord::Base)
|
@@ -35,14 +50,182 @@ describe BigbluebuttonRoom do
|
|
35
50
|
room.server.should_not be_nil
|
36
51
|
}
|
37
52
|
|
38
|
-
it { should ensure_length_of(:meeting_id).
|
39
|
-
|
40
|
-
it { should ensure_length_of(:
|
41
|
-
|
42
|
-
it { should ensure_length_of(:
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
53
|
+
it { should ensure_length_of(:meeting_id).is_at_least(1).is_at_most(100) }
|
54
|
+
it { should ensure_length_of(:name).is_at_least(1).is_at_most(150) }
|
55
|
+
it { should ensure_length_of(:attendee_password).is_at_most(50) }
|
56
|
+
it { should ensure_length_of(:moderator_password).is_at_most(50) }
|
57
|
+
it { should ensure_length_of(:welcome_msg).is_at_most(250) }
|
58
|
+
|
59
|
+
# attr_readers
|
60
|
+
[:running, :participant_count, :moderator_count, :attendees,
|
61
|
+
:has_been_forcibly_ended, :start_time, :end_time].each do |attr|
|
62
|
+
it { should respond_to(attr) }
|
63
|
+
end
|
64
|
+
|
65
|
+
it { should respond_to(:is_running?) }
|
66
|
+
|
67
|
+
context "using the api" do
|
68
|
+
before { mock_server_and_api }
|
69
|
+
let(:room) { Factory.create(:bigbluebutton_room) }
|
70
|
+
|
71
|
+
describe "#fetch_is_running?" do
|
72
|
+
|
73
|
+
it { should respond_to(:fetch_is_running?) }
|
74
|
+
|
75
|
+
it "fetches is_running? when not running" do
|
76
|
+
mocked_api.should_receive(:is_meeting_running?).with(room.meeting_id).and_return(false)
|
77
|
+
room.server = mocked_server
|
78
|
+
room.fetch_is_running?
|
79
|
+
room.running.should == false
|
80
|
+
room.is_running?.should == false
|
81
|
+
end
|
82
|
+
|
83
|
+
it "fetches is_running? when running" do
|
84
|
+
mocked_api.should_receive(:is_meeting_running?).with(room.meeting_id).and_return(true)
|
85
|
+
room.server = mocked_server
|
86
|
+
room.fetch_is_running?
|
87
|
+
room.running.should == true
|
88
|
+
room.is_running?.should == true
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
describe "#fetch_meeting_info" do
|
94
|
+
|
95
|
+
# these hashes should be exactly as returned by bigbluebutton-api-ruby to be sure we are testing it right
|
96
|
+
let(:hash_info) {
|
97
|
+
{ :returncode=>"SUCCESS", :meetingID=>"test_id", :attendeePW=>1234, :moderatorPW=>4321,
|
98
|
+
:running=>"false", :hasBeenForciblyEnded=>"false", :startTime=>"null", :endTime=>"null",
|
99
|
+
:participantCount=>0, :moderatorCount=>0, :attendees=>[], :messageKey=>{ }, :message=>{ }
|
100
|
+
}
|
101
|
+
}
|
102
|
+
let(:users) {
|
103
|
+
[
|
104
|
+
{:userID=>"ndw1fnaev0rj", :fullName=>"House M.D.", :role=>"MODERATOR"},
|
105
|
+
{:userID=>"gn9e22b7ynna", :fullName=>"Dexter Morgan", :role=>"MODERATOR"},
|
106
|
+
{:userID=>"llzihbndryc3", :fullName=>"Cameron Palmer", :role=>"VIEWER"},
|
107
|
+
{:userID=>"rbepbovolsxt", :fullName=>"Trinity", :role=>"VIEWER"}
|
108
|
+
]
|
109
|
+
}
|
110
|
+
let(:hash_info2) {
|
111
|
+
{ :returncode=>"SUCCESS", :meetingID=>"test_id", :attendeePW=>1234, :moderatorPW=>4321,
|
112
|
+
:running=>"true", :hasBeenForciblyEnded=>"false", :startTime=>"Wed Apr 06 17:09:57 UTC 2011",
|
113
|
+
:endTime=>"null", :participantCount=>4, :moderatorCount=>2,
|
114
|
+
:attendees => users, :messageKey=>{ }, :message=>{ }
|
115
|
+
}
|
116
|
+
}
|
117
|
+
|
118
|
+
it { should respond_to(:fetch_meeting_info) }
|
119
|
+
|
120
|
+
it "fetches meeting info when the meeting is not running" do
|
121
|
+
mocked_api.should_receive(:get_meeting_info).
|
122
|
+
with(room.meeting_id, room.moderator_password).and_return(hash_info)
|
123
|
+
room.server = mocked_server
|
124
|
+
|
125
|
+
room.fetch_meeting_info
|
126
|
+
room.running.should == false
|
127
|
+
room.has_been_forcibly_ended.should == false
|
128
|
+
room.participant_count.should == 0
|
129
|
+
room.moderator_count.should == 0
|
130
|
+
room.start_time.should == nil
|
131
|
+
room.end_time.should == nil
|
132
|
+
room.attendees.should == []
|
133
|
+
end
|
134
|
+
|
135
|
+
it "fetches meeting info when the meeting is running" do
|
136
|
+
mocked_api.should_receive(:get_meeting_info).
|
137
|
+
with(room.meeting_id, room.moderator_password).and_return(hash_info2)
|
138
|
+
room.server = mocked_server
|
139
|
+
|
140
|
+
room.fetch_meeting_info
|
141
|
+
room.running.should == true
|
142
|
+
room.has_been_forcibly_ended.should == false
|
143
|
+
room.participant_count.should == 4
|
144
|
+
room.moderator_count.should == 2
|
145
|
+
room.start_time.should == DateTime.parse("Wed Apr 06 17:09:57 UTC 2011")
|
146
|
+
room.end_time.should == nil
|
147
|
+
|
148
|
+
users.each do |att|
|
149
|
+
attendee = BigbluebuttonAttendee.new
|
150
|
+
attendee.from_hash(att)
|
151
|
+
room.attendees.should include(attendee)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
describe "#send_end" do
|
158
|
+
|
159
|
+
it { should respond_to(:send_end) }
|
160
|
+
|
161
|
+
it "send end_meeting" do
|
162
|
+
mocked_api.should_receive(:end_meeting).with(room.meeting_id, room.moderator_password)
|
163
|
+
room.server = mocked_server
|
164
|
+
room.send_end
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
168
|
+
|
169
|
+
describe "#send_create" do
|
170
|
+
let(:attendee_password) { Forgery(:basic).password }
|
171
|
+
let(:moderator_password) { Forgery(:basic).password }
|
172
|
+
let(:hash_create) {
|
173
|
+
{
|
174
|
+
:returncode => "SUCCESS", :meetingID => "test_id",
|
175
|
+
:attendeePW => attendee_password, :moderatorPW => moderator_password,
|
176
|
+
:hasBeenForciblyEnded => "false", :messageKey => {}, :message => {}
|
177
|
+
}
|
178
|
+
}
|
179
|
+
|
180
|
+
it { should respond_to(:send_create) }
|
181
|
+
|
182
|
+
it "send create_meeting" do
|
183
|
+
mocked_api.should_receive(:create_meeting).
|
184
|
+
with(room.name, room.meeting_id, room.moderator_password,
|
185
|
+
room.attendee_password, room.welcome_msg)
|
186
|
+
room.server = mocked_server
|
187
|
+
room.send_create
|
188
|
+
end
|
189
|
+
|
190
|
+
it "send create_meeting" do
|
191
|
+
mocked_api.should_receive(:create_meeting).
|
192
|
+
with(room.name, room.meeting_id, room.moderator_password,
|
193
|
+
room.attendee_password, room.welcome_msg).and_return(hash_create)
|
194
|
+
room.server = mocked_server
|
195
|
+
room.send_create
|
196
|
+
|
197
|
+
room.attendee_password.should == attendee_password
|
198
|
+
room.moderator_password.should == moderator_password
|
199
|
+
|
200
|
+
# to be sure that the model was saved
|
201
|
+
saved = BigbluebuttonRoom.find(room.id)
|
202
|
+
saved.attendee_password.should == attendee_password
|
203
|
+
saved.moderator_password.should == moderator_password
|
204
|
+
end
|
205
|
+
|
206
|
+
end
|
207
|
+
|
208
|
+
describe "#join_url" do
|
209
|
+
let(:username) { Forgery(:name).full_name }
|
210
|
+
|
211
|
+
it { should respond_to(:join_url) }
|
212
|
+
|
213
|
+
it "with moderator role" do
|
214
|
+
mocked_api.should_receive(:join_meeting_url).
|
215
|
+
with(room.meeting_id, username, room.moderator_password)
|
216
|
+
room.server = mocked_server
|
217
|
+
room.join_url(username, :moderator)
|
218
|
+
end
|
219
|
+
|
220
|
+
it "with attendee role" do
|
221
|
+
mocked_api.should_receive(:join_meeting_url).
|
222
|
+
with(room.meeting_id, username, room.attendee_password)
|
223
|
+
room.server = mocked_server
|
224
|
+
room.join_url(username, :attendee)
|
225
|
+
end
|
226
|
+
|
227
|
+
end
|
228
|
+
|
229
|
+
end
|
230
|
+
|
48
231
|
end
|
@@ -80,4 +80,47 @@ describe BigbluebuttonServer do
|
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
|
+
context "fetching info from bbb" do
|
84
|
+
let(:server) { Factory.create(:bigbluebutton_server) }
|
85
|
+
let(:room1) { Factory.create(:bigbluebutton_room, :server => server, :meeting_id => "room1") }
|
86
|
+
let(:room2) { Factory.create(:bigbluebutton_room, :server => server, :meeting_id => "room2") }
|
87
|
+
before {
|
88
|
+
@api_mock = mock(BigBlueButton::BigBlueButtonApi)
|
89
|
+
server.stub(:api).and_return(@api_mock)
|
90
|
+
}
|
91
|
+
|
92
|
+
# the hashes should be exactly as returned by bigbluebutton-api-ruby to be sure we are testing it right
|
93
|
+
let(:meetings) {
|
94
|
+
[
|
95
|
+
{ :meetingID => room1.meeting_id, :attendeePW=>"ap", :moderatorPW=>"mp", :hasBeenForciblyEnded => "false", :running => "true"},
|
96
|
+
{ :meetingID => room2.meeting_id, :attendeePW=>"pass", :moderatorPW=>"pass", :hasBeenForciblyEnded => "true", :running => "false"}
|
97
|
+
]
|
98
|
+
}
|
99
|
+
let(:hash) {
|
100
|
+
{ :returncode => "SUCCESS",
|
101
|
+
:meetings => meetings
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
it { should respond_to(:fetch_meetings) }
|
106
|
+
it { should respond_to(:meetings) }
|
107
|
+
|
108
|
+
it "fetches meetings" do
|
109
|
+
@api_mock.should_receive(:get_meetings).and_return(hash)
|
110
|
+
server.fetch_meetings
|
111
|
+
|
112
|
+
server.meetings.count.should be(2)
|
113
|
+
|
114
|
+
server.meetings[0].running.should == true
|
115
|
+
server.meetings[0].has_been_forcibly_ended.should == false
|
116
|
+
server.meetings[0].room.should == room1
|
117
|
+
|
118
|
+
server.meetings[1].running.should == false
|
119
|
+
server.meetings[1].has_been_forcibly_ended.should == true
|
120
|
+
server.meetings[1].room.should == room2
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
|
83
126
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bigbluebutton_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-04-
|
12
|
+
date: 2011-04-08 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
|
-
requirement: &
|
16
|
+
requirement: &81912800 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,21 +21,21 @@ dependencies:
|
|
21
21
|
version: 3.0.3
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *81912800
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: bigbluebutton-api-ruby
|
27
|
-
requirement: &
|
27
|
+
requirement: &81912560 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 0.0.
|
32
|
+
version: 0.0.9
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *81912560
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rspec-rails
|
38
|
-
requirement: &
|
38
|
+
requirement: &81912310 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 2.5.0
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *81912310
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: factory_girl
|
49
|
-
requirement: &
|
49
|
+
requirement: &81912070 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 1.3.2
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *81912070
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: sqlite3-ruby
|
60
|
-
requirement: &
|
60
|
+
requirement: &81911830 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 1.3.3
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *81911830
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: generator_spec
|
71
|
-
requirement: &
|
71
|
+
requirement: &81911560 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: 0.8.2
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *81911560
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: shoulda-matchers
|
82
|
-
requirement: &
|
82
|
+
requirement: &81911280 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ~>
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: 1.0.0.beta
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *81911280
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: forgery
|
93
|
-
requirement: &
|
93
|
+
requirement: &81910980 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ~>
|
@@ -98,7 +98,7 @@ dependencies:
|
|
98
98
|
version: 0.3.7
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *81910980
|
102
102
|
description: BigBlueButton integration for Ruby on Rails
|
103
103
|
email: mconf@googlegroups.com
|
104
104
|
executables: []
|
@@ -135,6 +135,8 @@ files:
|
|
135
135
|
- lib/bigbluebutton_rails/rails.rb
|
136
136
|
- lib/bigbluebutton_rails/rails/routes.rb
|
137
137
|
- lib/bigbluebutton_rails/version.rb
|
138
|
+
- lib/classes/bigbluebutton_attendee.rb
|
139
|
+
- lib/classes/bigbluebutton_meeting.rb
|
138
140
|
- lib/generators/bigbluebutton_rails/install_generator.rb
|
139
141
|
- lib/generators/bigbluebutton_rails/public_generator.rb
|
140
142
|
- lib/generators/bigbluebutton_rails/templates/migration.rb
|
@@ -143,6 +145,8 @@ files:
|
|
143
145
|
- lib/generators/bigbluebutton_rails/templates/public/javascripts/jquery.min.js
|
144
146
|
- lib/generators/bigbluebutton_rails/views_generator.rb
|
145
147
|
- spec/bigbluebutton_rails_spec.rb
|
148
|
+
- spec/classes/bigbluebutton_attendee_spec.rb
|
149
|
+
- spec/classes/bigbluebutton_meeting_spec.rb
|
146
150
|
- spec/controllers/bigbluebutton/rooms_controller_spec.rb
|
147
151
|
- spec/controllers/bigbluebutton/servers_controller_spec.rb
|
148
152
|
- spec/factories/bigbluebutton_room.rb
|
@@ -215,7 +219,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
215
219
|
version: '0'
|
216
220
|
segments:
|
217
221
|
- 0
|
218
|
-
hash: -
|
222
|
+
hash: -956916625
|
219
223
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
220
224
|
none: false
|
221
225
|
requirements:
|
@@ -224,7 +228,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
224
228
|
version: '0'
|
225
229
|
segments:
|
226
230
|
- 0
|
227
|
-
hash: -
|
231
|
+
hash: -956916625
|
228
232
|
requirements: []
|
229
233
|
rubyforge_project:
|
230
234
|
rubygems_version: 1.7.2
|