pusher-fake 4.1.0 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/pusher-fake/server/chain_trap_handlers.rb +24 -0
- data/lib/pusher-fake/server.rb +10 -0
- data/lib/pusher-fake.rb +1 -1
- metadata +20 -81
- data/spec/features/api/channels_spec.rb +0 -86
- data/spec/features/api/users_spec.rb +0 -36
- data/spec/features/client/connect_spec.rb +0 -11
- data/spec/features/client/event_spec.rb +0 -49
- data/spec/features/client/presence_spec.rb +0 -58
- data/spec/features/client/subscribe_spec.rb +0 -84
- data/spec/features/server/event_spec.rb +0 -122
- data/spec/features/server/webhooks_spec.rb +0 -107
- data/spec/lib/pusher-fake/channel/presence_spec.rb +0 -249
- data/spec/lib/pusher-fake/channel/private_spec.rb +0 -180
- data/spec/lib/pusher-fake/channel/public_spec.rb +0 -206
- data/spec/lib/pusher-fake/channel_spec.rb +0 -122
- data/spec/lib/pusher-fake/configuration_spec.rb +0 -123
- data/spec/lib/pusher-fake/connection_spec.rb +0 -332
- data/spec/lib/pusher-fake/server/application_spec.rb +0 -604
- data/spec/lib/pusher-fake/server_spec.rb +0 -177
- data/spec/lib/pusher-fake/webhook_spec.rb +0 -67
- data/spec/lib/pusher_fake_spec.rb +0 -96
- data/spec/spec_helper.rb +0 -31
- data/spec/support/application/public/javascripts/vendor/polyfill.min.js +0 -1
- data/spec/support/application/public/javascripts/vendor/pusher-7.0.6.js +0 -4567
- data/spec/support/application/views/index.erb +0 -91
- data/spec/support/application.rb +0 -35
- data/spec/support/capybara.rb +0 -10
- data/spec/support/helpers/connect.rb +0 -21
- data/spec/support/helpers/event.rb +0 -11
- data/spec/support/helpers/subscription.rb +0 -31
- data/spec/support/helpers/user.rb +0 -13
- data/spec/support/matchers/have_configuration_option.rb +0 -19
- data/spec/support/pusher_fake.rb +0 -21
- data/spec/support/webhooks.rb +0 -40
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "spec_helper"
|
|
4
|
-
|
|
5
|
-
feature "Server triggers event" do
|
|
6
|
-
let(:event) { "message" }
|
|
7
|
-
let(:other_user) { "Bob" }
|
|
8
|
-
let(:public_channel) { "chat" }
|
|
9
|
-
let(:private_channel) { "private-chat" }
|
|
10
|
-
|
|
11
|
-
before do
|
|
12
|
-
connect
|
|
13
|
-
connect_as(other_user)
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
scenario "on a subscribed public channel" do
|
|
17
|
-
subscribe_to(public_channel)
|
|
18
|
-
subscribe_to_as(public_channel, other_user)
|
|
19
|
-
|
|
20
|
-
trigger(public_channel, event)
|
|
21
|
-
|
|
22
|
-
expect(page).to have_event(event, on: public_channel)
|
|
23
|
-
|
|
24
|
-
using_session(other_user) do
|
|
25
|
-
expect(page).to have_event(event, on: public_channel)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
scenario "on a previously subscribed public channel" do
|
|
30
|
-
subscribe_to(public_channel)
|
|
31
|
-
subscribe_to_as(public_channel, other_user)
|
|
32
|
-
unsubscribe_from(public_channel)
|
|
33
|
-
|
|
34
|
-
trigger(public_channel, event)
|
|
35
|
-
|
|
36
|
-
expect(page).not_to have_event(event, on: public_channel)
|
|
37
|
-
|
|
38
|
-
using_session(other_user) do
|
|
39
|
-
expect(page).to have_event(event, on: public_channel)
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
scenario "on an unsubscribed public channel" do
|
|
44
|
-
trigger(public_channel, event)
|
|
45
|
-
|
|
46
|
-
expect(page).not_to have_event(event, on: public_channel)
|
|
47
|
-
|
|
48
|
-
using_session(other_user) do
|
|
49
|
-
expect(page).not_to have_event(event, on: public_channel)
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
scenario "on a subscribed private channel" do
|
|
54
|
-
subscribe_to(private_channel)
|
|
55
|
-
subscribe_to_as(private_channel, other_user)
|
|
56
|
-
|
|
57
|
-
trigger(private_channel, event)
|
|
58
|
-
|
|
59
|
-
expect(page).to have_event(event, on: private_channel)
|
|
60
|
-
|
|
61
|
-
using_session(other_user) do
|
|
62
|
-
expect(page).to have_event(event, on: private_channel)
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
scenario "on a previously subscribed private channel" do
|
|
67
|
-
subscribe_to(private_channel)
|
|
68
|
-
subscribe_to_as(private_channel, other_user)
|
|
69
|
-
unsubscribe_from(private_channel)
|
|
70
|
-
|
|
71
|
-
trigger(private_channel, event)
|
|
72
|
-
|
|
73
|
-
expect(page).not_to have_event(event, on: private_channel)
|
|
74
|
-
|
|
75
|
-
using_session(other_user) do
|
|
76
|
-
expect(page).to have_event(event, on: private_channel)
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
scenario "on an unsubscribed private channel" do
|
|
81
|
-
trigger(private_channel, event)
|
|
82
|
-
|
|
83
|
-
expect(page).not_to have_event(event, on: private_channel)
|
|
84
|
-
|
|
85
|
-
using_session(other_user) do
|
|
86
|
-
expect(page).not_to have_event(event, on: private_channel)
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
scenario "on multiple subscribed private channels" do
|
|
91
|
-
subscribe_to("private-chat-1")
|
|
92
|
-
subscribe_to_as("private-chat-2", other_user)
|
|
93
|
-
|
|
94
|
-
trigger("private-chat-1", event)
|
|
95
|
-
trigger("private-chat-2", event)
|
|
96
|
-
|
|
97
|
-
expect(page).to have_event(event, on: "private-chat-1")
|
|
98
|
-
|
|
99
|
-
using_session(other_user) do
|
|
100
|
-
expect(page).to have_event(event, on: "private-chat-2")
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
scenario "on a subscribed public channel, ignoring a user" do
|
|
105
|
-
subscribe_to(public_channel)
|
|
106
|
-
subscribe_to_as(public_channel, other_user)
|
|
107
|
-
|
|
108
|
-
trigger(public_channel, event, socket_id: user_id(other_user))
|
|
109
|
-
|
|
110
|
-
expect(page).to have_event(event, on: public_channel)
|
|
111
|
-
|
|
112
|
-
using_session(other_user) do
|
|
113
|
-
expect(page).not_to have_event(event, on: public_channel)
|
|
114
|
-
end
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
protected
|
|
118
|
-
|
|
119
|
-
def trigger(channel, event, options = {})
|
|
120
|
-
Pusher.trigger(channel, event, {}, options)
|
|
121
|
-
end
|
|
122
|
-
end
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "spec_helper"
|
|
4
|
-
|
|
5
|
-
feature "Receiving event webhooks" do
|
|
6
|
-
let(:channel) { "room-1" }
|
|
7
|
-
let(:other_user) { "Bob" }
|
|
8
|
-
let(:cache_channel) { "cache-last-command" }
|
|
9
|
-
let(:presence_channel) { "presence-room-1" }
|
|
10
|
-
|
|
11
|
-
before do
|
|
12
|
-
events.clear
|
|
13
|
-
|
|
14
|
-
PusherFake.configuration.webhooks = ["http://127.0.0.1:8082"]
|
|
15
|
-
|
|
16
|
-
connect
|
|
17
|
-
connect_as(other_user)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
scenario "occupying a channel" do
|
|
21
|
-
subscribe_to(channel)
|
|
22
|
-
|
|
23
|
-
expect(events).to include_event("channel_occupied", "channel" => channel)
|
|
24
|
-
|
|
25
|
-
subscribe_to_as(channel, other_user)
|
|
26
|
-
|
|
27
|
-
expect(events.size).to eq(1)
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
scenario "vacating a channel" do
|
|
31
|
-
subscribe_to(channel)
|
|
32
|
-
subscribe_to_as(channel, other_user)
|
|
33
|
-
|
|
34
|
-
unsubscribe_from(channel)
|
|
35
|
-
|
|
36
|
-
expect(events.size).to eq(1)
|
|
37
|
-
|
|
38
|
-
unsubscribe_from_as(channel, other_user)
|
|
39
|
-
|
|
40
|
-
expect(events).to include_event("channel_vacated", "channel" => channel)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
scenario "subscribing to a presence channel" do
|
|
44
|
-
subscribe_to(presence_channel)
|
|
45
|
-
|
|
46
|
-
expect(events).to include_event(
|
|
47
|
-
"member_added",
|
|
48
|
-
"channel" => presence_channel, "user_id" => user_id
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
subscribe_to_as(presence_channel, other_user)
|
|
52
|
-
|
|
53
|
-
expect(events).to include_event(
|
|
54
|
-
"member_added",
|
|
55
|
-
"channel" => presence_channel, "user_id" => user_id(other_user)
|
|
56
|
-
)
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
scenario "unsubscribing from a presence channel" do
|
|
60
|
-
subscribe_to(presence_channel)
|
|
61
|
-
subscribe_to_as(presence_channel, other_user)
|
|
62
|
-
|
|
63
|
-
unsubscribe_from(presence_channel)
|
|
64
|
-
|
|
65
|
-
expect(events).to include_event("member_added",
|
|
66
|
-
"channel" => presence_channel,
|
|
67
|
-
"user_id" => user_id)
|
|
68
|
-
|
|
69
|
-
unsubscribe_from_as(presence_channel, other_user)
|
|
70
|
-
|
|
71
|
-
expect(events).to include_event("member_added",
|
|
72
|
-
"channel" => presence_channel,
|
|
73
|
-
"user_id" => user_id(other_user))
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
scenario "subscribing to a cache channel with no event" do
|
|
77
|
-
subscribe_to(cache_channel)
|
|
78
|
-
|
|
79
|
-
expect(events).to include_event("cache_miss",
|
|
80
|
-
"channel" => cache_channel)
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
scenario "subscribing to a cache channel with an event" do
|
|
84
|
-
subscribe_to(cache_channel)
|
|
85
|
-
events.clear
|
|
86
|
-
Pusher.trigger(cache_channel, "an event", {}, {})
|
|
87
|
-
|
|
88
|
-
subscribe_to_as(cache_channel, other_user)
|
|
89
|
-
|
|
90
|
-
expect(events).not_to include_event("cache_miss",
|
|
91
|
-
"channel" => cache_channel)
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
protected
|
|
95
|
-
|
|
96
|
-
def events
|
|
97
|
-
sleep(1)
|
|
98
|
-
|
|
99
|
-
WebhookHelper.mutex.synchronize do
|
|
100
|
-
WebhookHelper.events
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
def include_event(event, options = {})
|
|
105
|
-
include(options.merge("name" => event))
|
|
106
|
-
end
|
|
107
|
-
end
|
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "spec_helper"
|
|
4
|
-
|
|
5
|
-
describe PusherFake::Channel::Presence do
|
|
6
|
-
subject { described_class }
|
|
7
|
-
|
|
8
|
-
let(:name) { "channel" }
|
|
9
|
-
|
|
10
|
-
it "inherits from private channel" do
|
|
11
|
-
expect(subject.ancestors).to include(PusherFake::Channel::Private)
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
it "creates an empty members hash" do
|
|
15
|
-
channel = subject.new(name)
|
|
16
|
-
|
|
17
|
-
expect(channel.members).to eq({})
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
describe PusherFake::Channel::Presence, "#add" do
|
|
22
|
-
subject { described_class.new(name) }
|
|
23
|
-
|
|
24
|
-
let(:name) { "name" }
|
|
25
|
-
let(:user_id) { "1234" }
|
|
26
|
-
let(:connection) { instance_double(PusherFake::Connection, emit: nil) }
|
|
27
|
-
let(:connections) { instance_double(Array, push: nil, length: 0) }
|
|
28
|
-
let(:channel_data) { { user_id: user_id } }
|
|
29
|
-
let(:authentication) { "auth" }
|
|
30
|
-
let(:subscription_data) { { presence: { hash: {}, count: 1 } } }
|
|
31
|
-
|
|
32
|
-
let(:data) do
|
|
33
|
-
{ auth: authentication,
|
|
34
|
-
channel_data: MultiJson.dump(channel_data) }
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
before do
|
|
38
|
-
allow(PusherFake::Webhook).to receive(:trigger)
|
|
39
|
-
allow(MultiJson).to receive(:load).and_return(channel_data)
|
|
40
|
-
allow(subject).to receive(:connections).and_return(connections)
|
|
41
|
-
allow(subject).to receive(:emit).and_return(nil)
|
|
42
|
-
allow(subject).to receive(:subscription_data).and_return(subscription_data)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
it "authorizes the connection" do
|
|
46
|
-
allow(subject).to receive(:authorized?).and_return(nil)
|
|
47
|
-
|
|
48
|
-
subject.add(connection, data)
|
|
49
|
-
|
|
50
|
-
expect(subject).to have_received(:authorized?).with(connection, data)
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
it "parses the channel_data when authorized" do
|
|
54
|
-
allow(subject).to receive(:authorized?).and_return(true)
|
|
55
|
-
|
|
56
|
-
subject.add(connection, data)
|
|
57
|
-
|
|
58
|
-
expect(MultiJson).to have_received(:load)
|
|
59
|
-
.with(data[:channel_data], symbolize_keys: true)
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
it "assigns the channel_data to the members hash for current connection" do
|
|
63
|
-
allow(subject).to receive(:authorized?).and_return(true)
|
|
64
|
-
|
|
65
|
-
subject.add(connection, data)
|
|
66
|
-
|
|
67
|
-
expect(subject.members[connection]).to eq(channel_data)
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
it "notifies the channel of the new member when authorized" do
|
|
71
|
-
allow(subject).to receive(:authorized?).and_return(true)
|
|
72
|
-
|
|
73
|
-
subject.add(connection, data)
|
|
74
|
-
|
|
75
|
-
expect(subject).to have_received(:emit)
|
|
76
|
-
.with("pusher_internal:member_added", channel_data)
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
it "successfully subscribes the connection when authorized" do
|
|
80
|
-
allow(subject).to receive(:authorized?).and_return(true)
|
|
81
|
-
|
|
82
|
-
subject.add(connection, data)
|
|
83
|
-
|
|
84
|
-
expect(connection).to have_received(:emit)
|
|
85
|
-
.with("pusher_internal:subscription_succeeded",
|
|
86
|
-
subscription_data, subject.name)
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
it "adds the connection to the channel when authorized" do
|
|
90
|
-
allow(subject).to receive(:authorized?).and_return(true)
|
|
91
|
-
|
|
92
|
-
subject.add(connection, data)
|
|
93
|
-
|
|
94
|
-
expect(connections).to have_received(:push).with(connection)
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
it "triggers occupied webhook for first connection added when authorized" do
|
|
98
|
-
allow(subject).to receive(:authorized?).and_return(true)
|
|
99
|
-
allow(subject).to receive(:connections).and_call_original
|
|
100
|
-
|
|
101
|
-
2.times { subject.add(connection, data) }
|
|
102
|
-
|
|
103
|
-
expect(PusherFake::Webhook).to have_received(:trigger)
|
|
104
|
-
.with("channel_occupied", channel: name).once
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
it "triggers the member added webhook when authorized" do
|
|
108
|
-
allow(subject).to receive(:authorized?).and_return(true)
|
|
109
|
-
|
|
110
|
-
subject.add(connection, data)
|
|
111
|
-
|
|
112
|
-
expect(PusherFake::Webhook).to have_received(:trigger)
|
|
113
|
-
.with("member_added", channel: name, user_id: user_id).once
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
it "unsuccessfully subscribes the connection when not authorized" do
|
|
117
|
-
allow(subject).to receive(:authorized?).and_return(false)
|
|
118
|
-
|
|
119
|
-
subject.add(connection, data)
|
|
120
|
-
|
|
121
|
-
expect(connection).to have_received(:emit)
|
|
122
|
-
.with("pusher_internal:subscription_error", {}, subject.name)
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
it "does not trigger channel occupied webhook when not authorized" do
|
|
126
|
-
allow(subject).to receive(:authorized?).and_return(false)
|
|
127
|
-
allow(subject).to receive(:connections).and_call_original
|
|
128
|
-
|
|
129
|
-
2.times { subject.add(connection, data) }
|
|
130
|
-
|
|
131
|
-
expect(PusherFake::Webhook).not_to have_received(:trigger)
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
it "does not trigger the member added webhook when not authorized" do
|
|
135
|
-
allow(subject).to receive(:authorized?).and_return(false)
|
|
136
|
-
|
|
137
|
-
subject.add(connection, data)
|
|
138
|
-
|
|
139
|
-
expect(PusherFake::Webhook).not_to have_received(:trigger)
|
|
140
|
-
end
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
describe PusherFake::Channel::Presence, "#remove" do
|
|
144
|
-
subject { described_class.new(name) }
|
|
145
|
-
|
|
146
|
-
let(:name) { "name" }
|
|
147
|
-
let(:user_id) { "1234" }
|
|
148
|
-
let(:connection) { double }
|
|
149
|
-
let(:channel_data) { { user_id: user_id } }
|
|
150
|
-
|
|
151
|
-
before do
|
|
152
|
-
allow(PusherFake::Webhook).to receive(:trigger)
|
|
153
|
-
allow(subject).to receive(:connections).and_return([connection])
|
|
154
|
-
allow(subject).to receive(:emit).and_return(nil)
|
|
155
|
-
|
|
156
|
-
subject.members[connection] = channel_data
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
it "removes the connection from the channel" do
|
|
160
|
-
subject.remove(connection)
|
|
161
|
-
|
|
162
|
-
expect(subject.connections).to be_empty
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
it "removes the connection from the members hash" do
|
|
166
|
-
subject.remove(connection)
|
|
167
|
-
|
|
168
|
-
expect(subject.members).not_to have_key(connection)
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
it "triggers the member removed webhook" do
|
|
172
|
-
subject.remove(connection)
|
|
173
|
-
|
|
174
|
-
expect(PusherFake::Webhook).to have_received(:trigger)
|
|
175
|
-
.with("member_removed", channel: name, user_id: user_id).once
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
it "notifies the channel of the removed member" do
|
|
179
|
-
subject.remove(connection)
|
|
180
|
-
|
|
181
|
-
expect(subject).to have_received(:emit)
|
|
182
|
-
.with("pusher_internal:member_removed", channel_data)
|
|
183
|
-
end
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
describe PusherFake::Channel::Presence,
|
|
187
|
-
"#remove, for an unsubscribed connection" do
|
|
188
|
-
subject { described_class.new(name) }
|
|
189
|
-
|
|
190
|
-
let(:name) { "name" }
|
|
191
|
-
let(:user_id) { "1234" }
|
|
192
|
-
let(:connection) { double }
|
|
193
|
-
let(:channel_data) { { user_id: user_id } }
|
|
194
|
-
|
|
195
|
-
before do
|
|
196
|
-
allow(subject).to receive(:connections).and_return([])
|
|
197
|
-
allow(subject).to receive(:emit).and_return(nil)
|
|
198
|
-
allow(subject).to receive(:trigger).and_return(nil)
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
it "does not raise an error" do
|
|
202
|
-
expect do
|
|
203
|
-
subject.remove(connection)
|
|
204
|
-
end.not_to raise_error
|
|
205
|
-
end
|
|
206
|
-
|
|
207
|
-
it "does not trigger an event" do
|
|
208
|
-
subject.remove(connection)
|
|
209
|
-
|
|
210
|
-
expect(subject).not_to have_received(:trigger)
|
|
211
|
-
.with("member_removed", channel: name, user_id: user_id)
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
it "does not emit an event" do
|
|
215
|
-
subject.remove(connection)
|
|
216
|
-
|
|
217
|
-
expect(subject).not_to have_received(:emit)
|
|
218
|
-
.with("pusher_internal:member_removed", channel_data)
|
|
219
|
-
end
|
|
220
|
-
end
|
|
221
|
-
|
|
222
|
-
describe PusherFake::Channel::Presence, "#subscription_data" do
|
|
223
|
-
subject { described_class.new("name") }
|
|
224
|
-
|
|
225
|
-
let(:one) { { user_id: 1, name: "Bob" } }
|
|
226
|
-
let(:two) { { user_id: 2, name: "Beau" } }
|
|
227
|
-
let(:data) { subject.subscription_data }
|
|
228
|
-
let(:members) { { double => one } }
|
|
229
|
-
|
|
230
|
-
before do
|
|
231
|
-
allow(subject).to receive(:members).and_return(members)
|
|
232
|
-
end
|
|
233
|
-
|
|
234
|
-
it "returns hash with presence information" do
|
|
235
|
-
expect(data).to eq(presence: {
|
|
236
|
-
hash: { one[:user_id] => one[:user_info] },
|
|
237
|
-
count: 1
|
|
238
|
-
})
|
|
239
|
-
end
|
|
240
|
-
|
|
241
|
-
it "handles multiple members" do
|
|
242
|
-
members[double] = two
|
|
243
|
-
|
|
244
|
-
expect(data[:presence][:count]).to eq(2)
|
|
245
|
-
expect(data[:presence][:hash]).to eq(
|
|
246
|
-
one[:user_id] => one[:user_info], two[:user_id] => two[:user_info]
|
|
247
|
-
)
|
|
248
|
-
end
|
|
249
|
-
end
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "spec_helper"
|
|
4
|
-
|
|
5
|
-
describe PusherFake::Channel::Private do
|
|
6
|
-
subject { described_class }
|
|
7
|
-
|
|
8
|
-
it "inherits from public channel" do
|
|
9
|
-
expect(subject.ancestors).to include(PusherFake::Channel::Public)
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
describe PusherFake::Channel::Private, "#add" do
|
|
14
|
-
subject { described_class.new(name) }
|
|
15
|
-
|
|
16
|
-
let(:data) { { auth: authentication } }
|
|
17
|
-
let(:name) { "name" }
|
|
18
|
-
let(:connection) { instance_double(PusherFake::Connection, emit: nil) }
|
|
19
|
-
let(:connections) { instance_double(Array, push: nil, length: 0) }
|
|
20
|
-
let(:authentication) { "auth" }
|
|
21
|
-
|
|
22
|
-
before do
|
|
23
|
-
allow(PusherFake::Webhook).to receive(:trigger)
|
|
24
|
-
allow(subject).to receive(:connections).and_return(connections)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
it "authorizes the connection" do
|
|
28
|
-
allow(subject).to receive(:authorized?).and_return(nil)
|
|
29
|
-
|
|
30
|
-
subject.add(connection, data)
|
|
31
|
-
|
|
32
|
-
expect(subject).to have_received(:authorized?).with(connection, data)
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
it "adds the connection to the channel when authorized" do
|
|
36
|
-
allow(subject).to receive(:authorized?).and_return(true)
|
|
37
|
-
|
|
38
|
-
subject.add(connection, data)
|
|
39
|
-
|
|
40
|
-
expect(connections).to have_received(:push).with(connection)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
it "successfully subscribes the connection when authorized" do
|
|
44
|
-
allow(subject).to receive(:authorized?).and_return(true)
|
|
45
|
-
|
|
46
|
-
subject.add(connection, data)
|
|
47
|
-
|
|
48
|
-
expect(connection).to have_received(:emit)
|
|
49
|
-
.with("pusher_internal:subscription_succeeded", {}, subject.name)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it "triggers occupied webhook for first connection added when authorized" do
|
|
53
|
-
allow(subject).to receive(:authorized?).and_return(true)
|
|
54
|
-
allow(subject).to receive(:connections).and_call_original
|
|
55
|
-
|
|
56
|
-
2.times { subject.add(connection, data) }
|
|
57
|
-
|
|
58
|
-
expect(PusherFake::Webhook).to have_received(:trigger)
|
|
59
|
-
.with("channel_occupied", channel: name).once
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
it "unsuccessfully subscribes the connection when not authorized" do
|
|
63
|
-
allow(subject).to receive(:authorized?).and_return(false)
|
|
64
|
-
|
|
65
|
-
subject.add(connection, data)
|
|
66
|
-
|
|
67
|
-
expect(connection).to have_received(:emit)
|
|
68
|
-
.with("pusher_internal:subscription_error", {}, subject.name)
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
it "does not trigger channel occupied webhook when not authorized" do
|
|
72
|
-
allow(subject).to receive(:authorized?).and_return(false)
|
|
73
|
-
allow(subject).to receive(:connections).and_call_original
|
|
74
|
-
|
|
75
|
-
2.times { subject.add(connection, data) }
|
|
76
|
-
|
|
77
|
-
expect(PusherFake::Webhook).not_to have_received(:trigger)
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
describe PusherFake::Channel::Private, "#authentication_for" do
|
|
82
|
-
subject { described_class.new(name) }
|
|
83
|
-
|
|
84
|
-
let(:id) { "1234" }
|
|
85
|
-
let(:name) { "private-channel" }
|
|
86
|
-
let(:digest) { instance_double(OpenSSL::Digest::SHA256) }
|
|
87
|
-
let(:string) { [id, name].join(":") }
|
|
88
|
-
let(:signature) { "signature" }
|
|
89
|
-
|
|
90
|
-
let(:configuration) do
|
|
91
|
-
instance_double(PusherFake::Configuration, key: "key", secret: "secret")
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
before do
|
|
95
|
-
allow(PusherFake).to receive(:configuration).and_return(configuration)
|
|
96
|
-
allow(OpenSSL::HMAC).to receive(:hexdigest).and_return(signature)
|
|
97
|
-
allow(OpenSSL::Digest).to receive(:new).with("SHA256").and_return(digest)
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
it "generates a signature" do
|
|
101
|
-
subject.authentication_for(id)
|
|
102
|
-
|
|
103
|
-
expect(OpenSSL::HMAC).to have_received(:hexdigest)
|
|
104
|
-
.with(digest, configuration.secret, string)
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
it "returns the authentication string" do
|
|
108
|
-
string = subject.authentication_for(id)
|
|
109
|
-
|
|
110
|
-
expect(string).to eq("#{configuration.key}:#{signature}")
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
describe PusherFake::Channel::Private,
|
|
115
|
-
"#authentication_for, with channel data" do
|
|
116
|
-
subject { described_class.new(name) }
|
|
117
|
-
|
|
118
|
-
let(:id) { "1234" }
|
|
119
|
-
let(:name) { "private-channel" }
|
|
120
|
-
let(:digest) { instance_double(OpenSSL::Digest::SHA256) }
|
|
121
|
-
let(:string) { [id, name, channel_data].join(":") }
|
|
122
|
-
let(:signature) { "signature" }
|
|
123
|
-
let(:channel_data) { "{}" }
|
|
124
|
-
|
|
125
|
-
let(:configuration) do
|
|
126
|
-
instance_double(PusherFake::Configuration, key: "key", secret: "secret")
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
before do
|
|
130
|
-
allow(PusherFake).to receive(:configuration).and_return(configuration)
|
|
131
|
-
allow(OpenSSL::HMAC).to receive(:hexdigest).and_return(signature)
|
|
132
|
-
allow(OpenSSL::Digest).to receive(:new).with("SHA256").and_return(digest)
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
it "generates a signature" do
|
|
136
|
-
subject.authentication_for(id, channel_data)
|
|
137
|
-
|
|
138
|
-
expect(OpenSSL::HMAC).to have_received(:hexdigest)
|
|
139
|
-
.with(digest, configuration.secret, string)
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
it "returns the authentication string" do
|
|
143
|
-
string = subject.authentication_for(id, channel_data)
|
|
144
|
-
|
|
145
|
-
expect(string).to eq("#{configuration.key}:#{signature}")
|
|
146
|
-
end
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
describe PusherFake::Channel::Private, "#authorized?" do
|
|
150
|
-
subject { described_class.new(name) }
|
|
151
|
-
|
|
152
|
-
let(:data) { { auth: authentication, channel_data: channel_data } }
|
|
153
|
-
let(:name) { "private-channel" }
|
|
154
|
-
let(:connection) { instance_double(PusherFake::Connection, id: "1") }
|
|
155
|
-
let(:channel_data) { "{}" }
|
|
156
|
-
let(:authentication) { "authentication" }
|
|
157
|
-
|
|
158
|
-
before do
|
|
159
|
-
allow(subject).to receive(:authentication_for)
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
it "generates authentication for the connection ID" do
|
|
163
|
-
subject.authorized?(connection, data)
|
|
164
|
-
|
|
165
|
-
expect(subject).to have_received(:authentication_for)
|
|
166
|
-
.with(connection.id, channel_data)
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
it "returns true if the authentication matches" do
|
|
170
|
-
allow(subject).to receive(:authentication_for).and_return(authentication)
|
|
171
|
-
|
|
172
|
-
expect(subject).to be_authorized(connection, data)
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
it "returns false if the authentication matches" do
|
|
176
|
-
allow(subject).to receive(:authentication_for).and_return("")
|
|
177
|
-
|
|
178
|
-
expect(subject).not_to be_authorized(connection, data)
|
|
179
|
-
end
|
|
180
|
-
end
|