Files
old-holivud2/spec/models/user_spec.rb
2020-05-31 22:38:19 +02:00

154 lines
5.1 KiB
Ruby

require "rails_helper"
RSpec.describe User, type: :model do
describe "associations" do
it { is_expected.to have_many(:accounts).through(:account_auths) }
it { is_expected.to have_many(:account_auths).dependent(:destroy) }
it { is_expected.to have_many(:project_memberships).dependent(:destroy) }
end
describe "validations" do
it { is_expected.to validate_presence_of(:email) }
it { is_expected.to validate_presence_of(:password_digest) }
it { is_expected.to validate_presence_of(:time_zone) }
describe "#email uniqueness validation" do
subject { build(:user) }
it { is_expected.to validate_uniqueness_of(:email) }
end
end
describe "#associate?" do
it "returns true if the user is an associate for the given account" do
account_auth = create(:account_auth, role: :associate)
user = account_auth.user
account = account_auth.account
expect(user.associate?(account)).to be_truthy
end
context "when user does not belong to the given account" do
it "raises an error" do
account = build(:account)
user = build(:user)
expect { user.associate?(account) }.to raise_error(ActiveRecord::RecordNotFound)
end
end
end
describe "#manager?" do
it "returns true if the user is a project manager for the given account" do
account_auth = create(:account_auth, role: :project_manager)
user = account_auth.user
account = account_auth.account
expect(user.manager?(account)).to be_truthy
end
context "when user does not belong to the given account" do
it "raises an error" do
account = build(:account)
user = build(:user)
expect { user.manager?(account) }.to raise_error(ActiveRecord::RecordNotFound)
end
end
end
describe "#account_manager?" do
it "returns true if the user is an account manager for the given account" do
account_auth = create(:account_auth, role: :account_manager)
user = account_auth.user
account = account_auth.account
expect(user.account_manager?(account)).to be_truthy
end
context "when user does not belong to the given account" do
it "raises an error" do
account = build(:account)
user = build(:user)
expect { user.account_manager?(account) }.to raise_error(ActiveRecord::RecordNotFound)
end
end
end
describe "#role_for" do
it "returns the name of the role for the given account" do
account_auth = create(:account_auth, role: :associate)
user = account_auth.user
account = account_auth.account
expect(user.role_for(account)).to eq "associate"
account_auth.update(role: :project_manager)
expect(user.role_for(account)).to eq "project_manager"
account_auth.update(role: :account_manager)
expect(user.role_for(account)).to eq "account_manager"
end
context "when the user does not belong to the given account" do
it "raises an error" do
account = build(:account)
user = build(:user)
expect { user.role_for(account) }.to raise_error(ActiveRecord::RecordNotFound)
end
end
end
describe "#primary_account" do
it "returns the first account the user has access to" do
user = build(:user, accounts: build_list(:account, 2))
expect(user.primary_account).to eq user.primary_account
end
it "adds a given account to the collection" do
account = build(:account)
user = build(:user, accounts: [])
user.primary_account = account
expect(user.accounts).to include account
end
end
describe "#accessible_projects_for" do
context "when user is an account manager" do
it "returns all projects belonging to that account" do
account = create(:account)
account_manager = create(:user, :account_manager, primary_account: account)
member_project = create(:project, name: "Member Project", account: account)
non_member_project = create(:project, name: "Non-Member Project", account: account)
outside_project = create(:project, name: "Outside Project", account: build(:account))
results = account_manager.accessible_projects_for(account)
expect(results).to include(member_project)
expect(results).to include(non_member_project)
expect(results).not_to include(outside_project)
end
end
context "when user is not an account manager" do
it "returns all projects for which the user has a membership" do
account = create(:account)
associate = create(:user, :associate, primary_account: account)
member_project = create(:project, members: associate, name: "Member Project", account: account)
non_member_project = create(:project, members: [], name: "Non-Member Project", account: account)
outside_project = create(:project, name: "Outside Project", account: build(:account))
results = associate.accessible_projects_for(account)
expect(results).to include(member_project)
expect(results).not_to include(non_member_project)
expect(results).not_to include(outside_project)
end
end
end
end