| 
									
										
										
										
											2017-11-13 09:54:48 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-23 18:50:53 +02:00
										 |  |  | require 'rails_helper' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | RSpec.describe SessionActivation, type: :model do | 
					
						
							| 
									
										
										
										
											2017-11-13 09:54:48 +09:00
										 |  |  |   describe '#detection' do | 
					
						
							|  |  |  |     let(:session_activation) { Fabricate(:session_activation, user_agent: 'Chrome/62.0.3202.89') } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it 'sets a Browser instance as detection' do | 
					
						
							|  |  |  |       expect(session_activation.detection).to be_kind_of Browser::Chrome | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe '#browser' do | 
					
						
							|  |  |  |     before do | 
					
						
							|  |  |  |       allow(session_activation).to receive(:detection).and_return(detection) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let(:detection)          { double(id: 1) } | 
					
						
							|  |  |  |     let(:session_activation) { Fabricate(:session_activation) } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it 'returns detection.id' do | 
					
						
							|  |  |  |       expect(session_activation.browser).to be 1
 | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe '#platform' do | 
					
						
							|  |  |  |     before do | 
					
						
							|  |  |  |       allow(session_activation).to receive(:detection).and_return(detection) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let(:session_activation) { Fabricate(:session_activation) } | 
					
						
							|  |  |  |     let(:detection)          { double(platform: double(id: 1)) } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it 'returns detection.platform.id' do | 
					
						
							|  |  |  |       expect(session_activation.platform).to be 1
 | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe '.active?' do | 
					
						
							|  |  |  |     subject { described_class.active?(id) } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context 'id is absent' do | 
					
						
							|  |  |  |       let(:id) { nil } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it 'returns nil' do | 
					
						
							|  |  |  |         is_expected.to be nil | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context 'id is present' do | 
					
						
							|  |  |  |       let(:id) { '1' } | 
					
						
							|  |  |  |       let!(:session_activation) { Fabricate(:session_activation, session_id: id) } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context 'id exists as session_id' do | 
					
						
							|  |  |  |         it 'returns true' do | 
					
						
							|  |  |  |           is_expected.to be true | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context 'id does not exist as session_id' do | 
					
						
							|  |  |  |         before do | 
					
						
							|  |  |  |           session_activation.update!(session_id: '2') | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it 'returns false' do | 
					
						
							|  |  |  |           is_expected.to be false | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe '.activate' do | 
					
						
							|  |  |  |     let(:options) { { user: Fabricate(:user), session_id: '1' } } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it 'calls create! and purge_old' do | 
					
						
							|  |  |  |       expect(described_class).to receive(:create!).with(options) | 
					
						
							|  |  |  |       expect(described_class).to receive(:purge_old) | 
					
						
							|  |  |  |       described_class.activate(options) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it 'returns an instance of SessionActivation' do | 
					
						
							|  |  |  |       expect(described_class.activate(options)).to be_kind_of SessionActivation | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe '.deactivate' do | 
					
						
							|  |  |  |     context 'id is absent' do | 
					
						
							|  |  |  |       let(:id) { nil } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it 'returns nil' do | 
					
						
							|  |  |  |         expect(described_class.deactivate(id)).to be nil | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context 'id exists' do | 
					
						
							|  |  |  |       let(:id) { '1' } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it 'calls where.destroy_all' do | 
					
						
							|  |  |  |         expect(described_class).to receive_message_chain(:where, :destroy_all) | 
					
						
							|  |  |  |           .with(session_id: id).with(no_args) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         described_class.deactivate(id) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe '.purge_old' do | 
					
						
							|  |  |  |     it 'calls order.offset.destroy_all' do | 
					
						
							|  |  |  |       expect(described_class).to receive_message_chain(:order, :offset, :destroy_all) | 
					
						
							|  |  |  |         .with('created_at desc').with(Rails.configuration.x.max_session_activations).with(no_args) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       described_class.purge_old | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe '.exclusive' do | 
					
						
							|  |  |  |     let(:id) { '1' } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it 'calls where.destroy_all' do | 
					
						
							|  |  |  |       expect(described_class).to receive_message_chain(:where, :destroy_all) | 
					
						
							|  |  |  |         .with('session_id != ?', id).with(no_args) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       described_class.exclusive(id) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-06-23 18:50:53 +02:00
										 |  |  | end |