bigbluebutton_rails 0.0.4 → 0.0.5

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.
Files changed (74) hide show
  1. data/.gitignore +2 -1
  2. data/CHANGELOG.rdoc +12 -0
  3. data/Gemfile.lock +53 -14
  4. data/README.rdoc +31 -29
  5. data/Rakefile +63 -11
  6. data/app/controllers/bigbluebutton/rooms_controller.rb +89 -26
  7. data/app/controllers/bigbluebutton/servers_controller.rb +38 -5
  8. data/app/helpers/bigbluebutton_rails_helper.rb +12 -0
  9. data/app/models/bigbluebutton_room.rb +44 -1
  10. data/app/models/bigbluebutton_server.rb +48 -12
  11. data/app/views/bigbluebutton/rooms/_form.html.erb +8 -0
  12. data/app/views/bigbluebutton/rooms/index.html.erb +34 -43
  13. data/app/views/bigbluebutton/rooms/join_mobile.html.erb +9 -0
  14. data/app/views/bigbluebutton/rooms/show.html.erb +8 -0
  15. data/app/views/bigbluebutton/servers/_activity_list.html.erb +48 -0
  16. data/app/views/bigbluebutton/servers/_form.html.erb +4 -0
  17. data/app/views/bigbluebutton/servers/activity.html.erb +51 -0
  18. data/app/views/bigbluebutton/servers/index.html.erb +21 -25
  19. data/app/views/bigbluebutton/servers/show.html.erb +5 -0
  20. data/bigbluebutton_rails.gemspec +9 -6
  21. data/config/locales/en.yml +11 -2
  22. data/lib/bigbluebutton_rails/controller_methods.rb +47 -14
  23. data/lib/bigbluebutton_rails/exceptions.rb +6 -0
  24. data/lib/bigbluebutton_rails/rails/routes.rb +17 -12
  25. data/lib/bigbluebutton_rails/rails.rb +4 -0
  26. data/lib/bigbluebutton_rails/version.rb +1 -1
  27. data/lib/bigbluebutton_rails.rb +1 -0
  28. data/lib/generators/bigbluebutton_rails/install_generator.rb +28 -5
  29. data/lib/generators/bigbluebutton_rails/templates/migration.rb +3 -0
  30. data/lib/generators/bigbluebutton_rails/templates/migration_0_0_4.rb +38 -0
  31. data/lib/generators/bigbluebutton_rails/templates/migration_0_0_5.rb +23 -0
  32. data/{lib/generators/bigbluebutton_rails/templates/public → public}/images/loading.gif +0 -0
  33. data/{lib/generators/bigbluebutton_rails/templates/public → public}/javascripts/jquery.min.js +0 -0
  34. data/public/stylesheets/bigbluebutton_rails.css +138 -0
  35. data/spec/controllers/bigbluebutton/rooms_controller_spec.rb +284 -25
  36. data/spec/controllers/bigbluebutton/servers_controller_spec.rb +93 -1
  37. data/spec/factories/bigbluebutton_room.rb +1 -0
  38. data/spec/factories/bigbluebutton_server.rb +1 -0
  39. data/spec/factories/integration/bigbluebutton_server_integration.rb +8 -0
  40. data/spec/generators/install_generator_spec.rb +53 -10
  41. data/spec/generators/views_generator_spec.rb +6 -2
  42. data/spec/helpers/bigbluebutton_rails_helper_spec.rb +19 -0
  43. data/spec/integration_conf.yml.example +5 -0
  44. data/spec/models/bigbluebutton_room_spec.rb +99 -72
  45. data/spec/models/bigbluebutton_server_spec.rb +81 -20
  46. data/spec/rails_app/.gitignore +2 -1
  47. data/spec/rails_app/app/views/layouts/application.html.erb +1 -1
  48. data/spec/rails_app/config/cucumber.yml +8 -0
  49. data/spec/rails_app/config/database.yml +4 -1
  50. data/spec/rails_app/db/seeds.rb +6 -5
  51. data/spec/rails_app/features/manage_bigbluebutton_rooms.feature +9 -0
  52. data/spec/rails_app/features/manage_bigbluebutton_servers.feature +9 -0
  53. data/spec/rails_app/features/step_definitions/bigbluebutton_room_steps.rb +38 -0
  54. data/spec/rails_app/features/step_definitions/bigbluebutton_server_steps.rb +23 -0
  55. data/spec/rails_app/features/step_definitions/common_steps.rb +3 -0
  56. data/spec/rails_app/features/step_definitions/web_steps.rb +211 -0
  57. data/spec/rails_app/features/support/content.rb +11 -0
  58. data/spec/rails_app/features/support/env.rb +50 -0
  59. data/spec/rails_app/features/support/env_gem.rb +9 -0
  60. data/spec/rails_app/features/support/paths.rb +38 -0
  61. data/spec/rails_app/features/support/selectors.rb +39 -0
  62. data/spec/rails_app/lib/tasks/cucumber.rake +65 -0
  63. data/spec/rails_app/public/images/loading.gif +0 -0
  64. data/spec/rails_app/public/javascripts/jquery.min.js +16 -0
  65. data/spec/rails_app/public/stylesheets/bigbluebutton_rails.css +138 -0
  66. data/spec/rails_app/script/cucumber +10 -0
  67. data/spec/routing/bigbluebutton/rooms_routing_spec.rb +12 -0
  68. data/spec/spec_helper.rb +0 -1
  69. data/spec/support/integration/integration_conf.rb +16 -0
  70. data/spec/support/matchers/shoulda/respond_with_json_matcher.rb +67 -0
  71. data/spec/support/mocked_server.rb +1 -0
  72. metadata +91 -29
  73. data/lib/generators/bigbluebutton_rails/public_generator.rb +0 -16
  74. data/spec/generators/public_generator_spec.rb +0 -31
@@ -21,6 +21,7 @@ describe Bigbluebutton::RoomsController do
21
21
  it { should respond_with(:success) }
22
22
  it { should assign_to(:server).with(server) }
23
23
  it { should assign_to(:rooms).with(BigbluebuttonRoom.all) }
24
+ it { should render_template(:index) }
24
25
  end
25
26
 
26
27
  describe "#show" do
@@ -28,6 +29,7 @@ describe Bigbluebutton::RoomsController do
28
29
  it { should respond_with(:success) }
29
30
  it { should assign_to(:server).with(server) }
30
31
  it { should assign_to(:room).with(room) }
32
+ it { should render_template(:show) }
31
33
  end
32
34
 
33
35
  describe "#new" do
@@ -35,6 +37,7 @@ describe Bigbluebutton::RoomsController do
35
37
  it { should respond_with(:success) }
36
38
  it { should assign_to(:server).with(server) }
37
39
  it { should assign_to(:room).with_kind_of(BigbluebuttonRoom) }
40
+ it { should render_template(:new) }
38
41
  end
39
42
 
40
43
  describe "#edit" do
@@ -42,6 +45,25 @@ describe Bigbluebutton::RoomsController do
42
45
  it { should respond_with(:success) }
43
46
  it { should assign_to(:server).with(server) }
44
47
  it { should assign_to(:room).with(room) }
48
+ it { should render_template(:edit) }
49
+ end
50
+
51
+ describe "#join_mobile" do
52
+ let(:user) { Factory.build(:user) }
53
+ before {
54
+ mock_server_and_api
55
+ controller.stub(:bigbluebutton_user) { user }
56
+ controller.should_receive(:bigbluebutton_role).and_return(:moderator)
57
+ mocked_api.should_receive(:join_meeting_url).
58
+ with(room.meetingid, user.name, room.moderator_password).
59
+ and_return("http://join_url")
60
+ }
61
+ before(:each) { get :join_mobile, :server_id => mocked_server.to_param, :id => room.to_param }
62
+ it { should respond_with(:success) }
63
+ it { should assign_to(:server).with(mocked_server) }
64
+ it { should assign_to(:room).with(room) }
65
+ it { should assign_to(:join_url).with("bigbluebutton://join_url") }
66
+ it { should render_template(:join_mobile) }
45
67
  end
46
68
 
47
69
  describe "#create" do
@@ -112,7 +134,7 @@ describe Bigbluebutton::RoomsController do
112
134
 
113
135
  describe "#update" do
114
136
  let(:new_room) { Factory.build(:bigbluebutton_room) }
115
- before { @room = room }
137
+ before { @room = room } # need this to trigger let(:room) and actually create the room
116
138
 
117
139
  context "on success" do
118
140
  before :each do
@@ -121,8 +143,9 @@ describe Bigbluebutton::RoomsController do
121
143
  }.not_to change{ BigbluebuttonRoom.count }
122
144
  end
123
145
  it {
146
+ saved = BigbluebuttonRoom.find(@room)
124
147
  should respond_with(:redirect)
125
- should redirect_to bigbluebutton_server_room_path(server, @room)
148
+ should redirect_to bigbluebutton_server_room_path(server, saved)
126
149
  }
127
150
  it {
128
151
  saved = BigbluebuttonRoom.find(@room)
@@ -240,14 +263,24 @@ describe Bigbluebutton::RoomsController do
240
263
  }
241
264
  end
242
265
 
243
- context "for a user without a role" do
266
+ context "when the user's role" do
244
267
  before { controller.stub(:bigbluebutton_user) { user } }
245
- before { controller.stub(:bigbluebutton_role) { nil } }
246
- before(:each) { get :join, :server_id => mocked_server.to_param, :id => room.to_param }
247
- it {
248
- should respond_with(:redirect)
249
- should redirect_to(invite_bigbluebutton_server_room_path(mocked_server, room))
250
- }
268
+
269
+ context "should be defined with a password" do
270
+ before { controller.stub(:bigbluebutton_role) { :password } }
271
+ before(:each) { get :join, :server_id => mocked_server.to_param, :id => room.to_param }
272
+ it { should respond_with(:redirect) }
273
+ it { should redirect_to(invite_bigbluebutton_server_room_path(mocked_server, room)) }
274
+ end
275
+
276
+ context "is undefined, the access should be blocked" do
277
+ before { controller.stub(:bigbluebutton_role) { nil } }
278
+ it {
279
+ lambda {
280
+ get :join, :server_id => mocked_server.to_param, :id => room.to_param
281
+ }.should raise_error(BigbluebuttonRails::RoomAccessDenied)
282
+ }
283
+ end
251
284
  end
252
285
 
253
286
  context do
@@ -289,6 +322,38 @@ describe Bigbluebutton::RoomsController do
289
322
  room.logout_url, room.max_participants, room.voice_bridge)
290
323
  get :join, :server_id => mocked_server.to_param, :id => room.to_param
291
324
  end
325
+
326
+ context "adds the protocol/domain to logout_url" do
327
+ after :each do
328
+ get :join, :server_id => mocked_server.to_param, :id => room.to_param
329
+ end
330
+
331
+ it "when it doesn't have protocol neither domain" do
332
+ room.update_attributes(:logout_url => "/incomplete/url")
333
+ full_logout_url = "http://test.host" + room.logout_url
334
+
335
+ mocked_api.should_receive(:create_meeting).
336
+ with(anything, anything, anything, anything, anything, anything,
337
+ full_logout_url, anything, anything)
338
+ end
339
+
340
+ it "when it doesn't have protocol only" do
341
+ room.update_attributes(:logout_url => "www.host.com/incomplete/url")
342
+ full_logout_url = "http://" + room.logout_url
343
+
344
+ mocked_api.should_receive(:create_meeting).
345
+ with(anything, anything, anything, anything, anything, anything,
346
+ full_logout_url, anything, anything)
347
+ end
348
+
349
+ it "but not when it has a protocol defined" do
350
+ room.update_attributes(:logout_url => "http://with/protocol")
351
+ mocked_api.should_receive(:create_meeting).
352
+ with(anything, anything, anything, anything, anything, anything,
353
+ room.logout_url, anything, anything)
354
+ end
355
+ end
356
+
292
357
  end
293
358
 
294
359
  end
@@ -359,6 +424,7 @@ describe Bigbluebutton::RoomsController do
359
424
  context "room is not running" do
360
425
  before { mocked_api.should_receive(:is_meeting_running?).and_return(false) }
361
426
  before(:each) { get :end, :server_id => mocked_server.to_param, :id => room.to_param }
427
+ it { should respond_with(:redirect) }
362
428
  it { should set_the_flash.to(I18n.t('bigbluebutton_rails.rooms.notice.end.not_running')) }
363
429
  end
364
430
  end
@@ -369,7 +435,7 @@ describe Bigbluebutton::RoomsController do
369
435
 
370
436
  context "for an anonymous user" do
371
437
  before { controller.stub(:bigbluebutton_user).and_return(nil) }
372
-
438
+
373
439
  context "with a role defined" do
374
440
  before { controller.stub(:bigbluebutton_role).and_return(:attendee) }
375
441
  before(:each) { get :invite, :server_id => mocked_server.to_param, :id => room.to_param }
@@ -378,12 +444,23 @@ describe Bigbluebutton::RoomsController do
378
444
  it { should assign_to(:room).with(room) }
379
445
  end
380
446
 
381
- context "without a role" do
382
- before { controller.stub(:bigbluebutton_role).and_return(nil) }
383
- before(:each) { get :invite, :server_id => mocked_server.to_param, :id => room.to_param }
384
- it { should respond_with(:success) }
385
- it { should render_template(:invite) }
386
- it { should assign_to(:room).with(room) }
447
+ context "when the user's role" do
448
+ context "should be defined with a password" do
449
+ before { controller.stub(:bigbluebutton_role) { :password } }
450
+ before(:each) { get :invite, :server_id => mocked_server.to_param, :id => room.to_param }
451
+ it { should respond_with(:success) }
452
+ it { should render_template(:invite) }
453
+ it { should assign_to(:room).with(room) }
454
+ end
455
+
456
+ context "is undefined, the access should be blocked" do
457
+ before { controller.stub(:bigbluebutton_role) { nil } }
458
+ it {
459
+ lambda {
460
+ get :invite, :server_id => mocked_server.to_param, :id => room.to_param
461
+ }.should raise_error(BigbluebuttonRails::RoomAccessDenied)
462
+ }
463
+ end
387
464
  end
388
465
  end
389
466
 
@@ -397,12 +474,23 @@ describe Bigbluebutton::RoomsController do
397
474
  it { should redirect_to(join_bigbluebutton_server_room_path(mocked_server, room)) }
398
475
  end
399
476
 
400
- context "without a role" do
401
- before { controller.stub(:bigbluebutton_role).and_return(nil) }
402
- before(:each) { get :invite, :server_id => mocked_server.to_param, :id => room.to_param }
403
- it { should respond_with(:success) }
404
- it { should render_template(:invite) }
405
- it { should assign_to(:room).with(room) }
477
+ context "when the user's role" do
478
+ context "should be defined with a password" do
479
+ before { controller.stub(:bigbluebutton_role) { :password } }
480
+ before(:each) { get :invite, :server_id => mocked_server.to_param, :id => room.to_param }
481
+ it { should respond_with(:success) }
482
+ it { should render_template(:invite) }
483
+ it { should assign_to(:room).with(room) }
484
+ end
485
+
486
+ context "is undefined, the access should be blocked" do
487
+ before { controller.stub(:bigbluebutton_role) { nil } }
488
+ it {
489
+ lambda {
490
+ get :invite, :server_id => mocked_server.to_param, :id => room.to_param
491
+ }.should raise_error(BigbluebuttonRails::RoomAccessDenied)
492
+ }
493
+ end
406
494
  end
407
495
  end
408
496
 
@@ -415,6 +503,16 @@ describe Bigbluebutton::RoomsController do
415
503
  controller.stub(:bigbluebutton_user).and_return(nil)
416
504
  }
417
505
 
506
+ context "block access if bigbluebutton_role returns nil" do
507
+ let(:hash) { { :name => "Elftor", :password => room.attendee_password } }
508
+ before { controller.stub(:bigbluebutton_role) { nil } }
509
+ it {
510
+ lambda {
511
+ post :auth, :server_id => mocked_server.to_param, :id => room.to_param, :user => hash
512
+ }.should raise_error(BigbluebuttonRails::RoomAccessDenied)
513
+ }
514
+ end
515
+
418
516
  context "if there's a user logged, should use it's name" do
419
517
  let(:hash) { { :name => "Elftor", :password => room.attendee_password } }
420
518
  it do
@@ -437,7 +535,7 @@ describe Bigbluebutton::RoomsController do
437
535
  it { should respond_with(:unauthorized) }
438
536
  it { should assign_to(:room).with(room) }
439
537
  it { should render_template(:invite) }
440
- it { should set_the_flash.to(I18n.t('bigbluebutton_rails.rooms.error.auth.failure')) }
538
+ it { should set_the_flash.to(I18n.t('bigbluebutton_rails.rooms.errors.auth.failure')) }
441
539
  end
442
540
 
443
541
  context "the password is wrong" do
@@ -446,7 +544,7 @@ describe Bigbluebutton::RoomsController do
446
544
  it { should respond_with(:unauthorized) }
447
545
  it { should assign_to(:room).with(room) }
448
546
  it { should render_template(:invite) }
449
- it { should set_the_flash.to(I18n.t('bigbluebutton_rails.rooms.error.auth.failure')) }
547
+ it { should set_the_flash.to(I18n.t('bigbluebutton_rails.rooms.errors.auth.failure')) }
450
548
  end
451
549
 
452
550
  end
@@ -487,7 +585,7 @@ describe Bigbluebutton::RoomsController do
487
585
  post :auth, :server_id => mocked_server.to_param, :id => room.to_param, :user => hash
488
586
  should respond_with(:success)
489
587
  should render_template(:invite)
490
- should set_the_flash.to(I18n.t('bigbluebutton_rails.rooms.error.not_running'))
588
+ should set_the_flash.to(I18n.t('bigbluebutton_rails.rooms.errors.auth.not_running'))
491
589
  end
492
590
  end
493
591
 
@@ -545,6 +643,7 @@ describe Bigbluebutton::RoomsController do
545
643
  it { should assign_to(:server).with(server) }
546
644
  end
547
645
 
646
+ # make sure that the exceptions thrown by bigbluebutton-api-ruby are treated by the controller
548
647
  context "exception handling" do
549
648
  let(:bbb_error_msg) { "err msg" }
550
649
  let(:bbb_error) { BigBlueButton::BigBlueButtonException.new(bbb_error_msg) }
@@ -651,5 +750,165 @@ describe Bigbluebutton::RoomsController do
651
750
 
652
751
  end # exception handling
653
752
 
753
+ # verify all JSON responses
754
+ context "json responses for " do
755
+ describe "#index" do
756
+ before do
757
+ @room1 = Factory.create(:bigbluebutton_room, :server => server)
758
+ @room2 = Factory.create(:bigbluebutton_room, :server => server)
759
+ end
760
+ before(:each) { get :index, :server_id => server.to_param, :format => 'json' }
761
+ it { should respond_with(:success) }
762
+ it { should respond_with_content_type(:json) }
763
+ it { should respond_with_json([@room1, @room2].to_json) }
764
+ end
765
+
766
+ describe "#new" do
767
+ before(:each) { get :new, :server_id => server.to_param, :format => 'json' }
768
+ it { should respond_with(:success) }
769
+ it { should respond_with_content_type(:json) }
770
+ it {
771
+ # we ignore all values bc a BigbluebuttonRoom is generated with some
772
+ # random values (meetingid, voice_bridge)
773
+ should respond_with_json(BigbluebuttonRoom.new.to_json).ignoring_values
774
+ }
775
+ end
776
+
777
+ describe "#show" do
778
+ before(:each) { get :show, :server_id => server.to_param, :id => room.to_param, :format => 'json' }
779
+ it { should respond_with(:success) }
780
+ it { should respond_with_content_type(:json) }
781
+ it { should respond_with_json(room.to_json) }
782
+ end
783
+
784
+ describe "#create" do
785
+ let(:new_room) { Factory.build(:bigbluebutton_room, :server => server) }
786
+
787
+ context "on success" do
788
+ before(:each) {
789
+ post :create, :server_id => server.to_param, :bigbluebutton_room => new_room.attributes, :format => 'json'
790
+ }
791
+ it { should respond_with(:created) }
792
+ it { should respond_with_content_type(:json) }
793
+ it {
794
+ json = { :message => I18n.t('bigbluebutton_rails.rooms.notice.create.success') }.to_json
795
+ should respond_with_json(json)
796
+ }
797
+ end
798
+
799
+ context "on failure" do
800
+ before(:each) {
801
+ new_room.name = nil # invalid
802
+ post :create, :server_id => server.to_param, :bigbluebutton_room => new_room.attributes, :format => 'json'
803
+ }
804
+ it { should respond_with(:unprocessable_entity) }
805
+ it { should respond_with_content_type(:json) }
806
+ it {
807
+ new_room.save # should fail
808
+ should respond_with_json(new_room.errors.full_messages.to_json)
809
+ }
810
+ end
811
+ end
812
+
813
+ describe "#update" do
814
+ let(:new_room) { Factory.build(:bigbluebutton_room) }
815
+ before { @room = room }
816
+
817
+ context "on success" do
818
+ before(:each) {
819
+ put :update, :server_id => server.to_param, :id => @room.to_param, :bigbluebutton_room => new_room.attributes, :format => 'json'
820
+ }
821
+ it { should respond_with(:success) }
822
+ it { should respond_with_content_type(:json) }
823
+ it {
824
+ json = { :message => I18n.t('bigbluebutton_rails.rooms.notice.update.success') }.to_json
825
+ should respond_with_json(json)
826
+ }
827
+ end
828
+
829
+ context "on failure" do
830
+ before(:each) {
831
+ new_room.name = nil # invalid
832
+ put :update, :server_id => server.to_param, :id => @room.to_param, :bigbluebutton_room => new_room.attributes, :format => 'json'
833
+ }
834
+ it { should respond_with(:unprocessable_entity) }
835
+ it { should respond_with_content_type(:json) }
836
+ it {
837
+ new_room.save # should fail
838
+ should respond_with_json(new_room.errors.full_messages.to_json)
839
+ }
840
+ end
841
+ end
842
+
843
+ describe "#end" do
844
+ before { mock_server_and_api }
845
+
846
+ context "room is running" do
847
+ before {
848
+ mocked_api.should_receive(:is_meeting_running?).and_return(true)
849
+ mocked_api.should_receive(:end_meeting).with(room.meetingid, room.moderator_password)
850
+ }
851
+ before(:each) { get :end, :server_id => mocked_server.to_param, :id => room.to_param, :format => 'json' }
852
+ it { should respond_with(:success) }
853
+ it { should respond_with_content_type(:json) }
854
+ it { should respond_with_json(I18n.t('bigbluebutton_rails.rooms.notice.end.success')) }
855
+ end
856
+
857
+ context "room is not running" do
858
+ before { mocked_api.should_receive(:is_meeting_running?).and_return(false) }
859
+ before(:each) { get :end, :server_id => mocked_server.to_param, :id => room.to_param, :format => 'json' }
860
+ it { should respond_with(:error) }
861
+ it { should respond_with_content_type(:json) }
862
+ it { should respond_with_json(I18n.t('bigbluebutton_rails.rooms.notice.end.not_running')) }
863
+ end
864
+
865
+ context "throwing an exception" do
866
+ let(:msg) { "any error message" }
867
+ before {
868
+ mocked_api.should_receive(:is_meeting_running?).and_return{ raise BigBlueButton::BigBlueButtonException.new(msg) }
869
+ }
870
+ before(:each) { get :end, :server_id => mocked_server.to_param, :id => room.to_param, :format => 'json' }
871
+ it { should respond_with(:error) }
872
+ it { should respond_with_content_type(:json) }
873
+ it { should respond_with_json(msg) }
874
+ end
875
+
876
+ end
877
+
878
+ describe "#destroy" do
879
+ before { mock_server_and_api }
880
+
881
+ context "on success" do
882
+ before {
883
+ mocked_api.should_receive(:is_meeting_running?).and_return(true)
884
+ mocked_api.should_receive(:end_meeting)
885
+ }
886
+ before(:each) {
887
+ delete :destroy, :server_id => mocked_server.to_param, :id => room.to_param, :format => 'json'
888
+ }
889
+ it { should respond_with(:success) }
890
+ it { should respond_with_content_type(:json) }
891
+ it {
892
+ json = { :message => I18n.t('bigbluebutton_rails.rooms.notice.destroy.success') }.to_json
893
+ should respond_with_json(json)
894
+ }
895
+ end
896
+
897
+ context "throwing error" do
898
+ let(:msg) { "any error message" }
899
+ before {
900
+ mocked_api.should_receive(:is_meeting_running?).and_return{ raise BigBlueButton::BigBlueButtonException.new(msg) }
901
+ }
902
+ before(:each) {
903
+ delete :destroy, :server_id => mocked_server.to_param, :id => room.to_param, :format => 'json'
904
+ }
905
+ it { should respond_with(:error) }
906
+ it { should respond_with_content_type(:json) }
907
+ it { should respond_with_json({ :message => msg }.to_json) }
908
+ end
909
+ end
910
+
911
+ end # json responses
912
+
654
913
  end
655
914
 
@@ -51,8 +51,9 @@ describe Bigbluebutton::ServersController do
51
51
  }.not_to change{ BigbluebuttonServer.count }
52
52
  end
53
53
  it {
54
+ saved = BigbluebuttonServer.find(@server)
54
55
  should respond_with(:redirect)
55
- should redirect_to(bigbluebutton_server_path(@server))
56
+ should redirect_to(bigbluebutton_server_path(saved))
56
57
  }
57
58
  it {
58
59
  saved = BigbluebuttonServer.find(@server)
@@ -74,5 +75,96 @@ describe Bigbluebutton::ServersController do
74
75
  }
75
76
  end
76
77
 
78
+ # verify all JSON responses
79
+ context "json responses for " do
80
+
81
+ describe "#index" do
82
+ before do
83
+ @server1 = Factory.create(:bigbluebutton_server)
84
+ @server2 = Factory.create(:bigbluebutton_server)
85
+ end
86
+ before(:each) { get :index, :format => 'json' }
87
+ it { should respond_with(:success) }
88
+ it { should respond_with_content_type(:json) }
89
+ it { should respond_with_json([@server1, @server2].to_json) }
90
+ end
91
+
92
+ describe "#new" do
93
+ before(:each) { get :new, :format => 'json' }
94
+ it { should respond_with(:success) }
95
+ it { should respond_with_content_type(:json) }
96
+ it { should respond_with_json(BigbluebuttonServer.new.to_json).ignoring_values }
97
+ end
98
+
99
+ describe "#show" do
100
+ before(:each) { get :show, :id => server.to_param, :format => 'json' }
101
+ it { should respond_with(:success) }
102
+ it { should respond_with_content_type(:json) }
103
+ it { should respond_with_json(server.to_json) }
104
+ end
105
+
106
+ describe "#create" do
107
+ let(:new_server) { Factory.build(:bigbluebutton_server) }
108
+
109
+ context "on success" do
110
+ before(:each) {
111
+ post :create, :bigbluebutton_server => new_server.attributes, :format => 'json'
112
+ }
113
+ it { should respond_with(:created) }
114
+ it { should respond_with_content_type(:json) }
115
+ it { should respond_with_json(new_server.to_json).ignoring_attributes }
116
+ end
117
+
118
+ context "on failure" do
119
+ before(:each) {
120
+ new_server.url = nil # invalid
121
+ post :create, :bigbluebutton_server => new_server.attributes, :format => 'json'
122
+ }
123
+ it { should respond_with(:unprocessable_entity) }
124
+ it { should respond_with_content_type(:json) }
125
+ it {
126
+ new_server.save # should fail
127
+ should respond_with_json(new_server.errors.full_messages.to_json)
128
+ }
129
+ end
130
+ end
131
+
132
+ describe "#update" do
133
+ let(:new_server) { Factory.build(:bigbluebutton_server) }
134
+ before { @server = server }
135
+
136
+ context "on success" do
137
+ before(:each) {
138
+ put :update, :id => @server.to_param, :bigbluebutton_server => new_server.attributes, :format => 'json'
139
+ }
140
+ it { should respond_with(:success) }
141
+ it { should respond_with_content_type(:json) }
142
+ end
143
+
144
+ context "on failure" do
145
+ before(:each) {
146
+ new_server.url = nil # invalid
147
+ put :update, :id => @server.to_param, :bigbluebutton_server => new_server.attributes, :format => 'json'
148
+ }
149
+ it { should respond_with(:unprocessable_entity) }
150
+ it { should respond_with_content_type(:json) }
151
+ it {
152
+ new_server.save # should fail
153
+ should respond_with_json(new_server.errors.full_messages.to_json)
154
+ }
155
+ end
156
+ end
157
+
158
+ describe "#destroy" do
159
+ before :each do
160
+ @server = server
161
+ delete :destroy, :id => @server.to_param, :format => 'json'
162
+ end
163
+ it { should respond_with(:success) }
164
+ it { should respond_with_content_type(:json) }
165
+ end
166
+
167
+ end # json responses
168
+
77
169
  end
78
170
 
@@ -7,4 +7,5 @@ Factory.define :bigbluebutton_room do |r|
7
7
  r.welcome_msg { Forgery(:lorem_ipsum).sentences(2) }
8
8
  r.private false
9
9
  r.randomize_meetingid false
10
+ r.sequence(:param) { |n| "meeting-#{n}" }
10
11
  end
@@ -3,4 +3,5 @@ Factory.define :bigbluebutton_server do |s|
3
3
  s.sequence(:url) { |n| "http://bigbluebutton#{n}.test.com/bigbluebutton/api" }
4
4
  s.salt { Forgery(:basic).password :at_least => 30, :at_most => 40 }
5
5
  s.version '0.7'
6
+ s.sequence(:param) { |n| "server-#{n}" }
6
7
  end
@@ -0,0 +1,8 @@
1
+ IntegrationConf.load
2
+ config = IntegrationConf.config["server"]
3
+
4
+ Factory.define :bigbluebutton_server_integration, :parent => :bigbluebutton_server do |s|
5
+ s.url { config["url"] }
6
+ s.salt { config["salt"] }
7
+ s.version { config["version"] }
8
+ end
@@ -5,19 +5,62 @@ describe BigbluebuttonRails::Generators::InstallGenerator do
5
5
  destination File.expand_path("../../../tmp", __FILE__)
6
6
  tests BigbluebuttonRails::Generators::InstallGenerator
7
7
 
8
- before(:all) do
9
- prepare_destination
10
- run_generator
8
+ context "standard install" do
9
+ before(:all) do
10
+ prepare_destination
11
+ run_generator
12
+ end
13
+
14
+ it "all files are properly created" do
15
+ assert_migration "db/migrate/create_bigbluebutton_rails.rb"
16
+ assert_file "config/locales/bigbluebutton_rails.en.yml"
17
+ assert_file "public/stylesheets/bigbluebutton_rails.css"
18
+ assert_file "public/javascripts/jquery.min.js"
19
+ assert_file "public/images/loading.gif"
20
+ end
21
+
22
+ it "all files are properly destroyed" do
23
+ run_generator %w(), :behavior => :revoke
24
+ assert_no_file "config/locales/bigbluebutton_rails.en.yml"
25
+ assert_no_migration "db/migrate/create_bigbluebutton_rails.rb"
26
+ assert_no_file "public/stylesheets/bigbluebutton_rails.css"
27
+ assert_no_file "public/javascripts/jquery.min.js"
28
+ assert_no_file "public/images/loading.gif"
29
+ end
11
30
  end
12
31
 
13
- it "all files are properly created" do
14
- assert_migration "db/migrate/create_bigbluebutton_rails.rb"
15
- assert_file "config/locales/bigbluebutton_rails.en.yml"
32
+ context "setting migration-only" do
33
+ before(:all) do
34
+ prepare_destination
35
+ run_generator %w{ --migration-only }
36
+ end
37
+
38
+ it "only the migration is created" do
39
+ assert_migration "db/migrate/create_bigbluebutton_rails.rb"
40
+ assert_no_file "config/locales/bigbluebutton_rails.en.yml"
41
+ assert_no_file "public/stylesheets/bigbluebutton_rails.css"
42
+ assert_no_file "public/javascripts/jquery.min.js"
43
+ assert_no_file "public/images/loading.gif"
44
+ end
16
45
  end
17
46
 
18
- it "all files are properly destroyed" do
19
- run_generator %w(), :behavior => :revoke
20
- assert_no_file "config/locales/bigbluebutton_rails.en.yml"
21
- assert_no_migration "db/migrate/create_bigbluebutton_rails.rb"
47
+ context "migrating to version" do
48
+ before { prepare_destination }
49
+
50
+ ["0.0.4", "0.0.5"].each do |version|
51
+ context "#{version}" do
52
+ before { run_generator [ version ] }
53
+
54
+ it "all files are properly created" do
55
+ assert_migration "db/migrate/bigbluebutton_rails_to_#{version.gsub(".", "_")}.rb"
56
+ end
57
+
58
+ it "all files are properly destroyed" do
59
+ run_generator [ version ], :behavior => :revoke
60
+ assert_no_migration "db/migrate/bigbluebutton_rails_to_#{version.gsub(".", "_")}.rb"
61
+ end
62
+ end
63
+ end
22
64
  end
65
+
23
66
  end
@@ -30,14 +30,18 @@ describe BigbluebuttonRails::Generators::ViewsGenerator do
30
30
 
31
31
  def assert_files(assert_exists=true, scope="bigbluebutton")
32
32
  files = [
33
- "app/views/#{scope}/rooms/edit.html.erb",
34
33
  "app/views/#{scope}/rooms/_form.html.erb",
34
+ "app/views/#{scope}/rooms/edit.html.erb",
35
35
  "app/views/#{scope}/rooms/index.html.erb",
36
+ "app/views/#{scope}/rooms/invite.html.erb",
36
37
  "app/views/#{scope}/rooms/join.html.erb",
38
+ "app/views/#{scope}/rooms/join_mobile.html.erb",
37
39
  "app/views/#{scope}/rooms/new.html.erb",
38
40
  "app/views/#{scope}/rooms/show.html.erb",
39
- "app/views/#{scope}/servers/edit.html.erb",
41
+ "app/views/#{scope}/servers/_activity_list.html.erb",
40
42
  "app/views/#{scope}/servers/_form.html.erb",
43
+ "app/views/#{scope}/servers/activity.html.erb",
44
+ "app/views/#{scope}/servers/edit.html.erb",
41
45
  "app/views/#{scope}/servers/index.html.erb",
42
46
  "app/views/#{scope}/servers/new.html.erb",
43
47
  "app/views/#{scope}/servers/show.html.erb"
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe BigbluebuttonRailsHelper do
4
+
5
+ describe "#qrcode_url" do
6
+ let(:url) { "http://www.google.com" }
7
+ let(:size) { "55x55" }
8
+
9
+ subject { qrcode_url(url, size) }
10
+
11
+ it("uses google charts api") { should match /https:\/\/chart.googleapis.com\/chart\?cht=qr/ }
12
+ it("uses encoded content") { should match /chl=#{CGI::escape(url)}/ }
13
+ it("uses size") { should match /chs=#{size}/ }
14
+ it("uses UTF-8") { should match /choe=UTF-8/ }
15
+ end
16
+
17
+ end
18
+
19
+