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 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