crusade-apns 0.8.0 → 0.8.2
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/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
|