From d1b81a385fdc3b83dab44817898d17b8e43c88da Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 18 Jun 2018 14:55:01 -0400 Subject: [PATCH] add more model tests --- Gemfile | 1 + Gemfile.lock | 3 + app/models/room.rb | 11 +--- config/cable.yml | 2 +- sample.env | 1 - spec/models/room_spec.rb | 120 ++++++++++++++++++++++++++++++++++++++- spec/models/user_spec.rb | 33 ++++++++++- spec/rails_helper.rb | 2 + 8 files changed, 157 insertions(+), 16 deletions(-) diff --git a/Gemfile b/Gemfile index b5e7d992..2a7e0a48 100644 --- a/Gemfile +++ b/Gemfile @@ -75,6 +75,7 @@ end group :test do # Include Rspec and other testing utilities. gem 'rspec-rails', '~> 3.7' + gem 'action-cable-testing' gem 'shoulda-matchers', '~> 3.1' gem 'faker' gem "factory_bot_rails" diff --git a/Gemfile.lock b/Gemfile.lock index 1d04d2d2..97de67ad 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,6 +1,8 @@ GEM remote: https://rubygems.org/ specs: + action-cable-testing (0.3.1) + actioncable (~> 5.0) actioncable (5.0.7) actionpack (= 5.0.7) nio4r (>= 1.2, < 3.0) @@ -240,6 +242,7 @@ PLATFORMS ruby DEPENDENCIES + action-cable-testing bcrypt (~> 3.1.7) bigbluebutton-api-ruby bootstrap (~> 4.1.1) diff --git a/app/models/room.rb b/app/models/room.rb index 7467d374..d9b0c5f2 100644 --- a/app/models/room.rb +++ b/app/models/room.rb @@ -135,21 +135,12 @@ class Room < ApplicationRecord def update_recording(record_id, meta) meta.merge!({recordID: record_id}) - bbb.send_api_request("updateRecordings", meta) end # Deletes a recording from a room. def delete_recording(record_id) - res = bbb.delete_recordings(record_id) - - if res[:returncode] - # Handle successful deletion. - - else - # Handle unsuccessful deletion. - - end + bbb.delete_recordings(record_id) end private diff --git a/config/cable.yml b/config/cable.yml index 0bbde6f7..2e672deb 100644 --- a/config/cable.yml +++ b/config/cable.yml @@ -2,7 +2,7 @@ development: adapter: async test: - adapter: async + adapter: test production: adapter: redis diff --git a/sample.env b/sample.env index 968effee..4b0fae9c 100644 --- a/sample.env +++ b/sample.env @@ -10,7 +10,6 @@ # SECRET_KEY_BASE= - # The endpoint and secret for your BigBlueButton server. # Set these if you are running GreenLight on a single BigBlueButton server. # You can retrive these by running the following command on your BigBlueButton server: diff --git a/spec/models/room_spec.rb b/spec/models/room_spec.rb index 0ad8fe31..7e9361a0 100644 --- a/spec/models/room_spec.rb +++ b/spec/models/room_spec.rb @@ -1,14 +1,19 @@ require "rails_helper" +require 'bigbluebutton_api' describe Room, type: :model do - before { @room = create(:room) } + + before { + @user = create(:user) + @room = @user.main_room + } context 'validations' do - it { should validate_presence_of :name } + it { should validate_presence_of(:name) } end context 'associations' do - it { should belong_to(:owner).class_name("User") } + it { should belong_to(:owner).class_name("User").with_foreign_key("user_id") } end context '#setup' do @@ -24,4 +29,113 @@ describe Room, type: :model do end end + context "#invite_path" do + it "should have correct invite path" do + expect(@room.invite_path).to eq("/#{@room.uid}") + end + end + + context "#owned_by?" do + it "should return true for correct owner" do + expect(@room.owned_by?(@user)).to be true + end + + it "should return false for incorrect owner" do + expect(@room.owned_by?(create(:user))).to be false + end + end + + context "#is_running?" do + it "should return false when not running" do + expect(@room.is_running?).to be false + end + + it "should return true when running" do + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:is_meeting_running?).and_return(true) + expect(@room.is_running?).to be true + end + end + + context "#start_session" do + it "should update latest session info" do + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:create_meeting).and_return(true) + + expect{ + @room.start_session + }.to change { + @room.sessions + }.by(1) + + expect(@room.last_session.utc.to_i).to eq(Time.now.to_i) + end + end + + context "#join_path" do + it "should return correct join URL for user" do + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:get_meeting_info).and_return({ + attendeePW: "testpass" + }) + + endpoint = Rails.configuration.bigbluebutton_endpoint + secret = Rails.configuration.bigbluebutton_secret + fullname = "fullName=Example" + html = if Rails.configuration.html5_enabled then "&joinViaHtml5=true" else "" end + meetingID = "&meetingID=#{@room.bbb_id}" + password = "&password=testpass" + + query = fullname + html + meetingID + password + checksum_string = "join#{query + secret}" + + checksum = OpenSSL::Digest.digest('sha1', checksum_string).unpack("H*").first + + expect(@room.join_path("Example")).to eql( + "#{endpoint}join?#{query}&checksum=#{checksum}" + ) + end + end + + context "#notify_waiting" do + it "should broadcast to waiting channel with started action" do + expect{ + @room.notify_waiting + }.to have_broadcasted_to("#{@room.uid}_waiting_channel").with(a_hash_including(action: "started")) + end + end + + context "#participants" do + it "should link participants to accounts" do + user1 = create(:user) + user2 = create(:user) + + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:get_meeting_info).and_return({ + attendees: [ + {userID: user1.uid, fullName: user1.name}, + {userID: "non-matching-uid", fullName: "Guest User"}, + {userID: user2.uid, fullName: user2.name} + ] + }) + + expect(@room.participants).to contain_exactly(user1, nil, user2) + end + end + + context "#recordings" do + it "should properly find meeting recordings" do + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:get_recordings).and_return({ + recordings: [ + { + name: "Example", + playback: { + format: "presentation" + } + }, + ] + }) + + expect(@room.recordings).to contain_exactly({ + name: "Example", + playbacks: ["presentation"] + }) + end + end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 3ec7907e..b5aef16c 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -20,9 +20,13 @@ describe User, type: :model do it { should_not allow_value("invalid.txt").for(:image) } it { should allow_value("", nil).for(:image) } + it "should convert email to downcase on save" do + user = create(:user, email: "EXAMPLE@EXAMPLE.COM") + expect(user.email).to eq("example@example.com") + end + context 'is greenlight account' do before { allow(subject).to receive(:greenlight_account?).and_return(true) } - it { should validate_presence_of(:password) } it { should validate_length_of(:password).is_at_least(6) } end @@ -50,6 +54,33 @@ describe User, type: :model do end end + context '#from_omniauth' do + it "should create user from omniauth" do + auth = { + "uid" => "123456789", + "provider" => "twitter", + "info" => { + "name" => "Test Name", + "nickname" => "username", + "email" => "test@example.com", + "image" => "example.png" + } + } + + expect { + user = User.from_omniauth(auth) + + expect(user.name).to eq("Test Name") + expect(user.email).to eq("test@example.com") + expect(user.image).to eq("example.png") + expect(user.provider).to eq("twitter") + expect(user.social_uid).to eq("123456789") + }.to change { + User.count + }.by(1) + end + end + context '#first_name' do it 'properly finds the users first name' do user = create(:user, name: "Example User") diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 6c4f2f18..853cb7e1 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -8,6 +8,8 @@ abort("The Rails environment is running in production mode!") if Rails.env.produ require 'rspec/rails' # Add additional requires below this line. Rails is not loaded until this point! +require "action_cable/testing/rspec" + # Requires supporting ruby files with custom matchers and macros, etc, in # spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are # run as spec files by default. This means that files in spec/support that end