gcm_middleware 0.0.2 → 0.0.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ac61ade0afe4dbe472d9eadd91962d9f52e1df20
4
- data.tar.gz: 2747f613ef9131048a6658c7372260d6254f949a
3
+ metadata.gz: bb36403e61c66e64c2ff8fa8c3503688a1e526d9
4
+ data.tar.gz: d90d36193d8d59c40da959a508f937cad8d0a4dd
5
5
  SHA512:
6
- metadata.gz: 218463a6fe419556cee7aeef96708a7f6e93b95061141e171389349f59b1c73dd04ca2bec760260c86d68d5dd2a9d9335517653dfec2ce413559bd55674d0986
7
- data.tar.gz: b8c545b3d5504c40535a9a831e77e1d4f0acc484c2bfc53d16581572253d54f28d7ce9c66393caf3f1fdd3ee9510ac0c6770b8a4ae929c36a3907ac14f4e5912
6
+ metadata.gz: b667337bdb8072c193f74f099728fc0770b42fcf6ac126fc09a26fa77f5fb548c912a5b8f7431d3a8ed19e5c42c1fe9e98fa63380eb657665db41f00928f6416
7
+ data.tar.gz: 6e3fe15c892949d6285b6932041396422a92394066764af863d16227825a25582d5f5bd59b9708ddb1038eeba07a292ae2c3b38e79691a2b4f3b5399c9357200
@@ -19,9 +19,9 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency 'faraday'
22
- spec.add_dependency 'faraday_middleware'
23
22
 
24
23
  spec.add_development_dependency "bundler", "~> 1.7"
24
+ spec.add_development_dependency "pry"
25
25
  spec.add_development_dependency "rake", "~> 10.0"
26
26
  spec.add_development_dependency "rspec", "~> 3.1"
27
27
  end
@@ -1,31 +1,71 @@
1
1
  require 'faraday'
2
+ require 'json'
2
3
 
3
4
  module GCMMiddleware
4
5
  class CanonicalId < Faraday::Middleware
6
+ GCM_PATH = '/gcm/send'.freeze
7
+ GCM_REGISTRATION_ID_KEY = 'registration_ids'.freeze
8
+ GCM_RESULTS_KEY = 'results'.freeze
9
+ ORIGINAL_ID_KEY = 'original_id'.freeze
10
+
5
11
  def call(env)
6
- save_ids(env.body)
12
+ save_ids(env.body) if should_save_ids?(env)
7
13
 
8
14
  @app.call(env).on_complete do |env|
9
- inject_original_ids(env.body) if has_registration_ids && env.body
15
+ if should_inject_ids? env
16
+ env.body = injected_response_body(env.body)
17
+ end
10
18
  end
11
19
  end
12
20
 
13
21
  private
14
22
 
15
- attr_reader :registration_ids
23
+ attr_reader :registration_ids, :has_saved_ids
24
+
25
+ def injected_response_body(body)
26
+ if body.is_a? Hash
27
+ set_ids(body)
28
+ else
29
+ set_ids(JSON.parse(body)).to_json
30
+ end
31
+ end
16
32
 
17
- def inject_original_ids(body)
18
- body['results'].each_with_index do |result, i|
19
- result['original_id'] = registration_ids[i]
33
+ def set_ids(body)
34
+ body.tap do |b|
35
+ b.fetch(GCM_RESULTS_KEY, []).each_with_index do |result, i|
36
+ result[ORIGINAL_ID_KEY] = registration_ids[i]
37
+ end
20
38
  end
21
39
  end
22
40
 
41
+ def should_save_ids?(env)
42
+ @has_saved_ids = is_gcm_url?(env.url) && env.body
43
+ end
44
+
23
45
  def save_ids(body)
24
- @registration_ids = body.fetch('registration_ids', []) if body
46
+ @registration_ids = parse(body).fetch(GCM_REGISTRATION_ID_KEY, [])
47
+ end
48
+
49
+ def should_inject_ids?(env)
50
+ has_saved_ids &&
51
+ is_success?(env.status) &&
52
+ has_registration_ids?
25
53
  end
26
54
 
27
- def has_registration_ids
55
+ def has_registration_ids?
28
56
  registration_ids && registration_ids.any?
29
57
  end
58
+
59
+ def parse(body)
60
+ body.is_a?(String) ? JSON.parse(body) : body
61
+ end
62
+
63
+ def is_success?(status)
64
+ status == 200
65
+ end
66
+
67
+ def is_gcm_url?(url)
68
+ url.path == GCM_PATH
69
+ end
30
70
  end
31
71
  end
@@ -1,3 +1,3 @@
1
1
  module GCMMiddleware
2
- VERSION = '0.0.2'
2
+ VERSION = '0.0.3'
3
3
  end
@@ -22,13 +22,13 @@ describe GCMMiddleware do
22
22
  f.use :gcm_canonical_id
23
23
 
24
24
  f.adapter :test do |stub|
25
- stub.post('/test') { |env| [ 200, {}, {'results' => [{}]} ] }
25
+ stub.post('/gcm/send') { |env| [ 200, {}, {'results' => [{}]} ] }
26
26
  end
27
27
  end
28
28
  end
29
29
 
30
30
  it 'registers :gcm_canonical_id' do
31
- response = faraday.post('test', { 'registration_ids' => ['1'] })
31
+ response = faraday.post('/gcm/send', { 'registration_ids' => ['1'] })
32
32
 
33
33
  expect(response.body['results'][0]['original_id']).to eq '1'
34
34
  end
@@ -1,74 +1,104 @@
1
+
1
2
  describe GCMMiddleware::CanonicalId do
3
+ let(:response) { faraday.post(path, request_body) }
4
+ let(:path) { '/gcm/send' }
5
+ let(:status_code) { 200 }
6
+ let(:raw_response) { {} }
7
+ let(:response_object) { [status_code, {}, raw_response] }
2
8
  let(:faraday) do
3
9
  Faraday.new('http://www.example.com') do |builder|
4
10
  builder.use GCMMiddleware::CanonicalId
5
11
 
6
12
  builder.adapter :test do |stub|
7
- stub.post('/test') { |env| [ 200, {}, {'results' => raw_results} ] }
8
- stub.post('/error') { |env| [ 200, {}, nil ] }
13
+ stub.post('/gcm/send') { |env| response_object }
14
+ stub.post('/other') { |env| [ 200, {}, raw_response ] }
9
15
  end
10
16
  end
11
17
  end
12
- let(:raw_results) { [] }
13
-
14
- context 'with no body' do
15
- it 'does not modify request' do
16
- response = faraday.post '/test', nil
18
+ let(:request_body) { nil }
17
19
 
18
- expect(response.body).to eq({'results' => []})
20
+ shared_examples 'a normal request' do
21
+ it 'does not modify request or response' do
22
+ expect(response.body).to eq(raw_response)
19
23
  end
20
24
  end
21
25
 
22
- context 'when no registration ids' do
23
- let(:body) { {'foo' => 'bar'} }
26
+ context 'with no request body' do
27
+ it_behaves_like 'a normal request'
28
+ end
24
29
 
25
- it 'does nothing with the request' do
26
- response = faraday.post '/test', body
30
+ context 'when it is not the gcm path' do
31
+ let(:path) { '/other' }
32
+ let(:raw_response) { { 'foo' => 'bar' } }
33
+ let(:request_body) { { 'registration_ids' => ['1'] } }
27
34
 
28
- expect(response.body).to eq({'results' => []})
29
- end
35
+ it_behaves_like 'a normal request'
30
36
  end
31
37
 
32
- context 'with registration ids' do
33
- let(:raw_results) do
34
- [
35
- {
36
- 'message_id' => 'message-1',
37
- 'registration_id' => 'registration-1',
38
- 'error' => nil
39
- },
40
- {
41
- 'message_id' => 'message-2',
42
- 'registration_id' => 'registration-2',
43
- 'error' => nil
44
- }
45
- ]
38
+ context 'when a error is thrown' do
39
+ let(:status_code) { 500 }
40
+ let(:request_body) { {'registration_ids' => ['1']} }
41
+
42
+ it_behaves_like 'a normal request'
43
+ end
44
+
45
+ context 'with a request body' do
46
+ context 'with no registration ids' do
47
+ let(:body) { {'foo' => 'bar'} }
48
+
49
+ it_behaves_like 'a normal request'
46
50
  end
47
- let(:body) { {'registration_ids' => ['first-id', 'second-id']} }
48
51
 
49
- it 'stores the original ids in the response' do
50
- response = faraday.post '/test', body
52
+ shared_examples 'a gcm request' do
53
+ it 'stores the original id in the results' do
54
+ body = response.body
55
+
56
+ results = body.is_a?(String) ? JSON.parse(body)['results'] : body['results']
51
57
 
52
- results = response.body['results']
53
- expect(results[0]).to eq({
58
+ expect(results[0]).to eq({
54
59
  'message_id' => 'message-1',
55
60
  'registration_id' => 'registration-1',
56
61
  'error' => nil,
57
62
  'original_id' => 'first-id'
58
- })
59
- expect(results[1]).to eq({
63
+ })
64
+
65
+ expect(results[1]).to eq({
60
66
  'message_id' => 'message-2',
61
67
  'registration_id' => 'registration-2',
62
68
  'error' => nil,
63
69
  'original_id' => 'second-id'
64
- })
70
+ })
71
+ end
65
72
  end
66
73
 
67
- context 'with no response body' do
68
- it 'does not throw exception' do
69
- response = faraday.post '/error', body
74
+ context 'with registration ids' do
75
+ let(:request_body) do
76
+ {'registration_ids' => ['first-id', 'second-id']}
77
+ end
78
+ let(:raw_response) do
79
+ { 'results' =>
80
+ [
81
+ {
82
+ 'message_id' => 'message-1',
83
+ 'registration_id' => 'registration-1',
84
+ 'error' => nil
85
+ },
86
+ {
87
+ 'message_id' => 'message-2',
88
+ 'registration_id' => 'registration-2',
89
+ 'error' => nil
90
+ }
91
+ ]
92
+ }
93
+ end
94
+
95
+ it_behaves_like 'a gcm request'
96
+
97
+ context 'with json request' do
98
+ let(:response_object) { [status_code, {}, raw_response.to_json] }
99
+ let(:response) { faraday.post(path, request_body.to_json) }
70
100
 
71
- expect(response.body).to be_nil
101
+ it_behaves_like 'a gcm request'
72
102
  end
73
103
  end
74
104
  end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'gcm_middleware'
2
+ require 'pry'
2
3
 
3
4
  RSpec.configure do |config|
4
5
  config.expect_with :rspec do |expectations|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gcm_middleware
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Trevor John
@@ -25,33 +25,33 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: faraday_middleware
28
+ name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :runtime
33
+ version: '1.7'
34
+ type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '1.7'
41
41
  - !ruby/object:Gem::Dependency
42
- name: bundler
42
+ name: pry
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '1.7'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '1.7'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement