rhoconnect 3.2.1 → 3.3.1.beta2

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