rhoconnect 3.4.5 → 4.0.0.beta.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (337) hide show
  1. data/CHANGELOG.md +57 -3
  2. data/Gemfile +9 -7
  3. data/Gemfile.lock +37 -37
  4. data/Rakefile +18 -7
  5. data/bench/benchapp/Gemfile +1 -1
  6. data/bench/benchapp/config.ru +0 -3
  7. data/bench/benchapp/controllers/ruby/application.rb +17 -0
  8. data/bench/benchapp/controllers/ruby/application_controller.rb +17 -0
  9. data/bench/benchapp/controllers/ruby/mock_adapter_controller.rb +8 -0
  10. data/bench/benchapp/controllers/ruby/queue_mock_adapter_controller.rb +8 -0
  11. data/bench/benchapp/{sources → models/ruby}/mock_adapter.rb +1 -1
  12. data/bench/benchapp/{sources → models/ruby}/queue_mock_adapter.rb +0 -0
  13. data/bench/benchapp/spec/{sources → models/ruby}/mock_adapter_spec.rb +1 -1
  14. data/bench/benchapp/spec/{sources → models/ruby}/queue_mock_adapter_spec.rb +1 -1
  15. data/bench/benchapp/spec/spec_helper.rb +2 -2
  16. data/bench/blobapp/Gemfile +1 -1
  17. data/bench/blobapp/config.ru +0 -3
  18. data/bench/blobapp/controllers/ruby/application_controller.rb +17 -0
  19. data/bench/blobapp/controllers/ruby/blob_adapter_controller.rb +8 -0
  20. data/bench/blobapp/{sources → models/ruby}/blob_adapter.rb +9 -2
  21. data/bench/blobapp/spec/{sources → models/ruby}/blob_adapter_spec.rb +1 -1
  22. data/bench/blobapp/spec/spec_helper.rb +1 -1
  23. data/bench/lib/bench/cli.rb +1 -1
  24. data/bench/scripts/blob_cud_script.rb +1 -1
  25. data/bench/scripts/query_md_script.rb +1 -1
  26. data/bench/scripts/query_only_script.rb +1 -1
  27. data/bench/scripts/query_script.rb +1 -1
  28. data/bench/scripts/test_query_script.rb +7 -1
  29. data/bench/spec/mock_adapter_spec.rb +1 -1
  30. data/bench/spec/result_spec.rb +3 -3
  31. data/bin/rhoconnect +5 -3
  32. data/commands/dtach/dtach_install.rb +2 -2
  33. data/commands/execute.rb +8 -3
  34. data/commands/generators/app.rb +3 -3
  35. data/commands/generators/controller.rb +6 -0
  36. data/commands/generators/model.rb +6 -0
  37. data/commands/generators/source.rb +3 -3
  38. data/commands/generators/update.rb +1 -1
  39. data/commands/redis/redis_about.rb +2 -2
  40. data/commands/redis/redis_download.rb +1 -1
  41. data/commands/redis/redis_install.rb +4 -3
  42. data/commands/redis/redis_restart.rb +4 -4
  43. data/commands/redis/redis_start.rb +5 -4
  44. data/commands/redis/redis_startbg.rb +5 -4
  45. data/commands/redis/redis_status.rb +13 -0
  46. data/commands/redis/redis_stop.rb +3 -3
  47. data/commands/rhoconnect/config.rb +28 -16
  48. data/commands/rhoconnect/flushdb.rb +1 -2
  49. data/commands/rhoconnect/get_token.rb +15 -11
  50. data/commands/rhoconnect/restart.rb +13 -5
  51. data/commands/rhoconnect/set_admin_password.rb +8 -8
  52. data/commands/rhoconnect/start.rb +74 -16
  53. data/commands/rhoconnect/startbg.rb +1 -1
  54. data/commands/rhoconnect/startdebug.rb +1 -1
  55. data/commands/rhoconnect/stop.rb +13 -1
  56. data/commands/rhoconnect/web.rb +5 -5
  57. data/commands/rhoconnect_console/console.rb +7 -5
  58. data/commands/{rhoconnect → rhoconnect_spec}/spec.rb +0 -0
  59. data/commands/rhoconnect_war/war.rb +9 -9
  60. data/commands/utilities/blank_app.ru +56 -0
  61. data/commands/utilities/redis_runner.rb +54 -19
  62. data/doc/authentication.txt +80 -6
  63. data/doc/blob-sync.txt +104 -97
  64. data/doc/bulk-sync.txt +1 -1
  65. data/doc/client-java.txt +3 -3
  66. data/doc/client-objc.txt +2 -2
  67. data/doc/client.txt +4 -4
  68. data/doc/command-line.txt +105 -200
  69. data/doc/data-partitioning.txt +40 -0
  70. data/doc/deploying.txt +249 -77
  71. data/doc/extending-rhoconnect-server.txt +40 -57
  72. data/doc/heroku-addon.txt +2 -0
  73. data/doc/install.txt +45 -95
  74. data/doc/introduction.txt +1 -1
  75. data/doc/java-plugin.txt +365 -190
  76. data/doc/metadata.txt +1 -1
  77. data/doc/migration.txt +108 -142
  78. data/doc/preparing-production.txt +1 -1
  79. data/doc/push-backend-setup.txt +2 -0
  80. data/doc/push-client-setup-android.txt +78 -0
  81. data/doc/push-client-setup-bb.txt +81 -0
  82. data/doc/push-client-setup-ios.txt +70 -0
  83. data/doc/push-client-setup-rps.txt +200 -0
  84. data/doc/push-client-setup.txt +63 -66
  85. data/doc/push-server-setup.txt +67 -40
  86. data/doc/push-testing.txt +29 -0
  87. data/doc/push.txt +21 -6
  88. data/doc/rest-api.txt +128 -55
  89. data/doc/rhoconnect-redis-stack.txt +120 -0
  90. data/doc/settings.txt +4 -12
  91. data/doc/source-adapters-intro.txt +28 -0
  92. data/doc/source-adapters.txt +235 -272
  93. data/doc/stats-middleware.txt +9 -29
  94. data/doc/supported-platforms.txt +21 -30
  95. data/doc/testing.txt +40 -42
  96. data/doc/tutorial.txt +72 -57
  97. data/examples/simple/Gemfile +1 -1
  98. data/examples/simple/application.rb +4 -5
  99. data/examples/simple/my_server.rb +2 -2
  100. data/examples/simple/settings/settings.yml +1 -1
  101. data/generators/rhoconnect.rb +151 -50
  102. data/generators/templates/application/Gemfile +1 -1
  103. data/generators/templates/application/Rakefile +3 -3
  104. data/generators/templates/application/config.ru +1 -4
  105. data/generators/templates/application/controllers/application_controller.rb +17 -0
  106. data/generators/templates/application/controllers/js/application_controller.js +14 -0
  107. data/generators/templates/application/controllers/ruby/application_controller.rb +17 -0
  108. data/generators/templates/application/package.json +8 -0
  109. data/generators/templates/application/rcgemfile +2 -5
  110. data/generators/templates/application/settings/settings.yml +3 -3
  111. data/generators/templates/application/spec/application_controller_spec.rb +23 -0
  112. data/generators/templates/application/spec/js_spec.rb +25 -0
  113. data/generators/templates/application/spec/spec_helper.rb +21 -7
  114. data/generators/templates/source/controllers/js/controller.js +7 -0
  115. data/generators/templates/source/controllers/ruby/controller.rb +8 -0
  116. data/generators/templates/source/controllers/ruby/controller_spec.rb +27 -0
  117. data/generators/templates/source/models/js/model.js +46 -0
  118. data/generators/templates/source/{source_adapter.rb → models/ruby/model.rb} +15 -10
  119. data/generators/templates/source/{source_spec.rb → models/ruby/model_spec.rb} +1 -1
  120. data/install.sh +5 -5
  121. data/installer/unix-like/create_texts.rb +2 -2
  122. data/installer/unix-like/rho_connect_install_constants.rb +2 -2
  123. data/installer/unix-like/rho_connect_install_utilities.rb +1 -1
  124. data/installer/utils/constants.rb +4 -4
  125. data/js-adapters/ballroom.js +216 -0
  126. data/js-adapters/node.rb +52 -0
  127. data/js-adapters/node_channel.rb +181 -0
  128. data/js-adapters/request.js +27 -0
  129. data/js-adapters/response.js +57 -0
  130. data/js-adapters/rhoconnect_helpers.js +60 -0
  131. data/js-adapters/router.js +60 -0
  132. data/js-adapters/server.js +5 -0
  133. data/lib/rhoconnect/api/app/ans_login.rb +3 -3
  134. data/lib/rhoconnect/api/app/bulk_data.rb +10 -10
  135. data/lib/rhoconnect/api/app/fast_delete.rb +11 -10
  136. data/lib/rhoconnect/api/app/fast_insert.rb +11 -10
  137. data/lib/rhoconnect/api/app/fast_update.rb +11 -10
  138. data/lib/rhoconnect/api/app/login.rb +5 -5
  139. data/lib/rhoconnect/api/app/push_deletes.rb +12 -11
  140. data/lib/rhoconnect/api/app/push_objects.rb +12 -11
  141. data/lib/rhoconnect/api/app/query.rb +8 -7
  142. data/lib/rhoconnect/api/app/queue_updates.rb +98 -94
  143. data/lib/rhoconnect/api/app/search.rb +8 -7
  144. data/lib/rhoconnect/api/client/client_get_db_doc.rb +5 -5
  145. data/lib/rhoconnect/api/client/client_set_db_doc.rb +8 -8
  146. data/lib/rhoconnect/api/client/create.rb +7 -7
  147. data/lib/rhoconnect/api/client/get_client_params.rb +4 -4
  148. data/lib/rhoconnect/api/client/list_client_docs.rb +17 -17
  149. data/lib/rhoconnect/api/client/register.rb +12 -12
  150. data/lib/rhoconnect/api/client/reset.rb +5 -5
  151. data/lib/rhoconnect/api/readstate/set_refresh_time.rb +9 -9
  152. data/lib/rhoconnect/api/source/get_source_params.rb +4 -4
  153. data/lib/rhoconnect/api/source/list_sources.rb +16 -16
  154. data/lib/rhoconnect/api/source/update_source_params.rb +6 -6
  155. data/lib/rhoconnect/api/store/get_db_doc.rb +4 -4
  156. data/lib/rhoconnect/api/store/set_db_doc.rb +7 -7
  157. data/lib/rhoconnect/api/system/get_adapter.rb +4 -4
  158. data/lib/rhoconnect/api/system/get_license_info.rb +8 -8
  159. data/lib/rhoconnect/api/system/login.rb +15 -15
  160. data/lib/rhoconnect/api/system/reset.rb +11 -11
  161. data/lib/rhoconnect/api/system/save_adapter.rb +4 -4
  162. data/lib/rhoconnect/api/system/stats.rb +22 -22
  163. data/lib/rhoconnect/api/user/create_user.rb +7 -7
  164. data/lib/rhoconnect/api/user/delete_client.rb +6 -6
  165. data/lib/rhoconnect/api/user/delete_user.rb +11 -10
  166. data/lib/rhoconnect/api/user/list_clients.rb +4 -4
  167. data/lib/rhoconnect/api/user/list_source_docs.rb +10 -10
  168. data/lib/rhoconnect/api/user/list_users.rb +3 -3
  169. data/lib/rhoconnect/api/user/ping.rb +3 -3
  170. data/lib/rhoconnect/api/user/show_user.rb +3 -3
  171. data/lib/rhoconnect/api/user/update_user.rb +5 -5
  172. data/lib/rhoconnect/api/user/user_get_db_doc.rb +5 -5
  173. data/lib/rhoconnect/api/user/user_set_db_doc.rb +10 -10
  174. data/lib/rhoconnect/api_token.rb +5 -6
  175. data/lib/rhoconnect/app.rb +6 -46
  176. data/lib/rhoconnect/application/init.rb +5 -2
  177. data/lib/rhoconnect/async.rb +76 -39
  178. data/lib/rhoconnect/bulk_data/bulk_data.rb +6 -4
  179. data/lib/rhoconnect/client.rb +59 -9
  180. data/lib/rhoconnect/condition/admin_required.rb +27 -0
  181. data/lib/rhoconnect/condition/client_required.rb +50 -0
  182. data/lib/rhoconnect/condition/login_required.rb +22 -0
  183. data/lib/rhoconnect/condition/source_required.rb +49 -0
  184. data/lib/rhoconnect/condition/verbs.rb +17 -0
  185. data/lib/rhoconnect/condition/verify_success.rb +19 -0
  186. data/lib/rhoconnect/controller/app_base.rb +74 -0
  187. data/lib/rhoconnect/controller/base.rb +68 -0
  188. data/lib/rhoconnect/controller/clients_controller.rb +79 -0
  189. data/lib/rhoconnect/controller/dynamic_adapter_controller.rb +93 -0
  190. data/lib/rhoconnect/controller/js_base.rb +124 -0
  191. data/lib/rhoconnect/controller/read_state_controller.rb +22 -0
  192. data/lib/rhoconnect/controller/source_adapter_base.rb +14 -0
  193. data/lib/rhoconnect/controller/sources_controller.rb +44 -0
  194. data/lib/rhoconnect/controller/store_controller.rb +25 -0
  195. data/lib/rhoconnect/controller/system_controller.rb +67 -0
  196. data/lib/rhoconnect/controller/users_controller.rb +99 -0
  197. data/lib/rhoconnect/db_adapter.rb +1 -3
  198. data/lib/rhoconnect/document.rb +159 -50
  199. data/lib/rhoconnect/handler/authenticate/execute_methods.rb +77 -0
  200. data/lib/rhoconnect/handler/authenticate/runner.rb +49 -0
  201. data/lib/rhoconnect/handler/authenticate.rb +3 -0
  202. data/lib/rhoconnect/handler/bulk_data.rb +28 -0
  203. data/lib/rhoconnect/handler/changes/engine.rb +271 -0
  204. data/lib/rhoconnect/handler/changes/execute_methods.rb +88 -0
  205. data/lib/rhoconnect/handler/changes/pass_through_runner.rb +11 -0
  206. data/lib/rhoconnect/handler/changes/runner.rb +53 -0
  207. data/lib/rhoconnect/handler/changes.rb +31 -0
  208. data/lib/rhoconnect/handler/helpers/auth_method.rb +29 -0
  209. data/lib/rhoconnect/handler/helpers/binding.rb +18 -0
  210. data/lib/rhoconnect/handler/helpers/bulk_data.rb +53 -0
  211. data/lib/rhoconnect/handler/helpers/source_job.rb +14 -0
  212. data/lib/rhoconnect/handler/helpers.rb +4 -0
  213. data/lib/rhoconnect/handler/plugin_callbacks/execute_methods.rb +99 -0
  214. data/lib/rhoconnect/handler/plugin_callbacks/runner.rb +28 -0
  215. data/lib/rhoconnect/handler/plugin_callbacks.rb +67 -0
  216. data/lib/rhoconnect/handler/query/engine.rb +93 -0
  217. data/lib/rhoconnect/handler/query/execute_methods.rb +21 -0
  218. data/lib/rhoconnect/handler/query/pass_through_runner.rb +35 -0
  219. data/lib/rhoconnect/handler/query/runner.rb +270 -0
  220. data/lib/rhoconnect/handler/query.rb +19 -0
  221. data/lib/rhoconnect/handler/search/engine.rb +60 -0
  222. data/lib/rhoconnect/handler/search/execute_methods.rb +32 -0
  223. data/lib/rhoconnect/handler/search/pass_through_runner.rb +18 -0
  224. data/lib/rhoconnect/handler/search/runner.rb +104 -0
  225. data/lib/rhoconnect/handler/search.rb +26 -0
  226. data/lib/rhoconnect/handler/sync.rb +29 -0
  227. data/lib/rhoconnect/jobs/source_job.rb +13 -4
  228. data/lib/rhoconnect/js_adapter.rb +79 -0
  229. data/lib/rhoconnect/license.rb +10 -2
  230. data/lib/rhoconnect/middleware/current_user.rb +14 -1
  231. data/lib/rhoconnect/middleware/helpers.rb +10 -93
  232. data/lib/rhoconnect/middleware/x_domain_session_wrapper.rb +1 -1
  233. data/lib/rhoconnect/model/base.rb +229 -0
  234. data/lib/rhoconnect/model/dynamic_adapter_model.rb +90 -0
  235. data/lib/rhoconnect/model/js_base.rb +121 -0
  236. data/lib/rhoconnect/ping/android.rb +1 -1
  237. data/lib/rhoconnect/predefined_adapters/bench_adapter.rb +7 -4
  238. data/lib/rhoconnect/read_state.rb +3 -3
  239. data/lib/rhoconnect/server.rb +159 -190
  240. data/lib/rhoconnect/source.rb +100 -11
  241. data/lib/rhoconnect/stats/record.rb +10 -10
  242. data/lib/rhoconnect/store.rb +905 -591
  243. data/lib/rhoconnect/{model.rb → store_orm.rb} +53 -115
  244. data/lib/rhoconnect/tasks.rb +18 -4
  245. data/lib/rhoconnect/test_methods.rb +30 -17
  246. data/lib/rhoconnect/user.rb +35 -17
  247. data/lib/rhoconnect/utilities.rb +1 -1
  248. data/lib/rhoconnect/version.rb +2 -2
  249. data/lib/rhoconnect/web-console/server.rb +29 -14
  250. data/lib/rhoconnect/web-console/views/home.js +10 -10
  251. data/lib/rhoconnect/web-console/views/new_ping.js +1 -1
  252. data/lib/rhoconnect.rb +120 -51
  253. data/rhoconnect.gemspec +4 -3
  254. data/spec/api/api_helper.rb +1 -6
  255. data/spec/api/app/fast_delete_spec.rb +4 -4
  256. data/spec/api/app/fast_insert_spec.rb +4 -4
  257. data/spec/api/app/fast_update_spec.rb +8 -8
  258. data/spec/api/app/push_deletes_spec.rb +2 -2
  259. data/spec/api/app/push_objects_spec.rb +5 -5
  260. data/spec/api/client/client_get_db_doc_spec.rb +6 -4
  261. data/spec/api/client/client_set_db_doc_spec.rb +3 -2
  262. data/spec/api/client/get_client_params_spec.rb +14 -0
  263. data/spec/api/client/list_client_docs_spec.rb +30 -20
  264. data/spec/api/client/reset_spec.rb +36 -0
  265. data/spec/api/source/get_source_params_spec.rb +23 -17
  266. data/spec/api/system/get_license_info_spec.rb +0 -20
  267. data/spec/api/system/login_spec.rb +8 -0
  268. data/spec/api/system/reset_spec.rb +0 -1
  269. data/spec/api/system/stats_spec.rb +5 -5
  270. data/spec/api/user/create_user_spec.rb +14 -6
  271. data/spec/api/user/delete_user_spec.rb +20 -18
  272. data/spec/api/user/list_users_spec.rb +5 -6
  273. data/spec/api/user/update_user_spec.rb +5 -4
  274. data/spec/apps/rhotestapp/config.ru +16 -1
  275. data/spec/apps/rhotestapp/controllers/js/js_sample_controller.js +23 -0
  276. data/spec/apps/rhotestapp/controllers/js/sample2_controller.js +32 -0
  277. data/spec/apps/rhotestapp/controllers/ruby/application_controller.rb +21 -0
  278. data/spec/apps/rhotestapp/controllers/ruby/sample_adapter_controller.rb +8 -0
  279. data/spec/apps/rhotestapp/models/js/js_sample.js +55 -0
  280. data/spec/apps/rhotestapp/models/js/sample2.js +25 -0
  281. data/spec/apps/rhotestapp/{sources → models/ruby}/base_adapter.rb +0 -0
  282. data/spec/apps/rhotestapp/{sources → models/ruby}/fixed_schema_adapter.rb +0 -0
  283. data/spec/apps/rhotestapp/{sources → models/ruby}/other_adapter.rb +0 -0
  284. data/spec/apps/rhotestapp/{sources → models/ruby}/sample_adapter.rb +0 -0
  285. data/spec/apps/rhotestapp/{sources → models/ruby}/simple_adapter.rb +2 -2
  286. data/spec/apps/rhotestapp/{sources → models/ruby}/sub_adapter.rb +0 -0
  287. data/spec/apps/rhotestapp/settings/settings.yml +0 -1
  288. data/spec/bulk_data/bulk_data_spec.rb +20 -5
  289. data/spec/cli/cli_spec.rb +83 -0
  290. data/spec/client_spec.rb +20 -17
  291. data/spec/client_sync_spec.rb +244 -406
  292. data/spec/controllers/js_base_spec.rb +89 -0
  293. data/spec/doc/doc_spec.rb +18 -18
  294. data/spec/document_spec.rb +29 -13
  295. data/spec/dynamic_adapter_spec.rb +6 -6
  296. data/spec/generator/generator_spec.rb +7 -4
  297. data/spec/jobs/bulk_data_job_spec.rb +14 -10
  298. data/spec/jobs/source_job_spec.rb +8 -8
  299. data/spec/license_spec.rb +5 -2
  300. data/spec/models/js_model_spec.rb +39 -0
  301. data/spec/node_spec.rb +42 -0
  302. data/spec/perf/store_perf_spec.rb +67 -12
  303. data/spec/ping/android_spec.rb +1 -1
  304. data/spec/read_state_spec.rb +1 -1
  305. data/spec/rhoconnect_spec.rb +1 -1
  306. data/spec/server/cors_spec.rb +14 -18
  307. data/spec/server/server_spec.rb +265 -88
  308. data/spec/server/stats_spec.rb +1 -1
  309. data/spec/source_adapter_spec.rb +54 -27
  310. data/spec/source_spec.rb +8 -3
  311. data/spec/source_sync_spec.rb +538 -468
  312. data/spec/spec_helper.rb +35 -4
  313. data/spec/stats/record_spec.rb +10 -10
  314. data/spec/{model_spec.rb → store_orm_spec.rb} +56 -54
  315. data/spec/store_spec.rb +159 -179
  316. data/spec/support/shared_examples.rb +36 -27
  317. data/spec/sync_states_spec.rb +40 -33
  318. data/spec/test_methods_spec.rb +18 -14
  319. data/spec/user_spec.rb +17 -30
  320. metadata +156 -52
  321. data/bench/benchapp/application.rb +0 -39
  322. data/bench/blobapp/application.rb +0 -44
  323. data/commands/rhoconnect/clean_start.rb +0 -9
  324. data/commands/rhoconnect/create_user.rb +0 -18
  325. data/commands/rhoconnect/delete_device.rb +0 -9
  326. data/commands/rhoconnect/delete_user.rb +0 -8
  327. data/commands/rhoconnect/reset.rb +0 -16
  328. data/commands/rhoconnect/reset_refresh.rb +0 -11
  329. data/generators/templates/application/application.rb +0 -43
  330. data/lib/rhoconnect/client_sync.rb +0 -434
  331. data/lib/rhoconnect/dynamic_adapter.rb +0 -91
  332. data/lib/rhoconnect/middleware/admin_user.rb +0 -23
  333. data/lib/rhoconnect/middleware/current_request.rb +0 -16
  334. data/lib/rhoconnect/middleware/login_required.rb +0 -22
  335. data/lib/rhoconnect/source_adapter.rb +0 -132
  336. data/lib/rhoconnect/source_sync.rb +0 -464
  337. data/spec/apps/rhotestapp/application.rb +0 -23
@@ -9,20 +9,13 @@ describe "Server" do
9
9
 
10
10
  it_behaves_like "SharedRhoconnectHelper", :rhoconnect_data => true do
11
11
  before(:each) do
12
- require File.join(get_testapp_path,test_app_name)
13
- Rhoconnect.bootstrap(get_testapp_path) do |rhoconnect|
14
- rhoconnect.vendor_directory = File.join(rhoconnect.base_directory,'..','..','..','vendor')
15
- rhoconnect.appserver = nil
16
- end
17
- Rhoconnect::Server.set :environment, :test
18
- Rhoconnect::Server.set :run, false
19
12
  Rhoconnect::Server.set :secret, "secure!"
20
- Rhoconnect::Server.use Rack::Static, :urls => ["/data"],
13
+ Rhoconnect::Server.use Rack::Static, :urls => ["/data"],
21
14
  :root => File.expand_path(File.join(File.dirname(__FILE__),'..','apps','rhotestapp'))
22
15
  end
23
16
 
24
17
  def app
25
- @app ||= Rhoconnect::Server.new
18
+ @app ||= Rack::URLMap.new Rhoconnect.url_map
26
19
  end
27
20
 
28
21
  it "should show status page" do
@@ -31,12 +24,12 @@ describe "Server" do
31
24
  end
32
25
 
33
26
  it "should login if content-type contains extra parameters" do
34
- post "/rc/#{Rhoconnect::API_VERSION}/system/login", {"login" => 'rhoadmin', "password" => ''}.to_json, {'CONTENT_TYPE'=>'application/json; charset=UTF-8'}
27
+ post "/rc/#{Rhoconnect::API_VERSION}/system/login", {"login" => 'rhoadmin', "password" => ''}.to_json, {'CONTENT_TYPE'=>'application/json; charset=UTF-8'}
35
28
  last_response.should be_ok
36
29
  end
37
30
 
38
31
  it "should fail to login if wrong content-type" do
39
- post "/rc/#{Rhoconnect::API_VERSION}/system/login", {"login" => 'rhoadmin', "password" => ''}.to_json, {'CONTENT_TYPE'=>'application/x-www-form-urlencoded'}
32
+ post "/rc/#{Rhoconnect::API_VERSION}/system/login", {"login" => 'rhoadmin', "password" => ''}.to_json, {'CONTENT_TYPE'=>'application/x-www-form-urlencoded'}
40
33
  last_response.should_not be_ok
41
34
  end
42
35
 
@@ -44,34 +37,25 @@ describe "Server" do
44
37
  post "/rc/#{Rhoconnect::API_VERSION}/system/login", "login" => 'rhoadmin', "password" => ''
45
38
  last_response.should be_ok
46
39
  end
47
-
40
+
48
41
  it "should extract api token from the header" do
49
42
  post "/rc/#{Rhoconnect::API_VERSION}/system/login", "login" => 'rhoadmin', "password" => ''
50
43
  last_response.should be_ok
51
44
  api_token = last_response.body
52
-
45
+
53
46
  get "/rc/#{Rhoconnect::API_VERSION}/system/license", {}, {Rhoconnect::API_TOKEN_HEADER => api_token}
54
47
  last_response.should be_ok
55
48
  JSON.parse(last_response.body).should == {
56
- "available" => 9,
57
- "issued" => "Fri Apr 23 17:20:13 -0700 2010",
58
- "seats" => 10,
49
+ "available" => 9,
50
+ "issued" => "Fri Apr 23 17:20:13 -0700 2010",
51
+ "seats" => 10,
59
52
  "rhoconnect_version" => "Version 1",
60
53
  "licensee" => "Rhomobile" }
61
54
  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
71
55
 
72
- it "should respond with 401 if controller name is not specified" do
73
- get "/app/"
74
- last_response.status.should == 401
56
+ it "should respond with 404 if controller name is not specified" do
57
+ get "/app/#{Rhoconnect::API_VERSION}/"
58
+ last_response.status.should == 404
75
59
  end
76
60
 
77
61
  it "should have default session secret" do
@@ -92,7 +76,7 @@ describe "Server" do
92
76
  check_hsql_lib!
93
77
  end
94
78
 
95
- describe "helpers" do
79
+ describe "helpers" do
96
80
  before(:each) do
97
81
  do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => @u.login, "password" => 'testpass'
98
82
  end
@@ -108,13 +92,13 @@ describe "Server" do
108
92
  do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => @u.login, "password" => 'testpass'
109
93
  last_response.should be_ok
110
94
  end
111
-
95
+
112
96
  it "should login user with correct username,password old route and deprecation warning" do
113
97
  do_post "/application/clientlogin", "login" => @u.login, "password" => 'testpass'
114
98
  last_response.should be_ok
115
99
  last_response.headers["Warning"].index('deprecated').should_not == nil
116
100
  end
117
-
101
+
118
102
  it "should login user with correct username,password if backend service defined" do
119
103
  stub_request(:post, "http://test.com/rhoconnect/authenticate").to_return(:body => "lucas")
120
104
  Rhoconnect.appserver = 'http://test.com'
@@ -152,15 +136,49 @@ describe "Server" do
152
136
  @a.users.members.sort.should == ['different','testuser']
153
137
  end
154
138
 
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", {}
139
+ context "rps authenticate" do
140
+ it "should authenticate user with rps route" do
141
+ # RPS login should always come after normal login
142
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => @u.login, "password" => 'testpass'
143
+ authorize 'rpsuser', 'secret'
144
+ get "/rc/#{Rhoconnect::API_VERSION}/app/rps_login", {}
159
145
  last_response.status.should == 204
160
146
  end
161
147
  end
162
148
  end
163
149
 
150
+ describe "controller custom routes" do
151
+ before(:each) do
152
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => @u.login, "password" => 'testpass'
153
+ end
154
+
155
+ it "should register custom_route in DefaultServer and process it" do
156
+ Rhoconnect::Server.api4 '', "/my_custom_route", :get do
157
+ "Hello World!"
158
+ end
159
+
160
+ get "/my_custom_route", {}
161
+ last_response.body.should == "Hello World!"
162
+ end
163
+
164
+ it "should register custom_route in SimpleAdapter controller and process it" do
165
+ SimpleAdapterController.get '/my_custom_route', {:client_required => true, :source_required => true} do
166
+ "Hello World!"
167
+ end
168
+ get "/app/#{Rhoconnect::API_VERSION}/SimpleAdapter/my_custom_route", {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
169
+ last_response.body.should == "Hello World!"
170
+ end
171
+
172
+ it "should register custom_route in SimpleAdapter controller, require client condition and return error if client is missing" do
173
+ SimpleAdapterController.get '/my_custom_route_with_client', {:client_required => true, :source_required => true} do
174
+ "Hello World!"
175
+ end
176
+ get "/app/#{Rhoconnect::API_VERSION}/SimpleAdapter/my_custom_route_with_client", {}
177
+ last_response.body.should == "Unknown client"
178
+ last_response.status.should == 500
179
+ end
180
+ end
181
+
164
182
  describe "client management routes" do
165
183
  before(:each) do
166
184
  do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => @u.login, "password" => 'testpass'
@@ -172,13 +190,13 @@ describe "Server" do
172
190
  last_response.content_type.should =~ /application\/json/
173
191
  id = JSON.parse(last_response.body)['client']['client_id']
174
192
  id.length.should == 32
175
- JSON.parse(last_response.body).should ==
193
+ JSON.parse(last_response.body).should ==
176
194
  {"client"=>{"client_id"=>id}}
177
195
  c = Client.load(id,{:source_name => '*'})
178
196
  c.user_id.should == 'testuser'
179
197
  c.device_type.should == 'blackberry'
180
198
  end
181
-
199
+
182
200
  it "should respond to clientcreate with old route and deprecation warning" do
183
201
  get "/application/clientcreate?device_type=blackberry"
184
202
  last_response.should be_ok
@@ -186,7 +204,7 @@ describe "Server" do
186
204
  last_response.content_type.should =~ /application\/json/
187
205
  id = JSON.parse(last_response.body)['client']['client_id']
188
206
  id.length.should == 32
189
- JSON.parse(last_response.body).should ==
207
+ JSON.parse(last_response.body).should ==
190
208
  {"client"=>{"client_id"=>id}}
191
209
  c = Client.load(id,{:source_name => '*'})
192
210
  c.user_id.should == 'testuser'
@@ -194,19 +212,19 @@ describe "Server" do
194
212
  end
195
213
 
196
214
  it "should respond to clientregister" do
197
- do_post "/rc/#{Rhoconnect::API_VERSION}/clients/#{@c.id}/register",
215
+ do_post "/rc/#{Rhoconnect::API_VERSION}/clients/#{@c.id}/register",
198
216
  "device_type" => "iPhone", "device_pin" => 'abcd'
199
217
  last_response.should be_ok
200
218
  @c.device_type.should == 'Apple'
201
219
  @c.device_pin.should == 'abcd'
202
220
  @c.id.length.should == 32
203
221
  end
204
-
222
+
205
223
  it "should respond to clientregister without clientcreate" do
206
- Store.flash_data("client*")
224
+ Store.flush_data("client*")
207
225
  client_id = @c.id.clone
208
226
  @c = nil
209
- do_post "/rc/#{Rhoconnect::API_VERSION}/clients/#{client_id}/register",
227
+ do_post "/rc/#{Rhoconnect::API_VERSION}/clients/#{client_id}/register",
210
228
  "device_type" => "iPhone", "device_pin" => 'abcd'
211
229
  last_response.should be_ok
212
230
  @c = Client.load(client_id, {:source_name => '*'})
@@ -216,30 +234,30 @@ describe "Server" do
216
234
  end
217
235
 
218
236
  it "should respond to clientreset" do
219
- set_state(@c.docname(:cd) => @data)
237
+ set_doc_state(@c, :cd => @data)
220
238
  do_post "/rc/#{Rhoconnect::API_VERSION}/clients/#{@c.id}/reset", {}
221
- verify_result(@c.docname(:cd) => {})
239
+ verify_doc_result(@c, :cd => {})
222
240
  end
223
-
241
+
224
242
  it "should respond to clientreset with old route and deprecation warning" do
225
- set_state(@c.docname(:cd) => @data)
243
+ set_doc_state(@c, :cd => @data)
226
244
  get "/application/clientreset", 'client_id' => @c.id
227
245
  last_response.headers["Warning"].index('deprecated').should_not == nil
228
- verify_result(@c.docname(:cd) => {})
246
+ verify_doc_result(@c, :cd => {})
229
247
  end
230
-
248
+
231
249
  it "should respond to clientreset with individual adapters" do
232
250
  @c.source_name = 'SimpleAdapter'
233
- set_state(@c.docname(:cd) => @data)
251
+ set_doc_state(@c, :cd => @data)
234
252
  @c.source_name = 'SampleAdapter'
235
- set_state(@c.docname(:cd) => @data)
253
+ set_doc_state(@c, :cd => @data)
236
254
  sources = [{'name' => 'SimpleAdapter'}]
237
255
  do_post "/rc/#{Rhoconnect::API_VERSION}/clients/#{@c.id}/reset", 'sources' => sources
238
256
  last_response.should be_ok
239
257
  @c.source_name = 'SampleAdapter'
240
- verify_result(@c.docname(:cd) => @data)
258
+ verify_doc_result(@c, :cd => @data)
241
259
  @c.source_name = 'SimpleAdapter'
242
- verify_result(@c.docname(:cd) => {})
260
+ verify_doc_result(@c, :cd => {})
243
261
  end
244
262
 
245
263
  it "should switch client user if client user_id doesn't match session user" do
@@ -252,7 +270,7 @@ describe "Server" do
252
270
  get "/app/#{Rhoconnect::API_VERSION}/#{@s.name}", {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
253
271
  JSON.parse(last_response.body).last['insert'].should == data
254
272
  end
255
-
273
+
256
274
  it "should return error on routes if client doesn't exist" do
257
275
  get "/app/#{Rhoconnect::API_VERSION}/#{@s.name}",{}, {Rhoconnect::CLIENT_ID_HEADER => "BrokenClient"}
258
276
  last_response.body.should == "Unknown client"
@@ -281,19 +299,19 @@ describe "Server" do
281
299
  last_response.body.should == ''
282
300
  verify_result("test_update_storage" => {'1'=>@product1})
283
301
  end
284
-
302
+
285
303
  it "should post records for update using the old route and have the deprecation warning" do
286
304
  params = {'update'=>{'1'=>@product1},:client_id => @c.id,:source_name => @s.name,
287
- :version => ClientSync::VERSION}
305
+ :version => Rhoconnect::SYNC_VERSION}
288
306
  do_post "/application", params
289
307
  last_response.should be_ok
290
308
  last_response.body.should == ''
291
309
  last_response.headers["Warning"].index('deprecated').should_not == nil
292
310
  verify_result("test_update_storage" => {'1'=>@product1})
293
311
  end
294
-
312
+
295
313
  it "should post records for delete" do
296
- set_state(@c.docname(:cd) => @data)
314
+ set_doc_state(@c, :cd => @data)
297
315
  delete "/app/#{Rhoconnect::API_VERSION}/#{@s.name}/1", {}, { Rhoconnect::CLIENT_ID_HEADER => @c.id }
298
316
  last_response.should be_ok
299
317
  last_response.body.should == ''
@@ -302,7 +320,7 @@ describe "Server" do
302
320
 
303
321
  it "should post records for delete using the old route with deprecation warning" do
304
322
  params = {'delete'=>{'1'=>@product1},:client_id => @c.id,:source_name => @s.name,
305
- :version => ClientSync::VERSION}
323
+ :version => Rhoconnect::SYNC_VERSION}
306
324
  do_post "/api/application/queue_updates", params
307
325
  last_response.should be_ok
308
326
  last_response.headers["Warning"].index('deprecated').should_not == nil
@@ -323,43 +341,74 @@ describe "Server" do
323
341
  last_response.body.should == "Unable to authenticate ''"
324
342
  end
325
343
 
344
+ it "should resend page if page exists and no token provided" do
345
+ expected = {'1'=>@product1}
346
+ set_test_data('test_db_storage',{'1'=>@product1,'2'=>@product2,'4'=>@product4})
347
+ params = {'name' => 'iPhone'}
348
+ get "/app/#{Rhoconnect::API_VERSION}/#{@s.name}", {:query => params}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
349
+ last_response.should be_ok
350
+ last_response.content_type.should =~ /application\/json/
351
+ token = @c.get_value(:page_token)
352
+ last_response.headers[Rhoconnect::PAGE_TOKEN_HEADER].should == token
353
+ last_response.headers[Rhoconnect::PAGE_OBJECT_COUNT_HEADER].should == 1.to_s
354
+ JSON.parse(last_response.body).should == [{'version'=>Rhoconnect::SYNC_VERSION}, {"token"=>token},
355
+ {"count"=>1}, {"progress_count"=>0},{"total_count"=>1},{'insert'=>expected}]
356
+ # this should re-send the page
357
+ get "/app/#{Rhoconnect::API_VERSION}/#{@s.name}", {:query => params}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
358
+ last_response.should be_ok
359
+ last_response.content_type.should =~ /application\/json/
360
+ token1 = @c.get_value(:page_token)
361
+ token1.should == token
362
+ last_response.headers[Rhoconnect::PAGE_TOKEN_HEADER].should == token1
363
+ last_response.headers[Rhoconnect::PAGE_OBJECT_COUNT_HEADER].should == 1.to_s
364
+ JSON.parse(last_response.body).should == [{'version'=>Rhoconnect::SYNC_VERSION}, {"token"=>token1},
365
+ {"count"=>1}, {"progress_count"=>0},{"total_count"=>1},{'insert'=>expected}]
366
+ # this should ack_token
367
+ get "/app/#{Rhoconnect::API_VERSION}/#{@s.name}", {:token => token, :query => params}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
368
+ last_response.should be_ok
369
+ last_response.content_type.should =~ /application\/json/
370
+ last_response.headers[Rhoconnect::PAGE_TOKEN_HEADER].should == ""
371
+ last_response.headers[Rhoconnect::PAGE_OBJECT_COUNT_HEADER].should == 0.to_s
372
+ JSON.parse(last_response.body).should == [{'version'=>Rhoconnect::SYNC_VERSION}, {"token"=>""},
373
+ {"count"=>0}, {"progress_count"=>0},{"total_count"=>1},{}]
374
+ @c.get_data(:page).should == {}
375
+ @c.get_value(:page_token).should be_nil
376
+ end
377
+
326
378
  it "should get inserts json" do
327
- cs = ClientSync.new(@s,@c,1)
328
379
  data = {'1'=>@product1,'2'=>@product2}
329
380
  set_test_data('test_db_storage',data)
330
381
  get "/app/#{Rhoconnect::API_VERSION}/#{@s.name}", {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
331
382
  last_response.should be_ok
332
383
  last_response.content_type.should =~ /application\/json/
333
384
  token = @c.get_value(:page_token)
334
- JSON.parse(last_response.body).should == [{'version'=>ClientSync::SYNC_VERSION}, {"token"=>token},
385
+ JSON.parse(last_response.body).should == [{'version'=>Rhoconnect::SYNC_VERSION}, {"token"=>token},
335
386
  {"count"=>2}, {"progress_count"=>0},{"total_count"=>2},{'insert'=>data}]
336
387
  end
337
-
388
+
338
389
  it "should get inserts json with the old route and show deprecation warning" do
339
- cs = ClientSync.new(@s,@c,1)
340
390
  data = {'1'=>@product1,'2'=>@product2}
341
391
  set_test_data('test_db_storage',data)
342
- get "/application",:client_id => @c.id,:source_name => @s.name,:version => ClientSync::SYNC_VERSION
392
+ get "/application",:client_id => @c.id,:source_name => @s.name,:version => Rhoconnect::SYNC_VERSION
343
393
  last_response.should be_ok
344
394
  last_response.headers["Warning"].index('deprecated').should_not == nil
345
395
  last_response.content_type.should =~ /application\/json/
346
396
  token = @c.get_value(:page_token)
347
- JSON.parse(last_response.body).should == [{'version'=>ClientSync::SYNC_VERSION},{"token"=>token},
397
+ JSON.parse(last_response.body).should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
348
398
  {"count"=>2}, {"progress_count"=>0},{"total_count"=>2},{'insert'=>data}]
349
399
  end
350
-
400
+
351
401
  it "should get inserts json and confirm token" do
352
- cs = ClientSync.new(@s,@c,1)
353
402
  data = {'1'=>@product1,'2'=>@product2}
354
403
  set_test_data('test_db_storage',data)
355
404
  get "/app/#{Rhoconnect::API_VERSION}/#{@s.name}", {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
356
405
  last_response.should be_ok
357
406
  token = @c.get_value(:page_token)
358
- JSON.parse(last_response.body).should == [{'version'=>ClientSync::SYNC_VERSION},{"token"=>token},
407
+ JSON.parse(last_response.body).should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
359
408
  {"count"=>2}, {"progress_count"=>0}, {"total_count"=>2},{'insert'=>data}]
360
409
  get "/app/#{Rhoconnect::API_VERSION}/#{@s.name}", {:token => token}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
361
410
  last_response.should be_ok
362
- JSON.parse(last_response.body).should == [{'version'=>ClientSync::SYNC_VERSION},{"token"=>''},
411
+ JSON.parse(last_response.body).should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>''},
363
412
  {"count"=>0}, {"progress_count"=>0}, {"total_count"=>2},{}]
364
413
  end
365
414
 
@@ -375,7 +424,6 @@ describe "Server" do
375
424
 
376
425
  it "should get deletes json" do
377
426
  @s = Source.load(@s_fields[:name],@s_params)
378
- cs = ClientSync.new(@s,@c,1)
379
427
  data = {'1'=>@product1,'2'=>@product2}
380
428
  set_test_data('test_db_storage',data)
381
429
 
@@ -384,46 +432,44 @@ describe "Server" do
384
432
  token = @c.get_value(:page_token)
385
433
  last_response.headers[Rhoconnect::PAGE_TOKEN_HEADER].should == token
386
434
  last_response.headers[Rhoconnect::PAGE_OBJECT_COUNT_HEADER].should == 2.to_s
387
- JSON.parse(last_response.body).should == [{'version'=>ClientSync::SYNC_VERSION},{"token"=>token},
435
+ JSON.parse(last_response.body).should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
388
436
  {"count"=>2}, {"progress_count"=>0}, {"total_count"=>2},{'insert'=>data}]
389
437
 
390
- Store.flash_data('test_db_storage')
391
- @s.read_state.refresh_time = Time.now.to_i
438
+ Store.flush_data('test_db_storage')
439
+ @s.read_state.refresh_time = Time.now.to_i
392
440
 
393
441
  get "/app/#{Rhoconnect::API_VERSION}/#{@s.name}",{:token => token}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
394
442
  last_response.should be_ok
395
443
  token = @c.get_value(:page_token)
396
444
  last_response.headers[Rhoconnect::PAGE_TOKEN_HEADER].should == token
397
445
  last_response.headers[Rhoconnect::PAGE_OBJECT_COUNT_HEADER].should == 2.to_s
398
- JSON.parse(last_response.body).should == [{'version'=>ClientSync::SYNC_VERSION},{"token"=>token},
446
+ JSON.parse(last_response.body).should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
399
447
  {"count"=>2}, {"progress_count"=>0}, {"total_count"=>0},{'delete'=>data}]
400
448
  end
401
449
 
402
450
  it "should get search results using the old route with deprecation warning" do
403
451
  sources = [{:name=>'SampleAdapter'}]
404
- cs = ClientSync.new(@s,@c,1)
405
452
  Store.put_data('test_db_storage',@data)
406
453
  params = {:client_id => @c.id,:sources => sources,:search => {'name' => 'iPhone'},
407
- :version => ClientSync::VERSION}
454
+ :version => Rhoconnect::SYNC_VERSION}
408
455
  get "/api/application/search",params
409
456
  last_response.headers['Warning'].index('deprecated').should_not == nil
410
457
  last_response.content_type.should =~ /application\/json/
411
458
  token = @c.get_value(:search_token)
412
459
  last_response.headers[Rhoconnect::PAGE_TOKEN_HEADER].should == token
413
460
  last_response.headers[Rhoconnect::PAGE_OBJECT_COUNT_HEADER].should == 1.to_s
414
- JSON.parse(last_response.body).should == [[{'version'=>ClientSync::SYNC_VERSION},{'token'=>token},
461
+ JSON.parse(last_response.body).should == [[{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>token},
415
462
  {'source'=>sources[0][:name]},{'count'=>1},{'insert'=>{'1'=>@product1}}]]
416
463
  end
417
-
464
+
418
465
  it "should get search results" do
419
466
  sources = [{:name=>'SampleAdapter'}]
420
- cs = ClientSync.new(@s,@c,1)
421
467
  Store.put_data('test_db_storage',@data)
422
468
  params = {:sources => sources,:search => {'name' => 'iPhone'}}
423
469
  do_post "/rc/#{Rhoconnect::API_VERSION}/app/search",params, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
424
470
  last_response.content_type.should =~ /application\/json/
425
471
  token = @c.get_value(:search_token)
426
- JSON.parse(last_response.body).should == [[{'version'=>ClientSync::SYNC_VERSION},{'token'=>token},
472
+ JSON.parse(last_response.body).should == [[{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>token},
427
473
  {'source'=>sources[0][:name]},{'count'=>1},{'insert'=>{'1'=>@product1}}]]
428
474
  end
429
475
 
@@ -433,8 +479,9 @@ describe "Server" do
433
479
  error = set_test_data('test_db_storage',@data,msg,'search error')
434
480
  params = {:sources => sources,:search => {'name' => 'iPhone'}}
435
481
  do_post "/rc/#{Rhoconnect::API_VERSION}/app/search", params, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
436
- JSON.parse(last_response.body).should == [[{'version'=>ClientSync::SYNC_VERSION},{'source'=>sources[0][:name]},
482
+ JSON.parse(last_response.body).should == [[{'version'=>Rhoconnect::SYNC_VERSION},{'source'=>sources[0][:name]},
437
483
  {'search-error'=>{'search-error'=>{'message'=>msg}}}]]
484
+ verify_doc_result(@c, :search => {})
438
485
  end
439
486
 
440
487
  it "should get multiple source search results" do
@@ -447,10 +494,66 @@ describe "Server" do
447
494
  @c.source_name = 'SampleAdapter'
448
495
  token = @c.get_value(:search_token)
449
496
  JSON.parse(last_response.body).should == [
450
- [{'version'=>ClientSync::SYNC_VERSION},{'token'=>token1},{"source"=>"SimpleAdapter"},
497
+ [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>token1},{"source"=>"SimpleAdapter"},
451
498
  {"count"=>1}, {"insert"=>{'obj'=>{'foo'=>'bar'}}}],
452
- [{'version'=>ClientSync::SYNC_VERSION},{'token'=>token},{"source"=>"SampleAdapter"},
499
+ [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>token},{"source"=>"SampleAdapter"},
453
500
  {"count"=>1}, {"insert"=>{'1'=>@product1}}]]
501
+ verify_doc_result(@c, {:search => {'1'=>@product1},
502
+ :search_errors => {}})
503
+ end
504
+
505
+ it "should handle search for pass through" do
506
+ sources = [{'name'=>'SampleAdapter'}]
507
+ set_state('test_db_storage' => @data)
508
+ @s.pass_through = 'true'
509
+ params = {:sources => sources, :search => {'name' => 'iPhone'}}
510
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/search", params, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
511
+ token = @c.get_value(:search_token)
512
+ JSON.parse(last_response.body).should == [[{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>token},
513
+ {'source'=>sources[0]['name']},{'count'=>1},{'insert'=>{'1'=>@product1}}]]
514
+ verify_doc_result(@c, {:search => {},
515
+ :search_errors => {}})
516
+ end
517
+
518
+ it "should handle multiple source search with one source returning nothing" do
519
+ set_test_data('test_db_storage',@data)
520
+ sources = [{'name'=>'SimpleAdapter'},{'name'=>'SampleAdapter'}]
521
+ params = {:sources => sources,:search => {'name' => 'iPhone'}}
522
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/search", params, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
523
+ @c.source_name = 'SimpleAdapter'
524
+ token1 = @c.get_value(:search_token)
525
+ token1.should be_nil
526
+ @c.source_name = 'SampleAdapter'
527
+ token = @c.get_value(:search_token)
528
+ JSON.parse(last_response.body).should == [[],[{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>token},
529
+ {"source"=>"SampleAdapter"},{"count"=>1},{"insert"=>{'1'=>@product1}}]]
530
+ end
531
+
532
+ it "should handle search and ack of search results" do
533
+ set_test_data('test_db_storage',@data)
534
+ sources = [{'name'=>'SimpleAdapter'},{'name'=>'SampleAdapter'}]
535
+ params = {:sources => sources,:search => {'search'=>'bar'}}
536
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/search", params, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
537
+ @c.source_name = 'SimpleAdapter'
538
+ token = @c.get_value(:search_token)
539
+ token.should_not be_nil
540
+ sources[0]['token'] = token
541
+ @c.get_data(:search).should == {'obj'=>{'foo'=>'bar'}}
542
+ @c.source_name = 'SampleAdapter'
543
+ token1 = @c.get_value(:search_token)
544
+ token1.should_not be_nil
545
+ sources[1]['token'] = token1
546
+ @c.get_data(:search).should == {'1'=>@product1}
547
+ # do ack on multiple sources
548
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/search", params, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
549
+ @c.source_name = 'SimpleAdapter'
550
+ token = @c.get_value(:search_token)
551
+ token.should be_nil
552
+ @c.get_data(:search).should == {}
553
+ @c.source_name = 'SampleAdapter'
554
+ token1 = @c.get_value(:search_token)
555
+ token1.should be_nil
556
+ @c.get_data(:search).should == {}
454
557
  end
455
558
  end
456
559
 
@@ -463,15 +566,18 @@ describe "Server" do
463
566
  delete_data_directory
464
567
  end
465
568
 
466
- it "should make initial bulk data request and receive wait (and no deprecation warning)" do
569
+ it "should make initial bulk data request (which creates Resque job) and receive wait (and no deprecation warning)" do
467
570
  set_state('test_db_storage' => @data)
468
571
  post "/rc/#{Rhoconnect::API_VERSION}/app/bulk_data", {:partition => :user}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
469
572
  last_response.should be_ok
470
573
  last_response.body.should == {:result => :wait}.to_json
471
574
  warning_header = last_response.headers['Warning']
472
575
  warning_header.should == nil or warning_header.index('deprecated').should == nil
576
+ Resque.peek(:bulk_data).should == {"args"=>
577
+ [{"data_name"=>File.join(@a_fields[:name],@u_fields[:login],@u_fields[:login])}],
578
+ "class"=>"Rhoconnect::BulkDataJob"}
473
579
  end
474
-
580
+
475
581
  it "should make old-way initial bulk data request and receive wait along with deprecation warning" do
476
582
  set_state('test_db_storage' => @data)
477
583
  get "/application/bulk_data", :partition => :user, :client_id => @c.id
@@ -479,7 +585,7 @@ describe "Server" do
479
585
  last_response.body.should == {:result => :wait}.to_json
480
586
  last_response.headers['Warning'].index('deprecated').should_not == nil
481
587
  end
482
-
588
+
483
589
  it "should make old-way initial bulk data request and receive wait along with deprecation warning (Sources sent as String)" do
484
590
  set_state('test_db_storage' => @data)
485
591
  get "/application/bulk_data?sources=FixedSchemaAdapter,SampleAdapter", :partition => :user, :client_id => @c.id
@@ -495,7 +601,7 @@ describe "Server" do
495
601
  post "/rc/#{Rhoconnect::API_VERSION}/app/bulk_data", {:partition => :user}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
496
602
  last_response.should be_ok
497
603
  data = BulkData.load(bulk_data_docname(@a.id,@u.id))
498
- last_response.body.should == {:result => :url,
604
+ last_response.body.should == {:result => :url,
499
605
  :url => data.url}.to_json
500
606
  validate_db(data,{@s.name => @data, 'FixedSchemaAdapter' => @data})
501
607
  end
@@ -505,11 +611,16 @@ describe "Server" do
505
611
  post "/rc/#{Rhoconnect::API_VERSION}/app/bulk_data", {:partition => :user}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
506
612
  do_bulk_data_job("data_name" => bulk_data_docname(@a.id,@u.id))
507
613
  post "/rc/#{Rhoconnect::API_VERSION}/app/bulk_data", {:partition => :user}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
614
+ JSON.parse(last_response.body).should == {'result' => 'url',
615
+ 'url' => BulkData.load(bulk_data_docname(@a.id,@u.id)).url}
508
616
  get JSON.parse(last_response.body)["url"]
509
617
  last_response.should be_ok
510
618
  File.open('test.data','wb') {|f| f.puts last_response.body}
511
619
  validate_db_file('test.data',[@s.name,'FixedSchemaAdapter'],{@s.name => @data, 'FixedSchemaAdapter' => @data})
512
620
  File.delete('test.data')
621
+ verify_doc_result(@c, :cd => @data)
622
+ verify_doc_result(@s, {:md => @data,
623
+ :md_copy => @data})
513
624
  end
514
625
 
515
626
  it "should receive nop when no sources are available for partition" do
@@ -520,6 +631,72 @@ describe "Server" do
520
631
  last_response.should be_ok
521
632
  last_response.body.should == {:result => :nop}.to_json
522
633
  end
634
+
635
+ it "should create bulk data job app partition with partition sources" do
636
+ @s.partition = :app
637
+ post "/rc/#{Rhoconnect::API_VERSION}/app/bulk_data", {:partition => :app}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
638
+ last_response.should be_ok
639
+ last_response.body.should == {:result => :wait}.to_json
640
+ warning_header = last_response.headers['Warning']
641
+ warning_header.should == nil or warning_header.index('deprecated').should == nil
642
+ Resque.peek(:bulk_data).should == {"args"=>
643
+ [{"data_name"=>File.join(@a_fields[:name],@a_fields[:name])}],
644
+ "class"=>"Rhoconnect::BulkDataJob"}
645
+ end
646
+
647
+ it "should return empty bulk data url if there are errors in query" do
648
+ post "/rc/#{Rhoconnect::API_VERSION}/app/bulk_data", {:partition => :user}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
649
+ do_bulk_data_job("data_name" => bulk_data_docname(@a.id,@u.id))
650
+ operation = 'query'
651
+ @s.lock(:errors) do
652
+ @s.put_data(:errors,{"#{operation}-error"=>{'message'=>"Some exception message"}}, true)
653
+ end
654
+ post "/rc/#{Rhoconnect::API_VERSION}/app/bulk_data", {:partition => :user}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
655
+ JSON.parse(last_response.body).should == {'result' => 'url', 'url' => ''}
656
+ end
657
+
658
+ it "should return bulk data url for completed bulk data app partition" do
659
+ set_state('test_db_storage' => @data)
660
+ @s.partition = :app
661
+ post "/rc/#{Rhoconnect::API_VERSION}/app/bulk_data", {:partition => :app}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
662
+ do_bulk_data_job("data_name" => bulk_data_docname(@a.id,"*"))
663
+ post "/rc/#{Rhoconnect::API_VERSION}/app/bulk_data", {:partition => :app}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
664
+ JSON.parse(last_response.body).should == {'result' => 'url',
665
+ 'url' => BulkData.load(bulk_data_docname(@a.id,"*")).url}
666
+ @c.source_name = @s.name
667
+ verify_doc_result(@c, :cd => @data)
668
+ verify_doc_result(@s, {:md => @data,
669
+ :md_copy => @data})
670
+ end
671
+
672
+ it "should return bulk data url for completed bulk data with bulk_sync_only source" do
673
+ set_state('test_db_storage' => @data)
674
+ @s.sync_type = :bulk_sync_only
675
+ post "/rc/#{Rhoconnect::API_VERSION}/app/bulk_data", {:partition => :user}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
676
+ do_bulk_data_job("data_name" => bulk_data_docname(@a.id,@u.id))
677
+ post "/rc/#{Rhoconnect::API_VERSION}/app/bulk_data", {:partition => :user}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
678
+ JSON.parse(last_response.body).should == {'result' => 'url',
679
+ 'url' => BulkData.load(bulk_data_docname(@a.id,@u.id)).url}
680
+ @c.source_name = @s.name
681
+ verify_doc_result(@c, :cd => {})
682
+ verify_doc_result(@s, {:md => @data,
683
+ :md_copy => {}})
684
+ end
685
+
686
+ it "should create bulk data job if no file exists" do
687
+ set_state('test_db_storage' => @data)
688
+ Rhoconnect.blackberry_bulk_sync = true
689
+ post "/rc/#{Rhoconnect::API_VERSION}/app/bulk_data", {:partition => :user}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
690
+ do_bulk_data_job("data_name" => bulk_data_docname(@a.id,@u.id))
691
+ data = BulkData.load(bulk_data_docname(@a.id,@u.id))
692
+ post "/rc/#{Rhoconnect::API_VERSION}/app/bulk_data", {:partition => :user}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
693
+ JSON.parse(last_response.body).should == {'result' => 'url', 'url' => data.url}
694
+ File.delete(data.dbfile)
695
+ post "/rc/#{Rhoconnect::API_VERSION}/app/bulk_data", {:partition => :user}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
696
+ JSON.parse(last_response.body).should == {'result' => 'wait'}
697
+ Resque.peek(:bulk_data).should == {"args"=>
698
+ [{"data_name"=>bulk_data_docname(@a.id,@u.id)}], "class"=>"Rhoconnect::BulkDataJob"}
699
+ end
523
700
  end
524
701
 
525
702
  describe "blob sync" do
@@ -535,9 +712,9 @@ describe "Server" do
535
712
  cud = {'create'=>{'1'=>@product1,'2'=>@product2},
536
713
  :blob_fields => ['txtfile-rhoblob']}.to_json
537
714
  post "/app/#{Rhoconnect::API_VERSION}/#{@s.name}",
538
- {:cud => cud,'txtfile-rhoblob-1' =>
715
+ {:cud => cud,'txtfile-rhoblob-1' =>
539
716
  Rack::Test::UploadedFile.new(File.join(File.dirname(__FILE__),'..','testdata',file1), "application/octet-stream"),
540
- 'txtfile-rhoblob-2' =>
717
+ 'txtfile-rhoblob-2' =>
541
718
  Rack::Test::UploadedFile.new(File.join(File.dirname(__FILE__),'..','testdata',file2), "application/octet-stream")}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
542
719
  last_response.should be_ok
543
720
  data = Store.get_data('test_create_storage')