crusade-apns 0.8.0 → 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/lib/crusade/apns/notification.rb +16 -9
- data/lib/crusade/apns/push_notification.rb +6 -0
- data/lib/crusade/apns/version.rb +1 -1
- data/test/integration/push_notification_test.rb +1 -5
- data/test/support/fixtures.rb +8 -2
- data/test/unit/notification_encoder_test.rb +1 -1
- data/test/unit/notification_test.rb +48 -52
- data/test/unit/push_notification_test.rb +46 -0
- data/test/unit/push_package/website_file_generator_test.rb +1 -1
- metadata +6 -7
- data/lib/crusade/apns/notification_builder.rb +0 -46
- data/test/unit/notification_builder_test.rb +0 -76
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f3f43365dbbb7d83fda84a7b56659c3fb3842c4b
|
4
|
+
data.tar.gz: 9fc653b9f4a6eddb2beee30e90c57ca3f15b1fb3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d0d8f657de2b178403731bd77b27a57daef52b66c66b90d209fed973141d5ed0956855984200aab810a488ce1db497e0f88684f6ca8e33a47f5ae96683d4b03c
|
7
|
+
data.tar.gz: c6977b46d2636894e3cf1291fa3d74a3194f9a672455c5b4f0beed6f3f7b30abbea68d373fd9a7fcf225cca95405863b7732ce90f0d46a38e10affa8c0f9c708
|
data/Gemfile
CHANGED
@@ -1,14 +1,18 @@
|
|
1
|
+
require 'delegate'
|
2
|
+
|
1
3
|
module Crusade
|
2
4
|
module APNS
|
3
|
-
class Notification
|
4
|
-
|
5
|
-
|
6
|
-
def initialize(
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
5
|
+
class Notification < SimpleDelegator
|
6
|
+
attr_reader :device_token
|
7
|
+
|
8
|
+
def initialize(notification, device_token = nil)
|
9
|
+
if notification.is_a? Hash
|
10
|
+
device_token = notification[:device_token]
|
11
|
+
notification = Crusade::Notification.new notification
|
12
|
+
end
|
13
|
+
super notification
|
14
|
+
self.notification = notification
|
15
|
+
self.device_token = device_token
|
12
16
|
end
|
13
17
|
|
14
18
|
def to_json
|
@@ -21,6 +25,9 @@ module Crusade
|
|
21
25
|
|
22
26
|
private
|
23
27
|
|
28
|
+
attr_accessor :notification
|
29
|
+
attr_writer :device_token
|
30
|
+
|
24
31
|
def payload
|
25
32
|
{
|
26
33
|
"aps" => aps
|
@@ -15,6 +15,8 @@ module Crusade
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def send notification
|
18
|
+
return :invalid unless Array(notification.url_args).count == url_args_in_configuration
|
19
|
+
|
18
20
|
info "sending notification #{notification.inspect}"
|
19
21
|
connection.send encoder.encode notification
|
20
22
|
end
|
@@ -27,6 +29,10 @@ module Crusade
|
|
27
29
|
def connection
|
28
30
|
@connection ||= Crusade::APNS::SocketConnection.new(configuration)
|
29
31
|
end
|
32
|
+
|
33
|
+
def url_args_in_configuration
|
34
|
+
configuration.url_format.scan("%@").count
|
35
|
+
end
|
30
36
|
end
|
31
37
|
end
|
32
38
|
end
|
data/lib/crusade/apns/version.rb
CHANGED
@@ -29,15 +29,11 @@ eof
|
|
29
29
|
end
|
30
30
|
|
31
31
|
it 'sends the binary representation of the notification' do
|
32
|
-
subject.send Fixtures.
|
32
|
+
subject.send Fixtures.default_apns_notification
|
33
33
|
|
34
34
|
Timeout::timeout(1, ThreadError) { while(server.received.size == 0) ; end }
|
35
35
|
|
36
36
|
server.received.last.must_equal Base64.decode64 binary
|
37
37
|
end
|
38
38
|
end
|
39
|
-
|
40
|
-
describe 'configuration' do
|
41
|
-
it { subject.configuration.must_be_same_as options }
|
42
|
-
end
|
43
39
|
end
|
data/test/support/fixtures.rb
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
require 'tmpdir'
|
2
2
|
|
3
3
|
require 'crusade/apns/push_notification'
|
4
|
+
require 'crusade/notification'
|
5
|
+
require 'crusade/apns/notification'
|
4
6
|
|
5
7
|
class Fixtures
|
6
8
|
def self.default_configuration
|
7
9
|
OpenStruct.new({
|
8
10
|
site_name: 'Bay Airlines',
|
9
11
|
push_id: 'web.com.example.domain',
|
10
|
-
url_format: 'http://domain.example.com
|
12
|
+
url_format: 'http://domain.example.com/?flight=%@',
|
11
13
|
webservice_url: 'https://example.com/push',
|
12
14
|
allowed_domains: ['http://example.com'],
|
13
15
|
temp_dir: Dir.mktmpdir,
|
@@ -19,7 +21,7 @@ class Fixtures
|
|
19
21
|
end
|
20
22
|
|
21
23
|
def self.default_notification
|
22
|
-
Crusade::
|
24
|
+
Crusade::Notification.new({
|
23
25
|
title: 'the title',
|
24
26
|
body: 'the body',
|
25
27
|
action: 'submit',
|
@@ -27,4 +29,8 @@ class Fixtures
|
|
27
29
|
device_token: '1234a'
|
28
30
|
})
|
29
31
|
end
|
32
|
+
|
33
|
+
def self.default_apns_notification
|
34
|
+
Crusade::APNS::Notification.new default_notification, '1234a'
|
35
|
+
end
|
30
36
|
end
|
@@ -13,7 +13,7 @@ describe Crusade::APNS::NotificationEncoder do
|
|
13
13
|
subject { Crusade::APNS::NotificationEncoder.new options }
|
14
14
|
|
15
15
|
describe 'encode' do
|
16
|
-
let(:notification) { Fixtures.
|
16
|
+
let(:notification) { Fixtures.default_apns_notification }
|
17
17
|
let(:expected) do
|
18
18
|
<<-eof
|
19
19
|
AQAAAAAAAVGAACASNKAAXHsiYXBzIjp7ImFsZXJ0Ijp7InRpdGxlIjoidGhl
|
@@ -1,9 +1,12 @@
|
|
1
1
|
require File.expand_path '../../test_helper.rb', __FILE__
|
2
2
|
|
3
|
+
require 'crusade/notification'
|
3
4
|
require 'crusade/apns/notification'
|
4
5
|
|
5
6
|
describe Crusade::APNS::Notification do
|
6
7
|
let(:described_class) { Crusade::APNS::Notification }
|
8
|
+
let(:notification) { Crusade::Notification.new attrs }
|
9
|
+
let(:device_token) { '1234a' }
|
7
10
|
|
8
11
|
let(:attrs) do
|
9
12
|
{
|
@@ -11,78 +14,71 @@ describe Crusade::APNS::Notification do
|
|
11
14
|
body: 'the body',
|
12
15
|
action: 'submit',
|
13
16
|
url_args: ['a'],
|
14
|
-
device_token:
|
17
|
+
device_token: device_token
|
15
18
|
}
|
16
19
|
end
|
17
20
|
|
18
21
|
describe 'initialize' do
|
19
|
-
|
22
|
+
describe 'with a generic notification' do
|
23
|
+
subject { described_class.new notification, device_token }
|
20
24
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
it 'initializes the body' do
|
26
|
-
subject.body.must_be_nil
|
27
|
-
end
|
25
|
+
it 'delegates the generic properties' do
|
26
|
+
subject.title.must_equal 'the title'
|
27
|
+
end
|
28
28
|
|
29
|
-
|
30
|
-
|
29
|
+
it 'has a device token' do
|
30
|
+
subject.device_token.must_equal device_token
|
31
|
+
end
|
31
32
|
end
|
32
33
|
|
33
|
-
|
34
|
-
subject.
|
35
|
-
end
|
34
|
+
describe 'with a hash of attributes' do
|
35
|
+
subject { described_class.new attrs }
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
it 'internally builds a generic notification' do
|
38
|
+
subject.title.must_equal 'the title'
|
39
|
+
end
|
40
40
|
|
41
|
-
|
42
|
-
|
41
|
+
it 'has a device token' do
|
42
|
+
subject.device_token.must_equal device_token
|
43
|
+
end
|
43
44
|
|
44
|
-
it { subject.title.must_equal 'the title' }
|
45
|
-
it { subject.body.must_equal 'the body' }
|
46
|
-
it { subject.action.must_equal 'submit' }
|
47
|
-
it { subject.url_args.must_equal ['a'] }
|
48
|
-
it { subject.device_token.must_equal '1234a' }
|
49
45
|
end
|
46
|
+
end
|
50
47
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
}
|
48
|
+
describe 'payload and co' do
|
49
|
+
subject { described_class.new notification }
|
50
|
+
|
51
|
+
let(:parsed_payload) { JSON.parse(subject.to_json) }
|
52
|
+
let(:expected_payload) do
|
53
|
+
{
|
54
|
+
"aps" => {
|
55
|
+
"alert" => {
|
56
|
+
"title" => 'the title',
|
57
|
+
"body" => 'the body',
|
58
|
+
"action" => 'submit'
|
59
|
+
},
|
60
|
+
"url-args" => ['a']
|
65
61
|
}
|
66
|
-
|
67
|
-
|
68
|
-
it { parsed_payload.must_equal expected_payload }
|
69
|
-
it { subject.json_size.must_equal 92 }
|
62
|
+
}
|
63
|
+
end
|
70
64
|
|
71
|
-
|
72
|
-
|
73
|
-
subject.url_args = []
|
74
|
-
end
|
65
|
+
it { parsed_payload.must_equal expected_payload }
|
66
|
+
it { subject.json_size.must_equal 92 }
|
75
67
|
|
76
|
-
|
68
|
+
describe 'no url_args' do
|
69
|
+
before do
|
70
|
+
notification.url_args = []
|
77
71
|
end
|
78
72
|
|
79
|
-
|
80
|
-
|
81
|
-
subject.action = nil
|
82
|
-
end
|
73
|
+
it { parsed_payload['aps'].has_key?('url-args').must_be_false }
|
74
|
+
end
|
83
75
|
|
84
|
-
|
76
|
+
describe 'no action' do
|
77
|
+
before do
|
78
|
+
notification.action = nil
|
85
79
|
end
|
80
|
+
|
81
|
+
it { parsed_payload['aps']['alert'].has_key?('action').must_be_false }
|
86
82
|
end
|
87
83
|
end
|
88
84
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.expand_path '../../test_helper.rb', __FILE__
|
2
|
+
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
class FakeEncoder
|
6
|
+
def encode notification
|
7
|
+
'123'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe Crusade::APNS::PushNotification do
|
12
|
+
let(:options) { Fixtures.default_configuration }
|
13
|
+
subject { Crusade::APNS::PushNotification.new options, connection }
|
14
|
+
let(:connection) { MiniTest::Mock.new }
|
15
|
+
let(:notification) { OpenStruct.new(url_args: %w(1)) }
|
16
|
+
|
17
|
+
describe 'send' do
|
18
|
+
let(:encoder) { FakeEncoder.new }
|
19
|
+
|
20
|
+
before do
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'sends the encoded notification' do
|
25
|
+
Crusade::APNS::NotificationEncoder.stub(:new, encoder) do
|
26
|
+
connection.expect :send, true, ['123']
|
27
|
+
|
28
|
+
subject.send notification
|
29
|
+
|
30
|
+
connection.verify.must_be_true
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'returns :invalid if the number of url args is not the same as in the configuration' do
|
35
|
+
notification.url_args = %w(1 2 3)
|
36
|
+
|
37
|
+
result = subject.send notification
|
38
|
+
|
39
|
+
result.must_equal :invalid
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe 'configuration' do
|
44
|
+
it { subject.configuration.must_be_same_as options }
|
45
|
+
end
|
46
|
+
end
|
@@ -30,7 +30,7 @@ describe Crusade::APNS::WebsiteFileGenerator do
|
|
30
30
|
"websiteName" => "Bay Airlines",
|
31
31
|
"websitePushID" => "web.com.example.domain",
|
32
32
|
"allowedDomains" => ['http://example.com'],
|
33
|
-
"urlFormatString" => "http://domain.example.com
|
33
|
+
"urlFormatString" => "http://domain.example.com/?flight=%@",
|
34
34
|
"authenticationToken" => "token",
|
35
35
|
"webServiceURL" => "https://example.com/push"
|
36
36
|
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crusade-apns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Rouchy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-10-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: crusade
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.8.
|
19
|
+
version: 0.8.2
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.8.
|
26
|
+
version: 0.8.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rubyzip
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -141,7 +141,6 @@ files:
|
|
141
141
|
- lib/crusade/apns/configuration.rb
|
142
142
|
- lib/crusade/apns/crypto/user_token_generator.rb
|
143
143
|
- lib/crusade/apns/notification.rb
|
144
|
-
- lib/crusade/apns/notification_builder.rb
|
145
144
|
- lib/crusade/apns/notification_encoder.rb
|
146
145
|
- lib/crusade/apns/push_notification.rb
|
147
146
|
- lib/crusade/apns/push_package/directory_structure_generator.rb
|
@@ -179,9 +178,9 @@ files:
|
|
179
178
|
- test/support/zip_support.rb
|
180
179
|
- test/test_helper.rb
|
181
180
|
- test/unit/configuration_test.rb
|
182
|
-
- test/unit/notification_builder_test.rb
|
183
181
|
- test/unit/notification_encoder_test.rb
|
184
182
|
- test/unit/notification_test.rb
|
183
|
+
- test/unit/push_notification_test.rb
|
185
184
|
- test/unit/push_package/directory_structure_generator_test.rb
|
186
185
|
- test/unit/push_package/manifest_generator_test.rb
|
187
186
|
- test/unit/push_package/signature_generator_test.rb
|
@@ -238,9 +237,9 @@ test_files:
|
|
238
237
|
- test/support/zip_support.rb
|
239
238
|
- test/test_helper.rb
|
240
239
|
- test/unit/configuration_test.rb
|
241
|
-
- test/unit/notification_builder_test.rb
|
242
240
|
- test/unit/notification_encoder_test.rb
|
243
241
|
- test/unit/notification_test.rb
|
242
|
+
- test/unit/push_notification_test.rb
|
244
243
|
- test/unit/push_package/directory_structure_generator_test.rb
|
245
244
|
- test/unit/push_package/manifest_generator_test.rb
|
246
245
|
- test/unit/push_package/signature_generator_test.rb
|
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'crusade/apns/notification'
|
2
|
-
|
3
|
-
module Crusade
|
4
|
-
module APNS
|
5
|
-
class NotificationBuilder
|
6
|
-
|
7
|
-
def initialize
|
8
|
-
self.notification = Crusade::APNS::Notification.new
|
9
|
-
end
|
10
|
-
|
11
|
-
def build
|
12
|
-
notification
|
13
|
-
end
|
14
|
-
|
15
|
-
def with_title(title)
|
16
|
-
notification.title = title
|
17
|
-
self
|
18
|
-
end
|
19
|
-
|
20
|
-
def with_body(body)
|
21
|
-
notification.body = body
|
22
|
-
self
|
23
|
-
end
|
24
|
-
|
25
|
-
def with_action(action)
|
26
|
-
notification.action = action
|
27
|
-
self
|
28
|
-
end
|
29
|
-
|
30
|
-
def with_url_args(url_args)
|
31
|
-
notification.url_args = url_args
|
32
|
-
self
|
33
|
-
end
|
34
|
-
|
35
|
-
def with_device_token(device_token)
|
36
|
-
notification.device_token = device_token
|
37
|
-
self
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
attr_accessor :notification
|
43
|
-
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,76 +0,0 @@
|
|
1
|
-
require File.expand_path '../../test_helper.rb', __FILE__
|
2
|
-
|
3
|
-
require 'crusade/apns/notification_builder'
|
4
|
-
|
5
|
-
describe Crusade::APNS::NotificationBuilder do
|
6
|
-
let(:described_class) { Crusade::APNS::NotificationBuilder }
|
7
|
-
subject { described_class.new }
|
8
|
-
|
9
|
-
describe 'build' do
|
10
|
-
it' creates a notification' do
|
11
|
-
notification = subject.build
|
12
|
-
|
13
|
-
notification.is_a?(Crusade::APNS::Notification).must_be_true
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
describe 'with_title' do
|
18
|
-
it 'returns the builder' do
|
19
|
-
subject.with_title('test').must_be_same_as subject
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'sets the title of the notification' do
|
23
|
-
notif = subject.with_title('test').build
|
24
|
-
|
25
|
-
notif.title.must_equal 'test'
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
describe 'with_body' do
|
30
|
-
it 'returns the builder' do
|
31
|
-
subject.with_body('test').must_be_same_as subject
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'sets the body of the notification' do
|
35
|
-
notif = subject.with_body('test').build
|
36
|
-
|
37
|
-
notif.body.must_equal 'test'
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
describe 'with_action' do
|
42
|
-
it 'returns the builder' do
|
43
|
-
subject.with_action('test').must_be_same_as subject
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'sets the action of the notification' do
|
47
|
-
notif = subject.with_action('test').build
|
48
|
-
|
49
|
-
notif.action.must_equal 'test'
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
describe 'with_url_args' do
|
54
|
-
it 'returns the builder' do
|
55
|
-
subject.with_url_args('test').must_be_same_as subject
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'sets the url_args of the notification' do
|
59
|
-
notif = subject.with_url_args(['test']).build
|
60
|
-
|
61
|
-
notif.url_args.must_equal ['test']
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
describe 'with_device_token' do
|
66
|
-
it 'returns the builder' do
|
67
|
-
subject.with_device_token('test').must_be_same_as subject
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'sets the url_args of the notification' do
|
71
|
-
notif = subject.with_device_token('test').build
|
72
|
-
|
73
|
-
notif.device_token.must_equal 'test'
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|