bigbluebutton_rails 1.4.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. checksums.yaml +7 -0
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +10 -1
  4. data/CHANGELOG.md +259 -0
  5. data/Gemfile +14 -19
  6. data/Gemfile.lock +194 -188
  7. data/README.md +416 -0
  8. data/Rakefile +12 -12
  9. data/TODO.md +13 -0
  10. data/app/controllers/bigbluebutton/playback_types_controller.rb +44 -0
  11. data/app/controllers/bigbluebutton/recordings_controller.rb +17 -10
  12. data/app/controllers/bigbluebutton/rooms_controller.rb +65 -36
  13. data/app/controllers/bigbluebutton/servers_controller.rb +12 -8
  14. data/app/models/bigbluebutton_metadata.rb +1 -1
  15. data/app/models/bigbluebutton_playback_format.rb +22 -1
  16. data/app/models/bigbluebutton_playback_type.rb +29 -0
  17. data/app/models/bigbluebutton_recording.rb +38 -19
  18. data/app/models/bigbluebutton_room.rb +150 -73
  19. data/app/models/bigbluebutton_room_options.rb +10 -7
  20. data/app/models/bigbluebutton_server.rb +69 -13
  21. data/app/models/bigbluebutton_server_config.rb +49 -0
  22. data/app/views/bigbluebutton/recordings/_form.html.erb +4 -0
  23. data/app/views/bigbluebutton/recordings/_recordings.html.erb +10 -3
  24. data/app/views/bigbluebutton/rooms/_form.html.erb +18 -6
  25. data/app/views/bigbluebutton/rooms/_rooms.html.erb +6 -3
  26. data/app/views/bigbluebutton/rooms/invite.html.erb +5 -5
  27. data/app/views/bigbluebutton/rooms/show.html.erb +18 -6
  28. data/app/views/bigbluebutton/servers/_form.html.erb +1 -1
  29. data/app/views/bigbluebutton/servers/show.html.erb +5 -0
  30. data/app/workers/bigbluebutton_finish_meetings.rb +11 -0
  31. data/app/workers/bigbluebutton_update_recordings.rb +11 -0
  32. data/app/workers/bigbluebutton_update_server_configs.rb +18 -0
  33. data/bigbluebutton_rails.gemspec +8 -7
  34. data/config/locales/en.yml +52 -7
  35. data/config/locales/pt-br.yml +162 -0
  36. data/config/resque/resque.rake +27 -0
  37. data/config/resque/workers_schedule.yml +17 -0
  38. data/lib/bigbluebutton_rails.rb +30 -2
  39. data/lib/bigbluebutton_rails/background_tasks.rb +31 -0
  40. data/lib/bigbluebutton_rails/controller_methods.rb +12 -8
  41. data/lib/bigbluebutton_rails/dial_number.rb +48 -0
  42. data/lib/bigbluebutton_rails/rails/routes.rb +9 -2
  43. data/lib/bigbluebutton_rails/utils.rb +9 -2
  44. data/lib/bigbluebutton_rails/version.rb +1 -1
  45. data/lib/generators/bigbluebutton_rails/install_generator.rb +0 -8
  46. data/lib/generators/bigbluebutton_rails/templates/migration.rb +28 -6
  47. data/lib/generators/bigbluebutton_rails/templates/migration_2_0_0.rb +56 -0
  48. data/lib/tasks/bigbluebutton_rails/meetings.rake +1 -13
  49. data/lib/tasks/bigbluebutton_rails/recordings.rake +1 -12
  50. data/lib/tasks/bigbluebutton_rails/server_configs.rake +10 -0
  51. data/spec/bigbluebutton_rails_spec.rb +0 -13
  52. data/spec/controllers/bigbluebutton/playback_types_controller_spec.rb +76 -0
  53. data/spec/controllers/bigbluebutton/recordings_controller_spec.rb +109 -37
  54. data/spec/controllers/bigbluebutton/rooms_controller_exception_handling_spec.rb +1 -0
  55. data/spec/controllers/bigbluebutton/rooms_controller_json_responses_spec.rb +27 -3
  56. data/spec/controllers/bigbluebutton/rooms_controller_spec.rb +338 -77
  57. data/spec/controllers/bigbluebutton/servers_controller_json_responses_spec.rb +8 -0
  58. data/spec/controllers/bigbluebutton/servers_controller_spec.rb +182 -47
  59. data/spec/factories/bigbluebutton_meeting.rb +2 -2
  60. data/spec/factories/bigbluebutton_playback_format.rb +2 -2
  61. data/spec/factories/bigbluebutton_playback_type.rb +7 -0
  62. data/spec/factories/bigbluebutton_recording.rb +8 -0
  63. data/spec/factories/bigbluebutton_room.rb +10 -3
  64. data/spec/factories/bigbluebutton_server.rb +6 -1
  65. data/spec/factories/bigbluebutton_server_config.rb +6 -0
  66. data/spec/generators/install_generator_spec.rb +0 -16
  67. data/spec/lib/bigbluebutton_rails/background_tasks_spec.rb +61 -0
  68. data/spec/lib/bigbluebutton_rails/dial_number_spec.rb +78 -0
  69. data/spec/lib/bigbluebutton_rails/utils_spec.rb +56 -0
  70. data/spec/lib/tasks/meetings_rake_spec.rb +14 -1
  71. data/spec/lib/tasks/recordings_rake_spec.rb +14 -1
  72. data/spec/models/bigbluebutton_meeting_db_spec.rb +3 -3
  73. data/spec/models/bigbluebutton_meeting_spec.rb +4 -4
  74. data/spec/models/bigbluebutton_playback_format_db_spec.rb +0 -1
  75. data/spec/models/bigbluebutton_playback_format_spec.rb +75 -4
  76. data/spec/models/bigbluebutton_playback_type_db_spec.rb +14 -0
  77. data/spec/models/bigbluebutton_playback_type_spec.rb +76 -0
  78. data/spec/models/bigbluebutton_recording_db_spec.rb +3 -1
  79. data/spec/models/bigbluebutton_recording_spec.rb +234 -58
  80. data/spec/models/bigbluebutton_room_db_spec.rb +8 -6
  81. data/spec/models/bigbluebutton_room_options_db_spec.rb +1 -0
  82. data/spec/models/bigbluebutton_room_options_spec.rb +137 -38
  83. data/spec/models/bigbluebutton_room_spec.rb +540 -153
  84. data/spec/models/bigbluebutton_server_config_spec.rb +115 -0
  85. data/spec/models/bigbluebutton_server_spec.rb +180 -23
  86. data/spec/rails_app/app/controllers/my_playback_types_controller.rb +7 -0
  87. data/spec/rails_app/app/views/frontpage/show.html.erb +1 -0
  88. data/spec/rails_app/app/views/my_playback_types/index.html.erb +33 -0
  89. data/spec/rails_app/config/application.rb +0 -3
  90. data/spec/rails_app/config/database.yml.travis +10 -0
  91. data/spec/rails_app/config/environments/development.rb +1 -6
  92. data/spec/rails_app/config/environments/production.rb +2 -0
  93. data/spec/rails_app/config/environments/test.rb +2 -0
  94. data/spec/rails_app/config/routes.rb +5 -2
  95. data/spec/rails_app/db/seeds.rb +1 -1
  96. data/spec/rails_app/features/config.yml.example +3 -4
  97. data/spec/rails_app/features/join_rooms.feature +14 -14
  98. data/spec/rails_app/features/step_definitions/activity_monitor_servers_step.rb +2 -2
  99. data/spec/rails_app/features/step_definitions/create_rooms_steps.rb +4 -4
  100. data/spec/rails_app/features/step_definitions/destroy_rooms_steps.rb +2 -2
  101. data/spec/rails_app/features/step_definitions/join_rooms_steps.rb +10 -10
  102. data/spec/rails_app/features/step_definitions/web_steps.rb +2 -2
  103. data/spec/rails_app/features/support/configurations.rb +1 -1
  104. data/spec/rails_app/features/support/templates.rb +12 -12
  105. data/spec/rails_app/lib/tasks/db/populate.rake +19 -6
  106. data/spec/routing/bigbluebutton/custom_controllers_routing_spec.rb +1 -1
  107. data/spec/routing/bigbluebutton/recordings_only_routing_spec.rb +2 -2
  108. data/spec/routing/bigbluebutton/recordings_routing_spec.rb +2 -2
  109. data/spec/routing/bigbluebutton/rooms_only_routing_spec.rb +1 -1
  110. data/spec/routing/bigbluebutton/rooms_routing_spec.rb +15 -1
  111. data/spec/routing/bigbluebutton/servers_only_routing_spec.rb +1 -1
  112. data/spec/routing/bigbluebutton/servers_routing_spec.rb +1 -1
  113. data/spec/spec_helper.rb +23 -31
  114. data/spec/support/matchers/delegate_matcher.rb +8 -1
  115. data/spec/support/matchers/shoulda/respond_with_json_matcher.rb +2 -2
  116. data/spec/support/mocked_server.rb +2 -0
  117. data/spec/support/shared_contexts/rake.rb +23 -0
  118. data/spec/workers/bigbluebutton_finish_meetings_spec.rb +14 -0
  119. data/spec/workers/bigbluebutton_update_recordings_spec.rb +14 -0
  120. data/spec/workers/bigbluebutton_update_server_configs_spec.rb +47 -0
  121. metadata +70 -59
  122. data/CHANGELOG.rdoc +0 -111
  123. data/README.rdoc +0 -319
  124. data/TODO.rdoc +0 -16
  125. data/config/schedule.rb +0 -7
@@ -0,0 +1,76 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe BigbluebuttonPlaybackType do
5
+ it "loaded correctly" do
6
+ BigbluebuttonPlaybackType.new.should be_a_kind_of(ActiveRecord::Base)
7
+ end
8
+
9
+ before { FactoryGirl.create(:bigbluebutton_playback_type) }
10
+
11
+ it { should validate_presence_of(:identifier) }
12
+
13
+ it { should_not validate_presence_of(:visible) }
14
+
15
+ it { should have_many(:playback_formats).dependent(:nullify) }
16
+
17
+ context "ensures only 0 or 1 records with default=true" do
18
+ context "automatically sets new records as default=false if setting the current as default=true" do
19
+ let!(:first) { FactoryGirl.create(:bigbluebutton_playback_type, default: true) }
20
+ let!(:target) { FactoryGirl.create(:bigbluebutton_playback_type, default: false) }
21
+ before(:each) {
22
+ target.update_attributes(default: true)
23
+ }
24
+ it { target.reload.default.should be(true) }
25
+ it { first.reload.default.should be(false) }
26
+ end
27
+
28
+ context "doesn't change other records to default=false if not setting the current as default=true" do
29
+ let!(:first) { FactoryGirl.create(:bigbluebutton_playback_type, default: true) }
30
+ let!(:target) { FactoryGirl.create(:bigbluebutton_playback_type, default: false) }
31
+ before(:each) {
32
+ target.update_attributes(identifier: "any")
33
+ }
34
+ it { target.reload.default.should be(false) }
35
+ it { first.reload.default.should be(true) }
36
+ end
37
+
38
+ context "allows all records to have default=false" do
39
+ let!(:first) { FactoryGirl.create(:bigbluebutton_playback_type, default: false) }
40
+ let!(:target) { FactoryGirl.create(:bigbluebutton_playback_type, default: true) }
41
+ before(:each) {
42
+ target.update_attributes(default: false)
43
+ }
44
+ it { target.reload.default.should be(false) }
45
+ it { first.reload.default.should be(false) }
46
+ end
47
+ end
48
+
49
+ describe "#name" do
50
+ let(:subject) { FactoryGirl.create(:bigbluebutton_playback_type) }
51
+
52
+ it {
53
+ subject.identifier = "presentation"
54
+ subject.name.should eql(I18n.t("bigbluebutton_rails.playback_types.presentation.name"))
55
+ }
56
+
57
+ it {
58
+ subject.identifier = "any_other"
59
+ subject.name.should eql("Any Other")
60
+ }
61
+ end
62
+
63
+ describe "#description" do
64
+ let(:subject) { FactoryGirl.create(:bigbluebutton_playback_type) }
65
+
66
+ it {
67
+ subject.identifier = "presentation"
68
+ subject.description.should eql(I18n.t("bigbluebutton_rails.playback_types.presentation.tip"))
69
+ }
70
+
71
+ it {
72
+ subject.identifier = "any_other"
73
+ subject.description.should eql("Any Other")
74
+ }
75
+ end
76
+ end
@@ -16,11 +16,13 @@ describe BigbluebuttonRecording do
16
16
  it { should have_db_column(:description).of_type(:string) }
17
17
  it { should have_db_column(:created_at).of_type(:datetime) }
18
18
  it { should have_db_column(:updated_at).of_type(:datetime) }
19
+ it { should have_db_column(:size).of_type(:integer) }
19
20
  it { should have_db_index(:room_id) }
20
21
  it { should have_db_index(:recordid).unique(true) }
21
22
  it "default values" do
22
23
  room = BigbluebuttonRecording.new
23
- room.published.should be_false
24
+ room.published.should be(false)
25
+ room.size.should be(0)
24
26
  end
25
27
  end
26
28
 
@@ -16,15 +16,17 @@ describe BigbluebuttonRecording do
16
16
  it { should validate_presence_of(:recordid) }
17
17
  it { should validate_uniqueness_of(:recordid) }
18
18
 
19
- [:recordid, :meetingid, :name, :published, :start_time,
20
- :end_time, :available].each do |attribute|
21
- it { should allow_mass_assignment_of(attribute) }
22
- end
23
-
24
19
  it { should have_many(:metadata).dependent(:destroy) }
25
20
 
26
21
  it { should have_many(:playback_formats).dependent(:destroy) }
27
22
 
23
+ describe "#size" do
24
+ # make sure it's a bigint
25
+ it { should allow_value(-9223372036854775808).for(:size) }
26
+ it { should allow_value(0).for(:size) }
27
+ it { should allow_value(9223372036854775807).for(:size) }
28
+ end
29
+
28
30
  context "scopes" do
29
31
 
30
32
  describe "#published" do
@@ -46,6 +48,24 @@ describe BigbluebuttonRecording do
46
48
  }
47
49
  end
48
50
 
51
+ describe "#default_playback_format" do
52
+ let!(:recording) { FactoryGirl.create(:bigbluebutton_recording) }
53
+ let!(:type_default) { FactoryGirl.create(:bigbluebutton_playback_type, default: true) }
54
+ let!(:type_other) { FactoryGirl.create(:bigbluebutton_playback_type, default: false) }
55
+ let!(:format1) { FactoryGirl.create(:bigbluebutton_playback_format, recording: recording, playback_type: type_other) }
56
+ let!(:format2) { FactoryGirl.create(:bigbluebutton_playback_format, recording: recording, playback_type: type_default) }
57
+ let!(:format3) { FactoryGirl.create(:bigbluebutton_playback_format, recording: recording, playback_type: type_other) }
58
+
59
+ context "in a normal situation" do
60
+ it { recording.default_playback_format.should eql(format2) }
61
+ end
62
+
63
+ context "when there's more than one format of the default type" do
64
+ let!(:format4) { FactoryGirl.create(:bigbluebutton_playback_format, recording: recording, playback_type: type_default) }
65
+ it { recording.default_playback_format.should eql(format2) }
66
+ end
67
+ end
68
+
49
69
  describe ".sync" do
50
70
  let(:data) {
51
71
  [
@@ -56,6 +76,7 @@ describe BigbluebuttonRecording do
56
76
  :published => true,
57
77
  :startTime => DateTime.now,
58
78
  :endTime => DateTime.now + 2.hours,
79
+ :size => 100,
59
80
  :metadata => {
60
81
  :course => "Fundamentals of JAVA",
61
82
  :description => "List of recordings",
@@ -96,6 +117,7 @@ describe BigbluebuttonRecording do
96
117
  it { @recording.server.should == new_server }
97
118
  it { @recording.room.should == @room }
98
119
  it { @recording.available.should == true }
120
+ it { @recording.size.should == 100 }
99
121
  it { @recording.metadata.count.should == 3 }
100
122
  3.times do |i|
101
123
  it { @recording.metadata[i].name.should == data[0][:metadata].keys[i].to_s }
@@ -103,6 +125,7 @@ describe BigbluebuttonRecording do
103
125
  end
104
126
  it { @recording.playback_formats.count.should == 2 }
105
127
  2.times do |i|
128
+ it { @recording.playback_formats[i].playback_type.identifier.should == data[0][:playback][:format][i][:type] }
106
129
  it { @recording.playback_formats[i].format_type.should == data[0][:playback][:format][i][:type] }
107
130
  it { @recording.playback_formats[i].url.should == data[0][:playback][:format][i][:url] }
108
131
  it { @recording.playback_formats[i].length.should == data[0][:playback][:format][i][:length] }
@@ -126,6 +149,7 @@ describe BigbluebuttonRecording do
126
149
  it { @recording.server.should == new_server }
127
150
  it { @recording.room.should == @room }
128
151
  it { @recording.available.should == true }
152
+ it { @recording.size.should == 100 }
129
153
  it { @recording.metadata.count.should == 3 }
130
154
  3.times do |i|
131
155
  it { @recording.metadata[i].name.should == data[0][:metadata].keys[i].to_s }
@@ -133,6 +157,7 @@ describe BigbluebuttonRecording do
133
157
  end
134
158
  it { @recording.playback_formats.count.should == 2 }
135
159
  2.times do |i|
160
+ it { @recording.playback_formats[i].playback_type.identifier.should == data[0][:playback][:format][i][:type] }
136
161
  it { @recording.playback_formats[i].format_type.should == data[0][:playback][:format][i][:type] }
137
162
  it { @recording.playback_formats[i].url.should == data[0][:playback][:format][i][:url] }
138
163
  it { @recording.playback_formats[i].length.should == data[0][:playback][:format][i][:length] }
@@ -149,17 +174,46 @@ describe BigbluebuttonRecording do
149
174
  end
150
175
 
151
176
  context "sets recording that are not in the parameters as unavailable" do
152
- before {
153
- # pre-existing recordings that should be marked as unavailable
154
- @r1 = FactoryGirl.create(:bigbluebutton_recording, :available => true)
155
- @r2 = FactoryGirl.create(:bigbluebutton_recording, :available => true)
156
- BigbluebuttonRecording.sync(new_server, data)
157
- @r1.reload
158
- @r2.reload
159
- }
160
- it { BigbluebuttonRecording.count.should == 3 }
161
- it { @r1.available.should == false }
162
- it { @r2.available.should == false }
177
+
178
+ context "for recordings in multiple servers" do
179
+ before {
180
+ BigbluebuttonRecording.delete_all
181
+ @r1 = FactoryGirl.create(:bigbluebutton_recording, :available => true, :server => new_server)
182
+ @r2 = FactoryGirl.create(:bigbluebutton_recording, :available => true, :server => new_server)
183
+ @r3 = FactoryGirl.create(:bigbluebutton_recording, :available => true, :server => FactoryGirl.create(:bigbluebutton_server))
184
+ @r4 = FactoryGirl.create(:bigbluebutton_recording, :available => true, :server => FactoryGirl.create(:bigbluebutton_server))
185
+ BigbluebuttonRecording.sync(new_server, data)
186
+ }
187
+ it { BigbluebuttonRecording.count.should == 5 }
188
+ it ("recording from the target server") { @r1.reload.available.should == false }
189
+ it ("recording from the target server") { @r2.reload.available.should == false }
190
+ it ("recording from another server") { @r3.reload.available.should == true }
191
+ it ("recording from another server") { @r4.reload.available.should == true }
192
+ end
193
+
194
+ context "when there are no recordings in the target server" do
195
+ before {
196
+ new_server.recordings.delete_all
197
+ @r1 = FactoryGirl.create(:bigbluebutton_recording, :available => true, :server => FactoryGirl.create(:bigbluebutton_server))
198
+ @r2 = FactoryGirl.create(:bigbluebutton_recording, :available => true, :server => FactoryGirl.create(:bigbluebutton_server))
199
+ BigbluebuttonRecording.sync(new_server, data)
200
+ }
201
+ it { new_server.recordings.should be_empty }
202
+ it ("recording from another server") { @r1.reload.available.should == true }
203
+ it ("recording from another server") { @r2.reload.available.should == true }
204
+ end
205
+
206
+ context "when there are no recordings in other servers" do
207
+ before {
208
+ BigbluebuttonRecording.delete_all
209
+ @r1 = FactoryGirl.create(:bigbluebutton_recording, :available => true, :server => new_server)
210
+ @r2 = FactoryGirl.create(:bigbluebutton_recording, :available => true, :server => new_server)
211
+ BigbluebuttonRecording.sync(new_server, data)
212
+ }
213
+ it { BigbluebuttonRecording.count.should == 3 }
214
+ it ("recording from another server") { @r1.reload.available.should == false }
215
+ it ("recording from another server") { @r2.reload.available.should == false }
216
+ end
163
217
  end
164
218
 
165
219
  context "works for multiple recordings" do
@@ -206,26 +260,39 @@ describe BigbluebuttonRecording do
206
260
  :published => !old_attrs[:published],
207
261
  :start_time => attrs[:start_time],
208
262
  :end_time => attrs[:end_time],
263
+ :size => attrs[:size],
209
264
  :metadata => { :any => "any" },
210
265
  :playback => { :format => [ { :type => "any1" }, { :type => "any2" } ] }
211
266
  }
212
267
  }
213
268
  let(:new_server) { FactoryGirl.create(:bigbluebutton_server) }
214
269
 
215
- before {
216
- @room = FactoryGirl.create(:bigbluebutton_room, :meetingid => attrs[:meetingid])
217
- BigbluebuttonRecording.should_receive(:sync_additional_data)
218
- .with(recording, data)
219
- BigbluebuttonRecording.send(:update_recording, new_server, recording, data)
220
- }
221
- it { recording.recordid.should == old_attrs[:recordid] } # not updated
222
- it { recording.meetingid.should == attrs[:meetingid] }
223
- it { recording.name.should == attrs[:name] }
224
- it { recording.published.should == !old_attrs[:published] }
225
- it { recording.end_time.utc.to_i.should == attrs[:end_time].utc.to_i }
226
- it { recording.start_time.utc.to_i.should == attrs[:start_time].utc.to_i }
227
- it { recording.server.should == new_server }
228
- it { recording.room.should == @room }
270
+ context "default behavior" do
271
+ before {
272
+ @room = FactoryGirl.create(:bigbluebutton_room, :meetingid => attrs[:meetingid])
273
+ BigbluebuttonRecording.should_receive(:sync_additional_data)
274
+ .with(recording, data)
275
+ BigbluebuttonRecording.send(:update_recording, new_server, recording, data)
276
+ }
277
+ it { recording.recordid.should == old_attrs[:recordid] } # not updated
278
+ it { recording.meetingid.should == attrs[:meetingid] }
279
+ it { recording.name.should == attrs[:name] }
280
+ it { recording.published.should == !old_attrs[:published] }
281
+ it { recording.end_time.utc.to_i.should == attrs[:end_time].utc.to_i }
282
+ it { recording.start_time.utc.to_i.should == attrs[:start_time].utc.to_i }
283
+ it { recording.size.should == attrs[:size] }
284
+ it { recording.server.should == new_server }
285
+ it { recording.room.should == @room }
286
+ end
287
+
288
+ context "works if the recording returned has no :size attribute" do
289
+ before {
290
+ data.delete(:size)
291
+ recording.update_attributes(size: 0)
292
+ BigbluebuttonRecording.send(:update_recording, new_server, recording, data)
293
+ }
294
+ it { recording.size.should == 0 }
295
+ end
229
296
  end
230
297
 
231
298
  describe ".create_recording" do
@@ -309,7 +376,7 @@ describe BigbluebuttonRecording do
309
376
  }
310
377
  }
311
378
 
312
- it "succeds" do
379
+ it "succeeds" do
313
380
  BigbluebuttonRecording.should_receive(:sync_metadata)
314
381
  .with(recording, data[:metadata])
315
382
  BigbluebuttonRecording.should_receive(:sync_playback_formats)
@@ -400,45 +467,87 @@ describe BigbluebuttonRecording do
400
467
  describe ".sync_playback_formats" do
401
468
  let(:recording) { FactoryGirl.create(:bigbluebutton_recording) }
402
469
 
403
- context "with several formats" do
470
+ context "with a single format" do
404
471
  let(:data) {
405
- [ { :type => "any1", :url => "url1", :length => 1 },
406
- { :type => "any2", :url => "url2", :length => 2 } ]
472
+ { :type => "any1", :url => "url1", :length => 1 }
407
473
  }
408
- before {
409
- # one playback format to be updated
410
- FactoryGirl.create(:bigbluebutton_playback_format,
411
- :recording => recording, :format_type => "any1")
412
- # one to be deleted
413
- FactoryGirl.create(:bigbluebutton_playback_format, :recording => recording)
414
474
 
415
- BigbluebuttonRecording.send(:sync_playback_formats, recording, data)
416
- }
417
- it { BigbluebuttonPlaybackFormat.count.should == 2 }
418
- it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id).count.should == 2 }
419
- it { BigbluebuttonPlaybackFormat.find_by_format_type("any1").url.should == "url1" }
420
- it { BigbluebuttonPlaybackFormat.find_by_format_type("any1").length.should == 1 }
421
- it { BigbluebuttonPlaybackFormat.find_by_format_type("any2").url.should == "url2" }
422
- it { BigbluebuttonPlaybackFormat.find_by_format_type("any2").length.should == 2 }
475
+ context "and it's not in the database yet" do
476
+ before {
477
+ BigbluebuttonRecording.send(:sync_playback_formats, recording, data)
478
+ }
479
+ it { BigbluebuttonPlaybackFormat.count.should == 1 }
480
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id).count.should == 1 }
481
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id).last.url.should == "url1" }
482
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id).last.length.should == 1 }
483
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id).last.visible.should be(true) }
484
+ end
485
+
486
+ context "and it's already in the database" do
487
+ before {
488
+ # one playback format to be updated
489
+ playback_type = FactoryGirl.create(:bigbluebutton_playback_type, identifier: "any1", visible: false)
490
+ FactoryGirl.create(:bigbluebutton_playback_format,
491
+ :recording => recording, :playback_type => playback_type)
492
+
493
+ BigbluebuttonRecording.send(:sync_playback_formats, recording, data)
494
+ }
495
+ it { BigbluebuttonPlaybackFormat.count.should == 1 }
496
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id).count.should == 1 }
497
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id).last.url.should == "url1" }
498
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id).last.length.should == 1 }
499
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id).last.visible.should be(false) }
500
+ end
501
+
502
+ context "and there are unused formats in the database" do
503
+ before {
504
+ # formats to be deleted
505
+ FactoryGirl.create(:bigbluebutton_playback_format, :recording => recording)
506
+ FactoryGirl.create(:bigbluebutton_playback_format, :recording => recording)
507
+
508
+ BigbluebuttonRecording.send(:sync_playback_formats, recording, data)
509
+ }
510
+ it { BigbluebuttonPlaybackFormat.count.should == 1 }
511
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id).count.should == 1 }
512
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id).last.url.should == "url1" }
513
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id).last.length.should == 1 }
514
+ end
423
515
  end
424
516
 
425
- context "with a single format" do
517
+ context "with several formats" do
426
518
  let(:data) {
427
- { :type => "any1", :url => "url1", :length => 1 }
519
+ [ { :type => "any1", :url => "url1", :length => 1 },
520
+ { :type => "any2", :url => "url2", :length => 2 },
521
+ { :type => "any3", :url => "url3", :length => 3 } ]
522
+ }
523
+ let(:playback_type) {
524
+ FactoryGirl.create(:bigbluebutton_playback_type, identifier: "any1", visible: true)
525
+ }
526
+ let(:playback_type_hidden) {
527
+ FactoryGirl.create(:bigbluebutton_playback_type, identifier: "any2", visible: false)
428
528
  }
429
529
  before {
430
- # one playback format to be updated
530
+ # two playback formats to be updated
531
+ FactoryGirl.create(:bigbluebutton_playback_format,
532
+ :recording => recording, :playback_type => playback_type)
431
533
  FactoryGirl.create(:bigbluebutton_playback_format,
432
- :recording => recording, :format_type => "any1")
534
+ :recording => recording, :playback_type => playback_type_hidden)
433
535
  # one to be deleted
434
536
  FactoryGirl.create(:bigbluebutton_playback_format, :recording => recording)
435
537
 
436
538
  BigbluebuttonRecording.send(:sync_playback_formats, recording, data)
437
539
  }
438
- it { BigbluebuttonPlaybackFormat.count.should == 1 }
439
- it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id).count.should == 1 }
440
- it { BigbluebuttonPlaybackFormat.find_by_format_type("any1").url.should == "url1" }
441
- it { BigbluebuttonPlaybackFormat.find_by_format_type("any1").length.should == 1 }
540
+ it { BigbluebuttonPlaybackType.count.should == 3 }
541
+ it { BigbluebuttonPlaybackFormat.count.should == 3 }
542
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id).count.should == 3 }
543
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id, :playback_type_id => playback_type.id).first.url.should == "url1" }
544
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id, :playback_type_id => playback_type.id).first.length.should == 1 }
545
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id, :playback_type_id => playback_type.id).first.visible.should be(true) }
546
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id, :playback_type_id => playback_type_hidden.id).first.url.should == "url2" }
547
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id, :playback_type_id => playback_type_hidden.id).first.length.should == 2 }
548
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id, :playback_type_id => playback_type_hidden.id).first.visible.should be(false) }
549
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id, :playback_type_id => BigbluebuttonPlaybackType.last.id).first.url.should == "url3" }
550
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id, :playback_type_id => BigbluebuttonPlaybackType.last.id).first.length.should == 3 }
442
551
  end
443
552
 
444
553
  context "ignores formats with blank type" do
@@ -450,12 +559,79 @@ describe BigbluebuttonRecording do
450
559
  before {
451
560
  BigbluebuttonRecording.send(:sync_playback_formats, recording, data)
452
561
  }
562
+ it { BigbluebuttonPlaybackType.count.should == 1 }
453
563
  it { BigbluebuttonPlaybackFormat.count.should == 1 }
454
564
  it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id).count.should == 1 }
455
- it { BigbluebuttonPlaybackFormat.find_by_format_type("any").url.should == "url2" }
456
- it { BigbluebuttonPlaybackFormat.find_by_format_type("any").length.should == 1 }
565
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id, :playback_type_id => BigbluebuttonPlaybackType.last.id).first.url.should == "url2" }
566
+ it { BigbluebuttonPlaybackFormat.where(:recording_id => recording.id, :playback_type_id => BigbluebuttonPlaybackType.last.id).first.length.should == 1 }
567
+ end
568
+
569
+ context "manages the playback types" do
570
+ let(:data) {
571
+ { :type => "any1", :url => "url1", :length => 1 }
572
+ }
573
+
574
+ context "when the playback type is already on the database" do
575
+ let!(:playback_type) {
576
+ FactoryGirl.create(:bigbluebutton_playback_type, :identifier => "any1")
577
+ }
578
+ before {
579
+ BigbluebuttonRecording.send(:sync_playback_formats, recording, data)
580
+ }
581
+ it { BigbluebuttonPlaybackType.count.should == 1 }
582
+ it { BigbluebuttonPlaybackType.last.should == playback_type }
583
+ end
584
+
585
+ context "when the playback type is not on the database" do
586
+ before {
587
+ BigbluebuttonRecording.send(:sync_playback_formats, recording, data)
588
+ }
589
+ it { BigbluebuttonPlaybackType.count.should == 1 }
590
+ it { BigbluebuttonPlaybackType.last.identifier.should == "any1" }
591
+ it { BigbluebuttonPlaybackType.last.playback_formats.should include(BigbluebuttonPlaybackFormat.last) }
592
+ end
593
+
594
+ context "when there are unused playback types on the database" do
595
+ before {
596
+ FactoryGirl.create(:bigbluebutton_playback_type, :identifier => "any2")
597
+ FactoryGirl.create(:bigbluebutton_playback_type, :identifier => "any3")
598
+ BigbluebuttonRecording.send(:sync_playback_formats, recording, data)
599
+ }
600
+ it { BigbluebuttonPlaybackType.count.should == 1 }
601
+ it { BigbluebuttonPlaybackType.last.identifier.should == "any1" }
602
+ end
457
603
  end
604
+ end
605
+
606
+ describe ".cleanup_playback_types" do
607
+ let(:recording) { FactoryGirl.create(:bigbluebutton_recording) }
458
608
 
609
+ context "when all playback types are in use" do
610
+ before {
611
+ @kept1 = FactoryGirl.create(:bigbluebutton_playback_format, :recording => recording).playback_type
612
+ @kept2 = FactoryGirl.create(:bigbluebutton_playback_format, :recording => recording).playback_type
613
+
614
+ BigbluebuttonRecording.send(:cleanup_playback_types)
615
+ }
616
+ it { BigbluebuttonPlaybackType.count.should == 2 }
617
+ it { BigbluebuttonPlaybackType.all.should include(@kept1) }
618
+ it { BigbluebuttonPlaybackType.all.should include(@kept2) }
619
+ end
620
+
621
+ context "when there are unused playback types" do
622
+ before {
623
+ @removed1 = FactoryGirl.create(:bigbluebutton_playback_type)
624
+ @removed2 = FactoryGirl.create(:bigbluebutton_playback_type)
625
+ @kept1 = FactoryGirl.create(:bigbluebutton_playback_format, :recording => recording).playback_type
626
+
627
+ BigbluebuttonRecording.send(:cleanup_playback_types)
628
+ }
629
+
630
+ it { BigbluebuttonPlaybackType.count.should == 1 }
631
+ it { BigbluebuttonPlaybackType.all.should include(@kept1) }
632
+ it { BigbluebuttonPlaybackType.all.should_not include(@removed1) }
633
+ it { BigbluebuttonPlaybackType.all.should_not include(@removed2) }
634
+ end
459
635
  end
460
636
 
461
637
  describe ".find_matching_meeting" do