dawarich/spec/models/user_family_spec.rb
2026-01-08 21:12:47 +01:00

138 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 'soft-deletes user but keeps invitations' do
expect { user.destroy }.not_to change(Family::Invitation, :count)
expect(user.deleted?).to be true
end
end
context 'when user has family membership' do
before do
create(:family_membership, user: user, family: family)
end
it 'soft-deletes user but keeps membership' do
expect { user.destroy }.not_to change(Family::Membership, :count)
expect(user.deleted?).to be true
end
end
end
end