154 lines
5.1 KiB
Ruby
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
|