bigbluebutton_rails 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
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
+