bigbluebutton_rails 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/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
|