ruby-push-notifications 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.hound.yml +2 -0
- data/.ruby-style.yml +1063 -0
- data/.travis.yml +7 -0
- data/Gemfile.lock +2 -0
- data/README.md +6 -2
- data/examples/mpns.rb +17 -0
- data/lib/ruby-push-notifications/mpns/mpns_connection.rb +82 -0
- data/lib/ruby-push-notifications/mpns/mpns_notification.rb +96 -0
- data/lib/ruby-push-notifications/mpns/mpns_pusher.rb +29 -0
- data/lib/ruby-push-notifications/mpns/mpns_response.rb +81 -0
- data/lib/ruby-push-notifications/mpns/mpns_result.rb +182 -0
- data/lib/ruby-push-notifications/mpns.rb +5 -0
- data/lib/ruby-push-notifications/version.rb +1 -1
- data/lib/ruby-push-notifications.rb +1 -0
- data/ruby-push-notifications.gemspec +2 -0
- data/spec/factories/notifications.rb +8 -0
- data/spec/factories.rb +5 -0
- data/spec/ruby-push-notifications/mpns/mpns_connection_spec.rb +46 -0
- data/spec/ruby-push-notifications/mpns/mpns_notification_spec.rb +43 -0
- data/spec/ruby-push-notifications/mpns/mpns_pusher_spec.rb +59 -0
- data/spec/ruby-push-notifications/mpns/mpns_response_spec.rb +64 -0
- metadata +33 -2
@@ -0,0 +1,43 @@
|
|
1
|
+
|
2
|
+
module RubyPushNotifications
|
3
|
+
module MPNS
|
4
|
+
describe MPNSNotification do
|
5
|
+
|
6
|
+
let(:device_urls) { %w(a b c) }
|
7
|
+
let(:raw_notification) { build :mpns_notification }
|
8
|
+
let(:toast_data) { { title: 'Title', message: 'Hello MPNS World!', type: :toast } }
|
9
|
+
let(:toast_notification) { build :mpns_notification, device_urls: device_urls, data: toast_data }
|
10
|
+
let(:tile_data) { { count: 1, title: 'Hello MPNS World!', type: :tile } }
|
11
|
+
let(:tile_notification) { build :mpns_notification, device_urls: device_urls, data: tile_data }
|
12
|
+
|
13
|
+
it 'builds the right mpns raw xml' do
|
14
|
+
xml = '<?xml version="1.0" encoding="UTF-8"?>'
|
15
|
+
xml << '<root><value1>hello</value1></root>'
|
16
|
+
expect(raw_notification.as_mpns_xml).to eq xml
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'builds the right mpns toast xml' do
|
20
|
+
xml = '<?xml version="1.0" encoding="UTF-8"?>'
|
21
|
+
xml << '<wp:Notification xmlns:wp="WPNotification"><wp:Toast>'
|
22
|
+
xml << '<wp:Text1>Title</wp:Text1>'
|
23
|
+
xml << '<wp:Text2>Hello MPNS World!</wp:Text2>'
|
24
|
+
xml << '</wp:Toast></wp:Notification>'
|
25
|
+
expect(toast_notification.as_mpns_xml).to eq xml
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'builds the right mpns tile xml' do
|
29
|
+
xml = '<?xml version="1.0" encoding="UTF-8"?>'
|
30
|
+
xml << '<wp:Notification xmlns:wp="WPNotification"><wp:Tile>'
|
31
|
+
xml << '<wp:Count>1</wp:Count>'
|
32
|
+
xml << '<wp:Title>Hello MPNS World!</wp:Title>'
|
33
|
+
xml << '</wp:Tile></wp:Notification>'
|
34
|
+
expect(tile_notification.as_mpns_xml).to eq xml
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'validates the mpns format'
|
38
|
+
|
39
|
+
it 'validates the data'
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
|
2
|
+
module RubyPushNotifications
|
3
|
+
module MPNS
|
4
|
+
describe MPNSPusher do
|
5
|
+
|
6
|
+
let(:pusher) { MPNSPusher.new }
|
7
|
+
|
8
|
+
describe '#push' do
|
9
|
+
|
10
|
+
let(:device_urls) { [generate(:mpns_device_url)] }
|
11
|
+
let(:notif1) { build :mpns_notification, device_urls: ['http://s.notify.live.net/1'], data: { message: { value1: 'hello' } } }
|
12
|
+
let(:notif2) { build :mpns_notification, device_urls: ['http://s.notify.live.net/1'], data: { message: { value1: 'hello' } } }
|
13
|
+
let(:raw_notification) { build :mpns_notification }
|
14
|
+
let(:toast_data) { { title: 'Title', message: 'Hello MPNS World!', type: :toast } }
|
15
|
+
let(:toast_notification) { build :mpns_notification, device_urls: device_urls, data: toast_data }
|
16
|
+
let(:tile_data) { { count: 1, title: 'Hello MPNS World!', type: :tile } }
|
17
|
+
let(:tile_notification) { build :mpns_notification, device_urls: device_urls, data: tile_data }
|
18
|
+
let(:headers) {
|
19
|
+
{
|
20
|
+
'x-notificationstatus' => 'Received',
|
21
|
+
'x-deviceconnectionstatus' => 'Connected',
|
22
|
+
'x-subscriptionstatus' => 'Active'
|
23
|
+
}
|
24
|
+
}
|
25
|
+
let(:response) { [ { device_url: 'http://s.notify.live.net/1', headers: headers, code: 200 } ]}
|
26
|
+
|
27
|
+
before do
|
28
|
+
stub_request(:post, %r{s.notify.live.net}).
|
29
|
+
to_return status: [200, 'OK'], headers: headers
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'submits every notification' do
|
33
|
+
pusher.push [raw_notification, toast_notification, tile_notification]
|
34
|
+
expect(WebMock).
|
35
|
+
to have_requested(:post, raw_notification.device_urls[0]).
|
36
|
+
with(body: raw_notification.as_mpns_xml, headers: { 'Content-Type' => 'text/xml', 'X-NotificationClass' => '3'}).
|
37
|
+
once
|
38
|
+
|
39
|
+
expect(WebMock).
|
40
|
+
to have_requested(:post, toast_notification.device_urls[0]).
|
41
|
+
with(body: toast_notification.as_mpns_xml, headers: { 'Content-Type' => 'text/xml', 'X-NotificationClass' => '2', 'X-WindowsPhone-Target' => :toast}).
|
42
|
+
once
|
43
|
+
|
44
|
+
expect(WebMock).
|
45
|
+
to have_requested(:post, tile_notification.device_urls[0]).
|
46
|
+
with(body: tile_notification.as_mpns_xml, headers: { 'Content-Type' => 'text/xml', 'X-NotificationClass' => '1', 'X-WindowsPhone-Target' => 'token'}).
|
47
|
+
once
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'sets results to notifications' do
|
51
|
+
expect do
|
52
|
+
pusher.push [notif1, notif2]
|
53
|
+
end.to change { [notif1, notif2].map &:results }.from([nil, nil]).to [MPNSResponse.new(response)]*2
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
|
2
|
+
module RubyPushNotifications
|
3
|
+
module MPNS
|
4
|
+
describe MPNSResponse do
|
5
|
+
|
6
|
+
describe 'success' do
|
7
|
+
|
8
|
+
let(:successful_messages) { 2 }
|
9
|
+
let(:failed_messages) { 6 }
|
10
|
+
let(:headers) {
|
11
|
+
{
|
12
|
+
'x-notificationstatus' => 'Received',
|
13
|
+
'x-deviceconnectionstatus' => 'Connected',
|
14
|
+
'x-subscriptionstatus' => 'Active'
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
let(:responses) {
|
19
|
+
[
|
20
|
+
{ device_url: '1', headers: headers, code: 200 },
|
21
|
+
{ device_url: '2', headers: headers, code: 200 },
|
22
|
+
{ device_url: '3', code: 400 },
|
23
|
+
{ device_url: '4', code: 401 },
|
24
|
+
{ device_url: '5', headers: headers, code: 404 },
|
25
|
+
{ device_url: '6', headers: headers, code: 406 },
|
26
|
+
{ device_url: '7', headers: headers, code: 412 },
|
27
|
+
{ device_url: '8', code: 503 }
|
28
|
+
]
|
29
|
+
}
|
30
|
+
|
31
|
+
let(:response) { MPNSResponse.new responses }
|
32
|
+
let(:result) { MPNSResultOK.new '1', headers }
|
33
|
+
|
34
|
+
it 'parses the number of successfully processed notifications' do
|
35
|
+
expect(response.success).to eq successful_messages
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'parses the number of failed messages' do
|
39
|
+
expect(response.failed).to eq failed_messages
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'parses the results' do
|
43
|
+
expect(response.results).to eq [
|
44
|
+
MPNSResultOK.new('1', headers),
|
45
|
+
MPNSResultOK.new('2', headers),
|
46
|
+
MalformedMPNSResultError.new('3'),
|
47
|
+
MPNSAuthError.new('4'),
|
48
|
+
MPNSInvalidError.new('5', headers),
|
49
|
+
MPNSLimitError.new('6', headers),
|
50
|
+
MPNSPreConditionError.new('7', headers),
|
51
|
+
MPNSInternalError.new('8')
|
52
|
+
]
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'parses headers to result attributes' do
|
56
|
+
expect(result.notification_status).to eq 'Received'
|
57
|
+
expect(result.device_connection_status).to eq 'Connected'
|
58
|
+
expect(result.subscription_status).to eq 'Active'
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-push-notifications
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carlos Alonso
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: builder
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.2'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -88,7 +102,9 @@ extensions: []
|
|
88
102
|
extra_rdoc_files: []
|
89
103
|
files:
|
90
104
|
- ".gitignore"
|
105
|
+
- ".hound.yml"
|
91
106
|
- ".rspec"
|
107
|
+
- ".ruby-style.yml"
|
92
108
|
- ".travis.yml"
|
93
109
|
- Gemfile
|
94
110
|
- Gemfile.lock
|
@@ -97,6 +113,7 @@ files:
|
|
97
113
|
- Rakefile
|
98
114
|
- examples/apns.rb
|
99
115
|
- examples/gcm.rb
|
116
|
+
- examples/mpns.rb
|
100
117
|
- lib/ruby-push-notifications.rb
|
101
118
|
- lib/ruby-push-notifications/apns.rb
|
102
119
|
- lib/ruby-push-notifications/apns/apns_connection.rb
|
@@ -109,6 +126,12 @@ files:
|
|
109
126
|
- lib/ruby-push-notifications/gcm/gcm_pusher.rb
|
110
127
|
- lib/ruby-push-notifications/gcm/gcm_response.rb
|
111
128
|
- lib/ruby-push-notifications/gcm/gcm_result.rb
|
129
|
+
- lib/ruby-push-notifications/mpns.rb
|
130
|
+
- lib/ruby-push-notifications/mpns/mpns_connection.rb
|
131
|
+
- lib/ruby-push-notifications/mpns/mpns_notification.rb
|
132
|
+
- lib/ruby-push-notifications/mpns/mpns_pusher.rb
|
133
|
+
- lib/ruby-push-notifications/mpns/mpns_response.rb
|
134
|
+
- lib/ruby-push-notifications/mpns/mpns_result.rb
|
112
135
|
- lib/ruby-push-notifications/version.rb
|
113
136
|
- ruby-push-notifications.gemspec
|
114
137
|
- spec/factories.rb
|
@@ -120,6 +143,10 @@ files:
|
|
120
143
|
- spec/ruby-push-notifications/gcm/gcm_notification_spec.rb
|
121
144
|
- spec/ruby-push-notifications/gcm/gcm_pusher_spec.rb
|
122
145
|
- spec/ruby-push-notifications/gcm/gcm_response_spec.rb
|
146
|
+
- spec/ruby-push-notifications/mpns/mpns_connection_spec.rb
|
147
|
+
- spec/ruby-push-notifications/mpns/mpns_notification_spec.rb
|
148
|
+
- spec/ruby-push-notifications/mpns/mpns_pusher_spec.rb
|
149
|
+
- spec/ruby-push-notifications/mpns/mpns_response_spec.rb
|
123
150
|
- spec/spec_helper.rb
|
124
151
|
- spec/support/dummy.pem
|
125
152
|
- spec/support/factory_girl.rb
|
@@ -157,6 +184,10 @@ test_files:
|
|
157
184
|
- spec/ruby-push-notifications/gcm/gcm_notification_spec.rb
|
158
185
|
- spec/ruby-push-notifications/gcm/gcm_pusher_spec.rb
|
159
186
|
- spec/ruby-push-notifications/gcm/gcm_response_spec.rb
|
187
|
+
- spec/ruby-push-notifications/mpns/mpns_connection_spec.rb
|
188
|
+
- spec/ruby-push-notifications/mpns/mpns_notification_spec.rb
|
189
|
+
- spec/ruby-push-notifications/mpns/mpns_pusher_spec.rb
|
190
|
+
- spec/ruby-push-notifications/mpns/mpns_response_spec.rb
|
160
191
|
- spec/spec_helper.rb
|
161
192
|
- spec/support/dummy.pem
|
162
193
|
- spec/support/factory_girl.rb
|