about summary refs log tree commit diff
path: root/spec/models/session_activation_spec.rb
blob: 8db06c6227a0295bd6f96e0e3ab2d22430f96c48 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# frozen_string_literal: true

require 'rails_helper'

RSpec.describe SessionActivation, type: :model do
  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, :not, :destroy_all)
        .with(session_id: id).with(no_args)

      described_class.exclusive(id)
    end
  end
end