summaryrefslogtreecommitdiff
path: root/spec/channels/awareness_channel_spec.rb
blob: 8d6dc36f6bd7c0c9a156bb77b0dee19bbe2958f0 (plain)
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
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe AwarenessChannel, :clean_gitlab_redis_shared_state, type: :channel do
  before do
    stub_action_cable_connection(current_user: user)
  end

  context "with user" do
    let(:user) { create(:user) }

    describe "when no path parameter given" do
      it "rejects subscription" do
        subscribe path: nil

        expect(subscription).to be_rejected
      end
    end

    describe "with valid path parameter" do
      it "successfully subscribes" do
        subscribe path: "/test"

        session = AwarenessSession.for("/test")

        expect(subscription).to be_confirmed
        # check if we can use session object instead
        expect(subscription).to have_stream_from("awareness:#{session.to_param}")
      end

      it "broadcasts set of collaborators when subscribing" do
        session = AwarenessSession.for("/test")

        freeze_time do
          collaborator = {
            id: user.id,
            name: user.name,
            avatar_url: user.avatar_url(size: 36),
            last_activity: Time.zone.now,
            last_activity_humanized: ActionController::Base.helpers.distance_of_time_in_words(
              Time.zone.now, Time.zone.now
            )
          }

          expect do
            subscribe path: "/test"
          end.to have_broadcasted_to("awareness:#{session.to_param}")
                   .with(collaborators: [collaborator])
        end
      end

      it "transmits payload when user is touched" do
        subscribe path: "/test"

        perform :touch

        expect(transmissions.size).to be 1
      end

      it "unsubscribes from channel" do
        subscribe path: "/test"
        session = AwarenessSession.for("/test")

        expect { subscription.unsubscribe_from_channel }
          .to change { session.size}.by(-1)
      end
    end
  end

  context "with guest" do
    let(:user) { nil }

    it "rejects subscription" do
      subscribe path: "/test"

      expect(subscription).to be_rejected
    end
  end
end