From 19f671521815605fb1ea84d8d661f212afa5bc79 Mon Sep 17 00:00:00 2001 From: Eugene Burmakin Date: Fri, 7 Nov 2025 11:20:36 +0100 Subject: [PATCH] Remove limit on number of family members for self-hosted instances. --- CHANGELOG.md | 1 + app/models/family.rb | 4 + spec/models/family_spec.rb | 194 ++++++++++++++++++++++++++++++++++--- 3 files changed, 184 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85d2f888..5c1f00b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## Changed - Removed useless system tests and cover map functionality with Playwright e2e tests instead. +- Number of family members on self-hosted instances is no longer limited. # [0.34.2] - 2025-10-31 diff --git a/app/models/family.rb b/app/models/family.rb index 51123293..4764fc66 100644 --- a/app/models/family.rb +++ b/app/models/family.rb @@ -11,6 +11,8 @@ class Family < ApplicationRecord MAX_MEMBERS = 5 def can_add_members? + return true if DawarichSettings.self_hosted? + (member_count + pending_invitations_count) < MAX_MEMBERS end @@ -32,6 +34,8 @@ class Family < ApplicationRecord end def full? + return false if DawarichSettings.self_hosted? + (member_count + pending_invitations_count) >= MAX_MEMBERS end diff --git a/spec/models/family_spec.rb b/spec/models/family_spec.rb index 7f81b898..215372f6 100644 --- a/spec/models/family_spec.rb +++ b/spec/models/family_spec.rb @@ -26,31 +26,100 @@ RSpec.describe Family, type: :model do describe '#can_add_members?' do let(:family) { create(:family, creator: user) } - context 'when family has fewer than max members' do + context 'when not in self-hosted mode' do before do - create(:family_membership, family: family, user: user, role: :owner) - create_list(:family_membership, 3, family: family, role: :member) + allow(DawarichSettings).to receive(:self_hosted?).and_return(false) end - it 'returns true' do - expect(family.can_add_members?).to be true + 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 pending invitations that would reach max' do + before do + create(:family_membership, family: family, user: user, role: :owner) + create_list(:family_membership, 3, family: family, role: :member) + create(:family_invitation, family: family, invited_by: user, status: :pending) + 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 - context 'when family has max members' do + context 'when in self-hosted mode' do before do - create(:family_membership, family: family, user: user, role: :owner) - create_list(:family_membership, 4, family: family, role: :member) + allow(DawarichSettings).to receive(:self_hosted?).and_return(true) end - it 'returns false' do - expect(family.can_add_members?).to be false - end - end + 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 - context 'when family has no members' do - it 'returns true' do - expect(family.can_add_members?).to be true + 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 true (no limit in self-hosted mode)' do + expect(family.can_add_members?).to be true + end + end + + context 'when family has more than max members' do + before do + create(:family_membership, family: family, user: user, role: :owner) + create_list(:family_membership, 10, family: family, role: :member) + end + + it 'returns true (no limit in self-hosted mode)' do + expect(family.can_add_members?).to be true + end + end + + context 'when family has pending invitations that would exceed max' do + before do + create(:family_membership, family: family, user: user, role: :owner) + create_list(:family_membership, 4, family: family, role: :member) + create_list(:family_invitation, 5, family: family, invited_by: user, status: :pending) + end + + it 'returns true (no limit in self-hosted mode)' do + expect(family.can_add_members?).to be true + end end end end @@ -122,4 +191,99 @@ RSpec.describe Family, type: :model do expect(Family::Membership.find_by(id: membership.id)).to be_nil end end + + describe '#full?' do + let(:family) { create(:family, creator: user) } + + context 'when not in self-hosted mode' do + before do + allow(DawarichSettings).to receive(:self_hosted?).and_return(false) + end + + 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 false' do + expect(family.full?).to be false + end + end + + context 'when family has exactly 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 true' do + expect(family.full?).to be true + end + end + + context 'when family has pending invitations that would reach max' do + before do + create(:family_membership, family: family, user: user, role: :owner) + create_list(:family_membership, 3, family: family, role: :member) + create(:family_invitation, family: family, invited_by: user, status: :pending) + end + + it 'returns true' do + expect(family.full?).to be true + end + end + end + + context 'when in self-hosted mode' do + before do + allow(DawarichSettings).to receive(:self_hosted?).and_return(true) + end + + 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 false' do + expect(family.full?).to be false + end + end + + context 'when family has exactly 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 (no limit in self-hosted mode)' do + expect(family.full?).to be false + end + end + + context 'when family has more than max members' do + before do + create(:family_membership, family: family, user: user, role: :owner) + create_list(:family_membership, 10, family: family, role: :member) + end + + it 'returns false (no limit in self-hosted mode)' do + expect(family.full?).to be false + end + end + + context 'when family has pending invitations that would exceed max' do + before do + create(:family_membership, family: family, user: user, role: :owner) + create_list(:family_membership, 4, family: family, role: :member) + create_list(:family_invitation, 5, family: family, invited_by: user, status: :pending) + end + + it 'returns false (no limit in self-hosted mode)' do + expect(family.full?).to be false + end + end + end + end end