dawarich/spec/models/family_spec.rb

125 lines
3.7 KiB
Ruby

# frozen_string_literal: true
require 'rails_helper'
RSpec.describe Family, type: :model do
let(:user) { create(:user) }
describe 'associations' do
it { is_expected.to have_many(:family_memberships).dependent(:destroy) }
it { is_expected.to have_many(:members).through(:family_memberships).source(:user) }
it { is_expected.to have_many(:family_invitations).dependent(:destroy) }
it { is_expected.to belong_to(:creator).class_name('User') }
end
describe 'validations' do
it { is_expected.to validate_presence_of(:name) }
it { is_expected.to validate_length_of(:name).is_at_most(50) }
end
describe 'constants' do
it 'defines MAX_MEMBERS' do
expect(Family::MAX_MEMBERS).to eq(5)
end
end
describe '#can_add_members?' do
let(:family) { create(:family, creator: user) }
context 'when family has fewer than max members' do
before do
create(:family_membership, family: family, user: user, role: :owner)
create_list(:family_membership, 3, family: family, role: :member)
end
it 'returns true' do
expect(family.can_add_members?).to be true
end
end
context 'when family has max members' do
before do
create(:family_membership, family: family, user: user, role: :owner)
create_list(:family_membership, 4, family: family, role: :member)
end
it 'returns false' do
expect(family.can_add_members?).to be false
end
end
context 'when family has no members' do
it 'returns true' do
expect(family.can_add_members?).to be true
end
end
end
describe 'family creation' do
let(:family) { Family.new(name: 'Test Family', creator: user) }
it 'can be created with valid attributes' do
expect(family).to be_valid
end
it 'requires a name' do
family.name = nil
expect(family).not_to be_valid
expect(family.errors[:name]).to include("can't be blank")
end
it 'requires a creator' do
family.creator = nil
expect(family).not_to be_valid
end
it 'rejects names longer than 50 characters' do
long_name = 'a' * 51
family.name = long_name
expect(family).not_to be_valid
expect(family.errors[:name]).to include('is too long (maximum is 50 characters)')
end
end
describe 'members association' do
let(:family) { create(:family, creator: user) }
let(:member1) { create(:user) }
let(:member2) { create(:user) }
before do
create(:family_membership, family: family, user: user, role: :owner)
create(:family_membership, family: family, user: member1, role: :member)
create(:family_membership, family: family, user: member2, role: :member)
end
it 'includes all family members' do
expect(family.members).to include(user, member1, member2)
expect(family.members.count).to eq(3)
end
end
describe 'family invitations association' do
let(:family) { create(:family, creator: user) }
it 'destroys associated invitations when family is destroyed' do
invitation = create(:family_invitation, family: family, invited_by: user)
expect { family.destroy }.to change(Family::Invitation, :count).by(-1)
expect(Family::Invitation.find_by(id: invitation.id)).to be_nil
end
end
describe 'family memberships association' do
let(:family) { create(:family, creator: user) }
it 'destroys associated memberships when family is destroyed' do
membership = create(:family_membership, family: family, user: user, role: :owner)
expect { family.destroy }.to change(Family::Membership, :count).by(-1)
expect(Family::Membership.find_by(id: membership.id)).to be_nil
end
end
end