fix: Resolve account switching issue for users with new accounts
## Summary - Fix account switching bug where new users couldn't switch accounts properly - Update `active_account_user` method to handle NULL `active_at` values correctly using `NULLS LAST` sorting - Add comprehensive specs to test the NULL handling behavior ## Problem When users were added to new accounts, the `active_at` field was NULL. The existing `ORDER BY active_at DESC` had undefined behavior for NULL values, causing: - Mobile apps to receive wrong `account_id` from `/profile` API - Account switching to fail until multiple attempts "fixed" it temporarily - Issue recurring whenever new accounts were added ## Solution - Updated `active_account_user` method in `UserAttributeHelpers` to use `NULLS LAST` sorting - This ensures accounts with actual timestamps are prioritized over NULL values - Added specs covering normal sorting, NULL handling, and edge cases
This commit is contained in:
@@ -18,7 +18,7 @@ module UserAttributeHelpers
|
||||
end
|
||||
|
||||
def active_account_user
|
||||
account_users.order(active_at: :desc)&.first
|
||||
account_users.order(Arel.sql('active_at DESC NULLS LAST'))&.first
|
||||
end
|
||||
|
||||
def current_account_user
|
||||
|
||||
@@ -110,4 +110,45 @@ RSpec.describe User do
|
||||
expect(new_user.email).to eq('test123@test.com')
|
||||
end
|
||||
end
|
||||
|
||||
describe '#active_account_user' do
|
||||
let(:user) { create(:user) }
|
||||
let(:account1) { create(:account) }
|
||||
let(:account2) { create(:account) }
|
||||
let(:account3) { create(:account) }
|
||||
|
||||
before do
|
||||
# Create account_users with different active_at values
|
||||
create(:account_user, user: user, account: account1, active_at: 2.days.ago)
|
||||
create(:account_user, user: user, account: account2, active_at: 1.day.ago)
|
||||
create(:account_user, user: user, account: account3, active_at: nil) # New account with NULL active_at
|
||||
end
|
||||
|
||||
it 'returns the account_user with the most recent active_at when all have timestamps' do
|
||||
expect(user.active_account_user.account_id).to eq(account2.id)
|
||||
end
|
||||
|
||||
it 'prioritizes accounts with active_at over NULL values (NULLS LAST behavior)' do
|
||||
# Even though account3 was created last, it should not be returned due to NULL active_at
|
||||
expect(user.active_account_user.account_id).to eq(account2.id)
|
||||
end
|
||||
|
||||
it 'returns NULL active_at account only when no other accounts have active_at' do
|
||||
# Remove active_at from all accounts
|
||||
user.account_users.update_all(active_at: nil)
|
||||
|
||||
# Should return one of the accounts (behavior is undefined but consistent)
|
||||
expect(user.active_account_user).to be_present
|
||||
end
|
||||
|
||||
context 'when multiple accounts have NULL active_at' do
|
||||
before do
|
||||
create(:account_user, user: user, account: create(:account), active_at: nil)
|
||||
end
|
||||
|
||||
it 'still prioritizes accounts with timestamps' do
|
||||
expect(user.active_account_user.account_id).to eq(account2.id)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user