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 CHANGED
@@ -1,4 +1,10 @@
1
- == 0.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.1)
5
- bigbluebutton-api-ruby (~> 0.0.8)
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.5)
13
- actionpack (= 3.0.5)
12
+ actionmailer (3.0.6)
13
+ actionpack (= 3.0.6)
14
14
  mail (~> 2.2.15)
15
- actionpack (3.0.5)
16
- activemodel (= 3.0.5)
17
- activesupport (= 3.0.5)
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.4)
20
+ i18n (~> 0.5.0)
21
21
  rack (~> 1.2.1)
22
- rack-mount (~> 0.6.13)
22
+ rack-mount (~> 0.6.14)
23
23
  rack-test (~> 0.5.7)
24
24
  tzinfo (~> 0.3.23)
25
- activemodel (3.0.5)
26
- activesupport (= 3.0.5)
25
+ activemodel (3.0.6)
26
+ activesupport (= 3.0.6)
27
27
  builder (~> 2.1.2)
28
- i18n (~> 0.4)
29
- activerecord (3.0.5)
30
- activemodel (= 3.0.5)
31
- activesupport (= 3.0.5)
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.5)
35
- activemodel (= 3.0.5)
36
- activesupport (= 3.0.5)
37
- activesupport (3.0.5)
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.8)
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.5)
66
- actionmailer (= 3.0.5)
67
- actionpack (= 3.0.5)
68
- activerecord (= 3.0.5)
69
- activeresource (= 3.0.5)
70
- activesupport (= 3.0.5)
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.5)
73
- railties (3.0.5)
74
- actionpack (= 3.0.5)
75
- activesupport (= 3.0.5)
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
- bbb_end_meeting if bbb_is_meeting_running?
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
- bbb_create_room unless bbb_is_meeting_running?
96
- join_url = bbb_join_url(bigbluebutton_user.name, role)
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 bbb_is_meeting_running?
103
- join_url = bbb_join_url(bigbluebutton_user.name, role)
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
- run = bbb_is_meeting_running?
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: "#{run}" }
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
- if bbb_is_meeting_running?
140
- bbb_end_meeting
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
@@ -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.8")
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")
@@ -1,3 +1,3 @@
1
1
  module BigbluebuttonRails
2
- VERSION = "0.0.1".freeze
2
+ VERSION = "0.0.2".freeze
3
3
  end
@@ -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.rb'
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).with(@server_mock.id.to_s).and_return(@server_mock)
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
- is_at_least(1).is_at_most(100) }
40
- it { should ensure_length_of(:name).
41
- is_at_least(1).is_at_most(150) }
42
- it { should ensure_length_of(:attendee_password).
43
- is_at_most(50) }
44
- it { should ensure_length_of(:moderator_password).
45
- is_at_most(50) }
46
- it { should ensure_length_of(:welcome_msg).
47
- is_at_most(250) }
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.1
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-06 00:00:00.000000000Z
12
+ date: 2011-04-08 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &71699830 !ruby/object:Gem::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: *71699830
24
+ version_requirements: *81912800
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: bigbluebutton-api-ruby
27
- requirement: &71699510 !ruby/object:Gem::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.8
32
+ version: 0.0.9
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *71699510
35
+ version_requirements: *81912560
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec-rails
38
- requirement: &71699160 !ruby/object:Gem::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: *71699160
46
+ version_requirements: *81912310
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: factory_girl
49
- requirement: &71698840 !ruby/object:Gem::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: *71698840
57
+ version_requirements: *81912070
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: sqlite3-ruby
60
- requirement: &71698470 !ruby/object:Gem::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: *71698470
68
+ version_requirements: *81911830
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: generator_spec
71
- requirement: &71698150 !ruby/object:Gem::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: *71698150
79
+ version_requirements: *81911560
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: shoulda-matchers
82
- requirement: &71697870 !ruby/object:Gem::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: *71697870
90
+ version_requirements: *81911280
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: forgery
93
- requirement: &71697580 !ruby/object:Gem::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: *71697580
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: -460721389
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: -460721389
231
+ hash: -956916625
228
232
  requirements: []
229
233
  rubyforge_project:
230
234
  rubygems_version: 1.7.2