146 lines
5.0 KiB
Ruby
146 lines
5.0 KiB
Ruby
require 'rails_helper'
|
|
|
|
RSpec.describe ZoomUser, type: :model do
|
|
describe 'associations' do
|
|
it { is_expected.to have_many(:zoom_meetings).dependent(:nullify) }
|
|
end
|
|
|
|
describe "enums" do
|
|
it { is_expected.to define_enum_for(:tier).with_values([:basic, :pro]) }
|
|
end
|
|
|
|
describe 'callbacks' do
|
|
let(:zoom_user) { build(:zoom_user) }
|
|
|
|
context '#after_create' do
|
|
it 'triggers create_api_user' do
|
|
allow(zoom_user).to receive(:create_api_user)
|
|
|
|
zoom_user.run_callbacks(:create)
|
|
expect(zoom_user).to have_received(:create_api_user)
|
|
end
|
|
|
|
it 'assigns api_id' do
|
|
allow_any_instance_of(ZoomGateway).to receive(:create_host).and_return("retrieved_api_id")
|
|
|
|
zoom_user.save
|
|
expect(zoom_user.api_id).to eq "retrieved_api_id"
|
|
end
|
|
|
|
it 'assigns current account number' do
|
|
allow_any_instance_of(ZoomGateway).to receive(:create_host).and_return("retrieved_api_id")
|
|
ENV['ZOOM_ACCOUNT_NUMBER'] = 'xxx-yyy-zzz'
|
|
|
|
zoom_user.save
|
|
expect(zoom_user.account_number).to eq 'xxx-yyy-zzz'
|
|
end
|
|
end
|
|
|
|
context '#before_destroy' do
|
|
pending 'aborts if there is api_id assigned'
|
|
end
|
|
end
|
|
|
|
describe 'scopes' do
|
|
context '.current_account' do
|
|
before do
|
|
create_list(:zoom_user, 10, :with_api_id, account_number: 'first-account-id')
|
|
create_list(:zoom_user, 25, :with_api_id, account_number: 'second-account-id')
|
|
end
|
|
|
|
it 'only returns users from currently set account' do
|
|
ENV['ZOOM_ACCOUNT_NUMBER'] = 'first-account-id'
|
|
expect(ZoomUser.current_account.count).to eq 10
|
|
expect(ZoomUser.current_account.pluck(:account_number).uniq.count).to eq 1
|
|
expect(ZoomUser.current_account.pluck(:account_number).uniq.first).to eq 'first-account-id'
|
|
end
|
|
end
|
|
|
|
context '.free' do
|
|
let(:free_user) { create(:zoom_user, :with_api_id) }
|
|
let(:busy_user) { create(:zoom_user, :with_api_id) }
|
|
let(:second_busy_user) { create(:zoom_user, :with_api_id) }
|
|
let!(:meeting_started) { create(:zoom_meeting, zoom_user: busy_user, status: :started) }
|
|
let!(:meeting_created) { create(:zoom_meeting, zoom_user: second_busy_user, status: :created) }
|
|
|
|
it 'returns only the users without started / created meetings' do
|
|
users = ZoomUser.free
|
|
|
|
expect(users).to include(free_user)
|
|
expect(users).not_to include(busy_user)
|
|
expect(users).not_to include(second_busy_user)
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
describe '.current_account?' do
|
|
let(:zoom_user) { create(:zoom_user, :with_api_id, account_number: 'xxx-xxx-xxx') }
|
|
|
|
it 'returns true if it belongs to currently set account' do
|
|
ENV['ZOOM_ACCOUNT_NUMBER'] = 'xxx-xxx-xxx'
|
|
expect(zoom_user.current_account?).to be_truthy
|
|
end
|
|
|
|
it 'returns false if it doesn\'t belong to currently set account' do
|
|
ENV['ZOOM_ACCOUNT_NUMBER'] = 'yyy-yyy-yyy'
|
|
expect(zoom_user.current_account?).to be_falsey
|
|
end
|
|
end
|
|
|
|
|
|
context 'static methods' do
|
|
describe '.generate_api_email' do
|
|
it 'contains @' do
|
|
expect(ZoomUser.generate_api_email).to include('@')
|
|
end
|
|
end
|
|
|
|
describe '.for_new_meeting' do
|
|
let(:a_basic) { create(:zoom_user, :with_api_id, account_number: 'aaa', tier: :basic) }
|
|
let(:b_basic) { create(:zoom_user, :with_api_id, account_number: 'bbb', tier: :basic) }
|
|
let(:a_pro) { create(:zoom_user, :with_api_id, account_number: 'aaa', tier: :pro) }
|
|
let(:b_pro) { create(:zoom_user, :with_api_id, account_number: 'bbb', tier: :pro) }
|
|
|
|
it 'picks free user of requested type from current account' do
|
|
[a_basic, a_pro, b_basic, b_pro]
|
|
|
|
stub_env_variables(ZOOM_USER_TYPE: 'basic', ZOOM_ACCOUNT_NUMBER: 'aaa')
|
|
expect(ZoomUser.for_new_meeting).to eq(a_basic)
|
|
|
|
stub_env_variables(ZOOM_USER_TYPE: 'pro', ZOOM_ACCOUNT_NUMBER: 'aaa')
|
|
expect(ZoomUser.for_new_meeting).to eq(a_pro)
|
|
|
|
stub_env_variables(ZOOM_USER_TYPE: 'basic', ZOOM_ACCOUNT_NUMBER: 'bbb')
|
|
expect(ZoomUser.for_new_meeting).to eq(b_basic)
|
|
|
|
stub_env_variables(ZOOM_USER_TYPE: 'pro', ZOOM_ACCOUNT_NUMBER: 'bbb')
|
|
expect(ZoomUser.for_new_meeting).to eq(b_pro)
|
|
end
|
|
|
|
context 'no free user' do
|
|
before do
|
|
allow_any_instance_of(ZoomGateway).to receive(:create_host).and_return('host-id')
|
|
end
|
|
|
|
it 'creates new user if there is no requested user free available under account' do
|
|
[a_basic, a_pro, b_basic]
|
|
stub_env_variables(ZOOM_USER_TYPE: 'pro', ZOOM_ACCOUNT_NUMBER: 'bbb')
|
|
|
|
expect_any_instance_of(ZoomGateway).to receive(:create_host)
|
|
ZoomUser.for_new_meeting
|
|
end
|
|
|
|
it 'creates new user if requested user is busy' do
|
|
[a_basic, a_pro, b_basic, b_pro]
|
|
stub_env_variables(ZOOM_USER_TYPE: 'pro', ZOOM_ACCOUNT_NUMBER: 'aaa')
|
|
create(:zoom_meeting, zoom_user: a_pro, status: :started)
|
|
|
|
expect_any_instance_of(ZoomGateway).to receive(:create_host)
|
|
ZoomUser.for_new_meeting
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|