rhoconnect 6.2.0 → 7.1.17

Sign up to get free protection for your applications and to get access to all the features.
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