62 lines
1.9 KiB
Ruby
62 lines
1.9 KiB
Ruby
require 'rails_helper'
|
|
|
|
RSpec.describe UserSession do
|
|
let(:user) { create(:user) }
|
|
|
|
describe 'associations' do
|
|
it { is_expected.to belong_to(:user) }
|
|
end
|
|
|
|
describe 'validations' do
|
|
subject { described_class.new(user: user, client_id: 'abc') }
|
|
|
|
it { is_expected.to validate_presence_of(:client_id) }
|
|
|
|
it 'validates uniqueness of client_id scoped to user_id' do
|
|
described_class.create!(user: user, client_id: 'abc', last_activity_at: Time.current)
|
|
|
|
duplicate = described_class.new(user: user, client_id: 'abc')
|
|
expect(duplicate).not_to be_valid
|
|
expect(duplicate.errors[:client_id]).to be_present
|
|
end
|
|
|
|
it 'allows the same client_id for different users' do
|
|
other = create(:user)
|
|
described_class.create!(user: user, client_id: 'abc', last_activity_at: Time.current)
|
|
|
|
expect(described_class.new(user: other, client_id: 'abc', last_activity_at: Time.current)).to be_valid
|
|
end
|
|
end
|
|
|
|
describe '#current?' do
|
|
let(:session) { described_class.create!(user: user, client_id: 'abc', last_activity_at: Time.current) }
|
|
|
|
it 'returns true when client_id matches' do
|
|
expect(session.current?('abc')).to be true
|
|
end
|
|
|
|
it 'returns false when client_id differs' do
|
|
expect(session.current?('xyz')).to be false
|
|
end
|
|
end
|
|
|
|
describe '#should_update_activity?' do
|
|
let(:session) { described_class.new(user: user, client_id: 'abc') }
|
|
|
|
it 'returns true when last_activity_at is nil' do
|
|
session.last_activity_at = nil
|
|
expect(session.should_update_activity?).to be true
|
|
end
|
|
|
|
it 'returns true when last_activity_at is older than the throttle window' do
|
|
session.last_activity_at = 10.minutes.ago
|
|
expect(session.should_update_activity?).to be true
|
|
end
|
|
|
|
it 'returns false when last_activity_at is within the throttle window' do
|
|
session.last_activity_at = 1.minute.ago
|
|
expect(session.should_update_activity?).to be false
|
|
end
|
|
end
|
|
end
|