zero_push 2.4.1 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -0
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +9 -1
- data/{LICENSE → LICENSE.md} +4 -1
- data/README.md +41 -38
- data/lib/zero_push.rb +29 -35
- data/lib/zero_push/client.rb +165 -22
- data/lib/zero_push/compatibility.rb +21 -0
- data/lib/zero_push/version.rb +1 -1
- data/spec/spec_helper.rb +2 -1
- data/spec/zero_push_client_spec.rb +166 -19
- data/spec/zero_push_spec.rb +11 -0
- data/zero_push.gemspec +1 -0
- metadata +21 -6
- data/spec/fixtures/responses.rb +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53395004125fe3080de63c22f54cf1c0a5bb03d3
|
4
|
+
data.tar.gz: 75b2fa3bb0bebfe3ced3da55a7574e3c837fba6e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d7aa1ff0fc3e1ef9929b980a8e09bfb974f833ab9195d989901e33dab01646709199e1a4c1eef38cf069205ac84e74f8f275a8cf53ef0eebbd8b8ed391e2b39
|
7
|
+
data.tar.gz: 57999b89d6297aea450bd392603c13e51e7f806966dc95c2f8e5142f940f2255e1db6ff0f2a7d42da91ea3cd4cb4354849e5139dc82e6fbdd83fe65c5616774b
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
ADDED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
zero_push (2.
|
4
|
+
zero_push (2.5.0)
|
5
5
|
faraday (~> 0.9.0)
|
6
6
|
faraday_middleware (~> 0.9.0)
|
7
7
|
|
@@ -23,8 +23,11 @@ GEM
|
|
23
23
|
minitest (~> 5.1)
|
24
24
|
thread_safe (~> 0.1)
|
25
25
|
tzinfo (~> 1.1)
|
26
|
+
addressable (2.3.6)
|
26
27
|
builder (3.2.2)
|
27
28
|
coderay (1.1.0)
|
29
|
+
crack (0.4.2)
|
30
|
+
safe_yaml (~> 1.0.0)
|
28
31
|
erubis (2.7.0)
|
29
32
|
faraday (0.9.0)
|
30
33
|
multipart-post (>= 1.2, < 3)
|
@@ -53,11 +56,15 @@ GEM
|
|
53
56
|
rake (>= 0.8.7)
|
54
57
|
thor (>= 0.18.1, < 2.0)
|
55
58
|
rake (10.3.2)
|
59
|
+
safe_yaml (1.0.4)
|
56
60
|
slop (3.4.7)
|
57
61
|
thor (0.19.1)
|
58
62
|
thread_safe (0.3.4)
|
59
63
|
tzinfo (1.2.1)
|
60
64
|
thread_safe (~> 0.1)
|
65
|
+
webmock (1.20.4)
|
66
|
+
addressable (>= 2.3.6)
|
67
|
+
crack (>= 0.3.2)
|
61
68
|
|
62
69
|
PLATFORMS
|
63
70
|
ruby
|
@@ -69,4 +76,5 @@ DEPENDENCIES
|
|
69
76
|
pry
|
70
77
|
railties (~> 4.1.4)
|
71
78
|
rake (~> 10.3.2)
|
79
|
+
webmock (~> 1.20.4)
|
72
80
|
zero_push!
|
data/{LICENSE → LICENSE.md}
RENAMED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
## License
|
2
|
+
|
3
|
+
Copyright (c) 2015 Symmetric Infinity LLC
|
2
4
|
|
3
5
|
MIT License
|
4
6
|
|
@@ -20,3 +22,4 @@ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
22
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
23
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
24
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
25
|
+
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
[![ZeroPush](https://raw.github.com/ZeroPush/zero_push/master/zeropush-header.png)](https://zeropush.com)
|
2
2
|
|
3
|
-
|
3
|
+
[![Build Status](http://img.shields.io/travis/ZeroPush/zero_push.svg)](https://travis-ci.org/ZeroPush/zero_push) [![Code Climate](https://codeclimate.com/github/ZeroPush/zero_push/badges/gpa.svg)](https://codeclimate.com/github/ZeroPush/zero_push) [![Gem Version](http://img.shields.io/gem/v/zero_push.svg)](http://rubygems.org/gems/zero_push)
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -25,21 +25,50 @@ Generate the ZeroPush initializer if you are using Ruby on Rails.
|
|
25
25
|
|
26
26
|
### API Client
|
27
27
|
|
28
|
-
The easiest way to use the API client is to set the
|
28
|
+
The easiest way to use the API client is to set the server `auth_token` at the module level and call methods on the ZeroPush module. You can find the token on settings page for your app.
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
```ruby
|
31
|
+
ZeroPush.auth_token = 'iosprod_your-server-token'
|
32
|
+
ZeroPush.verify_credentials
|
33
|
+
=> true
|
34
|
+
ZeroPush.notify(device_tokens: ['abcdef'], alert: 'hello, world', badge: '+1')
|
35
|
+
```
|
33
36
|
|
34
|
-
If your application
|
37
|
+
If your web application supports must support multiple mobile apps, you may configure it like this:
|
35
38
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
+
```ruby
|
40
|
+
if Rails.env == 'development' #or ENV['RACK_ENV']
|
41
|
+
ZeroPush.auth_tokens = {
|
42
|
+
apns: 'iosdev_XYZ',
|
43
|
+
gcm: 'gcmdev_ABC',
|
44
|
+
}
|
45
|
+
else
|
46
|
+
ZeroPush.auth_tokens = {
|
47
|
+
apns: 'iosprod_XYZ',
|
48
|
+
gcm: 'gcmprod_ABC',
|
49
|
+
}
|
50
|
+
end
|
51
|
+
```
|
39
52
|
|
40
|
-
|
41
|
-
|
42
|
-
|
53
|
+
You may then instantiate clients by calling the method that matches the auth token key:
|
54
|
+
|
55
|
+
```ruby
|
56
|
+
ZeroPush.apns.broadcast( ... )
|
57
|
+
ZeroPush.gcm.broadcast( ... )
|
58
|
+
```
|
59
|
+
|
60
|
+
|
61
|
+
Lastly, if you have many apps you may instantiate clients API Clients
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
client_1 = ZeroPush.client('iosprod_app-server-token-1')
|
65
|
+
client_1.broadcast(alert: 'hello, app1')
|
66
|
+
|
67
|
+
client_2 = ZeroPush.client('iosprod_app-server-token-2')
|
68
|
+
client_1.broadcast(alert: 'hello, app2')
|
69
|
+
```
|
70
|
+
|
71
|
+
Methods supported by this gem and their parameters can be found in the [API Reference](https://zeropush.com/documentation/api_reference)
|
43
72
|
|
44
73
|
For more documentation, check our [Getting Started Guide with ZeroPush](https://zeropush.com/documentation)
|
45
74
|
|
@@ -51,29 +80,3 @@ For more documentation, check our [Getting Started Guide with ZeroPush](https://
|
|
51
80
|
1. Commit your changes (`git commit -am 'Add some feature'`)
|
52
81
|
1. Push to the branch (`git push origin my-new-feature`)
|
53
82
|
1. Create new Pull Request
|
54
|
-
|
55
|
-
## License
|
56
|
-
|
57
|
-
Copyright (c) 2014 Symmetric Infinity LLC
|
58
|
-
|
59
|
-
MIT License
|
60
|
-
|
61
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
62
|
-
a copy of this software and associated documentation files (the
|
63
|
-
"Software"), to deal in the Software without restriction, including
|
64
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
65
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
66
|
-
permit persons to whom the Software is furnished to do so, subject to
|
67
|
-
the following conditions:
|
68
|
-
|
69
|
-
The above copyright notice and this permission notice shall be
|
70
|
-
included in all copies or substantial portions of the Software.
|
71
|
-
|
72
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
73
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
74
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
75
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
76
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
77
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
78
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
79
|
-
|
data/lib/zero_push.rb
CHANGED
@@ -4,46 +4,40 @@ require 'faraday'
|
|
4
4
|
|
5
5
|
module ZeroPush
|
6
6
|
class << self
|
7
|
-
|
7
|
+
extend Forwardable
|
8
|
+
attr_accessor :auth_token, :auth_tokens, :config
|
9
|
+
|
10
|
+
def_delegators :client,
|
11
|
+
:verify_credentials,
|
12
|
+
:notify,
|
13
|
+
:broadcast,
|
14
|
+
:subscribe,
|
15
|
+
:unsubscribe,
|
16
|
+
:register,
|
17
|
+
:unregister,
|
18
|
+
:set_badge,
|
19
|
+
:inactive_tokens,
|
20
|
+
:devices,
|
21
|
+
:set_device,
|
22
|
+
:update_device,
|
23
|
+
:channels,
|
24
|
+
:channel,
|
25
|
+
:delete_channel
|
8
26
|
|
9
|
-
def
|
10
|
-
|
11
|
-
end
|
12
|
-
|
13
|
-
def notify(params)
|
14
|
-
client.notify(params)
|
15
|
-
end
|
16
|
-
|
17
|
-
def broadcast(params)
|
18
|
-
client.broadcast(params)
|
19
|
-
end
|
20
|
-
|
21
|
-
def subscribe(device_token, channel)
|
22
|
-
client.subscribe(device_token, channel)
|
23
|
-
end
|
24
|
-
|
25
|
-
def unsubscribe(device_token, channel)
|
26
|
-
client.unsubscribe(device_token, channel)
|
27
|
-
end
|
28
|
-
|
29
|
-
def register(device_token, channel=nil)
|
30
|
-
client.register(device_token, channel)
|
31
|
-
end
|
32
|
-
|
33
|
-
def unregister(device_token)
|
34
|
-
client.unregister(device_token)
|
35
|
-
end
|
36
|
-
|
37
|
-
def set_badge(device_token, badge)
|
38
|
-
client.set_badge(device_token, badge)
|
27
|
+
def client(auth_token = self.auth_token)
|
28
|
+
ZeroPush::Client.new(auth_token)
|
39
29
|
end
|
40
30
|
|
41
|
-
def
|
42
|
-
|
31
|
+
def config
|
32
|
+
@config ||= {:http_adapter => Faraday.default_adapter, request_encoding: :json}
|
43
33
|
end
|
44
34
|
|
45
|
-
def
|
46
|
-
|
35
|
+
def method_missing(method, *params, &block)
|
36
|
+
if auth_tokens.is_a?(Hash) && auth_tokens.keys.include?(method)
|
37
|
+
self.client(auth_tokens[method])
|
38
|
+
else
|
39
|
+
super
|
40
|
+
end
|
47
41
|
end
|
48
42
|
end
|
49
43
|
end
|
data/lib/zero_push/client.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'zero_push/compatibility'
|
1
2
|
require 'faraday_middleware'
|
2
3
|
|
3
4
|
module ZeroPush
|
@@ -8,13 +9,14 @@ module ZeroPush
|
|
8
9
|
|
9
10
|
def initialize(auth_token)
|
10
11
|
self.auth_token = auth_token
|
12
|
+
self.extend(Compatibility)
|
11
13
|
end
|
12
14
|
|
13
15
|
# verifies credentials
|
14
16
|
#
|
15
17
|
# @return [Boolean]
|
16
18
|
def verify_credentials
|
17
|
-
response =
|
19
|
+
response = http.get('/verify_credentials')
|
18
20
|
response.status == 200
|
19
21
|
end
|
20
22
|
|
@@ -22,20 +24,20 @@ module ZeroPush
|
|
22
24
|
#
|
23
25
|
# @param params [Hash]
|
24
26
|
#
|
25
|
-
#
|
27
|
+
# Example response
|
26
28
|
# {"sent_count":10,"inactive_tokens":[],"unregistered_tokens":["abc"]}
|
27
29
|
def notify(params)
|
28
|
-
|
30
|
+
http.post('/notify', params)
|
29
31
|
end
|
30
32
|
|
31
33
|
# Sends a notification to all of the devices registered with the ZeroPush backend
|
32
34
|
#
|
33
35
|
# @param params [Hash]
|
34
36
|
#
|
35
|
-
#
|
37
|
+
# Example response
|
36
38
|
# {"sent_count":10}
|
37
39
|
def broadcast(params)
|
38
|
-
|
40
|
+
http.post('/broadcast', params)
|
39
41
|
end
|
40
42
|
|
41
43
|
# Subscribes a device to a particular notification channel
|
@@ -43,10 +45,10 @@ module ZeroPush
|
|
43
45
|
# @param device_token [String]
|
44
46
|
# @param channel [String]
|
45
47
|
#
|
46
|
-
#
|
48
|
+
# Example response
|
47
49
|
# {"device_token":"abc", "channels":["foo"]}
|
48
50
|
def subscribe(device_token, channel)
|
49
|
-
|
51
|
+
http.post("/subscribe/#{channel}", device_token:device_token)
|
50
52
|
end
|
51
53
|
|
52
54
|
# Unsubscribes a device from a particular notification channel
|
@@ -54,22 +56,22 @@ module ZeroPush
|
|
54
56
|
# @param device_token [String]
|
55
57
|
# @param channel [String]
|
56
58
|
#
|
57
|
-
#
|
59
|
+
# Example response
|
58
60
|
# {"device_token":"abc", "channels":[]}
|
59
61
|
def unsubscribe(device_token, channel)
|
60
|
-
|
62
|
+
http.delete("/subscribe/#{channel}", device_token:device_token)
|
61
63
|
end
|
62
64
|
|
63
65
|
# Registers a device token with the ZeroPush backend
|
64
66
|
#
|
65
67
|
# @param device_token
|
66
68
|
#
|
67
|
-
#
|
69
|
+
# Example response
|
68
70
|
# {"message":"ok"}
|
69
71
|
def register(device_token, channel=nil)
|
70
72
|
params = {device_token: device_token}
|
71
73
|
params.merge!(channel: channel) unless channel.nil?
|
72
|
-
|
74
|
+
http.post('/register', params)
|
73
75
|
end
|
74
76
|
|
75
77
|
# Unregisters a device token that has previously been registered with
|
@@ -77,10 +79,10 @@ module ZeroPush
|
|
77
79
|
#
|
78
80
|
# @param device_token
|
79
81
|
#
|
80
|
-
#
|
82
|
+
# Example response
|
81
83
|
# {"message":"ok"}
|
82
84
|
def unregister(device_token)
|
83
|
-
|
85
|
+
http.delete('/unregister', device_token: device_token)
|
84
86
|
end
|
85
87
|
|
86
88
|
# Sets the badge for a particular device
|
@@ -88,15 +90,15 @@ module ZeroPush
|
|
88
90
|
# @param device_token
|
89
91
|
# @param badge
|
90
92
|
#
|
91
|
-
#
|
93
|
+
# Example response
|
92
94
|
# {"message":"ok"}
|
93
95
|
def set_badge(device_token, badge)
|
94
|
-
|
96
|
+
http.post('/set_badge', device_token: device_token, badge: badge)
|
95
97
|
end
|
96
98
|
|
97
99
|
# Returns a list of tokens that have been marked inactive
|
98
100
|
#
|
99
|
-
#
|
101
|
+
# Example response
|
100
102
|
# [
|
101
103
|
# {
|
102
104
|
# "device_token":"238b8cb09011850cb4bd544dfe0c8f5eeab73d7eeaae9bdca59076db4ae49947",
|
@@ -107,19 +109,160 @@ module ZeroPush
|
|
107
109
|
# "marked_inactive_at":"2013-07-17T01:27:50-04:00"
|
108
110
|
# }
|
109
111
|
# ]
|
110
|
-
def inactive_tokens
|
111
|
-
|
112
|
+
def inactive_tokens(params = {page:1})
|
113
|
+
http.get('/inactive_tokens', params)
|
112
114
|
end
|
113
115
|
|
114
|
-
#
|
116
|
+
# Returns a paginated list of devices
|
117
|
+
# https://zeropush.com/documentation/api_reference#devices_index
|
115
118
|
#
|
116
|
-
|
119
|
+
# Example response
|
120
|
+
# [
|
121
|
+
# {
|
122
|
+
# "token": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcedf",
|
123
|
+
# "active": true,
|
124
|
+
# "marked_inactive_at": null,
|
125
|
+
# "badge": 1
|
126
|
+
# },
|
127
|
+
# {
|
128
|
+
# "token": "234567890abcdef1234567890abcdef1234567890abcdef1234567890abcedf0",
|
129
|
+
# "active": true,
|
130
|
+
# "marked_inactive_at": null,
|
131
|
+
# "badge": 2
|
132
|
+
# }
|
133
|
+
# ]
|
134
|
+
def devices(params = {page:1})
|
135
|
+
http.get('/devices', params)
|
136
|
+
end
|
137
|
+
|
138
|
+
# Return detailed information about a device
|
139
|
+
# https://zeropush.com/documentation/api_reference#devices_show
|
140
|
+
#
|
141
|
+
# Example response
|
142
|
+
# {
|
143
|
+
# "token": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcedf",
|
144
|
+
# "active": true,
|
145
|
+
# "marked_inactive_at": null,
|
146
|
+
# "badge": 1,
|
147
|
+
# "channels": [
|
148
|
+
# "testflight",
|
149
|
+
# "user@example.com"
|
150
|
+
# ]
|
151
|
+
# }
|
152
|
+
def device(token)
|
153
|
+
http.get("/devices/#{token}")
|
154
|
+
end
|
155
|
+
|
156
|
+
# Replace the channel subscriptions with a new set of channels. This will
|
157
|
+
# remove all previous subscriptions of the device. If you want to append a
|
158
|
+
# list of channels, use #update_device.
|
159
|
+
# https://zeropush.com/documentation/api_reference#devices_update_put
|
160
|
+
#
|
161
|
+
# @param token String token identifying the device
|
162
|
+
# @param channel_list String Comma separated list of channels
|
163
|
+
#
|
164
|
+
# Example Request
|
165
|
+
#
|
166
|
+
# ZeroPush.set_device(token, channel_list: 'player-1, game-256')
|
167
|
+
#
|
168
|
+
# Example Response
|
169
|
+
# {
|
170
|
+
# "token": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcedf",
|
171
|
+
# "active": true,
|
172
|
+
# "marked_inactive_at": null,
|
173
|
+
# "badge": 1,
|
174
|
+
# "channels": [
|
175
|
+
# "player-1",
|
176
|
+
# "game-256"
|
177
|
+
# ]
|
178
|
+
# }
|
179
|
+
def set_device(token, params)
|
180
|
+
http.put("/devices/#{token}", params)
|
181
|
+
end
|
182
|
+
|
183
|
+
# Append the channel subscriptions with a set of new channels. If you want
|
184
|
+
# to replace the list of channels, use #set_device.
|
185
|
+
# https://zeropush.com/documentation/api_reference#devices_update_patch
|
186
|
+
#
|
187
|
+
# @param token String token identifying the device
|
188
|
+
# @param channel_list String Comma separated list of channels
|
189
|
+
#
|
190
|
+
# Example Request
|
191
|
+
#
|
192
|
+
# ZeroPush.update_device(token, channel_list: 'player-1, game-256')
|
193
|
+
#
|
194
|
+
# Example Response
|
195
|
+
# {
|
196
|
+
# "token": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcedf",
|
197
|
+
# "active": true,
|
198
|
+
# "marked_inactive_at": null,
|
199
|
+
# "badge": 1,
|
200
|
+
# "channels": [
|
201
|
+
# "player-1",
|
202
|
+
# "game-256"
|
203
|
+
# ]
|
204
|
+
# }
|
205
|
+
def update_device(token, params)
|
206
|
+
http.patch("/devices/#{token}", params)
|
207
|
+
end
|
208
|
+
|
209
|
+
# Returns paginated list of channels
|
210
|
+
# https://zeropush.com/documentation/api_reference#channels_index
|
211
|
+
#
|
212
|
+
# Example Response:
|
213
|
+
# [
|
214
|
+
# "player-1",
|
215
|
+
# "player-2",
|
216
|
+
# "player-9",
|
217
|
+
# "game-256",
|
218
|
+
# "admins",
|
219
|
+
# "lobby"
|
220
|
+
# ]
|
221
|
+
def channels(params = {page:1})
|
222
|
+
http.get('/channels', params)
|
223
|
+
end
|
224
|
+
|
225
|
+
# Returns the list of device tokens for the given channel
|
226
|
+
# https://zeropush.com/documentation/api_reference#channels_show
|
227
|
+
#
|
228
|
+
# Example Response:
|
229
|
+
# {
|
230
|
+
# "channel": "player-1",
|
231
|
+
# "device_tokens": [
|
232
|
+
# "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcedf"
|
233
|
+
# ]
|
234
|
+
# }
|
235
|
+
def channel(channel_name)
|
236
|
+
http.get("/channels/#{channel_name}")
|
237
|
+
end
|
238
|
+
|
239
|
+
# Deletes a channels and unsubscribes all of the devices from it.
|
240
|
+
# https://zeropush.com/documentation/api_reference#channels_destroy
|
241
|
+
#
|
242
|
+
# {
|
243
|
+
# "channel": "player-1",
|
244
|
+
# "device_tokens": [
|
245
|
+
# "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcedf"
|
246
|
+
# ]
|
247
|
+
# }
|
248
|
+
def delete_channel(channel_name)
|
249
|
+
http.delete("/channels/#{channel_name}")
|
250
|
+
end
|
251
|
+
|
252
|
+
# Instantiate a new http client configured for making requests to the API
|
253
|
+
def http
|
117
254
|
Faraday.new(url: URL) do |c|
|
118
255
|
c.token_auth self.auth_token
|
119
|
-
c.request :
|
256
|
+
c.request http_config[:request_encoding]
|
120
257
|
c.response :json, :content_type => /\bjson$/ # parse responses to JSON
|
121
|
-
c.adapter
|
258
|
+
c.adapter http_config[:http_adapter]
|
122
259
|
end
|
123
260
|
end
|
261
|
+
alias client http
|
262
|
+
|
263
|
+
protected
|
264
|
+
def http_config
|
265
|
+
@http_config ||= ZeroPush.config.dup
|
266
|
+
end
|
124
267
|
end
|
125
268
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ZeroPush
|
2
|
+
module Compatibility
|
3
|
+
def warn_on_deprecated_parameters(params)
|
4
|
+
value = (params[:info] || params['info'] || params[:data] || params['data'])
|
5
|
+
if value.is_a?(String)
|
6
|
+
warn "[DEPRECATION] `info` or `data` encoded as a string will not be supported in version 3.0.0; Use a hash instead."
|
7
|
+
http_config[:request_encoding] = :url_encoded
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def notify(params)
|
12
|
+
warn_on_deprecated_parameters(params)
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
def broadcast(params)
|
17
|
+
warn_on_deprecated_parameters(params)
|
18
|
+
super
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/zero_push/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -1,18 +1,57 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'json'
|
2
3
|
|
3
4
|
describe ZeroPush::Client do
|
4
5
|
|
5
6
|
let(:auth_token){ ENV['AUTH_TOKEN'] }
|
6
7
|
let(:client){ ZeroPush.client(auth_token) }
|
7
8
|
let(:device_token) { 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' }
|
9
|
+
before do
|
10
|
+
stub_request(:post, "https://api.zeropush.com/register").
|
11
|
+
with(body: '{"device_token":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}', headers: {'Authorization'=>'Token token="test-token"', 'Content-Type'=>'application/json'}).
|
12
|
+
to_return(status: 200, body: '{"message":"ok"}', headers: {'Content-Type' => 'application/json'})
|
13
|
+
|
14
|
+
stub_request(:delete, "https://api.zeropush.com/unregister?device_token=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa").
|
15
|
+
with(headers: {'Authorization'=>"Token token=\"#{auth_token}\""}).
|
16
|
+
to_return(status: 200, body: '{"message":"ok"}', headers: {'Content-Type' => 'application/json'})
|
17
|
+
end
|
8
18
|
|
9
|
-
describe '
|
19
|
+
describe 'compatibility' do
|
20
|
+
it 'should use url_encoding if `info` or `data` params are strings' do
|
21
|
+
request = stub_request(:post, "https://api.zeropush.com/notify").
|
22
|
+
with(body: {"info" => "{\"a\":1}"}, headers: {'Content-Type'=>'application/x-www-form-urlencoded'}).to_return(status: 200)
|
23
|
+
client.notify(info: JSON.dump({a: 1}))
|
24
|
+
assert_request_requested request
|
25
|
+
end
|
26
|
+
it 'should use JSON encoding if `info` or `data` params are hashes' do
|
27
|
+
request = stub_request(:post, "https://api.zeropush.com/notify").
|
28
|
+
with(body: '{"info":{"a":1}}', headers: {'Content-Type' => 'application/json'}).to_return(status: 200)
|
29
|
+
client.notify(info: {a: 1})
|
30
|
+
assert_request_requested request
|
31
|
+
end
|
32
|
+
end
|
10
33
|
|
34
|
+
describe '#http' do
|
35
|
+
it 'should instantiate a default http client' do
|
36
|
+
client.http.must_be_instance_of Faraday::Connection
|
37
|
+
client.http.headers['Authorization'].must_equal 'Token token="test-token"'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#verify_credentials' do
|
11
42
|
it 'should verify credentials successfully' do
|
43
|
+
stub_request(:get, "https://api.zeropush.com/verify_credentials").
|
44
|
+
with(headers: {'Authorization'=>'Token token="test-token"'}).
|
45
|
+
to_return(status: 200, body: '{"message": "authenticated"}', headers: {'Content-Type' => 'application/json'})
|
46
|
+
|
12
47
|
client.verify_credentials.must_equal true
|
13
48
|
end
|
14
49
|
|
15
50
|
it 'should fail to verify credentials' do
|
51
|
+
stub_request(:get, "https://api.zeropush.com/verify_credentials").
|
52
|
+
with(headers: {'Authorization'=>'Token token="not a valid token"'}).
|
53
|
+
to_return(status: 401, body: '{"error": "unauthorized"}', headers: {'Content-Type' => 'application/json'})
|
54
|
+
|
16
55
|
client = ZeroPush.client('not a valid token')
|
17
56
|
client.verify_credentials.must_equal false
|
18
57
|
end
|
@@ -20,6 +59,9 @@ describe ZeroPush::Client do
|
|
20
59
|
|
21
60
|
describe '#notify' do
|
22
61
|
before do
|
62
|
+
stub_request(:post, "https://api.zeropush.com/notify").
|
63
|
+
with(body: '{"device_tokens":["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"],"alert":"hi"}').
|
64
|
+
to_return(status: 200, body: '{"sent_count":1, "inactive_tokens":[], "unregistered_tokens":[]}', headers: {'Content-Type' => 'application/json'})
|
23
65
|
client.register(device_token)
|
24
66
|
end
|
25
67
|
|
@@ -40,7 +82,6 @@ describe ZeroPush::Client do
|
|
40
82
|
end
|
41
83
|
|
42
84
|
describe '#register' do
|
43
|
-
|
44
85
|
describe 'without a channel parameter' do
|
45
86
|
it 'should return a hash' do
|
46
87
|
client.register(device_token).body.class.must_equal Hash
|
@@ -52,6 +93,12 @@ describe ZeroPush::Client do
|
|
52
93
|
end
|
53
94
|
|
54
95
|
describe 'with a channel parameter' do
|
96
|
+
before do
|
97
|
+
stub_request(:post, "https://api.zeropush.com/register").
|
98
|
+
with(body: '{"device_token":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","channel":"foo"}',
|
99
|
+
headers: {'Authorization'=>'Token token="test-token"', 'Content-Type'=>'application/json'}).
|
100
|
+
to_return(status: 200, body: '{"message":"ok"}', headers: {'Content-Type'=>'application/json'})
|
101
|
+
end
|
55
102
|
it 'should return a hash' do
|
56
103
|
client.register(device_token, 'foo').body.class.must_equal Hash
|
57
104
|
end
|
@@ -68,6 +115,11 @@ describe ZeroPush::Client do
|
|
68
115
|
end
|
69
116
|
|
70
117
|
describe 'when the device has been registered' do
|
118
|
+
before do
|
119
|
+
stub_request(:delete, "https://api.zeropush.com/unregister?device_token=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa").
|
120
|
+
to_return(status: 200, body: '{"message":"ok"}', headers: {'Content-Type' => 'application/json'})
|
121
|
+
end
|
122
|
+
|
71
123
|
it 'should return a hash' do
|
72
124
|
client.unregister(device_token).body.class.must_equal Hash
|
73
125
|
end
|
@@ -76,16 +128,13 @@ describe ZeroPush::Client do
|
|
76
128
|
client.unregister(device_token).body['message'].must_equal 'ok'
|
77
129
|
end
|
78
130
|
end
|
79
|
-
|
80
131
|
end
|
81
132
|
|
82
133
|
describe '#subscribe' do
|
83
134
|
before do
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
after do
|
88
|
-
client.unregister(device_token)
|
135
|
+
stub_request(:post, "https://api.zeropush.com/subscribe/foo_channel").
|
136
|
+
with(body: '{"device_token":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}').
|
137
|
+
to_return(status: 200, body: '{"device_token": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","channels":["foo_channel"]}', headers: {'Content-Type' => 'application/json'})
|
89
138
|
end
|
90
139
|
|
91
140
|
let(:response){client.subscribe(device_token, 'foo_channel')}
|
@@ -102,12 +151,8 @@ describe ZeroPush::Client do
|
|
102
151
|
|
103
152
|
describe '#unsubscribe' do
|
104
153
|
before do
|
105
|
-
|
106
|
-
|
107
|
-
end
|
108
|
-
|
109
|
-
after do
|
110
|
-
client.unregister(device_token)
|
154
|
+
stub_request(:delete, "https://api.zeropush.com/subscribe/foo_channel?device_token=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa").
|
155
|
+
to_return(status: 200, body: '{"device_token": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","channels":[]}', headers: {'Content-Type' => 'application/json'})
|
111
156
|
end
|
112
157
|
|
113
158
|
let(:response){client.unsubscribe(device_token, 'foo_channel')}
|
@@ -123,6 +168,11 @@ describe ZeroPush::Client do
|
|
123
168
|
end
|
124
169
|
|
125
170
|
describe '#broadcast' do
|
171
|
+
before do
|
172
|
+
stub_request(:post, "https://api.zeropush.com/broadcast").
|
173
|
+
with(body: '{"alert":"hi"}').
|
174
|
+
to_return(status: 200, body: '{"sent_count":10}', headers: {'Content-Type' => 'application/json'})
|
175
|
+
end
|
126
176
|
let(:response){client.broadcast(alert:'hi')}
|
127
177
|
|
128
178
|
it 'should return a hash' do
|
@@ -132,15 +182,20 @@ describe ZeroPush::Client do
|
|
132
182
|
it 'should broadcast a notification to all the devices' do
|
133
183
|
response.body['sent_count'].must_equal 10
|
134
184
|
end
|
185
|
+
|
186
|
+
it 'should use json encoding for custom data' do
|
187
|
+
request = stub_request(:post, "https://api.zeropush.com/broadcast").
|
188
|
+
with(body: '{"data":{"alert":"hi","user_id":5}}', headers: {'Content-Type'=>'application/json'}).to_return(status: 200)
|
189
|
+
client.broadcast(data: {alert: "hi", user_id: 5})
|
190
|
+
assert_request_requested request
|
191
|
+
end
|
135
192
|
end
|
136
193
|
|
137
194
|
describe '#set_badge' do
|
138
195
|
before do
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
after do
|
143
|
-
client.unregister(device_token)
|
196
|
+
stub_request(:post, "https://api.zeropush.com/set_badge").
|
197
|
+
with(body: '{"device_token":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","badge":10}').
|
198
|
+
to_return(status: 200, body: '{"message":"ok"}', headers: {'Content-Type'=>'application/json'})
|
144
199
|
end
|
145
200
|
|
146
201
|
let(:response){client.set_badge(device_token, 10)}
|
@@ -157,6 +212,10 @@ describe ZeroPush::Client do
|
|
157
212
|
describe '#inactive_tokens' do
|
158
213
|
|
159
214
|
let(:response){client.inactive_tokens}
|
215
|
+
before do
|
216
|
+
stub_request(:get, "https://api.zeropush.com/inactive_tokens?page=1").
|
217
|
+
to_return(status: 200, body: '[{"device_token": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","marked_inactive_at": "2013-03-11T16:25:14-04:00"}]', headers: {'Content-Type'=>'application/json'})
|
218
|
+
end
|
160
219
|
|
161
220
|
it 'should return an array' do
|
162
221
|
response.body.class.must_equal Array
|
@@ -166,4 +225,92 @@ describe ZeroPush::Client do
|
|
166
225
|
response.body.count.must_equal 1
|
167
226
|
end
|
168
227
|
end
|
228
|
+
|
229
|
+
describe '#devices' do
|
230
|
+
let(:response){client.devices}
|
231
|
+
before do
|
232
|
+
stub_request(:get, "https://api.zeropush.com/devices?page=1").
|
233
|
+
to_return(status: 200, body: '[]', headers: {'Content-Type' => 'application/json', 'Link' => '<https://api.zeropush.com/devices?page=10&per_page=25>; rel="last",<https://api.zeropush.com/devices?page=2&per_page=25>; rel="next"'})
|
234
|
+
end
|
235
|
+
it 'should return an array' do
|
236
|
+
response.body.class.must_equal Array
|
237
|
+
end
|
238
|
+
it 'should have paginated results' do
|
239
|
+
response.headers["link"].must_equal '<https://api.zeropush.com/devices?page=10&per_page=25>; rel="last",<https://api.zeropush.com/devices?page=2&per_page=25>; rel="next"'
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
describe '#device' do
|
244
|
+
before do
|
245
|
+
stub_request(:get, "https://api.zeropush.com/devices/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa").
|
246
|
+
to_return(status: 200, body: '{
|
247
|
+
"token": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcedf",
|
248
|
+
"active": true,
|
249
|
+
"marked_inactive_at": null,
|
250
|
+
"badge": 1,
|
251
|
+
"channels": [
|
252
|
+
"testflight",
|
253
|
+
"user@example.com"
|
254
|
+
]
|
255
|
+
}', headers: {'Content-Type'=>'application/json'})
|
256
|
+
end
|
257
|
+
let(:response){client.device('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')}
|
258
|
+
|
259
|
+
it 'should return a device hash' do
|
260
|
+
response.body.class.must_equal Hash
|
261
|
+
response.body.keys.must_equal %w[token active marked_inactive_at badge channels]
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
describe '#channels' do
|
266
|
+
before do
|
267
|
+
stub_request(:get, "https://api.zeropush.com/channels?page=1").
|
268
|
+
to_return(status: 200, body: '["player-1","foobar"]', headers: {'Content-Type'=>'application/json', 'Link' => '<https://api.zeropush.com/channels?page=10&per_page=25>; rel="last",<https://api.zeropush.com/channels?page=2&per_page=25>; rel="next"'})
|
269
|
+
end
|
270
|
+
let(:response){client.channels}
|
271
|
+
it 'should return an array' do
|
272
|
+
response.body.class.must_equal Array
|
273
|
+
end
|
274
|
+
it 'should have paginated results' do
|
275
|
+
response.headers["link"].must_equal '<https://api.zeropush.com/channels?page=10&per_page=25>; rel="last",<https://api.zeropush.com/channels?page=2&per_page=25>; rel="next"'
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
describe '#channel' do
|
280
|
+
before do
|
281
|
+
stub_request(:get, 'https://api.zeropush.com/channels/player-1').
|
282
|
+
to_return(status: 200, body:'{
|
283
|
+
"channel": "player-1",
|
284
|
+
"device_tokens": [
|
285
|
+
"1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcedf"
|
286
|
+
]
|
287
|
+
}', headers: {'Content-Type' => 'application/json'})
|
288
|
+
end
|
289
|
+
|
290
|
+
let(:response) { client.channel('player-1') }
|
291
|
+
|
292
|
+
it 'should return a channel hash' do
|
293
|
+
response.body.class.must_equal Hash
|
294
|
+
response.body.keys.must_equal %w[channel device_tokens]
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
describe '#delete_channel' do
|
299
|
+
before do
|
300
|
+
stub_request(:delete, 'https://api.zeropush.com/channels/player-1').
|
301
|
+
to_return(status: 200, body:'{
|
302
|
+
"channel": "player-1",
|
303
|
+
"device_tokens": [
|
304
|
+
"1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcedf"
|
305
|
+
]
|
306
|
+
}', headers: {'Content-Type' => 'application/json'})
|
307
|
+
end
|
308
|
+
|
309
|
+
let(:response) { client.delete_channel('player-1') }
|
310
|
+
|
311
|
+
it 'should return a channel hash' do
|
312
|
+
response.body.class.must_equal Hash
|
313
|
+
response.body.keys.must_equal %w[channel device_tokens]
|
314
|
+
end
|
315
|
+
end
|
169
316
|
end
|
data/spec/zero_push_spec.rb
CHANGED
@@ -5,6 +5,17 @@ describe ZeroPush do
|
|
5
5
|
ZeroPush.auth_token = ENV['AUTH_TOKEN'] || 'test_token'
|
6
6
|
end
|
7
7
|
|
8
|
+
describe 'using different auth_tokens' do
|
9
|
+
it 'should accept a hash of tokens' do
|
10
|
+
ZeroPush.auth_tokens = {
|
11
|
+
apns: 'test-apns-token',
|
12
|
+
gcm: 'test-gcm-token'
|
13
|
+
}
|
14
|
+
ZeroPush.apns.auth_token.must_equal 'test-apns-token'
|
15
|
+
ZeroPush.gcm.auth_token.must_equal 'test-gcm-token'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
8
19
|
describe '.client' do
|
9
20
|
it 'should return a client instance' do
|
10
21
|
ZeroPush.client.class.must_equal ZeroPush::Client
|
data/zero_push.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zero_push
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefan Natchev
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2015-01-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|
@@ -123,6 +123,20 @@ dependencies:
|
|
123
123
|
- - ">="
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: webmock
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - "~>"
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: 1.20.4
|
133
|
+
type: :development
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - "~>"
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: 1.20.4
|
126
140
|
description: ZeroPush is a simple service for sending iOS push notifications. (http://zeropush.com)
|
127
141
|
email:
|
128
142
|
- stefan.natchev@gmail.com
|
@@ -133,17 +147,18 @@ extra_rdoc_files: []
|
|
133
147
|
files:
|
134
148
|
- ".gitignore"
|
135
149
|
- ".travis.yml"
|
150
|
+
- CHANGELOG.md
|
136
151
|
- Gemfile
|
137
152
|
- Gemfile.lock
|
138
|
-
- LICENSE
|
153
|
+
- LICENSE.md
|
139
154
|
- README.md
|
140
155
|
- Rakefile
|
141
156
|
- lib/generators/zero_push/install_generator.rb
|
142
157
|
- lib/generators/zero_push/templates/zero_push.rb
|
143
158
|
- lib/zero_push.rb
|
144
159
|
- lib/zero_push/client.rb
|
160
|
+
- lib/zero_push/compatibility.rb
|
145
161
|
- lib/zero_push/version.rb
|
146
|
-
- spec/fixtures/responses.rb
|
147
162
|
- spec/generator_spec.rb
|
148
163
|
- spec/spec_helper.rb
|
149
164
|
- spec/zero_push_client_spec.rb
|
@@ -170,13 +185,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
170
185
|
version: '0'
|
171
186
|
requirements: []
|
172
187
|
rubyforge_project:
|
173
|
-
rubygems_version: 2.
|
188
|
+
rubygems_version: 2.4.5
|
174
189
|
signing_key:
|
175
190
|
specification_version: 4
|
176
191
|
summary: A gem for interacting with the ZeroPush API. (http://zeropush.com)
|
177
192
|
test_files:
|
178
|
-
- spec/fixtures/responses.rb
|
179
193
|
- spec/generator_spec.rb
|
180
194
|
- spec/spec_helper.rb
|
181
195
|
- spec/zero_push_client_spec.rb
|
182
196
|
- spec/zero_push_spec.rb
|
197
|
+
has_rdoc:
|
data/spec/fixtures/responses.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
class ZeroPush::Client
|
2
|
-
def client
|
3
|
-
Faraday.new do |builder|
|
4
|
-
builder.token_auth self.auth_token
|
5
|
-
builder.response :json, :content_type => /\bjson$/ # parse responses to JSON
|
6
|
-
builder.adapter :test do |stub|
|
7
|
-
stub.get('/verify_credentials') do |env|
|
8
|
-
if env.request_headers['Authorization'] == "Token token=\"not a valid token\""
|
9
|
-
[401, {'Content-Type' => 'application/json'}, '{"error": "unauthorized"}']
|
10
|
-
else
|
11
|
-
[200, {'Content-Type' => 'application/json'}, '{"message": "authenticated"}']
|
12
|
-
end
|
13
|
-
end
|
14
|
-
stub.post('/register') { [200, {'Content-Type' => 'application/json'}, '{"message":"ok"}'] }
|
15
|
-
stub.delete('/unregister') { [200, {'Content-Type' => 'application/json'}, '{"message":"ok"}'] }
|
16
|
-
stub.post('/notify') { [200, {'Content-Type' => 'application/json'}, '{"sent_count":1, "inactive_tokens":[]}'] }
|
17
|
-
stub.post('/broadcast') { [200, {'Content-Type' => 'application/json'}, '{"sent_count":10}'] }
|
18
|
-
stub.post('/subscribe/foo_channel') { [200, {'Content-Type' => 'application/json'}, '{"device_token": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","channels":["foo_channel"]}'] }
|
19
|
-
stub.delete('/subscribe/foo_channel') { [200, {'Content-Type' => 'application/json'}, '{"device_token": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","channels":[]}'] }
|
20
|
-
stub.post('/set_badge') { [200, {'Content-Type' => 'application/json'}, '{"message":"ok"}'] }
|
21
|
-
stub.get('/inactive_tokens') { [200, {'Content-Type' => 'application/json'}, '[{"device_token": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","marked_inactive_at": "2013-03-11T16:25:14-04:00"}]'] }
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|