Compare commits

...
Author SHA1 Message Date
Muhsin fb64e9a57c chore: refactor user active_account_user spec for clarity 2025-08-29 19:41:48 +05:30
Muhsin 28969deb01 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
2025-08-29 19:38:52 +05:30
2 changed files with 38 additions and 1 deletions
@@ -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
+37
View File
@@ -110,4 +110,41 @@ 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, prioritizing timestamps over NULL values' do
# Should return account2 (most recent timestamp) even though account3 was created last with 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.each { |au| au.update!(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