mercurius 0.1.6 → 0.1.7
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/README.md +17 -0
- data/lib/mercurius/apns.rb +1 -4
- data/lib/mercurius/apns/service.rb +4 -4
- data/lib/mercurius/gcm.rb +0 -1
- data/lib/mercurius/gcm/service.rb +4 -4
- data/lib/mercurius/testing.rb +7 -6
- data/lib/mercurius/testing/apns/successful_connection.rb +28 -0
- data/lib/mercurius/testing/fake_response.rb +14 -0
- data/lib/mercurius/testing/gcm/canonical_id_connection.rb +30 -0
- data/lib/mercurius/testing/gcm/successful_connection.rb +19 -0
- data/lib/mercurius/testing/gcm/token_serializer.rb +25 -0
- data/lib/mercurius/testing/gcm/unregistered_device_token_connection.rb +25 -0
- data/lib/mercurius/version.rb +1 -1
- data/spec/lib/testing_spec.rb +42 -29
- data/spec/spec_helper.rb +2 -1
- data/spec/support/fake_socket.rb +1 -2
- metadata +8 -7
- data/.ruby-gemset +0 -1
- data/lib/mercurius/testing/base.rb +0 -21
- data/lib/mercurius/testing/delivery.rb +0 -6
- data/lib/mercurius/testing/result.rb +0 -32
- data/lib/mercurius/testing/service.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad8436c06b411a85bb1392ae8829e647150a8813
|
4
|
+
data.tar.gz: 7b6021819a0c16f5b65c609e391c86eef4b10215
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f82468ba84b84c9fce6f0a8dc0b977724eda79378b1c70f1c6511be8f4d16e4baff266979c3a94dd73b08c3b4c04ce979960dae2b4afe26dd790041a7d42197e
|
7
|
+
data.tar.gz: 4c563b18ed858c1433ae0ff53199597028464d73f40f2b9361c0a9dd36add2fb1fc95055318c240c04809725cc5473f1315a1d1f76609695d954fe7ef178dce2
|
data/README.md
CHANGED
@@ -71,6 +71,23 @@ The deliver method can be called in the following ways:
|
|
71
71
|
token_array = ['token123', 'token456']
|
72
72
|
apns_service.deliver apns_notification, token_array # multiple recipients
|
73
73
|
|
74
|
+
## Testing
|
75
|
+
|
76
|
+
`GCM::Service` and `APNS::Service` can accept which type of connection they use to deliver pushes.
|
77
|
+
Mercurius provides several mock connections for convenient testing. You can create a custom fake
|
78
|
+
connection if you require a special use case.
|
79
|
+
|
80
|
+
```ruby
|
81
|
+
# Tokens passed will return successfully from GCM
|
82
|
+
GCM::Service.new connection: GCM::SuccessfulConnection.new
|
83
|
+
|
84
|
+
# Tokens passed will return a NotRegistered error from the fake GCM
|
85
|
+
GCM::Service.new connection: GCM::UnregisteredDeviceTokenConnection.new('token123')
|
86
|
+
|
87
|
+
# Tokens passed as keys will return their mapped value as the canonical ID
|
88
|
+
GCM::Service.new connection: GCM::CanonicalIdConnection.new('token123' => 'canonical123')
|
89
|
+
```
|
90
|
+
|
74
91
|
## Contributing
|
75
92
|
|
76
93
|
Please fork, modify, and send a pull request if you want to help improve this gem.
|
data/lib/mercurius/apns.rb
CHANGED
@@ -12,10 +12,7 @@ module APNS
|
|
12
12
|
attr_accessor :host, :port, :pem
|
13
13
|
|
14
14
|
def mode=(mode)
|
15
|
-
|
16
|
-
@host = HOSTS[mode.to_sym]
|
15
|
+
@host = HOSTS.fetch(mode.to_sym) { raise InvalidApnsModeError.new }
|
17
16
|
end
|
18
|
-
|
19
17
|
end
|
20
|
-
|
21
18
|
end
|
@@ -4,15 +4,15 @@ module APNS
|
|
4
4
|
|
5
5
|
MAX_NUMBER_OF_RETRIES = 3
|
6
6
|
|
7
|
-
attr_accessor :host, :port, :pem
|
8
|
-
attr_reader :
|
7
|
+
attr_accessor :host, :port, :pem, :connection
|
8
|
+
attr_reader :attempts
|
9
9
|
|
10
10
|
def initialize(*)
|
11
11
|
super
|
12
12
|
@host ||= APNS.host
|
13
13
|
@port ||= APNS.port
|
14
|
-
@pem
|
15
|
-
@connection
|
14
|
+
@pem ||= APNS.pem
|
15
|
+
@connection ||= APNS::Connection.new(@host, @port, @pem)
|
16
16
|
@attempts = 0
|
17
17
|
end
|
18
18
|
|
data/lib/mercurius/gcm.rb
CHANGED
@@ -4,14 +4,14 @@ module GCM
|
|
4
4
|
|
5
5
|
BATCH_SIZE = 999
|
6
6
|
|
7
|
-
attr_accessor :host, :key
|
8
|
-
attr_reader :
|
7
|
+
attr_accessor :host, :key, :connection
|
8
|
+
attr_reader :attempts
|
9
9
|
|
10
10
|
def initialize(*)
|
11
11
|
super
|
12
12
|
@host ||= GCM.host
|
13
|
-
@key
|
14
|
-
@connection
|
13
|
+
@key ||= GCM.key
|
14
|
+
@connection ||= GCM::Connection.new(@host, @key)
|
15
15
|
@attempts = 0
|
16
16
|
end
|
17
17
|
|
data/lib/mercurius/testing.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
-
require 'mercurius/testing/
|
2
|
-
require 'mercurius/testing/delivery'
|
3
|
-
require 'mercurius/testing/result'
|
4
|
-
require 'mercurius/testing/service'
|
1
|
+
require 'mercurius/testing/fake_response'
|
5
2
|
|
6
|
-
|
7
|
-
|
3
|
+
require 'mercurius/testing/gcm/token_serializer'
|
4
|
+
require 'mercurius/testing/gcm/successful_connection'
|
5
|
+
require 'mercurius/testing/gcm/canonical_id_connection'
|
6
|
+
require 'mercurius/testing/gcm/unregistered_device_token_connection'
|
7
|
+
|
8
|
+
require 'mercurius/testing/apns/successful_connection'
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module APNS
|
2
|
+
class SuccessfulConnection
|
3
|
+
def initialize
|
4
|
+
@_open = false
|
5
|
+
end
|
6
|
+
|
7
|
+
def open
|
8
|
+
@_open = true
|
9
|
+
@ssl = FakeSocket.new
|
10
|
+
@socket = FakeSocket.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def close
|
14
|
+
@_open = false
|
15
|
+
end
|
16
|
+
|
17
|
+
def closed?
|
18
|
+
not @_open
|
19
|
+
end
|
20
|
+
|
21
|
+
def write(data)
|
22
|
+
@ssl.write data
|
23
|
+
end
|
24
|
+
|
25
|
+
def read
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module GCM
|
2
|
+
class CanonicalIdConnection
|
3
|
+
include GCM::TokenSerializer
|
4
|
+
|
5
|
+
def initialize(canonical_ids_map)
|
6
|
+
@canonical_ids_map = canonical_ids_map
|
7
|
+
end
|
8
|
+
|
9
|
+
def write(json)
|
10
|
+
tokens = json[:registration_ids]
|
11
|
+
|
12
|
+
json = {
|
13
|
+
'multicast_id' => '123',
|
14
|
+
'success' => tokens.size,
|
15
|
+
'failure' => 0,
|
16
|
+
'canonical_ids' => number_of_tokens_mapped_to_canonical_ids(tokens),
|
17
|
+
'results' => canonical_token_json(tokens, @canonical_ids_map)
|
18
|
+
}.to_json
|
19
|
+
|
20
|
+
Mercurius::FakeResponse.new body: json, status: 200
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
def number_of_tokens_mapped_to_canonical_ids(tokens)
|
25
|
+
tokens.count do |token|
|
26
|
+
@canonical_ids_map.key? token
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module GCM
|
2
|
+
class SuccessfulConnection
|
3
|
+
include GCM::TokenSerializer
|
4
|
+
|
5
|
+
def write(json)
|
6
|
+
tokens = json[:registration_ids]
|
7
|
+
|
8
|
+
json = {
|
9
|
+
'multicast_id' => '123',
|
10
|
+
'success' => tokens.size,
|
11
|
+
'failure' => 0,
|
12
|
+
'canonical_ids' => 0,
|
13
|
+
'results' => valid_token_json(tokens)
|
14
|
+
}.to_json
|
15
|
+
|
16
|
+
Mercurius::FakeResponse.new body: json, status: 200
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module GCM
|
2
|
+
module TokenSerializer
|
3
|
+
def valid_token_json(tokens)
|
4
|
+
tokens.map do |token|
|
5
|
+
{ 'message_id' => SecureRandom.hex }
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def invalid_token_json(tokens, error)
|
10
|
+
tokens.map do |token|
|
11
|
+
{ 'error' => error }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def canonical_token_json(tokens, canonical_ids_map)
|
16
|
+
tokens.map do |token|
|
17
|
+
hash = { 'message_id' => SecureRandom.hex }
|
18
|
+
if canonical_id = canonical_ids_map[token]
|
19
|
+
hash['registration_id'] = canonical_id
|
20
|
+
end
|
21
|
+
hash
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module GCM
|
2
|
+
class UnregisteredDeviceTokenConnection
|
3
|
+
include GCM::TokenSerializer
|
4
|
+
|
5
|
+
def initialize(*invalid_tokens)
|
6
|
+
@invalid_tokens = invalid_tokens
|
7
|
+
end
|
8
|
+
|
9
|
+
def write(json)
|
10
|
+
invalid, valid = json[:registration_ids].partition do |token|
|
11
|
+
@invalid_tokens.include? token
|
12
|
+
end
|
13
|
+
|
14
|
+
json = {
|
15
|
+
'multicast_id' => '123',
|
16
|
+
'success' => valid.size,
|
17
|
+
'failure' => invalid.size,
|
18
|
+
'canonical_ids' => 0,
|
19
|
+
'results' => valid_token_json(valid).concat(invalid_token_json(invalid, 'NotRegistered'))
|
20
|
+
}.to_json
|
21
|
+
|
22
|
+
Mercurius::FakeResponse.new body: json, status: 200
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/mercurius/version.rb
CHANGED
data/spec/lib/testing_spec.rb
CHANGED
@@ -1,45 +1,58 @@
|
|
1
|
-
%w(service base result delivery).each do |rb|
|
2
|
-
require File.expand_path("../../../lib/mercurius/testing/#{rb}", __FILE__)
|
3
|
-
end
|
4
|
-
|
5
1
|
describe 'Test mode' do
|
2
|
+
context 'GCM' do
|
3
|
+
let(:message) { GCM::Notification.new(data: { alert: 'Hey' }) }
|
6
4
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
class APNS::MockService < APNS::Service
|
12
|
-
include Mercurius::Testing::Service
|
13
|
-
end
|
5
|
+
describe 'Normal test connection' do
|
6
|
+
let(:service) do
|
7
|
+
GCM::Service.new connection: GCM::SuccessfulConnection.new
|
8
|
+
end
|
14
9
|
|
15
|
-
|
16
|
-
|
17
|
-
|
10
|
+
it 'Returns all devices sent successfully' do
|
11
|
+
responses = service.deliver message, 'token123', 'token456'
|
12
|
+
expect(responses.results.succeeded.size).to eq 2
|
13
|
+
expect(responses.results.failed.size).to eq 0
|
14
|
+
end
|
15
|
+
end
|
18
16
|
|
19
|
-
|
20
|
-
|
21
|
-
|
17
|
+
describe 'Invalid device token connection' do
|
18
|
+
let(:service) do
|
19
|
+
GCM::Service.new connection: GCM::UnregisteredDeviceTokenConnection.new('token456')
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'Returns invalid device errors for the tokens provided' do
|
23
|
+
responses = service.deliver message, 'token123', 'token456'
|
24
|
+
expect(responses.results.failed.size).to eq 1
|
25
|
+
expect(responses.results.failed[0].token).to eq 'token456'
|
26
|
+
expect(responses.results.failed[0].error).to eq 'NotRegistered'
|
27
|
+
end
|
28
|
+
end
|
22
29
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
30
|
+
describe 'Canonical ID token connection' do
|
31
|
+
let(:service) do
|
32
|
+
GCM::Service.new connection: GCM::CanonicalIdConnection.new('token456' => 'canonicalToken999')
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'returns canonical IDs for the tokens provided' do
|
36
|
+
responses = service.deliver message, 'token123', 'token456'
|
37
|
+
expect(responses.results.with_canonical_ids.size).to eq 1
|
38
|
+
expect(responses.results.with_canonical_ids[0].token).to eq 'token456'
|
39
|
+
expect(responses.results.with_canonical_ids[0].canonical_id).to eq 'canonicalToken999'
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'matches the canonical count with the amount provided to the connection' do
|
43
|
+
responses = service.deliver message, 'token123', 'token456'
|
44
|
+
expect(responses[0].to_h['canonical_ids']).to eq 1
|
45
|
+
end
|
29
46
|
end
|
30
47
|
end
|
31
48
|
|
32
49
|
context 'APNS' do
|
33
|
-
let(:service) { APNS::
|
50
|
+
let(:service) { APNS::Service.new connection: APNS::SuccessfulConnection.new }
|
34
51
|
let(:message) { APNS::Notification.new(alert: 'Hey') }
|
35
52
|
|
36
53
|
it 'returns the deliveries sent to APNS' do
|
37
54
|
result = service.deliver message, 'token123'
|
38
|
-
|
39
|
-
expect(delivery.device_tokens).to include 'token123'
|
40
|
-
expect(delivery.notification.alert).to eq 'Hey'
|
41
|
-
expect(result).to be_a_kind_of Mercurius::Testing::Result
|
55
|
+
# Not sure what to test here...
|
42
56
|
end
|
43
57
|
end
|
44
|
-
|
45
58
|
end
|
data/spec/spec_helper.rb
CHANGED
data/spec/support/fake_socket.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mercurius
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Beck
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -132,7 +132,6 @@ extra_rdoc_files: []
|
|
132
132
|
files:
|
133
133
|
- ".gitignore"
|
134
134
|
- ".rspec"
|
135
|
-
- ".ruby-gemset"
|
136
135
|
- ".ruby-version"
|
137
136
|
- ".travis.yml"
|
138
137
|
- Gemfile
|
@@ -160,10 +159,12 @@ files:
|
|
160
159
|
- lib/mercurius/gcm/result_collection.rb
|
161
160
|
- lib/mercurius/gcm/service.rb
|
162
161
|
- lib/mercurius/testing.rb
|
163
|
-
- lib/mercurius/testing/
|
164
|
-
- lib/mercurius/testing/
|
165
|
-
- lib/mercurius/testing/
|
166
|
-
- lib/mercurius/testing/
|
162
|
+
- lib/mercurius/testing/apns/successful_connection.rb
|
163
|
+
- lib/mercurius/testing/fake_response.rb
|
164
|
+
- lib/mercurius/testing/gcm/canonical_id_connection.rb
|
165
|
+
- lib/mercurius/testing/gcm/successful_connection.rb
|
166
|
+
- lib/mercurius/testing/gcm/token_serializer.rb
|
167
|
+
- lib/mercurius/testing/gcm/unregistered_device_token_connection.rb
|
167
168
|
- lib/mercurius/version.rb
|
168
169
|
- mercurius.gemspec
|
169
170
|
- spec/lib/apns_notification_spec.rb
|
data/.ruby-gemset
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
mercurius
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module Mercurius
|
2
|
-
module Testing
|
3
|
-
class Base
|
4
|
-
|
5
|
-
def self.deliveries
|
6
|
-
@@deliveries ||= []
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.reset
|
10
|
-
@@deliveries = []
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.deliveries_to(device_token)
|
14
|
-
deliveries.select do |delivery|
|
15
|
-
delivery.device_tokens.include? device_token
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
module Mercurius
|
2
|
-
module Testing
|
3
|
-
class Result
|
4
|
-
attr_reader :responses
|
5
|
-
|
6
|
-
def initialize(notification)
|
7
|
-
@notification = notification
|
8
|
-
@responses = []
|
9
|
-
end
|
10
|
-
|
11
|
-
def success?
|
12
|
-
true
|
13
|
-
end
|
14
|
-
|
15
|
-
def process_response(*)
|
16
|
-
end
|
17
|
-
|
18
|
-
def failed_responses
|
19
|
-
[]
|
20
|
-
end
|
21
|
-
|
22
|
-
def failed_device_tokens
|
23
|
-
[]
|
24
|
-
end
|
25
|
-
|
26
|
-
def has_canonical_ids?
|
27
|
-
false
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module Mercurius
|
2
|
-
module Testing
|
3
|
-
module Service
|
4
|
-
|
5
|
-
def deliver(notification, *device_tokens)
|
6
|
-
Mercurius::Testing::Base.deliveries << Mercurius::Testing::Delivery.new(notification, Array(device_tokens).flatten)
|
7
|
-
Mercurius::Testing::Result.new notification
|
8
|
-
end
|
9
|
-
|
10
|
-
def deliver_topic(notification, topic)
|
11
|
-
Mercurius::Testing::Base.deliveries << Mercurius::Testing::Delivery.new(notification, [topic])
|
12
|
-
Mercurius::Testing::Result.new notification
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|