rhoconnect 3.4.5 → 4.0.0.beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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')