dawarich/spec/models/user_family_spec.rb

136 lines
3.8 KiB
Ruby

# frozen_string_literal: true
require 'rails_helper'
RSpec.describe User, 'family methods', type: :model do
let(:user) { create(:user) }
describe 'family associations' do
it { is_expected.to have_one(:family_membership).dependent(:destroy) }
it { is_expected.to have_one(:family).through(:family_membership) }
it {
is_expected.to have_one(:created_family).class_name('Family').with_foreign_key('creator_id').dependent(:destroy)
}
it {
is_expected.to have_many(:sent_family_invitations).class_name('Family::Invitation').with_foreign_key('invited_by_id').dependent(:destroy)
}
end
describe '#in_family?' do
context 'when user has no family membership' do
it 'returns false' do
expect(user.in_family?).to be false
end
end
context 'when user has family membership' do
let(:family) { create(:family, creator: user) }
before do
create(:family_membership, user: user, family: family)
end
it 'returns true' do
expect(user.in_family?).to be true
end
end
end
describe '#family_owner?' do
let(:family) { create(:family, creator: user) }
context 'when user is family owner' do
before do
create(:family_membership, user: user, family: family, role: :owner)
end
it 'returns true' do
expect(user.family_owner?).to be true
end
end
context 'when user is family member' do
before do
create(:family_membership, user: user, family: family, role: :member)
end
it 'returns false' do
expect(user.family_owner?).to be false
end
end
context 'when user has no family membership' do
it 'returns false' do
expect(user.family_owner?).to be false
end
end
end
describe '#can_delete_account?' do
context 'when user is not a family owner' do
it 'returns true' do
expect(user.can_delete_account?).to be true
end
end
context 'when user is family owner with only themselves as member' do
let(:family) { create(:family, creator: user) }
before do
create(:family_membership, user: user, family: family, role: :owner)
end
it 'returns true' do
expect(user.can_delete_account?).to be true
end
end
context 'when user is family owner with other members' do
let(:family) { create(:family, creator: user) }
let(:other_user) { create(:user) }
before do
create(:family_membership, user: user, family: family, role: :owner)
create(:family_membership, user: other_user, family: family, role: :member)
end
it 'returns false' do
expect(user.can_delete_account?).to be false
end
end
end
describe 'dependent destroy behavior' do
let(:family) { create(:family, creator: user) }
context 'when user has created families' do
it 'prevents deletion when family has members' do
other_user = create(:user)
create(:family_membership, user: user, family: family, role: :owner)
create(:family_membership, user: other_user, family: family, role: :member)
expect(user.can_delete_account?).to be false
end
end
context 'when user has sent invitations' do
before do
create(:family_invitation, family: family, invited_by: user)
end
it 'destroys associated invitations when user is destroyed' do
expect { user.destroy }.to change(Family::Invitation, :count).by(-1)
end
end
context 'when user has family membership' do
before do
create(:family_membership, user: user, family: family)
end
it 'destroys associated membership when user is destroyed' do
expect { user.destroy }.to change(Family::Membership, :count).by(-1)
end
end
end
end