fcm 0.0.7 → 1.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +30 -0
- data/.gitignore +1 -1
- data/Gemfile +1 -0
- data/README.md +89 -21
- data/fcm.gemspec +14 -15
- data/lib/fcm.rb +127 -61
- data/spec/fcm_spec.rb +177 -108
- metadata +35 -15
- data/.travis.yml +0 -8
data/spec/fcm_spec.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe FCM do
|
4
4
|
let(:send_url) { "#{FCM::BASE_URI}/fcm/send" }
|
5
5
|
let(:group_notification_base_uri) { "#{FCM::GROUP_NOTIFICATION_BASE_URI}/gcm/notification" }
|
6
|
-
let(:api_key) {
|
7
|
-
let(:registration_id) {
|
8
|
-
let(:registration_ids) { [
|
9
|
-
let(:key_name) {
|
6
|
+
let(:api_key) { "AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA" }
|
7
|
+
let(:registration_id) { "42" }
|
8
|
+
let(:registration_ids) { ["42"] }
|
9
|
+
let(:key_name) { "appUser-Chris" }
|
10
10
|
let(:project_id) { "123456789" } # https://developers.google.com/cloud-messaging/gcm#senderid
|
11
11
|
let(:notification_key) { "APA91bGHXQBB...9QgnYOEURwm0I3lmyqzk2TXQ" }
|
12
12
|
let(:valid_topic) { "TopicA" }
|
@@ -15,15 +15,19 @@ describe FCM do
|
|
15
15
|
let(:invalid_condition) { "'TopicA' in topics and some other text ('TopicB' in topics || 'TopicC' in topics)" }
|
16
16
|
let(:invalid_condition_topic) { "'TopicA$' in topics" }
|
17
17
|
|
18
|
-
it
|
18
|
+
it "should raise an error if the api key is not provided" do
|
19
19
|
expect { FCM.new }.to raise_error(ArgumentError)
|
20
20
|
end
|
21
21
|
|
22
|
-
it
|
22
|
+
it "should raise error if time_to_live is given" do
|
23
23
|
# ref: https://firebase.google.com/docs/cloud-messaging/http-server-ref#ttl
|
24
24
|
end
|
25
25
|
|
26
|
-
describe
|
26
|
+
describe "#send_v1" do
|
27
|
+
pending "should send message"
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "sending notification" do
|
27
31
|
let(:valid_request_body) do
|
28
32
|
{ registration_ids: registration_ids }
|
29
33
|
end
|
@@ -32,39 +36,39 @@ describe FCM do
|
|
32
36
|
end
|
33
37
|
let(:valid_request_headers) do
|
34
38
|
{
|
35
|
-
|
36
|
-
|
39
|
+
"Content-Type" => "application/json",
|
40
|
+
"Authorization" => "key=#{api_key}",
|
37
41
|
}
|
38
42
|
end
|
39
43
|
|
40
44
|
let(:stub_fcm_send_request) do
|
41
45
|
stub_request(:post, send_url).with(
|
42
46
|
body: valid_request_body.to_json,
|
43
|
-
headers: valid_request_headers
|
47
|
+
headers: valid_request_headers,
|
44
48
|
).to_return(
|
45
49
|
# ref: https://firebase.google.com/docs/cloud-messaging/http-server-ref#interpret-downstream
|
46
|
-
body:
|
50
|
+
body: "{}",
|
47
51
|
headers: {},
|
48
|
-
status: 200
|
52
|
+
status: 200,
|
49
53
|
)
|
50
54
|
end
|
51
55
|
|
52
56
|
let(:stub_fcm_send_request_with_string) do
|
53
57
|
stub_request(:post, send_url).with(
|
54
58
|
body: valid_request_body_with_string.to_json,
|
55
|
-
headers: valid_request_headers
|
59
|
+
headers: valid_request_headers,
|
56
60
|
).to_return(
|
57
|
-
body:
|
61
|
+
body: "{}",
|
58
62
|
headers: {},
|
59
|
-
status: 200
|
63
|
+
status: 200,
|
60
64
|
)
|
61
65
|
end
|
62
66
|
|
63
67
|
let(:stub_fcm_send_request_with_basic_auth) do
|
64
68
|
uri = URI.parse(send_url)
|
65
|
-
uri.user =
|
66
|
-
uri.password =
|
67
|
-
stub_request(:post, uri.to_s).to_return(body:
|
69
|
+
uri.user = "a"
|
70
|
+
uri.password = "b"
|
71
|
+
stub_request(:post, uri.to_s).to_return(body: "{}", headers: {}, status: 200)
|
68
72
|
end
|
69
73
|
|
70
74
|
before(:each) do
|
@@ -73,30 +77,30 @@ describe FCM do
|
|
73
77
|
stub_fcm_send_request_with_basic_auth
|
74
78
|
end
|
75
79
|
|
76
|
-
it
|
80
|
+
it "should send notification using POST to FCM server" do
|
77
81
|
fcm = FCM.new(api_key)
|
78
|
-
fcm.send(registration_ids).should eq(response:
|
82
|
+
fcm.send(registration_ids).should eq(response: "success", body: "{}", headers: {}, status_code: 200, canonical_ids: [], not_registered_ids: [])
|
79
83
|
stub_fcm_send_request.should have_been_made.times(1)
|
80
84
|
end
|
81
85
|
|
82
|
-
it
|
86
|
+
it "should send notification using POST to FCM if id provided as string" do
|
83
87
|
fcm = FCM.new(api_key)
|
84
|
-
fcm.send(registration_id).should eq(response:
|
88
|
+
fcm.send(registration_id).should eq(response: "success", body: "{}", headers: {}, status_code: 200, canonical_ids: [], not_registered_ids: [])
|
85
89
|
stub_fcm_send_request.should have_been_made.times(1)
|
86
90
|
end
|
87
91
|
|
88
|
-
context
|
92
|
+
context "send notification with data" do
|
89
93
|
let!(:stub_with_data) do
|
90
94
|
stub_request(:post, send_url)
|
91
95
|
.with(body: '{"registration_ids":["42"],"data":{"score":"5x1","time":"15:10"}}',
|
92
96
|
headers: valid_request_headers)
|
93
|
-
.to_return(status: 200, body:
|
97
|
+
.to_return(status: 200, body: "", headers: {})
|
94
98
|
end
|
95
99
|
before do
|
96
100
|
end
|
97
|
-
it
|
101
|
+
it "should send the data in a post request to fcm" do
|
98
102
|
fcm = FCM.new(api_key)
|
99
|
-
fcm.send(registration_ids, data: { score:
|
103
|
+
fcm.send(registration_ids, data: { score: "5x1", time: "15:10" })
|
100
104
|
stub_with_data.should have_been_requested
|
101
105
|
end
|
102
106
|
end
|
@@ -106,25 +110,25 @@ describe FCM do
|
|
106
110
|
stub_request(:post, send_url)
|
107
111
|
.with(body: '{"to":"/topics/TopicA","data":{"score":"5x1","time":"15:10"}}',
|
108
112
|
headers: valid_request_headers)
|
109
|
-
.to_return(status: 200, body:
|
113
|
+
.to_return(status: 200, body: "", headers: {})
|
110
114
|
end
|
111
115
|
let!(:stub_with_invalid_topic) do
|
112
116
|
stub_request(:post, send_url)
|
113
117
|
.with(body: '{"condition":"/topics/TopicA$","data":{"score":"5x1","time":"15:10"}}',
|
114
118
|
headers: valid_request_headers)
|
115
|
-
.to_return(status: 200, body:
|
119
|
+
.to_return(status: 200, body: "", headers: {})
|
116
120
|
end
|
117
121
|
|
118
122
|
describe "#send_to_topic" do
|
119
|
-
it
|
123
|
+
it "should send the data in a post request to fcm" do
|
120
124
|
fcm = FCM.new(api_key)
|
121
|
-
fcm.send_to_topic(valid_topic, data: { score:
|
125
|
+
fcm.send_to_topic(valid_topic, data: { score: "5x1", time: "15:10" })
|
122
126
|
stub_with_valid_topic.should have_been_requested
|
123
127
|
end
|
124
128
|
|
125
|
-
it
|
129
|
+
it "should not send to invalid topics" do
|
126
130
|
fcm = FCM.new(api_key)
|
127
|
-
fcm.send_to_topic(invalid_topic, data: { score:
|
131
|
+
fcm.send_to_topic(invalid_topic, data: { score: "5x1", time: "15:10" })
|
128
132
|
stub_with_invalid_topic.should_not have_been_requested
|
129
133
|
end
|
130
134
|
end
|
@@ -135,143 +139,143 @@ describe FCM do
|
|
135
139
|
stub_request(:post, send_url)
|
136
140
|
.with(body: '{"condition":"\'TopicA\' in topics && (\'TopicB\' in topics || \'TopicC\' in topics)","data":{"score":"5x1","time":"15:10"}}',
|
137
141
|
headers: valid_request_headers)
|
138
|
-
.to_return(status: 200, body:
|
142
|
+
.to_return(status: 200, body: "", headers: {})
|
139
143
|
end
|
140
144
|
let!(:stub_with_invalid_condition) do
|
141
145
|
stub_request(:post, send_url)
|
142
146
|
.with(body: '{"condition":"\'TopicA\' in topics and some other text (\'TopicB\' in topics || \'TopicC\' in topics)","data":{"score":"5x1","time":"15:10"}}',
|
143
147
|
headers: valid_request_headers)
|
144
|
-
.to_return(status: 200, body:
|
148
|
+
.to_return(status: 200, body: "", headers: {})
|
145
149
|
end
|
146
150
|
let!(:stub_with_invalid_condition_topic) do
|
147
151
|
stub_request(:post, send_url)
|
148
152
|
.with(body: '{"condition":"\'TopicA$\' in topics","data":{"score":"5x1","time":"15:10"}}',
|
149
153
|
headers: valid_request_headers)
|
150
|
-
.to_return(status: 200, body:
|
154
|
+
.to_return(status: 200, body: "", headers: {})
|
151
155
|
end
|
152
156
|
|
153
157
|
describe "#send_to_topic_condition" do
|
154
|
-
it
|
158
|
+
it "should send the data in a post request to fcm" do
|
155
159
|
fcm = FCM.new(api_key)
|
156
|
-
fcm.send_to_topic_condition(valid_condition, data: { score:
|
160
|
+
fcm.send_to_topic_condition(valid_condition, data: { score: "5x1", time: "15:10" })
|
157
161
|
stub_with_valid_condition.should have_been_requested
|
158
162
|
end
|
159
163
|
|
160
|
-
it
|
164
|
+
it "should not send to invalid conditions" do
|
161
165
|
fcm = FCM.new(api_key)
|
162
|
-
fcm.send_to_topic_condition(invalid_condition, data: { score:
|
166
|
+
fcm.send_to_topic_condition(invalid_condition, data: { score: "5x1", time: "15:10" })
|
163
167
|
stub_with_invalid_condition.should_not have_been_requested
|
164
168
|
end
|
165
169
|
|
166
|
-
it
|
170
|
+
it "should not send to invalid topics in a condition" do
|
167
171
|
fcm = FCM.new(api_key)
|
168
|
-
fcm.send_to_topic_condition(invalid_condition_topic, data: { score:
|
172
|
+
fcm.send_to_topic_condition(invalid_condition_topic, data: { score: "5x1", time: "15:10" })
|
169
173
|
stub_with_invalid_condition_topic.should_not have_been_requested
|
170
174
|
end
|
171
175
|
end
|
172
176
|
end
|
173
177
|
|
174
|
-
context
|
178
|
+
context "when send_notification responds with failure" do
|
175
179
|
let(:mock_request_attributes) do
|
176
180
|
{
|
177
181
|
body: valid_request_body.to_json,
|
178
|
-
headers: valid_request_headers
|
182
|
+
headers: valid_request_headers,
|
179
183
|
}
|
180
184
|
end
|
181
185
|
|
182
186
|
subject { FCM.new(api_key) }
|
183
187
|
|
184
|
-
context
|
188
|
+
context "on failure code 400" do
|
185
189
|
before do
|
186
190
|
stub_request(:post, send_url).with(
|
187
191
|
mock_request_attributes
|
188
192
|
).to_return(
|
189
193
|
# ref: https://firebase.google.com/docs/cloud-messaging/http-server-ref#interpret-downstream
|
190
|
-
body:
|
194
|
+
body: "{}",
|
191
195
|
headers: {},
|
192
|
-
status: 400
|
196
|
+
status: 400,
|
193
197
|
)
|
194
198
|
end
|
195
|
-
it
|
196
|
-
subject.send(registration_ids).should eq(body:
|
199
|
+
it "should not send notification due to 400" do
|
200
|
+
subject.send(registration_ids).should eq(body: "{}",
|
197
201
|
headers: {},
|
198
|
-
response:
|
202
|
+
response: "Only applies for JSON requests. Indicates that the request could not be parsed as JSON, or it contained invalid fields.",
|
199
203
|
status_code: 400)
|
200
204
|
end
|
201
205
|
end
|
202
206
|
|
203
|
-
context
|
207
|
+
context "on failure code 401" do
|
204
208
|
before do
|
205
209
|
stub_request(:post, send_url).with(
|
206
210
|
mock_request_attributes
|
207
211
|
).to_return(
|
208
212
|
# ref: https://firebase.google.com/docs/cloud-messaging/http-server-ref#interpret-downstream
|
209
|
-
body:
|
213
|
+
body: "{}",
|
210
214
|
headers: {},
|
211
|
-
status: 401
|
215
|
+
status: 401,
|
212
216
|
)
|
213
217
|
end
|
214
218
|
|
215
|
-
it
|
216
|
-
subject.send(registration_ids).should eq(body:
|
219
|
+
it "should not send notification due to 401" do
|
220
|
+
subject.send(registration_ids).should eq(body: "{}",
|
217
221
|
headers: {},
|
218
|
-
response:
|
222
|
+
response: "There was an error authenticating the sender account.",
|
219
223
|
status_code: 401)
|
220
224
|
end
|
221
225
|
end
|
222
226
|
|
223
|
-
context
|
227
|
+
context "on failure code 503" do
|
224
228
|
before do
|
225
229
|
stub_request(:post, send_url).with(
|
226
230
|
mock_request_attributes
|
227
231
|
).to_return(
|
228
232
|
# ref: https://firebase.google.com/docs/cloud-messaging/http-server-ref#interpret-downstream
|
229
|
-
body:
|
233
|
+
body: "{}",
|
230
234
|
headers: {},
|
231
|
-
status: 503
|
235
|
+
status: 503,
|
232
236
|
)
|
233
237
|
end
|
234
238
|
|
235
|
-
it
|
236
|
-
subject.send(registration_ids).should eq(body:
|
239
|
+
it "should not send notification due to 503" do
|
240
|
+
subject.send(registration_ids).should eq(body: "{}",
|
237
241
|
headers: {},
|
238
|
-
response:
|
242
|
+
response: "Server is temporarily unavailable.",
|
239
243
|
status_code: 503)
|
240
244
|
end
|
241
245
|
end
|
242
246
|
|
243
|
-
context
|
247
|
+
context "on failure code 5xx" do
|
244
248
|
before do
|
245
249
|
stub_request(:post, send_url).with(
|
246
250
|
mock_request_attributes
|
247
251
|
).to_return(
|
248
252
|
# ref: https://firebase.google.com/docs/cloud-messaging/http-server-ref#interpret-downstream
|
249
253
|
body: '{"body-key" => "Body value"}',
|
250
|
-
headers: {
|
251
|
-
status: 599
|
254
|
+
headers: { "header-key" => "Header value" },
|
255
|
+
status: 599,
|
252
256
|
)
|
253
257
|
end
|
254
258
|
|
255
|
-
it
|
259
|
+
it "should not send notification due to 599" do
|
256
260
|
subject.send(registration_ids).should eq(body: '{"body-key" => "Body value"}',
|
257
|
-
headers: {
|
258
|
-
response:
|
261
|
+
headers: { "header-key" => "Header value" },
|
262
|
+
response: "There was an internal error in the FCM server while trying to process the request.",
|
259
263
|
status_code: 599)
|
260
264
|
end
|
261
265
|
end
|
262
266
|
end
|
263
267
|
|
264
|
-
context
|
268
|
+
context "when send_notification responds canonical_ids" do
|
265
269
|
let(:mock_request_attributes) do
|
266
270
|
{
|
267
271
|
body: valid_request_body.to_json,
|
268
|
-
headers: valid_request_headers
|
272
|
+
headers: valid_request_headers,
|
269
273
|
}
|
270
274
|
end
|
271
275
|
|
272
276
|
let(:valid_response_body_with_canonical_ids) do
|
273
277
|
{
|
274
|
-
failure: 0, canonical_ids: 1, results: [{ registration_id:
|
278
|
+
failure: 0, canonical_ids: 1, results: [{ registration_id: "43", message_id: "0:1385025861956342%572c22801bb3" }],
|
275
279
|
}
|
276
280
|
end
|
277
281
|
|
@@ -284,35 +288,35 @@ describe FCM do
|
|
284
288
|
# ref: https://firebase.google.com/docs/cloud-messaging/http-server-ref#interpret-downstream
|
285
289
|
body: valid_response_body_with_canonical_ids.to_json,
|
286
290
|
headers: {},
|
287
|
-
status: 200
|
291
|
+
status: 200,
|
288
292
|
)
|
289
293
|
end
|
290
294
|
|
291
|
-
it
|
295
|
+
it "should contain canonical_ids" do
|
292
296
|
response = subject.send(registration_ids)
|
293
297
|
|
294
298
|
response.should eq(headers: {},
|
295
|
-
canonical_ids: [{ old:
|
299
|
+
canonical_ids: [{ old: "42", new: "43" }],
|
296
300
|
not_registered_ids: [],
|
297
301
|
status_code: 200,
|
298
|
-
response:
|
302
|
+
response: "success",
|
299
303
|
body: '{"failure":0,"canonical_ids":1,"results":[{"registration_id":"43","message_id":"0:1385025861956342%572c22801bb3"}]}')
|
300
304
|
end
|
301
305
|
end
|
302
306
|
|
303
|
-
context
|
307
|
+
context "when send_notification responds with NotRegistered" do
|
304
308
|
subject { FCM.new(api_key) }
|
305
309
|
|
306
310
|
let(:mock_request_attributes) do
|
307
311
|
{
|
308
312
|
body: valid_request_body.to_json,
|
309
|
-
headers: valid_request_headers
|
313
|
+
headers: valid_request_headers,
|
310
314
|
}
|
311
315
|
end
|
312
316
|
|
313
317
|
let(:valid_response_body_with_not_registered_ids) do
|
314
318
|
{
|
315
|
-
canonical_ids: 0, failure: 1, results: [{ error:
|
319
|
+
canonical_ids: 0, failure: 1, results: [{ error: "NotRegistered" }],
|
316
320
|
}
|
317
321
|
end
|
318
322
|
|
@@ -322,31 +326,31 @@ describe FCM do
|
|
322
326
|
).to_return(
|
323
327
|
body: valid_response_body_with_not_registered_ids.to_json,
|
324
328
|
headers: {},
|
325
|
-
status: 200
|
329
|
+
status: 200,
|
326
330
|
)
|
327
331
|
end
|
328
332
|
|
329
|
-
it
|
333
|
+
it "should contain not_registered_ids" do
|
330
334
|
response = subject.send(registration_ids)
|
331
335
|
response.should eq(
|
332
336
|
headers: {},
|
333
337
|
canonical_ids: [],
|
334
338
|
not_registered_ids: registration_ids,
|
335
339
|
status_code: 200,
|
336
|
-
response:
|
337
|
-
body: '{"canonical_ids":0,"failure":1,"results":[{"error":"NotRegistered"}]}'
|
340
|
+
response: "success",
|
341
|
+
body: '{"canonical_ids":0,"failure":1,"results":[{"error":"NotRegistered"}]}',
|
338
342
|
)
|
339
343
|
end
|
340
344
|
end
|
341
345
|
end
|
342
346
|
|
343
|
-
describe
|
347
|
+
describe "sending group notifications" do
|
344
348
|
# TODO: refactor to should_behave_like
|
345
349
|
let(:valid_request_headers) do
|
346
350
|
{
|
347
351
|
"Authorization" => "key=#{api_key}",
|
348
|
-
"Content-Type" =>
|
349
|
-
"Project-Id" => project_id
|
352
|
+
"Content-Type" => "application/json",
|
353
|
+
"Project-Id" => project_id,
|
350
354
|
}
|
351
355
|
end
|
352
356
|
let(:valid_response_body) do
|
@@ -357,24 +361,24 @@ describe FCM do
|
|
357
361
|
{
|
358
362
|
registration_ids: registration_ids,
|
359
363
|
operation: "create",
|
360
|
-
notification_key_name: key_name
|
364
|
+
notification_key_name: key_name,
|
361
365
|
}
|
362
366
|
end
|
363
367
|
|
364
368
|
subject { FCM.new(api_key) }
|
365
369
|
|
366
370
|
# ref: https://firebase.google.com/docs/cloud-messaging/notifications#managing-device-groups-on-the-app-server
|
367
|
-
context
|
371
|
+
context "create" do
|
368
372
|
let(:valid_request_body) do
|
369
373
|
default_valid_request_body.merge({
|
370
|
-
operation: "create"
|
374
|
+
operation: "create",
|
371
375
|
})
|
372
376
|
end
|
373
377
|
|
374
378
|
let(:mock_request_attributes) do
|
375
379
|
{
|
376
380
|
body: valid_request_body.to_json,
|
377
|
-
headers: valid_request_headers
|
381
|
+
headers: valid_request_headers,
|
378
382
|
}
|
379
383
|
end
|
380
384
|
|
@@ -384,33 +388,33 @@ describe FCM do
|
|
384
388
|
).to_return(
|
385
389
|
body: valid_response_body.to_json,
|
386
390
|
headers: {},
|
387
|
-
status: 200
|
391
|
+
status: 200,
|
388
392
|
)
|
389
393
|
end
|
390
394
|
|
391
|
-
it
|
395
|
+
it "should send a post request" do
|
392
396
|
response = subject.create(key_name, project_id, registration_ids)
|
393
397
|
response.should eq(
|
394
398
|
headers: {},
|
395
399
|
status_code: 200,
|
396
|
-
response:
|
397
|
-
body: valid_response_body.to_json
|
400
|
+
response: "success",
|
401
|
+
body: valid_response_body.to_json,
|
398
402
|
)
|
399
403
|
end
|
400
404
|
end # create context
|
401
405
|
|
402
|
-
context
|
406
|
+
context "add" do
|
403
407
|
let(:valid_request_body) do
|
404
408
|
default_valid_request_body.merge({
|
405
409
|
operation: "add",
|
406
|
-
notification_key: notification_key
|
410
|
+
notification_key: notification_key,
|
407
411
|
})
|
408
412
|
end
|
409
413
|
|
410
414
|
let(:mock_request_attributes) do
|
411
415
|
{
|
412
416
|
body: valid_request_body.to_json,
|
413
|
-
headers: valid_request_headers
|
417
|
+
headers: valid_request_headers,
|
414
418
|
}
|
415
419
|
end
|
416
420
|
|
@@ -420,33 +424,33 @@ describe FCM do
|
|
420
424
|
).to_return(
|
421
425
|
body: valid_response_body.to_json,
|
422
426
|
headers: {},
|
423
|
-
status: 200
|
427
|
+
status: 200,
|
424
428
|
)
|
425
429
|
end
|
426
430
|
|
427
|
-
it
|
431
|
+
it "should send a post request" do
|
428
432
|
response = subject.add(key_name, project_id, notification_key, registration_ids)
|
429
433
|
response.should eq(
|
430
434
|
headers: {},
|
431
435
|
status_code: 200,
|
432
|
-
response:
|
433
|
-
body: valid_response_body.to_json
|
436
|
+
response: "success",
|
437
|
+
body: valid_response_body.to_json,
|
434
438
|
)
|
435
439
|
end
|
436
440
|
end # add context
|
437
441
|
|
438
|
-
context
|
442
|
+
context "remove" do
|
439
443
|
let(:valid_request_body) do
|
440
444
|
default_valid_request_body.merge({
|
441
445
|
operation: "remove",
|
442
|
-
notification_key: notification_key
|
446
|
+
notification_key: notification_key,
|
443
447
|
})
|
444
448
|
end
|
445
449
|
|
446
450
|
let(:mock_request_attributes) do
|
447
451
|
{
|
448
452
|
body: valid_request_body.to_json,
|
449
|
-
headers: valid_request_headers
|
453
|
+
headers: valid_request_headers,
|
450
454
|
}
|
451
455
|
end
|
452
456
|
|
@@ -456,23 +460,88 @@ describe FCM do
|
|
456
460
|
).to_return(
|
457
461
|
body: valid_response_body.to_json,
|
458
462
|
headers: {},
|
459
|
-
status: 200
|
463
|
+
status: 200,
|
460
464
|
)
|
461
465
|
end
|
462
466
|
|
463
|
-
it
|
467
|
+
it "should send a post request" do
|
464
468
|
response = subject.remove(key_name, project_id, notification_key, registration_ids)
|
465
469
|
response.should eq(
|
466
470
|
headers: {},
|
467
471
|
status_code: 200,
|
468
|
-
response:
|
469
|
-
body: valid_response_body.to_json
|
472
|
+
response: "success",
|
473
|
+
body: valid_response_body.to_json,
|
470
474
|
)
|
471
475
|
end
|
472
476
|
end # remove context
|
473
477
|
end
|
474
478
|
|
475
|
-
describe
|
479
|
+
describe "#recover_notification_key" do
|
480
|
+
it "sends a 'retrieve notification key' request" do
|
481
|
+
uri = "#{FCM::GROUP_NOTIFICATION_BASE_URI}/gcm/notification"
|
482
|
+
endpoint = stub_request(:get, uri).with(
|
483
|
+
headers: {
|
484
|
+
"Content-Type" => "application/json",
|
485
|
+
"Authorization" => "key=TEST_SERVER_KEY",
|
486
|
+
"project_id" => "TEST_PROJECT_ID",
|
487
|
+
},
|
488
|
+
query: { notification_key_name: "TEST_KEY_NAME" },
|
489
|
+
)
|
490
|
+
client = FCM.new("TEST_SERVER_KEY")
|
491
|
+
|
492
|
+
client.recover_notification_key("TEST_KEY_NAME", "TEST_PROJECT_ID")
|
493
|
+
|
494
|
+
expect(endpoint).to have_been_requested
|
495
|
+
end
|
496
|
+
end
|
497
|
+
|
498
|
+
describe "subscribing to a topic" do
|
476
499
|
# TODO
|
477
500
|
end
|
501
|
+
|
502
|
+
describe 'getting instance info' do
|
503
|
+
subject(:get_info) { client.get_instance_id_info(registration_id, options) }
|
504
|
+
|
505
|
+
let(:options) { nil }
|
506
|
+
let(:client) { FCM.new('TEST_SERVER_KEY') }
|
507
|
+
let(:base_uri) { "#{FCM::INSTANCE_ID_API}/iid/info" }
|
508
|
+
let(:uri) { "#{base_uri}/#{registration_id}" }
|
509
|
+
let(:mock_request_attributes) do
|
510
|
+
{ headers: {
|
511
|
+
'Authorization' => 'key=TEST_SERVER_KEY',
|
512
|
+
'Content-Type' => 'application/json'
|
513
|
+
} }
|
514
|
+
end
|
515
|
+
|
516
|
+
context 'without options' do
|
517
|
+
it 'calls info endpoint' do
|
518
|
+
endpoint = stub_request(:get, uri).with(mock_request_attributes)
|
519
|
+
get_info
|
520
|
+
expect(endpoint).to have_been_requested
|
521
|
+
end
|
522
|
+
end
|
523
|
+
|
524
|
+
context 'with detail option' do
|
525
|
+
let(:uri) { "#{base_uri}/#{registration_id}?details=true" }
|
526
|
+
let(:options) { { details: true } }
|
527
|
+
|
528
|
+
it 'calls info endpoint' do
|
529
|
+
endpoint = stub_request(:get, uri).with(mock_request_attributes)
|
530
|
+
get_info
|
531
|
+
expect(endpoint).to have_been_requested
|
532
|
+
end
|
533
|
+
end
|
534
|
+
end
|
535
|
+
|
536
|
+
describe "credentials path" do
|
537
|
+
it "can be a path to a file" do
|
538
|
+
fcm = FCM.new("test", "README.md")
|
539
|
+
expect(fcm.__send__(:json_key).class).to eq(File)
|
540
|
+
end
|
541
|
+
|
542
|
+
it "can be an IO object" do
|
543
|
+
fcm = FCM.new("test", StringIO.new("hey"))
|
544
|
+
expect(fcm.__send__(:json_key).class).to eq(StringIO)
|
545
|
+
end
|
546
|
+
end
|
478
547
|
end
|