rhoconnect 6.2.0 → 7.1.17

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: 867ce0e17fb3e61305afe8736a2f06d913abb0b2
4
- data.tar.gz: 20f31ff7fefe36ae3fd1020ef541fa77062f6583
3
+ metadata.gz: 75a2c9f405a47e165d194f4b1f67bac5e852aed3
4
+ data.tar.gz: ab137d204628e7e27ba7bae7950ff78e076c6811
5
5
  SHA512:
6
- metadata.gz: a96a0176b31ca6e2539b18b4cd82235077817ed20a7bedd809878a851cb584fd08747fda22fffcb41d5226f16dbeb8aacca80e10825ad270a6d891277dcbd361
7
- data.tar.gz: a425f98cb21806eaf9058bb44f378173c2daed1f2204d1ec0b9d1f1a1dc1de51bca308478b2d84d0354290e6530454e2a89b0f8feed38b948821894c695e590d
6
+ metadata.gz: 792dd2116fd5928c1428c15e1329071e45032c16a25be1853dbfd6c33967eecf12e08762f790dfca9367b50f9eb2125ef53ec5d51097f5f9cdb28cf78d3b5626
7
+ data.tar.gz: bebf30ac060bb73983763b59327972abc6d244499e492be494eab9f003f8e293f097cb23983a37dbab7d76bbf195e69b142e99d9b1350c1f9d19ef1faf48c04f
data/Gemfile CHANGED
@@ -48,3 +48,7 @@ end
48
48
  group :build do
49
49
  gem 'fpm', '>= 1.11.00'
50
50
  end
51
+
52
+ gem 'signet', '~> 0.11.0'
53
+ gem 'google-api-client', '~> 0.31.0'
54
+ gem 'google-api-fcm', '~> 0.1.7'
@@ -8,16 +8,18 @@ GIT
8
8
  PATH
9
9
  remote: .
10
10
  specs:
11
- rhoconnect (7.0.0)
11
+ rhoconnect (7.1.0)
12
12
  bundler (~> 1.17.3)
13
13
  connection_pool (~> 2.2.2)
14
+ google-api-client (~> 0.31.0)
15
+ google-api-fcm (~> 0.1.7)
14
16
  json (>= 1.8, < 2.0)
15
17
  rack (~> 2.0.6)
16
18
  rake (~> 12.3.2)
17
19
  redis (~> 4.1.0)
18
20
  resque (>= 2.0.0)
19
21
  rest-client (~> 2.0.2)
20
- rubyzip (~> 1.2.2)
22
+ rubyzip (>= 1.2.2, < 2.1.0)
21
23
  sinatra (~> 2.0.5)
22
24
  thor (~> 0.20.3)
23
25
 
@@ -42,13 +44,17 @@ GEM
42
44
  crack (0.4.3)
43
45
  safe_yaml (~> 1.0.0)
44
46
  daemons (1.3.1)
47
+ declarative (0.0.10)
48
+ declarative-option (0.1.0)
45
49
  diff-lcs (1.3)
46
50
  docile (1.3.1)
47
- domain_name (0.5.20180417)
51
+ domain_name (0.5.20190701)
48
52
  unf (>= 0.0.5, < 1.0.0)
49
53
  dotenv (2.7.2)
50
54
  eventmachine (1.0.9.1)
51
55
  excon (0.62.0)
56
+ faraday (0.17.0)
57
+ multipart-post (>= 1.2, < 3)
52
58
  ffaker (2.10.0)
53
59
  ffi (1.10.0)
54
60
  fog-aws (3.4.0)
@@ -79,25 +85,48 @@ GEM
79
85
  pleaserun (~> 0.0.29)
80
86
  ruby-xz (~> 0.2.3)
81
87
  stud
88
+ google-api-client (0.31.0)
89
+ addressable (~> 2.5, >= 2.5.1)
90
+ googleauth (>= 0.5, < 0.10.0)
91
+ httpclient (>= 2.8.1, < 3.0)
92
+ mini_mime (~> 1.0)
93
+ representable (~> 3.0)
94
+ retriable (>= 2.0, < 4.0)
95
+ signet (0.11.0)
96
+ google-api-fcm (0.1.7)
97
+ google-api-client (~> 0.17)
98
+ googleauth (0.9.0)
99
+ faraday (~> 0.12)
100
+ jwt (>= 1.4, < 3.0)
101
+ memoist (~> 0.16)
102
+ multi_json (~> 1.11)
103
+ os (>= 0.9, < 2.0)
104
+ signet (0.11.0)
82
105
  hashdiff (0.3.8)
83
106
  http-cookie (1.0.3)
84
107
  domain_name (~> 0.5)
108
+ httpclient (2.8.3)
85
109
  insist (1.0.0)
86
110
  io-like (0.3.0)
87
111
  ipaddress (0.8.3)
88
112
  json (1.8.6)
113
+ jwt (2.2.1)
114
+ memoist (0.16.0)
89
115
  mime-types (3.2.2)
90
116
  mime-types-data (~> 3.2015)
91
117
  mime-types-data (3.2019.0331)
118
+ mini_mime (1.0.2)
92
119
  mini_portile2 (2.4.0)
93
120
  mono_logger (1.1.0)
94
121
  multi_json (1.13.1)
122
+ multipart-post (2.1.1)
95
123
  mustache (0.99.8)
96
124
  mustermann (1.0.3)
97
125
  net-ssh (5.2.0)
98
126
  netrc (0.11.0)
99
- nokogiri (1.10.2)
127
+ nokogiri (1.10.4)
100
128
  mini_portile2 (~> 2.4.0)
129
+ os (1.0.1)
101
130
  pleaserun (0.0.30)
102
131
  cabin (> 0)
103
132
  clamp
@@ -108,14 +137,18 @@ GEM
108
137
  public_suffix (3.0.3)
109
138
  rack (2.0.7)
110
139
  rack-fiber_pool (0.9.3)
111
- rack-protection (2.0.5)
140
+ rack-protection (2.0.7)
112
141
  rack
113
142
  rack-test (1.1.0)
114
143
  rack (>= 1.0, < 3)
115
- rake (12.3.2)
116
- redis (4.1.0)
144
+ rake (12.3.3)
145
+ redis (4.1.3)
117
146
  redis-namespace (1.6.0)
118
147
  redis (>= 3.0.4)
148
+ representable (3.0.4)
149
+ declarative (< 0.1.0)
150
+ declarative-option (< 0.2.0)
151
+ uber (< 0.2.0)
119
152
  resque (2.0.0)
120
153
  mono_logger (~> 1.0)
121
154
  multi_json (~> 1.0)
@@ -126,6 +159,7 @@ GEM
126
159
  http-cookie (>= 1.0.2, < 2.0)
127
160
  mime-types (>= 1.16, < 4.0)
128
161
  netrc (~> 0.8)
162
+ retriable (3.1.2)
129
163
  rspec (3.8.0)
130
164
  rspec-core (~> 3.8.0)
131
165
  rspec-expectations (~> 3.8.0)
@@ -142,8 +176,13 @@ GEM
142
176
  ruby-xz (0.2.3)
143
177
  ffi (~> 1.9)
144
178
  io-like (~> 0.3)
145
- rubyzip (1.2.2)
179
+ rubyzip (2.0.0)
146
180
  safe_yaml (1.0.5)
181
+ signet (0.11.0)
182
+ addressable (~> 2.3)
183
+ faraday (~> 0.9)
184
+ jwt (>= 1.5, < 3.0)
185
+ multi_json (~> 1.10)
147
186
  simplecov (0.16.1)
148
187
  docile (~> 1.1)
149
188
  json (>= 1.8, < 3)
@@ -151,10 +190,10 @@ GEM
151
190
  simplecov-html (0.10.2)
152
191
  simplecov-rcov (0.2.3)
153
192
  simplecov (>= 0.4.1)
154
- sinatra (2.0.5)
193
+ sinatra (2.0.7)
155
194
  mustermann (~> 1.0)
156
195
  rack (~> 2.0)
157
- rack-protection (= 2.0.5)
196
+ rack-protection (= 2.0.7)
158
197
  tilt (~> 2.0)
159
198
  sqlite3 (1.4.0)
160
199
  stud (0.0.23)
@@ -163,10 +202,11 @@ GEM
163
202
  eventmachine (~> 1.0, >= 1.0.4)
164
203
  rack (>= 1, < 3)
165
204
  thor (0.20.3)
166
- tilt (2.0.9)
205
+ tilt (2.0.10)
206
+ uber (0.1.0)
167
207
  unf (0.1.4)
168
208
  unf_ext
169
- unf_ext (0.0.7.5)
209
+ unf_ext (0.0.7.6)
170
210
  vegas (0.1.11)
171
211
  rack (>= 1.0.0)
172
212
  webmock (3.5.1)
@@ -188,6 +228,8 @@ DEPENDENCIES
188
228
  ffaker (~> 2.10.0)
189
229
  fog-aws (~> 3.4.0)
190
230
  fpm (>= 1.11.00)
231
+ google-api-client (~> 0.31.0)
232
+ google-api-fcm (~> 0.1.7)
191
233
  jdbc-sqlite3 (>= 3.7.2)
192
234
  jruby-openssl (>= 0.7.4)
193
235
  net-ssh (~> 5.2.0)
data/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![Build Status](https://travis-ci.org/rhomobile/rhoconnect.svg?branch=master)](https://travis-ci.org/rhomobile/rhoconnect)
2
+
1
3
  RhoConnect App Integration Server
2
4
  -------------------------------------------------------------
3
5
  RhoConnect is an app integration server which keeps enterprise data current and available on users’ devices.
File without changes
File without changes
@@ -1,3 +1,3 @@
1
1
  require 'rhoconnect/ping/apple'
2
2
  require 'rhoconnect/ping/rhoconnect_push'
3
- require 'rhoconnect/ping/gcm'
3
+ require 'rhoconnect/ping/fcm'
@@ -0,0 +1,74 @@
1
+ require 'google/apis/messages'
2
+
3
+ # https://firebase.google.com/docs/cloud-messaging/auth-server
4
+ # https://github.com/oniksfly/google-api-fcm
5
+
6
+ module Rhoconnect
7
+ class Fcm
8
+ class InvalidProjectId < Exception; end
9
+ class InvalidPackageName < Exception; end
10
+ class FCMPingError < Exception; end
11
+
12
+ def self.ping(params)
13
+ begin
14
+ fcm_project_id = Rhoconnect.settings[:fcm_project_id]
15
+ raise InvalidProjectId.new("Missing `:fcm_project_id:` option in settings/settings.yml") unless fcm_project_id
16
+
17
+ package_name = Rhoconnect.settings[:package_name]
18
+ raise InvalidPackageName.new("Missing `:package_name:` option in settings/settings.yml") unless package_name
19
+
20
+ send_ping_to_device(fcm_project_id, package_name, params)
21
+ rescue InvalidProjectId => error
22
+ log error
23
+ log error.backtrace.join("\n")
24
+ raise error
25
+ rescue InvalidPackageName => error
26
+ log error
27
+ log error.backtrace.join("\n")
28
+ raise error
29
+ rescue Exception => error
30
+ log error
31
+ log error.backtrace.join("\n")
32
+ raise error
33
+ end
34
+ end
35
+
36
+ def self.send_ping_to_device(project_id,package_name,params)
37
+
38
+ scope = Google::Apis::Messages::AUTH_MESSAGES
39
+ authorization = Google::Auth.get_application_default(scope)
40
+
41
+ service = Google::Apis::Messages::MessagesService.new(project_id: project_id)
42
+ service.authorization = authorization
43
+
44
+ service.notify(fcm_message(package_name,params))
45
+
46
+ end
47
+
48
+ def self.fcm_message(package_name,params)
49
+ params.reject! {|k,v| v.nil? || v.length == 0}
50
+ data = {}
51
+ data['do_sync'] = params['sources'] ? params['sources'].join(',') : ''
52
+ data['alert'] = params['message'] if params['message']
53
+ data['vibrate'] = params['vibrate'] if params['vibrate']
54
+ data['sound'] = params['sound'] if params['sound']
55
+ data['phone_id'] = params['phone_id'] if params['phone_id']
56
+
57
+ android = {}
58
+ android['collapse_key'] = (rand * 100000000).to_i.to_s
59
+ android['priority'] = 'high'
60
+ android['restricted_package_name'] = package_name
61
+ android['data'] = data
62
+ android['notification'] = {}
63
+ # android['notification']['title'] = 'Test message'
64
+ android['notification']['body'] = params['message']
65
+
66
+ message = Google::Apis::Messages::Message.new(
67
+ token: params['device_pin'].to_s,
68
+ android: android
69
+ )
70
+
71
+ message
72
+ end
73
+ end
74
+ end
@@ -1,3 +1,3 @@
1
1
  module Rhoconnect
2
- VERSION = '6.2.0'
2
+ VERSION = '7.1.17'
3
3
  end
@@ -44,10 +44,13 @@ Gem::Specification.new do |s|
44
44
  s.add_dependency('sinatra', '~> 2.0.5')
45
45
  s.add_dependency('rake', '~> 12.3.2')
46
46
  s.add_dependency('json', '>= 1.8', '< 2.0')
47
- s.add_dependency('rubyzip', '~> 1.2.2')
47
+ s.add_dependency('rubyzip', '>= 1.2.2', '< 2.1.0')
48
48
  s.add_dependency('connection_pool', '~> 2.2.2')
49
49
  s.add_dependency('redis', '~> 4.1.0')
50
50
  s.add_dependency('resque', '>= 2.0.0')
51
51
  s.add_dependency('rest-client', '~> 2.0.2')
52
52
  s.add_dependency('thor', '~> 0.20.3')
53
+ s.add_dependency('signet', '~> 0.11.0')
54
+ s.add_dependency('google-api-client', '~> 0.31.0')
55
+ s.add_dependency('google-api-fcm', '~> 0.1.7')
53
56
  end
@@ -33,8 +33,10 @@ describe 'PingJob' do
33
33
  scrubbed_params = params.dup
34
34
  scrubbed_params['vibrate'] = '5'
35
35
 
36
- Apple.should_receive(:ping).once.with({'device_pin' => @c.device_pin,
37
- 'device_port' => @c.device_port}.merge!(scrubbed_params))
36
+ expect(Apple).to receive(:ping).once.with({
37
+ 'device_pin' => @c.device_pin,
38
+ 'device_port' => @c.device_port
39
+ }.merge!(scrubbed_params))
38
40
  PingJob.perform(params)
39
41
  end
40
42
 
@@ -49,7 +51,7 @@ describe 'PingJob' do
49
51
  'phone_id' => nil,
50
52
  'device_app_id' => nil,
51
53
  'device_app_version' => nil}
52
- Apple.should_receive(:ping).once.with({'device_pin' => @c.device_pin,
54
+ expect(Apple).to receive(:ping).once.with({'device_pin' => @c.device_pin,
53
55
  'device_port' => @c.device_port}.merge!(params))
54
56
  PingJob.perform(params)
55
57
  end
@@ -66,7 +68,7 @@ describe 'PingJob' do
66
68
  'device_app_id' => nil,
67
69
  'device_app_version' => nil}
68
70
  @c.device_type = 'unknown_device_type'
69
- PingJob.should_receive(:log).once.with("Dropping ping request for unsupported platform '#{@c.device_type}'")
71
+ expect(PingJob).to receive(:log).once.with("Dropping ping request for unsupported platform '#{@c.device_type}'")
70
72
  PingJob.perform(params)
71
73
  end
72
74
 
@@ -81,8 +83,8 @@ describe 'PingJob' do
81
83
  'device_app_id' => nil,
82
84
  'device_app_version' => nil}
83
85
  @c.device_type = nil
84
- PingJob.should_receive(:log).once.with("Skipping ping for non-registered client_id '#{@c.id}'...")
85
- lambda {PingJob.perform(params)}.should_not raise_error
86
+ expect(PingJob).to receive(:log).once.with("Skipping ping for non-registered client_id '#{@c.id}'...")
87
+ expect {PingJob.perform(params)}.not_to raise_error
86
88
  end
87
89
 
88
90
  it 'should skip ping for empty device_pin' do
@@ -97,8 +99,8 @@ describe 'PingJob' do
97
99
  'device_app_version' => nil, }
98
100
  @c.device_type = 'Android'
99
101
  @c.device_pin = nil
100
- PingJob.should_receive(:log).once.with("Skipping ping for non-registered client_id '#{@c.id}'...")
101
- lambda {PingJob.perform(params)}.should_not raise_error
102
+ expect(PingJob).to receive(:log).once.with("Skipping ping for non-registered client_id '#{@c.id}'...")
103
+ expect {PingJob.perform(params)}.not_to raise_error
102
104
  end
103
105
 
104
106
  it 'should drop ping if it\'s already in user\'s device pin list' do
@@ -119,9 +121,9 @@ describe 'PingJob' do
119
121
  @c_fields.delete(:id)
120
122
  @c2 = Client.create(@c_fields, {:source_name => @s_fields[:name]})
121
123
 
122
- Apple.should_receive(:ping).with({'device_pin' => @c.device_pin, 'device_port' => @c.device_port}.merge!(params))
123
- PingJob.should_receive(:log).twice.with(/Dropping ping request for client/)
124
- lambda {PingJob.perform(params)}.should_not raise_error
124
+ expect(Apple).to receive(:ping).with({'device_pin' => @c.device_pin, 'device_port' => @c.device_port}.merge!(params))
125
+ expect(PingJob).to receive(:log).twice.with(/Dropping ping request for client/)
126
+ expect {PingJob.perform(params)}.not_to raise_error
125
127
  end
126
128
 
127
129
  it 'should drop ping if it\'s already in user\'s phone id list and device pin is different' do
@@ -143,12 +145,12 @@ describe 'PingJob' do
143
145
  @c_fields.delete(:id)
144
146
  @c2 = Client.create(@c_fields, {:source_name => @s_fields[:name]})
145
147
 
146
- Apple.should_receive(:ping).with({'device_pin' => @c.device_pin, 'phone_id' => @c.phone_id, 'device_port' => @c.device_port}.merge!(params))
147
- PingJob.should_receive(:log).twice.with(/Dropping ping request for client/)
148
- lambda {PingJob.perform(params)}.should_not raise_error
148
+ expect(Apple).to receive(:ping).with({'device_pin' => @c.device_pin, 'phone_id' => @c.phone_id, 'device_port' => @c.device_port}.merge!(params))
149
+ expect(PingJob).to receive(:log).twice.with(/Dropping ping request for client/)
150
+ expect {PingJob.perform(params)}.not_to raise_error
149
151
  end
150
152
 
151
- it 'should ping two different users from two different devices - Apple and GCM' do
153
+ xit 'should ping two different users from two different devices - Apple and GCM' do
152
154
  params = {'user_id' => [@u.id, @u1.id],
153
155
  'api_token' => @api_token,
154
156
  'sources' => [@s.name],
@@ -165,8 +167,30 @@ describe 'PingJob' do
165
167
  scrubbed_params['vibrate'] = '5'
166
168
  @c1.device_push_type = 'Gcm'
167
169
 
168
- Apple.should_receive(:ping).with(params.merge!({'device_pin' => @c.device_pin, 'phone_id' => @c.phone_id, 'device_port' => @c.device_port}))
169
- Gcm.should_receive(:ping).with({'device_pin' => @c1.device_pin, 'device_port' => @c1.device_port}.merge!(scrubbed_params))
170
+ expect(Apple).to receive(:ping).with(params.merge!({'device_pin' => @c.device_pin, 'phone_id' => @c.phone_id, 'device_port' => @c.device_port}))
171
+ expect(Gcm).to receive(:ping).with({'device_pin' => @c1.device_pin, 'device_port' => @c1.device_port}.merge!(scrubbed_params))
172
+ PingJob.perform(params)
173
+ end
174
+
175
+ it 'should ping two different users from two different devices - Apple and FCM' do
176
+ params = {'user_id' => [@u.id, @u1.id],
177
+ 'api_token' => @api_token,
178
+ 'sources' => [@s.name],
179
+ 'message' => 'hello world',
180
+ 'vibrate' => '5',
181
+ 'badge' => '5',
182
+ 'sound' => 'hello.mp3',
183
+ 'phone_id' => nil,
184
+ 'device_app_id' => nil,
185
+ 'device_app_version' => nil, }
186
+ @c.phone_id = '3'
187
+
188
+ scrubbed_params = params.dup
189
+ scrubbed_params['vibrate'] = '5'
190
+ @c1.device_push_type = 'Fcm'
191
+
192
+ expect(Apple).to receive(:ping).with(params.merge!({'device_pin' => @c.device_pin, 'phone_id' => @c.phone_id, 'device_port' => @c.device_port}))
193
+ expect(Fcm).to receive(:ping).with({'device_pin' => @c1.device_pin, 'device_port' => @c1.device_port}.merge!(scrubbed_params))
170
194
  PingJob.perform(params)
171
195
  end
172
196
 
@@ -183,9 +207,9 @@ describe 'PingJob' do
183
207
  @c.phone_id = '3'
184
208
  @c1.phone_id = '3'
185
209
 
186
- Apple.should_receive(:ping).with({'device_pin' => @c.device_pin, 'phone_id' => @c.phone_id, 'device_port' => @c.device_port}.merge!(params))
187
- PingJob.should_receive(:log).once.with(/Dropping ping request for client/)
188
- lambda {PingJob.perform(params)}.should_not raise_error
210
+ expect(Apple).to receive(:ping).with({'device_pin' => @c.device_pin, 'phone_id' => @c.phone_id, 'device_port' => @c.device_port}.merge!(params))
211
+ expect(PingJob).to receive(:log).once.with(/Dropping ping request for client/)
212
+ expect {PingJob.perform(params)}.not_to raise_error
189
213
  end
190
214
 
191
215
  it 'should drop ping with two different users with the same pin' do
@@ -201,12 +225,12 @@ describe 'PingJob' do
201
225
  'device_app_version' => nil, }
202
226
  @c1.device_pin = @c.device_pin
203
227
 
204
- Apple.should_receive(:ping).with({'device_pin' => @c.device_pin, 'device_port' => @c.device_port}.merge!(params))
205
- PingJob.should_receive(:log).once.with(/Dropping ping request for client/)
206
- lambda {PingJob.perform(params)}.should_not raise_error
228
+ expect(Apple).to receive(:ping).with({'device_pin' => @c.device_pin, 'device_port' => @c.device_port}.merge!(params))
229
+ expect(PingJob).to receive(:log).once.with(/Dropping ping request for client/)
230
+ expect {PingJob.perform(params)}.not_to raise_error
207
231
  end
208
232
 
209
- it 'should process all pings even if some of them are failing' do
233
+ xit 'should process all pings even if some of them are failing' do
210
234
  params = {'user_id' => [@u.id, @u1.id],
211
235
  'api_token' => @api_token,
212
236
  'sources' => [@s.name],
@@ -226,13 +250,30 @@ describe 'PingJob' do
226
250
  params.merge!({'device_pin' => @c.device_pin, 'phone_id' => @c.phone_id, 'device_port' => @c.device_port})
227
251
  allow(Apple).to receive(:ping).with(params).and_raise(SocketError.new("Socket failure"))
228
252
  allow(Gcm).to receive(:ping).with({'device_pin' => @c1.device_pin, 'device_port' => @c1.device_port}.merge!(scrubbed_params))
229
- exception_raised = false
230
- begin
231
- PingJob.perform(params)
232
- rescue Exception => e
233
- exception_raised = true
234
- end
235
- exception_raised.should == true
253
+ expect{ PingJob.perform(params)}.to raise_error
254
+ end
255
+
256
+ it 'should process all pings even if some of them are failing' do
257
+ params = {'user_id' => [@u.id, @u1.id],
258
+ 'api_token' => @api_token,
259
+ 'sources' => [@s.name],
260
+ 'message' => 'hello world',
261
+ 'vibrate' => '5',
262
+ 'badge' => '5',
263
+ 'sound' => 'hello.mp3',
264
+ 'phone_id' => nil,
265
+ 'device_app_id' => nil,
266
+ 'device_app_version' => nil, }
267
+ @c.phone_id = '3'
268
+
269
+ scrubbed_params = params.dup
270
+ scrubbed_params['vibrate'] = '5'
271
+ @c1.device_push_type = 'Fcm'
272
+
273
+ params.merge!({'device_pin' => @c.device_pin, 'phone_id' => @c.phone_id, 'device_port' => @c.device_port})
274
+ allow(Apple).to receive(:ping).with(params).and_raise(SocketError.new("Socket failure"))
275
+ allow(Fcm).to receive(:ping).with({'device_pin' => @c1.device_pin, 'device_port' => @c1.device_port}.merge!(scrubbed_params))
276
+ expect{ PingJob.perform(params)}.to raise_error
236
277
  end
237
278
 
238
279
  it 'should skip ping for unknown user or user with no clients' do
@@ -246,7 +287,7 @@ describe 'PingJob' do
246
287
  'phone_id' => nil,
247
288
  'device_app_id' => nil,
248
289
  'device_app_version' => nil, }
249
- PingJob.should_receive(:log).once.with(/Skipping ping for unknown user 'fake_user' or 'fake_user' has no registered clients.../)
290
+ expect(PingJob).to receive(:log).once.with(/Skipping ping for unknown user 'fake_user' or 'fake_user' has no registered clients.../)
250
291
  PingJob.perform(params)
251
292
  end
252
293
 
@@ -264,7 +305,7 @@ describe 'PingJob' do
264
305
  }
265
306
  scrubbed_params = params.dup
266
307
 
267
- RhoconnectPush.should_receive(:ping).once.with(
308
+ expect(RhoconnectPush).to receive(:ping).once.with(
268
309
  {'device_pin' => @c.device_pin}.merge!(scrubbed_params)
269
310
  )
270
311
  PingJob.perform(params)
@@ -0,0 +1,116 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe "Ping Android FCM" do
4
+ include_examples "SharedRhoconnectHelper", :rhoconnect_data => false
5
+
6
+ before(:each) do
7
+ allow( Google::Auth).to receive(:get_application_default)
8
+ @params = {"device_pin" => @c.device_pin,
9
+ "sources" => [@s.name], "message" => 'hello world',
10
+ "vibrate" => '5', "badge" => '5', "sound" => 'hello.mp3'}
11
+ @response = double('response')
12
+ Rhoconnect.settings[:fcm_project_id] = 'valid_project_id'
13
+ Rhoconnect.settings[:package_name] = 'valid_package_name'
14
+ end
15
+
16
+ it "should ping fcm successfully" do
17
+ stub_request(:post, "https://fcm.googleapis.com/v1/projects/valid_project_id/messages:send").with { |request|
18
+ hash = JSON.parse request.body
19
+ valid = hash["message"]["token"] == "abcd"
20
+ valid = valid && hash["message"]["topic"] == nil
21
+ valid = valid && hash["message"]["android"]["restricted_package_name"] == "valid_package_name"
22
+ valid
23
+ }
24
+ Fcm.ping(@params)
25
+ end
26
+
27
+ it "should raise error on missing fcm_project_id setting" do
28
+ key = Rhoconnect.settings[:fcm_project_id.dup]
29
+ Rhoconnect.settings[:fcm_project_id] = nil
30
+ expect(lambda { Fcm.ping(@params) }).to raise_error(Fcm::InvalidProjectId, 'Missing `:fcm_project_id:` option in settings/settings.yml')
31
+ Rhoconnect.settings[:fcm_project_id] = key
32
+ end
33
+
34
+ it "should raise error on missing package_name setting" do
35
+ key = Rhoconnect.settings[:package_name.dup]
36
+ Rhoconnect.settings[:package_name] = nil
37
+ expect(lambda { Fcm.ping(@params) }).to raise_error(Fcm::InvalidPackageName, 'Missing `:package_name:` option in settings/settings.yml')
38
+ Rhoconnect.settings[:package_name] = key
39
+ end
40
+
41
+ it "should ping fcm with 503 connection error" do
42
+ stub_request(:post, "https://fcm.googleapis.com/v1/projects/valid_project_id/messages:send").to_raise(RestClient::Exception.new(nil,503))
43
+ expect(lambda { Fcm.ping(@params) }).to raise_error(RestClient::Exception)
44
+ end
45
+
46
+ xit "should ping fcm with 200 error message" do
47
+ allow( Google::Auth).to receive(:get_application_default)
48
+
49
+ error = 'error:DeviceMessageRateExceeded'
50
+ allow(@response).to receive(:code).and_return(200)
51
+ allow(@response).to receive(:body).and_return(error)
52
+ allow(@response).to receive(:headers).and_return(nil)
53
+ stub_request(:post, "https://fcm.googleapis.com/v1/projects/valid_project_id/messages:send").to_raise(RestClient::Exception.new(@response,200))
54
+ expect(lambda { Fcm.ping(@params) }).to raise_error(Fcm::FCMPingError, "FCM ping error: DeviceMessageRateExceeded")
55
+ end
56
+
57
+ xit "should fail to ping with bad authentication" do
58
+ error = 'Error=BadAuthentication'
59
+ allow(@response).to receive(:code).and_return(403)
60
+ allow(@response).to receive(:body).and_return(error)
61
+ allow(@response).to receive(:headers).and_return({})
62
+ setup_post_yield(@response)
63
+ expect(Fcm).to receive(:log).twice
64
+ expect(lambda { Fcm.ping(@params) }).to raise_error(
65
+ Fcm::InvalidProjectId, "Invalid FCM project id. Obtain new api key from FCM service."
66
+ )
67
+ end
68
+
69
+ xit "should ping fcm with 401 error message" do
70
+ allow(@response).to receive(:code).and_return(401)
71
+ allow(@response).to receive(:body).and_return('')
72
+ setup_post_yield(@response)
73
+ expect(Fcm).to receive(:log).twice
74
+ expect(lambda { Fcm.ping(@params) }).to raise_error(
75
+ Fcm::InvalidProjectId, "Invalid FCM project id. Obtain new api key from FCM service."
76
+ )
77
+ end
78
+
79
+ it "should compute fcm_message" do
80
+ expect(Google::Apis::Messages::Message).to receive(:new) do |options|
81
+ expect(options[:token]).to eq(@c.device_pin)
82
+ expect(options[:android]["priority"]).to eq("high")
83
+ expect(options[:android]["restricted_package_name"]).to eq(Rhoconnect.settings[:package_name])
84
+ expect(options[:android]["data"]["do_sync"]).to eq(@s.name)
85
+ expect(options[:android]["data"]["alert"]).to eq("hello world")
86
+ expect(options[:android]["data"]["vibrate"]).to eq("5")
87
+ expect(options[:android]["data"]["sound"]).to eq("hello.mp3")
88
+ expect(options[:android]["notification"]["body"]).to eq("hello world")
89
+ end
90
+
91
+ Fcm.fcm_message(Rhoconnect.settings[:package_name], @params)
92
+ end
93
+
94
+ it "should trim empty or nil params from fcm_message" do
95
+ expect(Google::Apis::Messages::Message).to receive(:new) do |options|
96
+ expect(options[:token]).to eq(@c.device_pin)
97
+ expect(options[:android]["priority"]).to eq("high")
98
+ expect(options[:android]["restricted_package_name"]).to eq(Rhoconnect.settings[:package_name])
99
+ expect(options[:android]["data"]["do_sync"]).to eq('')
100
+ expect(options[:android]["data"]["alert"]).to eq(nil)
101
+ expect(options[:android]["data"]["vibrate"]).to eq("5")
102
+ expect(options[:android]["data"]["sound"]).to eq("hello.mp3")
103
+ expect(options[:android]["notification"]["body"]).to eq(nil)
104
+ end
105
+
106
+ params = {
107
+ "device_pin" => @c.device_pin,
108
+ "sources" => [],
109
+ "message" => '',
110
+ "vibrate" => '5',
111
+ "sound" => 'hello.mp3'
112
+ }
113
+
114
+ Fcm.fcm_message(Rhoconnect.settings[:package_name], params)
115
+ end
116
+ end
@@ -1,6 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__),'..','spec_helper')
2
2
 
3
- describe "Ping Android GCM" do
3
+ xdescribe "Ping Android GCM" do
4
4
  include_examples "SharedRhoconnectHelper", :rhoconnect_data => false
5
5
 
6
6
  before(:each) do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rhoconnect
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.2.0
4
+ version: 7.1.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rhomobile
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-09 00:00:00.000000000 Z
11
+ date: 2019-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -90,16 +90,22 @@ dependencies:
90
90
  name: rubyzip
91
91
  requirement: !ruby/object:Gem::Requirement
92
92
  requirements:
93
- - - "~>"
93
+ - - ">="
94
94
  - !ruby/object:Gem::Version
95
95
  version: 1.2.2
96
+ - - "<"
97
+ - !ruby/object:Gem::Version
98
+ version: 2.1.0
96
99
  type: :runtime
97
100
  prerelease: false
98
101
  version_requirements: !ruby/object:Gem::Requirement
99
102
  requirements:
100
- - - "~>"
103
+ - - ">="
101
104
  - !ruby/object:Gem::Version
102
105
  version: 1.2.2
106
+ - - "<"
107
+ - !ruby/object:Gem::Version
108
+ version: 2.1.0
103
109
  - !ruby/object:Gem::Dependency
104
110
  name: connection_pool
105
111
  requirement: !ruby/object:Gem::Requirement
@@ -170,6 +176,48 @@ dependencies:
170
176
  - - "~>"
171
177
  - !ruby/object:Gem::Version
172
178
  version: 0.20.3
179
+ - !ruby/object:Gem::Dependency
180
+ name: signet
181
+ requirement: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - "~>"
184
+ - !ruby/object:Gem::Version
185
+ version: 0.11.0
186
+ type: :runtime
187
+ prerelease: false
188
+ version_requirements: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - "~>"
191
+ - !ruby/object:Gem::Version
192
+ version: 0.11.0
193
+ - !ruby/object:Gem::Dependency
194
+ name: google-api-client
195
+ requirement: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - "~>"
198
+ - !ruby/object:Gem::Version
199
+ version: 0.31.0
200
+ type: :runtime
201
+ prerelease: false
202
+ version_requirements: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - "~>"
205
+ - !ruby/object:Gem::Version
206
+ version: 0.31.0
207
+ - !ruby/object:Gem::Dependency
208
+ name: google-api-fcm
209
+ requirement: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - "~>"
212
+ - !ruby/object:Gem::Version
213
+ version: 0.1.7
214
+ type: :runtime
215
+ prerelease: false
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ requirements:
218
+ - - "~>"
219
+ - !ruby/object:Gem::Version
220
+ version: 0.1.7
173
221
  description: RhoConnect App Integration Server and related command-line utilities
174
222
  email: dev@rhomobile.com
175
223
  executables:
@@ -504,6 +552,7 @@ files:
504
552
  - lib/rhoconnect/model/js_base.rb
505
553
  - lib/rhoconnect/ping.rb
506
554
  - lib/rhoconnect/ping/apple.rb
555
+ - lib/rhoconnect/ping/fcm.rb
507
556
  - lib/rhoconnect/ping/gcm.rb
508
557
  - lib/rhoconnect/ping/rhoconnect_push.rb
509
558
  - lib/rhoconnect/predefined_adapters/bench_adapter.rb
@@ -672,6 +721,7 @@ files:
672
721
  - spec/perf/perf_spec_helper.rb
673
722
  - spec/perf/store_perf_spec.rb
674
723
  - spec/ping/apple_spec.rb
724
+ - spec/ping/fcm_spec.rb
675
725
  - spec/ping/gcm_spec.rb
676
726
  - spec/ping/rhoconnect_push_spec.rb
677
727
  - spec/predefined_adapters/rho_internal_bench_adapter_controller_js_spec.rb
@@ -831,6 +881,7 @@ test_files:
831
881
  - spec/perf/perf_spec_helper.rb
832
882
  - spec/perf/store_perf_spec.rb
833
883
  - spec/ping/apple_spec.rb
884
+ - spec/ping/fcm_spec.rb
834
885
  - spec/ping/gcm_spec.rb
835
886
  - spec/ping/rhoconnect_push_spec.rb
836
887
  - spec/predefined_adapters/rho_internal_bench_adapter_controller_js_spec.rb