rhoconnect 3.2.1 → 3.3.1.beta2

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.
Files changed (221) hide show
  1. data/CHANGELOG.md +24 -5
  2. data/Gemfile +2 -2
  3. data/Gemfile.lock +20 -20
  4. data/bench/benchapp/Gemfile +17 -20
  5. data/bench/benchapp/config.ru +2 -2
  6. data/bench/benchapp/settings/settings.yml +3 -3
  7. data/bench/blobapp/Gemfile +16 -13
  8. data/bench/blobapp/config.ru +2 -2
  9. data/bench/blobapp/settings/settings.yml +5 -3
  10. data/bench/lib/bench.rb +35 -32
  11. data/bench/lib/bench/session.rb +9 -1
  12. data/bench/scripts/blob_cud_script.rb +13 -17
  13. data/bench/scripts/cud_script.rb +11 -12
  14. data/bench/scripts/helpers.rb +5 -7
  15. data/bench/scripts/query_md_script.rb +18 -12
  16. data/bench/scripts/query_only_script.rb +19 -11
  17. data/bench/scripts/query_script.rb +17 -13
  18. data/bench/scripts/test_query_script.rb +46 -17
  19. data/bench/scripts/test_source_script.rb +7 -7
  20. data/commands/commands/dtach_commands/dtach_install.rb +44 -16
  21. data/commands/commands/rhoconnect/spec.rb +13 -9
  22. data/commands/commands/rhoconnect/version.rb +6 -0
  23. data/commands/execute.rb +10 -6
  24. data/doc/deploying.txt +75 -13
  25. data/doc/install.txt +3 -3
  26. data/doc/push-client-setup.txt +1 -1
  27. data/doc/rest-api.txt +4 -23
  28. data/doc/rhoconnect-redis-stack.txt +26 -7
  29. data/doc/settings.txt +9 -3
  30. data/examples/simple/Gemfile +3 -1
  31. data/examples/simple/application.rb +5 -0
  32. data/examples/simple/config.ru +3 -2
  33. data/examples/simple/my_server.rb +14 -0
  34. data/examples/simple/settings/settings.yml +1 -0
  35. data/generators/templates/application/Gemfile +4 -4
  36. data/generators/templates/application/application.rb +4 -0
  37. data/generators/templates/application/settings/settings.yml +4 -1
  38. data/installer/unix-like/create_texts.rb +39 -1
  39. data/installer/unix-like/rho_connect_install_constants.rb +1 -1
  40. data/installer/utils/package_upload/repos.rake +7 -5
  41. data/lib/rhoconnect.rb +3 -2
  42. data/lib/rhoconnect/api/app/ans_login.rb +3 -0
  43. data/lib/rhoconnect/api/app/bulk_data.rb +6 -0
  44. data/lib/rhoconnect/api/{source → app}/fast_delete.rb +1 -1
  45. data/lib/rhoconnect/api/{source → app}/fast_insert.rb +2 -2
  46. data/lib/rhoconnect/api/{source → app}/fast_update.rb +2 -2
  47. data/lib/rhoconnect/api/app/login.rb +5 -0
  48. data/lib/rhoconnect/api/{source → app}/push_deletes.rb +1 -1
  49. data/lib/rhoconnect/api/{source → app}/push_objects.rb +1 -1
  50. data/lib/rhoconnect/api/app/query.rb +4 -0
  51. data/lib/rhoconnect/api/app/queue_updates.rb +94 -0
  52. data/lib/rhoconnect/api/app/search.rb +4 -0
  53. data/lib/rhoconnect/api/client/client_get_db_doc.rb +5 -0
  54. data/lib/rhoconnect/api/client/client_set_db_doc.rb +8 -0
  55. data/lib/rhoconnect/api/client/create.rb +7 -0
  56. data/lib/rhoconnect/api/client/get_client_params.rb +2 -1
  57. data/lib/rhoconnect/api/client/list_client_docs.rb +2 -1
  58. data/lib/rhoconnect/api/client/register.rb +12 -0
  59. data/lib/rhoconnect/api/client/reset.rb +5 -0
  60. data/lib/rhoconnect/api/{source → readstate}/set_refresh_time.rb +2 -1
  61. data/lib/rhoconnect/api/source/get_source_params.rb +3 -2
  62. data/lib/rhoconnect/api/source/list_sources.rb +2 -1
  63. data/lib/rhoconnect/api/source/update_source_params.rb +3 -3
  64. data/lib/rhoconnect/api/store/get_db_doc.rb +4 -0
  65. data/lib/rhoconnect/api/store/set_db_doc.rb +7 -0
  66. data/lib/rhoconnect/api/system/get_adapter.rb +4 -0
  67. data/lib/rhoconnect/api/{admin → system}/get_license_info.rb +2 -1
  68. data/lib/rhoconnect/api/system/login.rb +15 -0
  69. data/lib/rhoconnect/api/{admin → system}/reset.rb +3 -2
  70. data/lib/rhoconnect/api/system/save_adapter.rb +4 -0
  71. data/lib/rhoconnect/api/{admin → system}/stats.rb +2 -1
  72. data/lib/rhoconnect/api/user/create_user.rb +2 -2
  73. data/lib/rhoconnect/api/user/delete_client.rb +6 -0
  74. data/lib/rhoconnect/api/user/delete_user.rb +2 -1
  75. data/lib/rhoconnect/api/user/list_clients.rb +4 -0
  76. data/lib/rhoconnect/api/user/list_source_docs.rb +11 -0
  77. data/lib/rhoconnect/api/user/list_users.rb +1 -1
  78. data/lib/rhoconnect/api/user/ping.rb +7 -0
  79. data/lib/rhoconnect/api/user/show_user.rb +3 -0
  80. data/lib/rhoconnect/api/user/update_user.rb +3 -2
  81. data/lib/rhoconnect/api/user/user_get_db_doc.rb +5 -0
  82. data/lib/rhoconnect/api/user/user_set_db_doc.rb +10 -0
  83. data/lib/rhoconnect/app.rb +12 -2
  84. data/lib/rhoconnect/async.rb +6 -10
  85. data/lib/rhoconnect/bulk_data/bulk_data.rb +4 -4
  86. data/lib/rhoconnect/client.rb +10 -9
  87. data/lib/rhoconnect/client_sync.rb +24 -19
  88. data/lib/rhoconnect/document.rb +18 -4
  89. data/lib/rhoconnect/graph_helper.rb +4 -2
  90. data/lib/rhoconnect/jobs/bulk_data_job.rb +1 -1
  91. data/lib/rhoconnect/jobs/ping_job.rb +39 -29
  92. data/lib/rhoconnect/middleware/admin_user.rb +23 -0
  93. data/lib/rhoconnect/middleware/body_content_type_parser.rb +35 -0
  94. data/lib/rhoconnect/{cors.rb → middleware/cors.rb} +1 -0
  95. data/lib/rhoconnect/middleware/current_app.rb +16 -0
  96. data/lib/rhoconnect/middleware/current_request.rb +16 -0
  97. data/lib/rhoconnect/middleware/current_user.rb +17 -0
  98. data/lib/rhoconnect/middleware/helpers.rb +105 -0
  99. data/lib/rhoconnect/middleware/login_required.rb +22 -0
  100. data/lib/rhoconnect/{stats/middleware.rb → middleware/stats.rb} +5 -3
  101. data/lib/rhoconnect/middleware/x_domain_session_wrapper.rb +58 -0
  102. data/lib/rhoconnect/ping.rb +1 -0
  103. data/lib/rhoconnect/ping/apple.rb +18 -16
  104. data/lib/rhoconnect/ping/blackberry.rb +9 -9
  105. data/lib/rhoconnect/ping/rhoconnect_push.rb +45 -0
  106. data/lib/rhoconnect/server.rb +98 -91
  107. data/lib/rhoconnect/source.rb +5 -1
  108. data/lib/rhoconnect/source_sync.rb +4 -3
  109. data/lib/rhoconnect/stats/record.rb +15 -15
  110. data/lib/rhoconnect/store.rb +253 -75
  111. data/lib/rhoconnect/tasks.rb +3 -3
  112. data/lib/rhoconnect/version.rb +1 -1
  113. data/lib/rhoconnect/web-console/controllers/admins.js +1 -14
  114. data/lib/rhoconnect/web-console/models/adapter.js +18 -8
  115. data/lib/rhoconnect/web-console/models/client.js +15 -9
  116. data/lib/rhoconnect/web-console/models/doc.js +7 -11
  117. data/lib/rhoconnect/web-console/models/session.js +5 -2
  118. data/lib/rhoconnect/web-console/models/source.js +55 -36
  119. data/lib/rhoconnect/web-console/models/user.js +20 -11
  120. data/lib/rhoconnect/web-console/public/backbone.js +8 -2
  121. data/lib/rhoconnect/web-console/templates/index.erb +11 -5
  122. data/lib/rhoconnect/web-console/views/doc.js +6 -8
  123. data/lib/rhoconnect/web-console/views/edit_user.js +6 -3
  124. data/lib/rhoconnect/web-console/views/home.js +98 -25
  125. data/lib/rhoconnect/web-console/views/index.js +1 -1
  126. data/lib/rhoconnect/web-console/views/new_ping.js +6 -3
  127. data/lib/rhoconnect/web-console/views/server_doc.js +12 -4
  128. data/lib/rhoconnect/web-console/views/show_device.js +6 -3
  129. data/rhoconnect.gemspec +1 -2
  130. data/spec/api/{source → app}/fast_delete_spec.rb +4 -4
  131. data/spec/api/{source → app}/fast_insert_spec.rb +4 -4
  132. data/spec/api/{source → app}/fast_update_spec.rb +22 -6
  133. data/spec/api/{source → app}/push_deletes_spec.rb +2 -2
  134. data/spec/api/app/push_objects_spec.rb +45 -0
  135. data/spec/api/client/client_get_db_doc_spec.rb +31 -0
  136. data/spec/api/client/client_set_db_doc_spec.rb +14 -0
  137. data/spec/api/client/get_client_params_spec.rb +3 -2
  138. data/spec/api/client/list_client_docs_spec.rb +2 -2
  139. data/spec/api/{source → readstate}/set_refresh_time_spec.rb +15 -9
  140. data/spec/api/source/get_source_params_spec.rb +3 -2
  141. data/spec/api/source/list_sources_spec.rb +3 -9
  142. data/spec/api/source/update_source_params_spec.rb +4 -4
  143. data/spec/api/store/get_db_doc_spec.rb +32 -0
  144. data/spec/api/store/set_db_doc_spec.rb +43 -0
  145. data/spec/api/system/adapter_spec.rb +33 -0
  146. data/spec/api/{admin → system}/get_license_info_spec.rb +2 -5
  147. data/spec/api/{admin/get_api_token_spec.rb → system/login_spec.rb} +4 -11
  148. data/spec/api/{admin → system}/reset_spec.rb +2 -2
  149. data/spec/api/{admin → system}/stats_spec.rb +19 -13
  150. data/spec/api/user/create_user_spec.rb +15 -8
  151. data/spec/api/{client → user}/delete_client_spec.rb +3 -4
  152. data/spec/api/user/delete_user_spec.rb +33 -4
  153. data/spec/api/user/list_clients_spec.rb +30 -0
  154. data/spec/api/user/list_source_docs_spec.rb +35 -0
  155. data/spec/api/user/list_users_spec.rb +5 -6
  156. data/spec/api/{client → user}/ping_spec.rb +4 -6
  157. data/spec/api/user/show_user_spec.rb +14 -0
  158. data/spec/api/user/update_user_spec.rb +28 -10
  159. data/spec/api/user/user_get_db_doc_spec.rb +16 -0
  160. data/spec/api/user/user_set_db_doc_spec.rb +41 -0
  161. data/spec/apps/rhotestapp/application.rb +4 -0
  162. data/spec/apps/rhotestapp/settings/settings.yml +3 -1
  163. data/spec/bulk_data/bulk_data_spec.rb +13 -0
  164. data/spec/client_sync_spec.rb +41 -59
  165. data/spec/document_spec.rb +23 -0
  166. data/spec/javascripts/doc_view_spec.js +1 -1
  167. data/spec/javascripts/home_view_spec.js +10 -5
  168. data/spec/javascripts/index_view_spec.js +1 -1
  169. data/spec/jobs/ping_job_spec.rb +26 -0
  170. data/spec/perf/store_perf_spec.rb +1 -1
  171. data/spec/ping/android_spec.rb +0 -7
  172. data/spec/ping/apple_spec.rb +7 -0
  173. data/spec/ping/blackberry_spec.rb +10 -0
  174. data/spec/ping/rhoconnect_push_spec.rb +58 -0
  175. data/spec/server/cors_spec.rb +1 -1
  176. data/spec/server/server_spec.rb +152 -104
  177. data/spec/{stats/middleware_spec.rb → server/stats_spec.rb} +4 -5
  178. data/spec/server/x_domain_session_wrapper_spec.rb +3 -3
  179. data/spec/source_spec.rb +2 -2
  180. data/spec/source_sync_spec.rb +2 -0
  181. data/spec/spec_helper.rb +17 -3
  182. data/spec/stats/record_spec.rb +18 -19
  183. data/spec/store_spec.rb +51 -26
  184. data/spec/support/shared_examples.rb +4 -0
  185. data/spec/sync_states_spec.rb +2 -2
  186. metadata +104 -88
  187. data/bench/benchapp/Gemfile.lock +0 -87
  188. data/bench/blobapp/Gemfile.lock +0 -107
  189. data/bench/lib/testdata/5-data.txt +0 -8
  190. data/doc/release.txt +0 -41
  191. data/lib/rhoconnect/api/admin/get_api_token.rb +0 -14
  192. data/lib/rhoconnect/api/admin/login.rb +0 -6
  193. data/lib/rhoconnect/api/application/bulk_data.rb +0 -7
  194. data/lib/rhoconnect/api/application/clientcreate.rb +0 -8
  195. data/lib/rhoconnect/api/application/clientlogin.rb +0 -6
  196. data/lib/rhoconnect/api/application/clientregister.rb +0 -13
  197. data/lib/rhoconnect/api/application/clientreset.rb +0 -6
  198. data/lib/rhoconnect/api/application/query.rb +0 -7
  199. data/lib/rhoconnect/api/application/queue_updates.rb +0 -20
  200. data/lib/rhoconnect/api/application/search.rb +0 -6
  201. data/lib/rhoconnect/api/client/create_client.rb +0 -3
  202. data/lib/rhoconnect/api/client/delete_client.rb +0 -5
  203. data/lib/rhoconnect/api/client/list_clients.rb +0 -3
  204. data/lib/rhoconnect/api/client/ping.rb +0 -7
  205. data/lib/rhoconnect/api/source/get_adapter.rb +0 -3
  206. data/lib/rhoconnect/api/source/get_db_doc.rb +0 -7
  207. data/lib/rhoconnect/api/source/list_source_docs.rb +0 -10
  208. data/lib/rhoconnect/api/source/save_adapter.rb +0 -3
  209. data/lib/rhoconnect/api/source/set_db_doc.rb +0 -10
  210. data/lib/rhoconnect/api/source/upload_file.rb +0 -4
  211. data/lib/rhoconnect/body_content_type_parser.rb +0 -32
  212. data/lib/rhoconnect/x_domain_session_wrapper.rb +0 -53
  213. data/spec/api/admin/api_token_spec.rb +0 -13
  214. data/spec/api/client/create_client_spec.rb +0 -13
  215. data/spec/api/client/list_clients_spec.rb +0 -22
  216. data/spec/api/source/adapter_spec.rb +0 -29
  217. data/spec/api/source/get_db_doc_spec.rb +0 -21
  218. data/spec/api/source/list_source_docs_spec.rb +0 -25
  219. data/spec/api/source/push_objects_spec.rb +0 -27
  220. data/spec/api/source/set_db_doc_spec.rb +0 -32
  221. data/spec/api/source/upload_file_spec.rb +0 -26
@@ -16,15 +16,38 @@ describe "Document" do
16
16
 
17
17
  it "should flash_data for docname" do
18
18
  @c.put_data(:foo1,{'1'=>@product1})
19
+ docname = @c.docname(:foo1)
20
+ bucket_index = get_sha1('1')[0..1]
21
+ Store.db.keys(@c.docname('*')).sort.should == ["#{docname}:#{bucket_index}", "#{docname}:indices"].sort
22
+ @c.flash_data('*')
23
+ Store.db.keys(@c.docname(:foo)).should == []
24
+ end
25
+
26
+ it "should flash_data for arrays" do
27
+ @c.put_list(:foo1,['1', '2', '3'])
19
28
  Store.db.keys(@c.docname('*')).should == [@c.docname(:foo1)]
20
29
  @c.flash_data('*')
21
30
  Store.db.keys(@c.docname(:foo)).should == []
22
31
  end
32
+
33
+ it "should get_data for arrays" do
34
+ @c.put_list(:foo1,['1', '2', '3'])
35
+ Store.db.keys(@c.docname('*')).should == [@c.docname(:foo1)]
36
+ @c.get_data(:foo1, Array).should == ['1', '2', '3']
37
+ end
23
38
 
24
39
  it "should rename doc" do
25
40
  set_state(@c.docname(:key1) => @data)
26
41
  @c.rename(:key1,:key2)
27
42
  verify_result(@c.docname(:key1) => {}, @c.docname(:key2) => @data)
28
43
  end
44
+
45
+ it "should operate with individual object" do
46
+ key = '1'
47
+ data = {'foo' => 'bar'}
48
+ @c.put_object(:md, key, data)
49
+ obj = @c.get_object(:md, key)
50
+ obj.should == data
51
+ end
29
52
  end
30
53
  end
@@ -30,7 +30,7 @@ describe("DocView", function(){
30
30
  var title = this.docView.el.innerHTML.search('testkey');
31
31
  expect(title).toBeGreaterThan(0);
32
32
 
33
- var change_btn = this.docView.el.innerHTML.search('Upload token string');
33
+ var change_btn = this.docView.el.innerHTML.search('Upload string');
34
34
  expect(change_btn).toBeGreaterThan(0);
35
35
  })
36
36
  });
@@ -5,13 +5,18 @@ describe("Home", function(){
5
5
  session.setAuthenticated('true');
6
6
  session.setApiKey('testtoken');
7
7
  source = new Source();
8
-
9
- sinon.stub(source,'fetch')
8
+
9
+ sinon.stub(source,'fetch');
10
10
  sinon.stub(source,'save');
11
+
12
+ adapter = new Adapter();
13
+ sinon.stub(adapter, 'set_adapter');
14
+ sinon.stub(adapter, 'get_adapter');
15
+
11
16
  confirmStub = sinon.stub(window, 'confirm');
12
17
  confirmStub.returns(true);
13
-
14
- this.homeView = new App.Views.Home({model : source});
18
+ sinon.stub(jQuery,'ajax');
19
+ this.homeView = new App.Views.Home({model : source, model2 : adapter});
15
20
  });
16
21
 
17
22
  afterEach(function(){
@@ -19,6 +24,7 @@ describe("Home", function(){
19
24
  session.setAuthenticated('false');
20
25
  session.setApiKey(null);
21
26
  confirmStub.restore();
27
+ jQuery.ajax.restore();
22
28
  });
23
29
 
24
30
  it("should have render initial html",function(){
@@ -34,6 +40,5 @@ describe("Home", function(){
34
40
 
35
41
  var reset = this.homeView.el.innerHTML.search('Sync Server URL');
36
42
  expect(reset).toBeGreaterThan(0);
37
-
38
43
  })
39
44
  });
@@ -1,7 +1,7 @@
1
1
  describe("Index", function(){
2
2
 
3
3
  beforeEach(function(){
4
- this.indexView = new App.Views.Index;
4
+ this.indexView = new App.Views.Index;
5
5
  });
6
6
 
7
7
  afterEach(function(){
@@ -175,5 +175,31 @@ describe "PingJob" do
175
175
  end
176
176
  exception_raised.should == true
177
177
  end
178
+
179
+ it "should skip ping for unknown user or user with no clients" do
180
+ params = {"user_id" => [ 'fake_user' ], "api_token" => @api_token,
181
+ "sources" => [@s.name], "message" => 'hello world',
182
+ "vibrate" => '5', "badge" => '5', "sound" => 'hello.mp3', 'phone_id' => nil }
183
+ PingJob.should_receive(:log).once.with(/Skipping ping for unknown user 'fake_user' or 'fake_user' has no registered clients.../)
184
+ PingJob.perform(params)
185
+ end
186
+
187
+ it "should process ping for device_push_type if available" do
188
+ @c.device_push_type = 'rhoconnect_push'
189
+ @c.device_port = nil
190
+ params = {
191
+ 'user_id' => @u.id,
192
+ 'message' => 'hello world',
193
+ 'device_port' => '',
194
+ 'vibrate' => '',
195
+ 'phone_id' => nil
196
+ }
197
+ scrubbed_params = params.dup
198
+
199
+ RhoconnectPush.should_receive(:ping).once.with(
200
+ {'device_pin' => @c.device_pin}.merge!(scrubbed_params)
201
+ )
202
+ PingJob.perform(params)
203
+ end
178
204
  end
179
205
  end
@@ -19,7 +19,7 @@ describe "Rhoconnect Performance" do
19
19
  Store.put_data('mdoc',@data).should == true
20
20
  Store.put_data('cdoc',@data1).should == true
21
21
  start = start_timer
22
- Store.get_diff_data('mdoc','cdoc').should == [expected,1]
22
+ Store.get_diff_data('mdoc','cdoc').should == expected
23
23
  lap_timer('get_diff_data duration', start)
24
24
  end
25
25
  end
@@ -2,13 +2,6 @@ require File.join(File.dirname(__FILE__),'..','spec_helper')
2
2
 
3
3
  describe "Ping Android" do
4
4
  it_behaves_like "SharedRhoconnectHelper", :rhoconnect_data => false do
5
- def setup_post_yield(response)
6
- if RUBY_VERSION =~ /1.9/ or defined?(JRUBY_VERSION)
7
- RestClient.stub!(:post).and_yield(response, nil, nil)
8
- else
9
- RestClient.stub!(:post).and_yield(response)
10
- end
11
- end
12
5
 
13
6
  before do
14
7
  @params = {"device_pin" => @c.device_pin,
@@ -65,5 +65,12 @@ describe "Ping Apple" do
65
65
  Apple.should_receive(:log).once.with("Error while sending ping: #{error}")
66
66
  lambda { Apple.ping(@params) }.should raise_error(SocketError,error)
67
67
  end
68
+
69
+ it "should do nothing if no cert or host or port" do
70
+ Rhoconnect::Apple.stub!(:get_config).and_return({:test => {:iphonecertfile=>"none"}})
71
+ Rhoconnect::Apple.should_receive(:get_config).once
72
+ OpenSSL::SSL::SSLContext.should_receive(:new).exactly(0).times
73
+ Apple.ping(@params)
74
+ end
68
75
  end
69
76
  end
@@ -24,10 +24,20 @@ describe "Ping Blackberry" do
24
24
 
25
25
  it "should ping blackberry with connection error" do
26
26
  error = 'Connection refused'
27
+ Rhoconnect::Blackberry.stub!(:get_config).and_return({:test => {:mdsserver=>'testserver',:mdsserverport=>'testport'}})
28
+ Rhoconnect::Blackberry.should_receive(:get_config).once
27
29
  @http.stub!(:request).and_return { raise SocketError.new(error) }
28
30
  Blackberry.should_receive(:log).once.with("Error while sending ping: #{error}")
29
31
  lambda { Blackberry.ping(@params) }.should raise_error(SocketError,error)
30
32
  end
33
+
34
+ it "should do nothing if no host and port" do
35
+ error = 'Connection refused'
36
+ Rhoconnect::Blackberry.stub!(:get_config).and_return({:test => {}})
37
+ Rhoconnect::Blackberry.should_receive(:get_config).once
38
+ Net::HTTP.should_receive(:new).exactly(0).times
39
+ Blackberry.ping(@params)
40
+ end
31
41
 
32
42
  it "should compute pap_message" do
33
43
  expected = <<PAP
@@ -0,0 +1,58 @@
1
+ require File.join(File.dirname(__FILE__),'..','spec_helper')
2
+
3
+ describe "Ping using RhoConnect push" do
4
+ it_behaves_like "SharedRhoconnectHelper", :rhoconnect_data => false do
5
+
6
+ before do
7
+ @params = {"device_pin" => @c.device_pin,
8
+ "sources" => [@s.name], "message" => 'hello world',
9
+ "vibrate" => '5', "badge" => '5', "sound" => 'hello.mp3'}
10
+ @response = mock('response')
11
+
12
+ end
13
+
14
+ it "should ping rhoconnect push successfully" do
15
+ result = ''
16
+ @response.stub!(:code).and_return(204)
17
+ @response.stub!(:body).and_return(result)
18
+ @response.stub!(:return!).and_return(@response)
19
+ RestClient.stub!(:post).and_return(@response)
20
+ res = RhoconnectPush.ping(@params)
21
+ res.body.should == result
22
+ res.code.should == 204
23
+ end
24
+
25
+ it "should ping rhoconnect push with missing push_server property" do
26
+ RhoconnectPush.stub!(:get_config).and_return({:test => {}})
27
+ lambda { RhoconnectPush.ping(@params) }.should raise_error(
28
+ RhoconnectPush::InvalidPushServer, "Missing or invalid `:push_server` in settings/settings.yml."
29
+ )
30
+ end
31
+
32
+
33
+ it "should ping rhoconnect push with 400 response" do
34
+ result = ''
35
+ @response.stub!(:code).and_return(400)
36
+ @response.stub!(:body).and_return(result)
37
+ @response.stub!(:return!).and_return(@response)
38
+ setup_post_yield(@response)
39
+ lambda { RhoconnectPush.ping(@params) }.should raise_error(
40
+ RhoconnectPush::InvalidPushRequest, "Invalid push request."
41
+ )
42
+ end
43
+
44
+ it "should compute push_message" do
45
+ expected = {
46
+ 'collapseId' => 5,
47
+ 'data' => {
48
+ 'do_sync' => [@s.name],
49
+ 'message' => "hello world",
50
+ 'vibrate' => '5',
51
+ 'sound' => "hello.mp3"
52
+ }
53
+ }
54
+ actual = RhoconnectPush.push_message(@params)
55
+ JSON.parse(actual).should == expected
56
+ end
57
+ end
58
+ end
@@ -1,4 +1,4 @@
1
- require 'rhoconnect/cors'
1
+ require 'rhoconnect/middleware/cors'
2
2
  require File.join(File.dirname(__FILE__),'..','spec_helper')
3
3
 
4
4
  require "cgi"
@@ -31,22 +31,46 @@ describe "Server" do
31
31
  end
32
32
 
33
33
  it "should login if content-type contains extra parameters" do
34
- post "/api/admin/login", {"login" => 'rhoadmin', "password" => ''}.to_json, {'CONTENT_TYPE'=>'application/json; charset=UTF-8'}
34
+ post "/rc/#{Rhoconnect::API_VERSION}/system/login", {"login" => 'rhoadmin', "password" => ''}.to_json, {'CONTENT_TYPE'=>'application/json; charset=UTF-8'}
35
35
  last_response.should be_ok
36
36
  end
37
37
 
38
38
  it "should fail to login if wrong content-type" do
39
- post "/api/admin/login", {"login" => 'rhoadmin', "password" => ''}.to_json, {'CONTENT_TYPE'=>'application/x-www-form-urlencoded'}
39
+ post "/rc/#{Rhoconnect::API_VERSION}/system/login", {"login" => 'rhoadmin', "password" => ''}.to_json, {'CONTENT_TYPE'=>'application/x-www-form-urlencoded'}
40
40
  last_response.should_not be_ok
41
41
  end
42
42
 
43
43
  it "should login as rhoadmin user" do
44
- post "/api/admin/login", "login" => 'rhoadmin', "password" => ''
44
+ post "/rc/#{Rhoconnect::API_VERSION}/system/login", "login" => 'rhoadmin', "password" => ''
45
45
  last_response.should be_ok
46
46
  end
47
+
48
+ it "should extract api token from the header" do
49
+ post "/rc/#{Rhoconnect::API_VERSION}/system/login", "login" => 'rhoadmin', "password" => ''
50
+ last_response.should be_ok
51
+ api_token = last_response.body
52
+
53
+ get "/rc/#{Rhoconnect::API_VERSION}/system/license", {}, {Rhoconnect::API_TOKEN_HEADER => api_token}
54
+ last_response.should be_ok
55
+ JSON.parse(last_response.body).should == {
56
+ "available" => 9,
57
+ "issued" => "Fri Apr 23 17:20:13 -0700 2010",
58
+ "seats" => 10,
59
+ "rhoconnect_version" => "Version 1",
60
+ "licensee" => "Rhomobile" }
61
+ end
62
+
63
+ it "should register custom_route and process it" do
64
+ Rhoconnect::Server.api4 :my_custom_route, :get, "/my_custom_route", false, nil do |params,user,server|
65
+ "Hello World!"
66
+ end
67
+
68
+ get "/my_custom_route", {}
69
+ last_response.body.should == "Hello World!"
70
+ end
47
71
 
48
- it "should respond with 401 to /:app_name" do
49
- get "/api/application/query"
72
+ it "should respond with 401 if controller name is not specified" do
73
+ get "/app/"
50
74
  last_response.status.should == 401
51
75
  end
52
76
 
@@ -70,67 +94,95 @@ describe "Server" do
70
94
 
71
95
  describe "helpers" do
72
96
  before(:each) do
73
- do_post "/api/application/clientlogin", "login" => @u.login, "password" => 'testpass'
97
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => @u.login, "password" => 'testpass'
74
98
  end
75
99
 
76
100
  it "should return nil if params[:source_name] is missing" do
77
- get "/api/application/query"
101
+ get "/application"
78
102
  last_response.status.should == 500
79
103
  end
80
104
  end
81
105
 
82
106
  describe "auth routes" do
83
107
  it "should login user with correct username,password" do
84
- do_post "/api/application/clientlogin", "login" => @u.login, "password" => 'testpass'
108
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => @u.login, "password" => 'testpass'
85
109
  last_response.should be_ok
86
110
  end
87
111
 
88
- it "should login user with correct username,password if backend servcie defined" do
112
+ it "should login user with correct username,password old route and deprecation warning" do
113
+ do_post "/application/clientlogin", "login" => @u.login, "password" => 'testpass'
114
+ last_response.should be_ok
115
+ last_response.headers["Warning"].index('deprecated').should_not == nil
116
+ end
117
+
118
+ it "should login user with correct username,password if backend service defined" do
89
119
  stub_request(:post, "http://test.com/rhoconnect/authenticate").to_return(:body => "lucas")
90
120
  Rhoconnect.appserver = 'http://test.com'
91
- do_post "/api/application/clientlogin", "login" => 'lucas', "password" => 'testpass'
121
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => 'lucas', "password" => 'testpass'
92
122
  last_response.should be_ok
93
123
  end
94
124
 
95
125
  it "should return 401 and LoginException messsage from authenticate" do
96
- do_post "/api/application/clientlogin", "login" => @u.login, "password" => 'wrongpass'
126
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => @u.login, "password" => 'wrongpass'
97
127
  last_response.status.should == 401
98
128
  last_response.body.should == 'login exception'
99
129
  end
100
130
 
101
131
  it "should return 500 and Exception messsage from authenticate" do
102
- do_post "/api/application/clientlogin", "login" => @u.login, "password" => 'server error'
132
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => @u.login, "password" => 'server error'
103
133
  last_response.status.should == 500
104
134
  last_response.body.should == 'server error'
105
135
  end
106
136
 
107
137
  it "should return 401 and no messsage from authenticate if no exception raised" do
108
- do_post "/api/application/clientlogin", "login" => @u.login, "password" => 'wrongpassnomsg'
138
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => @u.login, "password" => 'wrongpassnomsg'
109
139
  last_response.status.should == 401
110
- last_response.body.should == ''
140
+ last_response.body.should == "Unable to authenticate '#{@u.login}'"
111
141
  end
112
142
 
113
143
  it "should create unknown user through delegated authentication" do
114
- do_post "/api/application/clientlogin", "login" => 'newuser', "password" => 'testpass'
144
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => 'newuser', "password" => 'testpass'
115
145
  User.is_exist?('newuser').should == true
116
146
  @a.users.members.sort.should == ['newuser','testuser']
117
147
  end
118
148
 
119
149
  it "should create a different username through delegated authentication" do
120
- do_post "/api/application/clientlogin", "login" => 'newuser', "password" => 'diffuser'
150
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => 'newuser', "password" => 'diffuser'
121
151
  User.is_exist?('different').should == true
122
152
  @a.users.members.sort.should == ['different','testuser']
123
153
  end
154
+
155
+ context "ans authenticate" do
156
+ it "should authenticate user with ans route" do
157
+ authorize 'ansuser', 'secret'
158
+ get "/rc/#{Rhoconnect::API_VERSION}/app/ans_login", {}
159
+ last_response.status.should == 204
160
+ end
161
+ end
124
162
  end
125
163
 
126
164
  describe "client management routes" do
127
165
  before(:each) do
128
- do_post "/api/application/clientlogin", "login" => @u.login, "password" => 'testpass'
166
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => @u.login, "password" => 'testpass'
129
167
  end
130
168
 
131
169
  it "should respond to clientcreate" do
132
- get "/api/application/clientcreate?device_type=blackberry"
170
+ do_post "/rc/#{Rhoconnect::API_VERSION}/clients", 'device_type' => 'blackberry'
171
+ last_response.should be_ok
172
+ last_response.content_type.should =~ /application\/json/
173
+ id = JSON.parse(last_response.body)['client']['client_id']
174
+ id.length.should == 32
175
+ JSON.parse(last_response.body).should ==
176
+ {"client"=>{"client_id"=>id}}
177
+ c = Client.load(id,{:source_name => '*'})
178
+ c.user_id.should == 'testuser'
179
+ c.device_type.should == 'blackberry'
180
+ end
181
+
182
+ it "should respond to clientcreate with old route and deprecation warning" do
183
+ get "/application/clientcreate?device_type=blackberry"
133
184
  last_response.should be_ok
185
+ last_response.headers["Warning"].index('deprecated').should_not == nil
134
186
  last_response.content_type.should =~ /application\/json/
135
187
  id = JSON.parse(last_response.body)['client']['client_id']
136
188
  id.length.should == 32
@@ -142,8 +194,8 @@ describe "Server" do
142
194
  end
143
195
 
144
196
  it "should respond to clientregister" do
145
- do_post "/api/application/clientregister",
146
- "device_type" => "iPhone", "device_pin" => 'abcd', "client_id" => @c.id
197
+ do_post "/rc/#{Rhoconnect::API_VERSION}/clients/#{@c.id}/register",
198
+ "device_type" => "iPhone", "device_pin" => 'abcd'
147
199
  last_response.should be_ok
148
200
  @c.device_type.should == 'Apple'
149
201
  @c.device_pin.should == 'abcd'
@@ -154,8 +206,8 @@ describe "Server" do
154
206
  Store.flash_data("client*")
155
207
  client_id = @c.id.clone
156
208
  @c = nil
157
- do_post "/api/application/clientregister",
158
- "device_type" => "iPhone", "device_pin" => 'abcd', "client_id" => client_id
209
+ do_post "/rc/#{Rhoconnect::API_VERSION}/clients/#{client_id}/register",
210
+ "device_type" => "iPhone", "device_pin" => 'abcd'
159
211
  last_response.should be_ok
160
212
  @c = Client.load(client_id, {:source_name => '*'})
161
213
  @c.device_type.should == 'iPhone'
@@ -165,7 +217,14 @@ describe "Server" do
165
217
 
166
218
  it "should respond to clientreset" do
167
219
  set_state(@c.docname(:cd) => @data)
168
- get "/api/application/clientreset", :client_id => @c.id,:version => ClientSync::VERSION
220
+ do_post "/rc/#{Rhoconnect::API_VERSION}/clients/#{@c.id}/reset", {}
221
+ verify_result(@c.docname(:cd) => {})
222
+ end
223
+
224
+ it "should respond to clientreset with old route and deprecation warning" do
225
+ set_state(@c.docname(:cd) => @data)
226
+ get "/application/clientreset", 'client_id' => @c.id
227
+ last_response.headers["Warning"].index('deprecated').should_not == nil
169
228
  verify_result(@c.docname(:cd) => {})
170
229
  end
171
230
 
@@ -175,7 +234,7 @@ describe "Server" do
175
234
  @c.source_name = 'SampleAdapter'
176
235
  set_state(@c.docname(:cd) => @data)
177
236
  sources = [{'name' => 'SimpleAdapter'}]
178
- get "/api/application/clientreset", :client_id => @c.id,:version => ClientSync::VERSION, :sources => sources
237
+ do_post "/rc/#{Rhoconnect::API_VERSION}/clients/#{@c.id}/reset", 'sources' => sources
179
238
  last_response.should be_ok
180
239
  @c.source_name = 'SampleAdapter'
181
240
  verify_result(@c.docname(:cd) => @data)
@@ -185,17 +244,17 @@ describe "Server" do
185
244
 
186
245
  it "should switch client user if client user_id doesn't match session user" do
187
246
  set_test_data('test_db_storage',@data)
188
- get "/api/application/query",:client_id => @c.id,:source_name => @s.name,:version => ClientSync::VERSION
247
+ get "/app/#{Rhoconnect::API_VERSION}/#{@s.name}", {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
189
248
  JSON.parse(last_response.body).last['insert'].should == @data
190
- do_post "/api/application/clientlogin", "login" => 'user2', "password" => 'testpass'
249
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => 'user2', "password" => 'testpass'
191
250
  data = {'1'=>@product1,'2'=>@product2}
192
251
  set_test_data('test_db_storage',data)
193
- get "/api/application/query",:client_id => @c.id,:source_name => @s.name,:version => ClientSync::VERSION
252
+ get "/app/#{Rhoconnect::API_VERSION}/#{@s.name}", {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
194
253
  JSON.parse(last_response.body).last['insert'].should == data
195
254
  end
196
255
 
197
256
  it "should return error on routes if client doesn't exist" do
198
- get "/api/application/query",:client_id => "missingclient",:source_name => @s.name,:version => ClientSync::VERSION
257
+ get "/app/#{Rhoconnect::API_VERSION}/#{@s.name}",{}, {Rhoconnect::CLIENT_ID_HEADER => "BrokenClient"}
199
258
  last_response.body.should == "Unknown client"
200
259
  last_response.status.should == 500
201
260
  end
@@ -203,29 +262,21 @@ describe "Server" do
203
262
 
204
263
  describe "source routes" do
205
264
  before(:each) do
206
- do_post "/api/application/clientlogin", "login" => @u.login, "password" => 'testpass'
207
- end
208
-
209
- it "should return 404 message with version < 3" do
210
- get "/api/application/query",:source_name => @s.name,:version => 2
211
- last_response.status.should == 404
212
- last_response.body.should == "Server supports version 3 or higher of the protocol."
265
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => @u.login, "password" => 'testpass'
213
266
  end
214
267
 
215
268
  it "should post records for create" do
216
269
  @product1['_id'] = '1'
217
- params = {'create'=>{'1'=>@product1},:client_id => @c.id,:source_name => @s.name,
218
- :version => ClientSync::VERSION}
219
- do_post "/api/application/queue_updates", params
270
+ params = {'create'=>{'1'=>@product1}}
271
+ do_post "/app/#{Rhoconnect::API_VERSION}/#{@s.name}", params, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
220
272
  last_response.should be_ok
221
273
  last_response.body.should == ''
222
274
  verify_result("test_create_storage" => {'1'=>@product1})
223
275
  end
224
276
 
225
277
  it "should post records for update" do
226
- params = {'update'=>{'1'=>@product1},:client_id => @c.id,:source_name => @s.name,
227
- :version => ClientSync::VERSION}
228
- do_post "/api/application/queue_updates", params
278
+ params = {'update' => @product1}
279
+ do_put "/app/#{Rhoconnect::API_VERSION}/#{@s.name}/1", params, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
229
280
  last_response.should be_ok
230
281
  last_response.body.should == ''
231
282
  verify_result("test_update_storage" => {'1'=>@product1})
@@ -241,47 +292,46 @@ describe "Server" do
241
292
  verify_result("test_update_storage" => {'1'=>@product1})
242
293
  end
243
294
 
244
- it "should post records for update using the /api/application route and have the deprecation warning" do
245
- params = {'update'=>{'1'=>@product1},:client_id => @c.id,:source_name => @s.name,
246
- :version => ClientSync::VERSION}
247
- do_post "/api/application", params
295
+ it "should post records for delete" do
296
+ set_state(@c.docname(:cd) => @data)
297
+ delete "/app/#{Rhoconnect::API_VERSION}/#{@s.name}/1", {}, { Rhoconnect::CLIENT_ID_HEADER => @c.id }
248
298
  last_response.should be_ok
249
299
  last_response.body.should == ''
250
- last_response.headers["Warning"].index('deprecated').should_not == nil
251
- verify_result("test_update_storage" => {'1'=>@product1})
300
+ verify_result("test_delete_storage" => {'1'=>@product1})
252
301
  end
253
302
 
254
- it "should post records for delete" do
303
+ it "should post records for delete using the old route with deprecation warning" do
255
304
  params = {'delete'=>{'1'=>@product1},:client_id => @c.id,:source_name => @s.name,
256
305
  :version => ClientSync::VERSION}
257
306
  do_post "/api/application/queue_updates", params
258
307
  last_response.should be_ok
308
+ last_response.headers["Warning"].index('deprecated').should_not == nil
259
309
  last_response.body.should == ''
260
310
  verify_result("test_delete_storage" => {'1'=>@product1})
261
311
  end
262
312
 
263
313
  it "should handle client posting broken json" do
264
314
  broken_json = "{\"foo\":\"bar\"\"}"
265
- post "/api/application/queue_updates", broken_json, {'CONTENT_TYPE'=>'application/json'}
315
+ do_post "/app/#{Rhoconnect::API_VERSION}/#{@s.name}", broken_json, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
266
316
  last_response.status.should == 500
267
317
  last_response.body.should == "Server error while processing client data"
268
318
  end
269
319
 
270
320
  it "should not login if login is empty" do
271
- post "/api/application/clientlogin", ''
321
+ post "/rc/#{Rhoconnect::API_VERSION}/app/login", ''
272
322
  last_response.status.should == 401
273
- last_response.body.should == ""
323
+ last_response.body.should == "Unable to authenticate ''"
274
324
  end
275
325
 
276
326
  it "should get inserts json" do
277
327
  cs = ClientSync.new(@s,@c,1)
278
328
  data = {'1'=>@product1,'2'=>@product2}
279
329
  set_test_data('test_db_storage',data)
280
- get "/api/application/query",:client_id => @c.id,:source_name => @s.name,:version => ClientSync::VERSION
330
+ get "/app/#{Rhoconnect::API_VERSION}/#{@s.name}", {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
281
331
  last_response.should be_ok
282
332
  last_response.content_type.should =~ /application\/json/
283
333
  token = @c.get_value(:page_token)
284
- JSON.parse(last_response.body).should == [{"version"=>ClientSync::VERSION},{"token"=>token},
334
+ JSON.parse(last_response.body).should == [{'version'=>ClientSync::SYNC_VERSION}, {"token"=>token},
285
335
  {"count"=>2}, {"progress_count"=>0},{"total_count"=>2},{'insert'=>data}]
286
336
  end
287
337
 
@@ -289,46 +339,37 @@ describe "Server" do
289
339
  cs = ClientSync.new(@s,@c,1)
290
340
  data = {'1'=>@product1,'2'=>@product2}
291
341
  set_test_data('test_db_storage',data)
292
- get "/application",:client_id => @c.id,:source_name => @s.name,:version => ClientSync::VERSION
342
+ get "/application",:client_id => @c.id,:source_name => @s.name,:version => ClientSync::SYNC_VERSION
293
343
  last_response.should be_ok
294
344
  last_response.headers["Warning"].index('deprecated').should_not == nil
295
345
  last_response.content_type.should =~ /application\/json/
296
346
  token = @c.get_value(:page_token)
297
- JSON.parse(last_response.body).should == [{"version"=>ClientSync::VERSION},{"token"=>token},
347
+ JSON.parse(last_response.body).should == [{'version'=>ClientSync::SYNC_VERSION},{"token"=>token},
298
348
  {"count"=>2}, {"progress_count"=>0},{"total_count"=>2},{'insert'=>data}]
299
349
  end
300
350
 
301
- it "should get inserts json with the /api/application route and show deprecation warning" do
302
- cs = ClientSync.new(@s,@c,1)
303
- data = {'1'=>@product1,'2'=>@product2}
304
- set_test_data('test_db_storage',data)
305
- get "/api/application",:client_id => @c.id,:source_name => @s.name,:version => ClientSync::VERSION
306
- last_response.should be_ok
307
- last_response.headers["Warning"].index('deprecated').should_not == nil
308
- last_response.content_type.should =~ /application\/json/
309
- token = @c.get_value(:page_token)
310
- JSON.parse(last_response.body).should == [{"version"=>ClientSync::VERSION},{"token"=>token},
311
- {"count"=>2}, {"progress_count"=>0},{"total_count"=>2},{'insert'=>data}]
312
- end
313
-
314
351
  it "should get inserts json and confirm token" do
315
352
  cs = ClientSync.new(@s,@c,1)
316
353
  data = {'1'=>@product1,'2'=>@product2}
317
354
  set_test_data('test_db_storage',data)
318
- get "/api/application/query",:client_id => @c.id,:source_name => @s.name,:version => ClientSync::VERSION
355
+ get "/app/#{Rhoconnect::API_VERSION}/#{@s.name}", {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
319
356
  last_response.should be_ok
320
357
  token = @c.get_value(:page_token)
321
- JSON.parse(last_response.body).should == [{"version"=>ClientSync::VERSION},{"token"=>token},
358
+ JSON.parse(last_response.body).should == [{'version'=>ClientSync::SYNC_VERSION},{"token"=>token},
322
359
  {"count"=>2}, {"progress_count"=>0}, {"total_count"=>2},{'insert'=>data}]
323
- get "/api/application/query",:client_id => @c.id,:source_name => @s.name,:token => token,
324
- :version => ClientSync::VERSION
360
+ get "/app/#{Rhoconnect::API_VERSION}/#{@s.name}", {:token => token}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
325
361
  last_response.should be_ok
326
- JSON.parse(last_response.body).should == [{"version"=>ClientSync::VERSION},{"token"=>''},
327
- {"count"=>0}, {"progress_count"=>2}, {"total_count"=>2},{}]
362
+ JSON.parse(last_response.body).should == [{'version'=>ClientSync::SYNC_VERSION},{"token"=>''},
363
+ {"count"=>0}, {"progress_count"=>0}, {"total_count"=>2},{}]
328
364
  end
329
365
 
330
366
  it "should create source for dynamic adapter if source_name is unknown" do
331
- get "/api/application/query",:client_id => @c.id,:source_name => 'Broken',:version => ClientSync::VERSION
367
+ get "/app/#{Rhoconnect::API_VERSION}/Broken", {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
368
+ last_response.status.should == 200
369
+ end
370
+
371
+ it "should create source for dynamic adapter if source_name is unknown using the old route" do
372
+ get "/api/application/query", {:source_name => @s_fields[:name], :client_id => @c.id}
332
373
  last_response.status.should == 200
333
374
  end
334
375
 
@@ -338,24 +379,23 @@ describe "Server" do
338
379
  data = {'1'=>@product1,'2'=>@product2}
339
380
  set_test_data('test_db_storage',data)
340
381
 
341
- get "/api/application/query",:client_id => @c.id,:source_name => @s.name,:version => ClientSync::VERSION
382
+ get "/app/#{Rhoconnect::API_VERSION}/#{@s.name}", {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
342
383
  last_response.should be_ok
343
384
  token = @c.get_value(:page_token)
344
- JSON.parse(last_response.body).should == [{"version"=>ClientSync::VERSION},{"token"=>token},
385
+ JSON.parse(last_response.body).should == [{'version'=>ClientSync::SYNC_VERSION},{"token"=>token},
345
386
  {"count"=>2}, {"progress_count"=>0}, {"total_count"=>2},{'insert'=>data}]
346
387
 
347
388
  Store.flash_data('test_db_storage')
348
389
  @s.read_state.refresh_time = Time.now.to_i
349
390
 
350
- get "/api/application/query",:client_id => @c.id,:source_name => @s.name,:token => token,
351
- :version => ClientSync::VERSION
391
+ get "/app/#{Rhoconnect::API_VERSION}/#{@s.name}",{:token => token}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
352
392
  last_response.should be_ok
353
393
  token = @c.get_value(:page_token)
354
- JSON.parse(last_response.body).should == [{"version"=>ClientSync::VERSION},{"token"=>token},
394
+ JSON.parse(last_response.body).should == [{'version'=>ClientSync::SYNC_VERSION},{"token"=>token},
355
395
  {"count"=>2}, {"progress_count"=>0}, {"total_count"=>0},{'delete'=>data}]
356
396
  end
357
397
 
358
- it "should get search results" do
398
+ it "should get search results using the old route with deprecation warning" do
359
399
  sources = [{:name=>'SampleAdapter'}]
360
400
  cs = ClientSync.new(@s,@c,1)
361
401
  Store.put_data('test_db_storage',@data)
@@ -364,7 +404,19 @@ describe "Server" do
364
404
  get "/api/application/search",params
365
405
  last_response.content_type.should =~ /application\/json/
366
406
  token = @c.get_value(:search_token)
367
- JSON.parse(last_response.body).should == [[{'version'=>ClientSync::VERSION},{'token'=>token},
407
+ JSON.parse(last_response.body).should == [[{'version'=>ClientSync::SYNC_VERSION},{'token'=>token},
408
+ {'source'=>sources[0][:name]},{'count'=>1},{'insert'=>{'1'=>@product1}}]]
409
+ end
410
+
411
+ it "should get search results" do
412
+ sources = [{:name=>'SampleAdapter'}]
413
+ cs = ClientSync.new(@s,@c,1)
414
+ Store.put_data('test_db_storage',@data)
415
+ params = {:sources => sources,:search => {'name' => 'iPhone'}}
416
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/search",params, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
417
+ last_response.content_type.should =~ /application\/json/
418
+ token = @c.get_value(:search_token)
419
+ JSON.parse(last_response.body).should == [[{'version'=>ClientSync::SYNC_VERSION},{'token'=>token},
368
420
  {'source'=>sources[0][:name]},{'count'=>1},{'insert'=>{'1'=>@product1}}]]
369
421
  end
370
422
 
@@ -372,34 +424,32 @@ describe "Server" do
372
424
  sources = [{:name=>'SampleAdapter'}]
373
425
  msg = "Error during search"
374
426
  error = set_test_data('test_db_storage',@data,msg,'search error')
375
- params = {:client_id => @c.id,:sources => sources,:search => {'name' => 'iPhone'},
376
- :version => ClientSync::VERSION}
377
- get "/api/application/search",params
378
- JSON.parse(last_response.body).should == [[{'version'=>ClientSync::VERSION},
379
- {'source'=>sources[0][:name]},{'search-error'=>{'search-error'=>{'message'=>msg}}}]]
427
+ params = {:sources => sources,:search => {'name' => 'iPhone'}}
428
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/search", params, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
429
+ JSON.parse(last_response.body).should == [[{'version'=>ClientSync::SYNC_VERSION},{'source'=>sources[0][:name]},
430
+ {'search-error'=>{'search-error'=>{'message'=>msg}}}]]
380
431
  end
381
432
 
382
433
  it "should get multiple source search results" do
383
434
  Store.put_data('test_db_storage',@data)
384
435
  sources = [{:name=>'SimpleAdapter'},{:name=>'SampleAdapter'}]
385
- params = {:client_id => @c.id,:sources => sources,:search => {'search' => 'bar'},
386
- :version => ClientSync::VERSION}
387
- get "/api/application/search",params
436
+ params = {:sources => sources,:search => {'search' => 'bar'}}
437
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/search", params, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
388
438
  @c.source_name = 'SimpleAdapter'
389
439
  token1 = @c.get_value(:search_token)
390
440
  @c.source_name = 'SampleAdapter'
391
441
  token = @c.get_value(:search_token)
392
442
  JSON.parse(last_response.body).should == [
393
- [{"version"=>ClientSync::VERSION},{'token'=>token1},{"source"=>"SimpleAdapter"},
443
+ [{'version'=>ClientSync::SYNC_VERSION},{'token'=>token1},{"source"=>"SimpleAdapter"},
394
444
  {"count"=>1}, {"insert"=>{'obj'=>{'foo'=>'bar'}}}],
395
- [{"version"=>ClientSync::VERSION},{'token'=>token},{"source"=>"SampleAdapter"},
445
+ [{'version'=>ClientSync::SYNC_VERSION},{'token'=>token},{"source"=>"SampleAdapter"},
396
446
  {"count"=>1}, {"insert"=>{'1'=>@product1}}]]
397
447
  end
398
448
  end
399
449
 
400
450
  describe "bulk data routes" do
401
451
  before(:each) do
402
- do_post "/api/application/clientlogin", "login" => @u.login, "password" => 'testpass'
452
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => @u.login, "password" => 'testpass'
403
453
  end
404
454
 
405
455
  after(:each) do
@@ -408,7 +458,7 @@ describe "Server" do
408
458
 
409
459
  it "should make initial bulk data request and receive wait (and no deprecation warning)" do
410
460
  set_state('test_db_storage' => @data)
411
- get "/api/application/bulk_data", :partition => :user, :client_id => @c.id
461
+ post "/rc/#{Rhoconnect::API_VERSION}/app/bulk_data", {:partition => :user}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
412
462
  last_response.should be_ok
413
463
  last_response.body.should == {:result => :wait}.to_json
414
464
  warning_header = last_response.headers['Warning']
@@ -425,9 +475,9 @@ describe "Server" do
425
475
 
426
476
  it "should receive url when bulk data is available" do
427
477
  set_state('test_db_storage' => @data)
428
- get "/api/application/bulk_data", :partition => :user, :client_id => @c.id
478
+ post "/rc/#{Rhoconnect::API_VERSION}/app/bulk_data", {:partition => :user}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
429
479
  do_bulk_data_job("data_name" => bulk_data_docname(@a.id,@u.id))
430
- get "/api/application/bulk_data", :partition => :user, :client_id => @c.id
480
+ post "/rc/#{Rhoconnect::API_VERSION}/app/bulk_data", {:partition => :user}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
431
481
  last_response.should be_ok
432
482
  data = BulkData.load(bulk_data_docname(@a.id,@u.id))
433
483
  last_response.body.should == {:result => :url,
@@ -437,9 +487,9 @@ describe "Server" do
437
487
 
438
488
  it "should download bulk data file" do
439
489
  set_state('test_db_storage' => @data)
440
- get "/api/application/bulk_data", :partition => :user, :client_id => @c.id
490
+ post "/rc/#{Rhoconnect::API_VERSION}/app/bulk_data", {:partition => :user}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
441
491
  do_bulk_data_job("data_name" => bulk_data_docname(@a.id,@u.id))
442
- get "/api/application/bulk_data", :partition => :user, :client_id => @c.id
492
+ post "/rc/#{Rhoconnect::API_VERSION}/app/bulk_data", {:partition => :user}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
443
493
  get JSON.parse(last_response.body)["url"]
444
494
  last_response.should be_ok
445
495
  File.open('test.data','wb') {|f| f.puts last_response.body}
@@ -451,7 +501,7 @@ describe "Server" do
451
501
  set_state('test_db_storage' => @data)
452
502
  Source.load('SimpleAdapter',@s_params).partition = :user
453
503
  @a.sources.delete('OtherAdapter')
454
- get "/api/application/bulk_data", :partition => :app, :client_id => @c.id
504
+ post "/rc/#{Rhoconnect::API_VERSION}/app/bulk_data", {:partition => :app}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
455
505
  last_response.should be_ok
456
506
  last_response.body.should == {:result => :nop}.to_json
457
507
  end
@@ -459,7 +509,7 @@ describe "Server" do
459
509
 
460
510
  describe "blob sync" do
461
511
  before(:each) do
462
- do_post "/api/application/clientlogin", "login" => @u.login, "password" => 'testpass'
512
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => @u.login, "password" => 'testpass'
463
513
  end
464
514
  it "should upload blob in multipart post" do
465
515
  file1,file2 = 'upload1.txt','upload2.txt'
@@ -468,14 +518,12 @@ describe "Server" do
468
518
  @product2['txtfile-rhoblob'] = file2
469
519
  @product2['_id'] = 'tempobj2'
470
520
  cud = {'create'=>{'1'=>@product1,'2'=>@product2},
471
- :client_id => @c.id,:source_name => @s.name,
472
- :version => ClientSync::VERSION,
473
521
  :blob_fields => ['txtfile-rhoblob']}.to_json
474
- post "/api/application/queue_updates",
522
+ post "/app/#{Rhoconnect::API_VERSION}/#{@s.name}",
475
523
  {:cud => cud,'txtfile-rhoblob-1' =>
476
524
  Rack::Test::UploadedFile.new(File.join(File.dirname(__FILE__),'..','testdata',file1), "application/octet-stream"),
477
525
  'txtfile-rhoblob-2' =>
478
- Rack::Test::UploadedFile.new(File.join(File.dirname(__FILE__),'..','testdata',file2), "application/octet-stream")}
526
+ Rack::Test::UploadedFile.new(File.join(File.dirname(__FILE__),'..','testdata',file2), "application/octet-stream")}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
479
527
  last_response.should be_ok
480
528
  data = Store.get_data('test_create_storage')
481
529
  data.size.should == 2