111 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
RSpec.shared_examples 'Expireable' do
 | 
						|
  subject { described_class.new(expires_at: expires_at) }
 | 
						|
 | 
						|
  let(:expires_at) { nil }
 | 
						|
 | 
						|
  describe 'Scopes' do
 | 
						|
    let!(:expired_record) do
 | 
						|
      travel_to 2.days.ago do
 | 
						|
        Fabricate factory_name, expires_at: 1.day.from_now
 | 
						|
      end
 | 
						|
    end
 | 
						|
    let!(:un_expired_record) { Fabricate factory_name, expires_at: 10.days.from_now }
 | 
						|
 | 
						|
    describe '.expired' do
 | 
						|
      it 'returns expired records' do
 | 
						|
        expect(described_class.expired)
 | 
						|
          .to include(expired_record)
 | 
						|
          .and not_include(un_expired_record)
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  describe '#expires_in' do
 | 
						|
    context 'when expires at is nil' do
 | 
						|
      let(:expires_at) { nil }
 | 
						|
 | 
						|
      it 'returns nil' do
 | 
						|
        expect(subject.expires_in)
 | 
						|
          .to be_nil
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  describe '#expires_in=' do
 | 
						|
    let(:record) { Fabricate.build factory_name }
 | 
						|
 | 
						|
    context 'when set to nil' do
 | 
						|
      it 'sets expires_at to nil' do
 | 
						|
        record.expires_in = nil
 | 
						|
        expect(record.expires_at)
 | 
						|
          .to be_nil
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    context 'when set to empty' do
 | 
						|
      it 'sets expires_at to nil' do
 | 
						|
        record.expires_in = ''
 | 
						|
        expect(record.expires_at)
 | 
						|
          .to be_nil
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    context 'when set to a value' do
 | 
						|
      it 'sets expires_at to expected future time' do
 | 
						|
        record.expires_in = 60
 | 
						|
        expect(record.expires_at)
 | 
						|
          .to be_within(0.1).of(60.seconds.from_now)
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  describe '#expired?' do
 | 
						|
    context 'when expires_at is nil' do
 | 
						|
      let(:expires_at) { nil }
 | 
						|
 | 
						|
      it { is_expected.to_not be_expired }
 | 
						|
    end
 | 
						|
 | 
						|
    context 'when expires_at is in the past' do
 | 
						|
      let(:expires_at) { 5.days.ago }
 | 
						|
 | 
						|
      it { is_expected.to be_expired }
 | 
						|
    end
 | 
						|
 | 
						|
    context 'when expires_at is in the future' do
 | 
						|
      let(:expires_at) { 5.days.from_now }
 | 
						|
 | 
						|
      it { is_expected.to_not be_expired }
 | 
						|
    end
 | 
						|
 | 
						|
    describe '#expire!' do
 | 
						|
      subject { Fabricate factory_name }
 | 
						|
 | 
						|
      it 'updates the timestamp' do
 | 
						|
        expect { subject.expire! }
 | 
						|
          .to change(subject, :expires_at)
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    describe '#expires?' do
 | 
						|
      context 'when value is missing' do
 | 
						|
        let(:expires_at) { nil }
 | 
						|
 | 
						|
        it { is_expected.to_not be_expires }
 | 
						|
      end
 | 
						|
 | 
						|
      context 'when value is present' do
 | 
						|
        let(:expires_at) { 3.days.from_now }
 | 
						|
 | 
						|
        it { is_expected.to be_expires }
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def factory_name
 | 
						|
    described_class.name.underscore.to_sym
 | 
						|
  end
 | 
						|
end
 |