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.
- data/CHANGELOG.md +57 -3
- data/Gemfile +9 -7
- data/Gemfile.lock +37 -37
- data/Rakefile +18 -7
- data/bench/benchapp/Gemfile +1 -1
- data/bench/benchapp/config.ru +0 -3
- data/bench/benchapp/controllers/ruby/application.rb +17 -0
- data/bench/benchapp/controllers/ruby/application_controller.rb +17 -0
- data/bench/benchapp/controllers/ruby/mock_adapter_controller.rb +8 -0
- data/bench/benchapp/controllers/ruby/queue_mock_adapter_controller.rb +8 -0
- data/bench/benchapp/{sources → models/ruby}/mock_adapter.rb +1 -1
- data/bench/benchapp/{sources → models/ruby}/queue_mock_adapter.rb +0 -0
- data/bench/benchapp/spec/{sources → models/ruby}/mock_adapter_spec.rb +1 -1
- data/bench/benchapp/spec/{sources → models/ruby}/queue_mock_adapter_spec.rb +1 -1
- data/bench/benchapp/spec/spec_helper.rb +2 -2
- data/bench/blobapp/Gemfile +1 -1
- data/bench/blobapp/config.ru +0 -3
- data/bench/blobapp/controllers/ruby/application_controller.rb +17 -0
- data/bench/blobapp/controllers/ruby/blob_adapter_controller.rb +8 -0
- data/bench/blobapp/{sources → models/ruby}/blob_adapter.rb +9 -2
- data/bench/blobapp/spec/{sources → models/ruby}/blob_adapter_spec.rb +1 -1
- data/bench/blobapp/spec/spec_helper.rb +1 -1
- data/bench/lib/bench/cli.rb +1 -1
- data/bench/scripts/blob_cud_script.rb +1 -1
- data/bench/scripts/query_md_script.rb +1 -1
- data/bench/scripts/query_only_script.rb +1 -1
- data/bench/scripts/query_script.rb +1 -1
- data/bench/scripts/test_query_script.rb +7 -1
- data/bench/spec/mock_adapter_spec.rb +1 -1
- data/bench/spec/result_spec.rb +3 -3
- data/bin/rhoconnect +5 -3
- data/commands/dtach/dtach_install.rb +2 -2
- data/commands/execute.rb +8 -3
- data/commands/generators/app.rb +3 -3
- data/commands/generators/controller.rb +6 -0
- data/commands/generators/model.rb +6 -0
- data/commands/generators/source.rb +3 -3
- data/commands/generators/update.rb +1 -1
- data/commands/redis/redis_about.rb +2 -2
- data/commands/redis/redis_download.rb +1 -1
- data/commands/redis/redis_install.rb +4 -3
- data/commands/redis/redis_restart.rb +4 -4
- data/commands/redis/redis_start.rb +5 -4
- data/commands/redis/redis_startbg.rb +5 -4
- data/commands/redis/redis_status.rb +13 -0
- data/commands/redis/redis_stop.rb +3 -3
- data/commands/rhoconnect/config.rb +28 -16
- data/commands/rhoconnect/flushdb.rb +1 -2
- data/commands/rhoconnect/get_token.rb +15 -11
- data/commands/rhoconnect/restart.rb +13 -5
- data/commands/rhoconnect/set_admin_password.rb +8 -8
- data/commands/rhoconnect/start.rb +74 -16
- data/commands/rhoconnect/startbg.rb +1 -1
- data/commands/rhoconnect/startdebug.rb +1 -1
- data/commands/rhoconnect/stop.rb +13 -1
- data/commands/rhoconnect/web.rb +5 -5
- data/commands/rhoconnect_console/console.rb +7 -5
- data/commands/{rhoconnect → rhoconnect_spec}/spec.rb +0 -0
- data/commands/rhoconnect_war/war.rb +9 -9
- data/commands/utilities/blank_app.ru +56 -0
- data/commands/utilities/redis_runner.rb +54 -19
- data/doc/authentication.txt +80 -6
- data/doc/blob-sync.txt +104 -97
- data/doc/bulk-sync.txt +1 -1
- data/doc/client-java.txt +3 -3
- data/doc/client-objc.txt +2 -2
- data/doc/client.txt +4 -4
- data/doc/command-line.txt +105 -200
- data/doc/data-partitioning.txt +40 -0
- data/doc/deploying.txt +249 -77
- data/doc/extending-rhoconnect-server.txt +40 -57
- data/doc/heroku-addon.txt +2 -0
- data/doc/install.txt +45 -95
- data/doc/introduction.txt +1 -1
- data/doc/java-plugin.txt +365 -190
- data/doc/metadata.txt +1 -1
- data/doc/migration.txt +108 -142
- data/doc/preparing-production.txt +1 -1
- data/doc/push-backend-setup.txt +2 -0
- data/doc/push-client-setup-android.txt +78 -0
- data/doc/push-client-setup-bb.txt +81 -0
- data/doc/push-client-setup-ios.txt +70 -0
- data/doc/push-client-setup-rps.txt +200 -0
- data/doc/push-client-setup.txt +63 -66
- data/doc/push-server-setup.txt +67 -40
- data/doc/push-testing.txt +29 -0
- data/doc/push.txt +21 -6
- data/doc/rest-api.txt +128 -55
- data/doc/rhoconnect-redis-stack.txt +120 -0
- data/doc/settings.txt +4 -12
- data/doc/source-adapters-intro.txt +28 -0
- data/doc/source-adapters.txt +235 -272
- data/doc/stats-middleware.txt +9 -29
- data/doc/supported-platforms.txt +21 -30
- data/doc/testing.txt +40 -42
- data/doc/tutorial.txt +72 -57
- data/examples/simple/Gemfile +1 -1
- data/examples/simple/application.rb +4 -5
- data/examples/simple/my_server.rb +2 -2
- data/examples/simple/settings/settings.yml +1 -1
- data/generators/rhoconnect.rb +151 -50
- data/generators/templates/application/Gemfile +1 -1
- data/generators/templates/application/Rakefile +3 -3
- data/generators/templates/application/config.ru +1 -4
- data/generators/templates/application/controllers/application_controller.rb +17 -0
- data/generators/templates/application/controllers/js/application_controller.js +14 -0
- data/generators/templates/application/controllers/ruby/application_controller.rb +17 -0
- data/generators/templates/application/package.json +8 -0
- data/generators/templates/application/rcgemfile +2 -5
- data/generators/templates/application/settings/settings.yml +3 -3
- data/generators/templates/application/spec/application_controller_spec.rb +23 -0
- data/generators/templates/application/spec/js_spec.rb +25 -0
- data/generators/templates/application/spec/spec_helper.rb +21 -7
- data/generators/templates/source/controllers/js/controller.js +7 -0
- data/generators/templates/source/controllers/ruby/controller.rb +8 -0
- data/generators/templates/source/controllers/ruby/controller_spec.rb +27 -0
- data/generators/templates/source/models/js/model.js +46 -0
- data/generators/templates/source/{source_adapter.rb → models/ruby/model.rb} +15 -10
- data/generators/templates/source/{source_spec.rb → models/ruby/model_spec.rb} +1 -1
- data/install.sh +5 -5
- data/installer/unix-like/create_texts.rb +2 -2
- data/installer/unix-like/rho_connect_install_constants.rb +2 -2
- data/installer/unix-like/rho_connect_install_utilities.rb +1 -1
- data/installer/utils/constants.rb +4 -4
- data/js-adapters/ballroom.js +216 -0
- data/js-adapters/node.rb +52 -0
- data/js-adapters/node_channel.rb +181 -0
- data/js-adapters/request.js +27 -0
- data/js-adapters/response.js +57 -0
- data/js-adapters/rhoconnect_helpers.js +60 -0
- data/js-adapters/router.js +60 -0
- data/js-adapters/server.js +5 -0
- data/lib/rhoconnect/api/app/ans_login.rb +3 -3
- data/lib/rhoconnect/api/app/bulk_data.rb +10 -10
- data/lib/rhoconnect/api/app/fast_delete.rb +11 -10
- data/lib/rhoconnect/api/app/fast_insert.rb +11 -10
- data/lib/rhoconnect/api/app/fast_update.rb +11 -10
- data/lib/rhoconnect/api/app/login.rb +5 -5
- data/lib/rhoconnect/api/app/push_deletes.rb +12 -11
- data/lib/rhoconnect/api/app/push_objects.rb +12 -11
- data/lib/rhoconnect/api/app/query.rb +8 -7
- data/lib/rhoconnect/api/app/queue_updates.rb +98 -94
- data/lib/rhoconnect/api/app/search.rb +8 -7
- data/lib/rhoconnect/api/client/client_get_db_doc.rb +5 -5
- data/lib/rhoconnect/api/client/client_set_db_doc.rb +8 -8
- data/lib/rhoconnect/api/client/create.rb +7 -7
- data/lib/rhoconnect/api/client/get_client_params.rb +4 -4
- data/lib/rhoconnect/api/client/list_client_docs.rb +17 -17
- data/lib/rhoconnect/api/client/register.rb +12 -12
- data/lib/rhoconnect/api/client/reset.rb +5 -5
- data/lib/rhoconnect/api/readstate/set_refresh_time.rb +9 -9
- data/lib/rhoconnect/api/source/get_source_params.rb +4 -4
- data/lib/rhoconnect/api/source/list_sources.rb +16 -16
- data/lib/rhoconnect/api/source/update_source_params.rb +6 -6
- data/lib/rhoconnect/api/store/get_db_doc.rb +4 -4
- data/lib/rhoconnect/api/store/set_db_doc.rb +7 -7
- data/lib/rhoconnect/api/system/get_adapter.rb +4 -4
- data/lib/rhoconnect/api/system/get_license_info.rb +8 -8
- data/lib/rhoconnect/api/system/login.rb +15 -15
- data/lib/rhoconnect/api/system/reset.rb +11 -11
- data/lib/rhoconnect/api/system/save_adapter.rb +4 -4
- data/lib/rhoconnect/api/system/stats.rb +22 -22
- data/lib/rhoconnect/api/user/create_user.rb +7 -7
- data/lib/rhoconnect/api/user/delete_client.rb +6 -6
- data/lib/rhoconnect/api/user/delete_user.rb +11 -10
- data/lib/rhoconnect/api/user/list_clients.rb +4 -4
- data/lib/rhoconnect/api/user/list_source_docs.rb +10 -10
- data/lib/rhoconnect/api/user/list_users.rb +3 -3
- data/lib/rhoconnect/api/user/ping.rb +3 -3
- data/lib/rhoconnect/api/user/show_user.rb +3 -3
- data/lib/rhoconnect/api/user/update_user.rb +5 -5
- data/lib/rhoconnect/api/user/user_get_db_doc.rb +5 -5
- data/lib/rhoconnect/api/user/user_set_db_doc.rb +10 -10
- data/lib/rhoconnect/api_token.rb +5 -6
- data/lib/rhoconnect/app.rb +6 -46
- data/lib/rhoconnect/application/init.rb +5 -2
- data/lib/rhoconnect/async.rb +76 -39
- data/lib/rhoconnect/bulk_data/bulk_data.rb +6 -4
- data/lib/rhoconnect/client.rb +59 -9
- data/lib/rhoconnect/condition/admin_required.rb +27 -0
- data/lib/rhoconnect/condition/client_required.rb +50 -0
- data/lib/rhoconnect/condition/login_required.rb +22 -0
- data/lib/rhoconnect/condition/source_required.rb +49 -0
- data/lib/rhoconnect/condition/verbs.rb +17 -0
- data/lib/rhoconnect/condition/verify_success.rb +19 -0
- data/lib/rhoconnect/controller/app_base.rb +74 -0
- data/lib/rhoconnect/controller/base.rb +68 -0
- data/lib/rhoconnect/controller/clients_controller.rb +79 -0
- data/lib/rhoconnect/controller/dynamic_adapter_controller.rb +93 -0
- data/lib/rhoconnect/controller/js_base.rb +124 -0
- data/lib/rhoconnect/controller/read_state_controller.rb +22 -0
- data/lib/rhoconnect/controller/source_adapter_base.rb +14 -0
- data/lib/rhoconnect/controller/sources_controller.rb +44 -0
- data/lib/rhoconnect/controller/store_controller.rb +25 -0
- data/lib/rhoconnect/controller/system_controller.rb +67 -0
- data/lib/rhoconnect/controller/users_controller.rb +99 -0
- data/lib/rhoconnect/db_adapter.rb +1 -3
- data/lib/rhoconnect/document.rb +159 -50
- data/lib/rhoconnect/handler/authenticate/execute_methods.rb +77 -0
- data/lib/rhoconnect/handler/authenticate/runner.rb +49 -0
- data/lib/rhoconnect/handler/authenticate.rb +3 -0
- data/lib/rhoconnect/handler/bulk_data.rb +28 -0
- data/lib/rhoconnect/handler/changes/engine.rb +271 -0
- data/lib/rhoconnect/handler/changes/execute_methods.rb +88 -0
- data/lib/rhoconnect/handler/changes/pass_through_runner.rb +11 -0
- data/lib/rhoconnect/handler/changes/runner.rb +53 -0
- data/lib/rhoconnect/handler/changes.rb +31 -0
- data/lib/rhoconnect/handler/helpers/auth_method.rb +29 -0
- data/lib/rhoconnect/handler/helpers/binding.rb +18 -0
- data/lib/rhoconnect/handler/helpers/bulk_data.rb +53 -0
- data/lib/rhoconnect/handler/helpers/source_job.rb +14 -0
- data/lib/rhoconnect/handler/helpers.rb +4 -0
- data/lib/rhoconnect/handler/plugin_callbacks/execute_methods.rb +99 -0
- data/lib/rhoconnect/handler/plugin_callbacks/runner.rb +28 -0
- data/lib/rhoconnect/handler/plugin_callbacks.rb +67 -0
- data/lib/rhoconnect/handler/query/engine.rb +93 -0
- data/lib/rhoconnect/handler/query/execute_methods.rb +21 -0
- data/lib/rhoconnect/handler/query/pass_through_runner.rb +35 -0
- data/lib/rhoconnect/handler/query/runner.rb +270 -0
- data/lib/rhoconnect/handler/query.rb +19 -0
- data/lib/rhoconnect/handler/search/engine.rb +60 -0
- data/lib/rhoconnect/handler/search/execute_methods.rb +32 -0
- data/lib/rhoconnect/handler/search/pass_through_runner.rb +18 -0
- data/lib/rhoconnect/handler/search/runner.rb +104 -0
- data/lib/rhoconnect/handler/search.rb +26 -0
- data/lib/rhoconnect/handler/sync.rb +29 -0
- data/lib/rhoconnect/jobs/source_job.rb +13 -4
- data/lib/rhoconnect/js_adapter.rb +79 -0
- data/lib/rhoconnect/license.rb +10 -2
- data/lib/rhoconnect/middleware/current_user.rb +14 -1
- data/lib/rhoconnect/middleware/helpers.rb +10 -93
- data/lib/rhoconnect/middleware/x_domain_session_wrapper.rb +1 -1
- data/lib/rhoconnect/model/base.rb +229 -0
- data/lib/rhoconnect/model/dynamic_adapter_model.rb +90 -0
- data/lib/rhoconnect/model/js_base.rb +121 -0
- data/lib/rhoconnect/ping/android.rb +1 -1
- data/lib/rhoconnect/predefined_adapters/bench_adapter.rb +7 -4
- data/lib/rhoconnect/read_state.rb +3 -3
- data/lib/rhoconnect/server.rb +159 -190
- data/lib/rhoconnect/source.rb +100 -11
- data/lib/rhoconnect/stats/record.rb +10 -10
- data/lib/rhoconnect/store.rb +905 -591
- data/lib/rhoconnect/{model.rb → store_orm.rb} +53 -115
- data/lib/rhoconnect/tasks.rb +18 -4
- data/lib/rhoconnect/test_methods.rb +30 -17
- data/lib/rhoconnect/user.rb +35 -17
- data/lib/rhoconnect/utilities.rb +1 -1
- data/lib/rhoconnect/version.rb +2 -2
- data/lib/rhoconnect/web-console/server.rb +29 -14
- data/lib/rhoconnect/web-console/views/home.js +10 -10
- data/lib/rhoconnect/web-console/views/new_ping.js +1 -1
- data/lib/rhoconnect.rb +120 -51
- data/rhoconnect.gemspec +4 -3
- data/spec/api/api_helper.rb +1 -6
- data/spec/api/app/fast_delete_spec.rb +4 -4
- data/spec/api/app/fast_insert_spec.rb +4 -4
- data/spec/api/app/fast_update_spec.rb +8 -8
- data/spec/api/app/push_deletes_spec.rb +2 -2
- data/spec/api/app/push_objects_spec.rb +5 -5
- data/spec/api/client/client_get_db_doc_spec.rb +6 -4
- data/spec/api/client/client_set_db_doc_spec.rb +3 -2
- data/spec/api/client/get_client_params_spec.rb +14 -0
- data/spec/api/client/list_client_docs_spec.rb +30 -20
- data/spec/api/client/reset_spec.rb +36 -0
- data/spec/api/source/get_source_params_spec.rb +23 -17
- data/spec/api/system/get_license_info_spec.rb +0 -20
- data/spec/api/system/login_spec.rb +8 -0
- data/spec/api/system/reset_spec.rb +0 -1
- data/spec/api/system/stats_spec.rb +5 -5
- data/spec/api/user/create_user_spec.rb +14 -6
- data/spec/api/user/delete_user_spec.rb +20 -18
- data/spec/api/user/list_users_spec.rb +5 -6
- data/spec/api/user/update_user_spec.rb +5 -4
- data/spec/apps/rhotestapp/config.ru +16 -1
- data/spec/apps/rhotestapp/controllers/js/js_sample_controller.js +23 -0
- data/spec/apps/rhotestapp/controllers/js/sample2_controller.js +32 -0
- data/spec/apps/rhotestapp/controllers/ruby/application_controller.rb +21 -0
- data/spec/apps/rhotestapp/controllers/ruby/sample_adapter_controller.rb +8 -0
- data/spec/apps/rhotestapp/models/js/js_sample.js +55 -0
- data/spec/apps/rhotestapp/models/js/sample2.js +25 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/base_adapter.rb +0 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/fixed_schema_adapter.rb +0 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/other_adapter.rb +0 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/sample_adapter.rb +0 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/simple_adapter.rb +2 -2
- data/spec/apps/rhotestapp/{sources → models/ruby}/sub_adapter.rb +0 -0
- data/spec/apps/rhotestapp/settings/settings.yml +0 -1
- data/spec/bulk_data/bulk_data_spec.rb +20 -5
- data/spec/cli/cli_spec.rb +83 -0
- data/spec/client_spec.rb +20 -17
- data/spec/client_sync_spec.rb +244 -406
- data/spec/controllers/js_base_spec.rb +89 -0
- data/spec/doc/doc_spec.rb +18 -18
- data/spec/document_spec.rb +29 -13
- data/spec/dynamic_adapter_spec.rb +6 -6
- data/spec/generator/generator_spec.rb +7 -4
- data/spec/jobs/bulk_data_job_spec.rb +14 -10
- data/spec/jobs/source_job_spec.rb +8 -8
- data/spec/license_spec.rb +5 -2
- data/spec/models/js_model_spec.rb +39 -0
- data/spec/node_spec.rb +42 -0
- data/spec/perf/store_perf_spec.rb +67 -12
- data/spec/ping/android_spec.rb +1 -1
- data/spec/read_state_spec.rb +1 -1
- data/spec/rhoconnect_spec.rb +1 -1
- data/spec/server/cors_spec.rb +14 -18
- data/spec/server/server_spec.rb +265 -88
- data/spec/server/stats_spec.rb +1 -1
- data/spec/source_adapter_spec.rb +54 -27
- data/spec/source_spec.rb +8 -3
- data/spec/source_sync_spec.rb +538 -468
- data/spec/spec_helper.rb +35 -4
- data/spec/stats/record_spec.rb +10 -10
- data/spec/{model_spec.rb → store_orm_spec.rb} +56 -54
- data/spec/store_spec.rb +159 -179
- data/spec/support/shared_examples.rb +36 -27
- data/spec/sync_states_spec.rb +40 -33
- data/spec/test_methods_spec.rb +18 -14
- data/spec/user_spec.rb +17 -30
- metadata +156 -52
- data/bench/benchapp/application.rb +0 -39
- data/bench/blobapp/application.rb +0 -44
- data/commands/rhoconnect/clean_start.rb +0 -9
- data/commands/rhoconnect/create_user.rb +0 -18
- data/commands/rhoconnect/delete_device.rb +0 -9
- data/commands/rhoconnect/delete_user.rb +0 -8
- data/commands/rhoconnect/reset.rb +0 -16
- data/commands/rhoconnect/reset_refresh.rb +0 -11
- data/generators/templates/application/application.rb +0 -43
- data/lib/rhoconnect/client_sync.rb +0 -434
- data/lib/rhoconnect/dynamic_adapter.rb +0 -91
- data/lib/rhoconnect/middleware/admin_user.rb +0 -23
- data/lib/rhoconnect/middleware/current_request.rb +0 -16
- data/lib/rhoconnect/middleware/login_required.rb +0 -22
- data/lib/rhoconnect/source_adapter.rb +0 -132
- data/lib/rhoconnect/source_sync.rb +0 -464
- data/spec/apps/rhotestapp/application.rb +0 -23
data/spec/client_sync_spec.rb
CHANGED
@@ -2,39 +2,21 @@ require File.join(File.dirname(__FILE__),'spec_helper')
|
|
2
2
|
|
3
3
|
describe "ClientSync" do
|
4
4
|
it_behaves_like "SharedRhoconnectHelper", :rhoconnect_data => true do
|
5
|
-
it "should raise Argument error if no client is provided" do
|
6
|
-
lambda { ClientSync.new(@s,nil,2) }.should raise_error(ArgumentError,'Unknown client')
|
7
|
-
end
|
8
|
-
|
9
5
|
it "should handle receive cud for dynamic adapter" do
|
6
|
+
Rhoconnect.appserver = "http://test.com"
|
10
7
|
params = {'create'=>{'1'=>@product1}}
|
11
8
|
@c.source_name = 'Product2'
|
12
|
-
|
9
|
+
# create handler
|
10
|
+
params = {:p_size => 2}
|
11
|
+
lv = lambda { @model.create(@params[:create_object]) }
|
12
|
+
@model = Rhoconnect::Model::Base.create(@s2)
|
13
|
+
@cs1 = Rhoconnect::Handler::Changes::Runner.new(['create'],@model,@c,lv,params)
|
13
14
|
stub_request(:post, "http://test.com/rhoconnect/authenticate")
|
14
15
|
stub_request(:post, "http://test.com/rhoconnect/create").with(:headers => {'Content-Type' => 'application/json'}).to_return(:body => {:id => 5})
|
15
|
-
@cs1.
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
end
|
20
|
-
|
21
|
-
it "should handle send cud for dynamic adapter" do
|
22
|
-
Rhoconnect.appserver = "http://test.com"
|
23
|
-
data = {'1'=>@product1}
|
24
|
-
expected = {'insert'=>data}
|
25
|
-
stub_request(:post, "http://test.com/rhoconnect/authenticate")
|
26
|
-
stub_request(:post, "http://test.com/rhoconnect/query").with(:headers => {'Content-Type' => 'application/json'}).to_return(:status => 200, :body => data.to_json)
|
27
|
-
|
28
|
-
@c.source_name = 'Product'
|
29
|
-
@cs1 = ClientSync.new(@s2,@c,2)
|
30
|
-
|
31
|
-
@cs1.send_cud.should == [{'version'=>ClientSync::SYNC_VERSION},{'token'=>@c.get_value(:page_token)},
|
32
|
-
{'count'=>data.size},{'progress_count'=>0},
|
33
|
-
{'total_count'=>data.size},expected]
|
34
|
-
|
35
|
-
verify_result(@cs1.client.docname(:page) => data,
|
36
|
-
@cs1.client.docname(:delete_page) => {},
|
37
|
-
@cs1.client.docname(:cd) => data)
|
16
|
+
@cs1.run
|
17
|
+
verify_source_queue_data(@s2, {:create => [],
|
18
|
+
:update => [],
|
19
|
+
:delete => []})
|
38
20
|
end
|
39
21
|
|
40
22
|
let(:mock_schema) { {"property" => { "name" => "string", "brand" => "string" }, "version" => "1.0"} }
|
@@ -42,58 +24,105 @@ describe "ClientSync" do
|
|
42
24
|
|
43
25
|
before(:each) do
|
44
26
|
@s = Source.load(@s_fields[:name],@s_params)
|
45
|
-
|
27
|
+
# CUD handler
|
28
|
+
rhcud = lambda { @model.send params[:operation].to_sym, params["#{params[:operation]}_object".to_sym] }
|
29
|
+
@model = Rhoconnect::Model::Base.create(@s)
|
30
|
+
@cud_handler = Rhoconnect::Handler::Changes::Runner.new(['create','update','delete'],@model,@c,rhcud,{})
|
31
|
+
|
32
|
+
# query handler
|
33
|
+
params = {:p_size => 2}
|
34
|
+
lv = lambda { @model.query(@params[:query]) }
|
35
|
+
@sync_handler = Rhoconnect::Handler::Query::Runner.new(@model,@c, lv, params)
|
46
36
|
end
|
47
37
|
|
48
38
|
it "should handle receive cud" do
|
49
|
-
params = {'create'=>{'1'=>@product1},'update'=>{'2'=>@product2},'delete'=>{'3'=>@product3}}
|
50
|
-
@
|
51
|
-
|
52
|
-
|
53
|
-
|
39
|
+
@cud_handler.params = {'create'=>{'1'=>@product1},'update'=>{'2'=>@product2},'delete'=>{'3'=>@product3}}
|
40
|
+
@cud_handler.run
|
41
|
+
verify_source_queue_data(@s, {:create => [],
|
42
|
+
:update => [],
|
43
|
+
:delete => []})
|
54
44
|
end
|
55
45
|
|
56
46
|
it "should handle receive cud that triggers processing of the previously queued data" do
|
57
47
|
queued_create_data = {'1'=>@product1}
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
@
|
63
|
-
|
64
|
-
|
65
|
-
|
48
|
+
set_source_queue_state(@s, {:create => queued_create_data}, @c.id)
|
49
|
+
verify_source_queue_data(@s, {:create => [queued_create_data],
|
50
|
+
:update => [],
|
51
|
+
:delete => []})
|
52
|
+
@cud_handler.run
|
53
|
+
verify_source_queue_data(@s, {:create => [],
|
54
|
+
:update => [],
|
55
|
+
:delete => []})
|
66
56
|
end
|
67
57
|
|
68
58
|
it "should handle receive cud with pass through" do
|
69
59
|
params = {'create'=>{'1'=>@product1},'update'=>{'2'=>@product2},'delete'=>{'3'=>@product3}}
|
70
60
|
@s.pass_through = 'true'
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
61
|
+
|
62
|
+
rhcud = lambda { @model.send params[:operation].to_sym, params["#{params[:operation]}_object".to_sym] }
|
63
|
+
@cud_handler = Rhoconnect::Handler::Changes::PassThroughRunner.new(['create','update','delete'],@model,@c,rhcud,params)
|
64
|
+
@cud_handler.run
|
65
|
+
verify_source_queue_data(@s, {:create => [],
|
66
|
+
:update => [],
|
67
|
+
:delete => []})
|
75
68
|
end
|
76
69
|
|
77
70
|
it "should handle exeptions in receive cud with pass through" do
|
78
71
|
params = {'create'=>{'1'=>@error},'update'=>{'2'=>@product2},'delete'=>{'3'=>@product3}}
|
79
72
|
@s.pass_through = 'true'
|
80
|
-
@
|
81
|
-
|
82
|
-
|
83
|
-
|
73
|
+
rhcud = lambda { @model.send params[:operation].to_sym, params["#{params[:operation]}_object".to_sym] }
|
74
|
+
@cud_handler = Rhoconnect::Handler::Changes::PassThroughRunner.new(['create','update','delete'],@model,@c,rhcud,params)
|
75
|
+
@cud_handler.run
|
76
|
+
verify_source_queue_data(@s, {:create => [],
|
77
|
+
:update => [],
|
78
|
+
:delete => []})
|
84
79
|
end
|
85
80
|
|
86
81
|
it "should handle send cud" do
|
87
82
|
data = {'1'=>@product1,'2'=>@product2}
|
88
83
|
expected = {'insert'=>data}
|
89
84
|
set_test_data('test_db_storage',data)
|
90
|
-
|
91
|
-
|
85
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>@c.get_value(:page_token)},
|
86
|
+
{'count'=>data.size},{'progress_count'=>0},
|
87
|
+
{'total_count'=>data.size},expected]
|
88
|
+
verify_doc_result(@sync_handler.client, {:page => data,
|
89
|
+
:delete_page => {},
|
90
|
+
:cd => data})
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should handle send cud with page size 0" do
|
94
|
+
data = {'1'=>@product1,'2'=>@product2}
|
95
|
+
expected = {}
|
96
|
+
set_test_data('test_db_storage',data)
|
97
|
+
@sync_handler.p_size = 0
|
98
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>''},
|
99
|
+
{'count'=>0},{'progress_count'=>0},
|
100
|
+
{'total_count'=>data.size},expected]
|
101
|
+
verify_doc_result(@sync_handler.client, {:page => expected,
|
102
|
+
:delete_page => {},
|
103
|
+
:cd => expected})
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should handle send cud for dynamic adapter" do
|
107
|
+
Rhoconnect.appserver = "http://test.com"
|
108
|
+
data = {'1'=>@product1}
|
109
|
+
expected = {'insert'=>data}
|
110
|
+
stub_request(:post, "http://test.com/rhoconnect/authenticate")
|
111
|
+
stub_request(:post, "http://test.com/rhoconnect/query").with(:headers => {'Content-Type' => 'application/json'}).to_return(:status => 200, :body => data.to_json)
|
112
|
+
|
113
|
+
@c.source_name = 'Product2'
|
114
|
+
# query handler
|
115
|
+
lv = lambda { @model.query(params[:query]) }
|
116
|
+
params = { :p_size => 2 }
|
117
|
+
@model = Rhoconnect::Model::Base.create(@s2)
|
118
|
+
@cs1 = Rhoconnect::Handler::Query::Runner.new(@model,@c, lv, params)
|
119
|
+
@cs1.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>@c.get_value(:page_token)},
|
92
120
|
{'count'=>data.size},{'progress_count'=>0},
|
93
121
|
{'total_count'=>data.size},expected]
|
94
|
-
|
95
|
-
|
96
|
-
|
122
|
+
|
123
|
+
verify_doc_result(@cs1.client, {:page => data,
|
124
|
+
:delete_page => {},
|
125
|
+
:cd => data})
|
97
126
|
end
|
98
127
|
|
99
128
|
it "should handle send cud with pass_through" do
|
@@ -101,11 +130,14 @@ describe "ClientSync" do
|
|
101
130
|
expected = {'insert'=>data}
|
102
131
|
set_test_data('test_db_storage',data)
|
103
132
|
@s.pass_through = 'true'
|
104
|
-
|
133
|
+
lv = lambda { @model.query(params[:query]) }
|
134
|
+
params = { :p_size => 2 }
|
135
|
+
@ptsync = Rhoconnect::Handler::Query::PassThroughRunner.new(@model, @c, lv, params)
|
136
|
+
@ptsync.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>@c.get_value(:page_token)},
|
105
137
|
{'count'=>data.size},{'progress_count'=>0},
|
106
138
|
{'total_count'=>data.size},expected]
|
107
|
-
|
108
|
-
|
139
|
+
verify_doc_result(@ptsync.client, {:page => {},
|
140
|
+
:cd => {}})
|
109
141
|
end
|
110
142
|
|
111
143
|
it "should handle send cud if with pass_through no data" do
|
@@ -113,24 +145,27 @@ describe "ClientSync" do
|
|
113
145
|
expected = {}
|
114
146
|
#set_test_data('test_db_storage',data)
|
115
147
|
@s.pass_through = 'true'
|
116
|
-
@
|
148
|
+
lv = lambda { @model.query(params[:query]) }
|
149
|
+
params = { :p_size => 2 }
|
150
|
+
@ptsync = Rhoconnect::Handler::Query::PassThroughRunner.new(@model, @c, lv, params)
|
151
|
+
@ptsync.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>""},
|
117
152
|
{'count'=>data.size},{'progress_count'=>0},
|
118
153
|
{'total_count'=>data.size},expected]
|
119
|
-
|
120
|
-
|
154
|
+
verify_doc_result(@ptsync.client, {:page => {},
|
155
|
+
:cd => {}})
|
121
156
|
end
|
122
157
|
|
123
158
|
it "should return read errors in send cud" do
|
124
159
|
msg = "Error during query"
|
125
160
|
data = {'1'=>@product1,'2'=>@product2}
|
126
161
|
set_test_data('test_db_storage',data,msg,'query error')
|
127
|
-
@
|
162
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""}, {"count"=>0}, {"progress_count"=>0},{"total_count"=>0},
|
128
163
|
{"source-error"=>{"query-error"=>{"message"=>msg}}}]
|
129
164
|
end
|
130
165
|
|
131
166
|
it "should return login errors in send cud" do
|
132
167
|
@u.login = nil
|
133
|
-
@
|
168
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""},
|
134
169
|
{"count"=>0}, {"progress_count"=>0}, {"total_count"=>0},
|
135
170
|
{'source-error'=>{"login-error"=>{"message"=>"Error logging in"}}}]
|
136
171
|
end
|
@@ -138,7 +173,7 @@ describe "ClientSync" do
|
|
138
173
|
it "should return logoff errors in send cud" do
|
139
174
|
msg = "Error logging off"
|
140
175
|
set_test_data('test_db_storage',{},msg,'logoff error')
|
141
|
-
@
|
176
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>@c.get_value(:page_token)},
|
142
177
|
{"count"=>1}, {"progress_count"=>0}, {"total_count"=>1},
|
143
178
|
{"source-error"=>{"logoff-error"=>{"message"=>msg}},
|
144
179
|
"insert"=>{ERROR=>{"name"=>"logoff error", "an_attribute"=>msg}}}]
|
@@ -153,25 +188,25 @@ describe "ClientSync" do
|
|
153
188
|
data = {'1'=>@product1,'2'=>@product2}
|
154
189
|
expected = {'insert'=>data}
|
155
190
|
set_test_data('test_db_storage',data)
|
156
|
-
@
|
191
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>@c.get_value(:page_token)},
|
157
192
|
{'count'=>data.size},{'progress_count'=>0},
|
158
193
|
{'total_count'=>data.size},expected]
|
159
|
-
|
160
|
-
|
161
|
-
|
194
|
+
verify_doc_result(@sync_handler.client, {:page => data,
|
195
|
+
:delete_page => {},
|
196
|
+
:cd => data})
|
162
197
|
end
|
163
198
|
|
164
199
|
it "should return read errors in send cud" do
|
165
200
|
msg = "Error during query"
|
166
201
|
data = {'1'=>@product1,'2'=>@product2}
|
167
202
|
set_test_data('test_db_storage',data,msg,'query error')
|
168
|
-
@
|
203
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""}, {"count"=>0}, {"progress_count"=>0},{"total_count"=>0},
|
169
204
|
{"source-error"=>{"query-error"=>{"message"=>msg}}}]
|
170
205
|
end
|
171
206
|
|
172
207
|
it "should return login errors in send cud" do
|
173
208
|
@u.login = nil
|
174
|
-
@
|
209
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""},
|
175
210
|
{"count"=>0}, {"progress_count"=>0}, {"total_count"=>0},
|
176
211
|
{'source-error'=>{"login-error"=>{"message"=>"Error logging in"}}}]
|
177
212
|
end
|
@@ -179,7 +214,7 @@ describe "ClientSync" do
|
|
179
214
|
it "should return logoff errors in send cud" do
|
180
215
|
msg = "Error logging off"
|
181
216
|
set_test_data('test_db_storage',{},msg,'logoff error')
|
182
|
-
@
|
217
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>@c.get_value(:page_token)},
|
183
218
|
{"count"=>1}, {"progress_count"=>0}, {"total_count"=>1},
|
184
219
|
{"source-error"=>{"logoff-error"=>{"message"=>msg}},
|
185
220
|
"insert"=>{ERROR=>{"name"=>"logoff error", "an_attribute"=>msg}}}]
|
@@ -192,7 +227,7 @@ describe "ClientSync" do
|
|
192
227
|
|
193
228
|
it "should handle update errors" do
|
194
229
|
broken_object = { ERROR => { 'price' => '99.99' } }
|
195
|
-
|
230
|
+
set_doc_state(@c, :cd => broken_object)
|
196
231
|
set_test_data('test_db_storage',broken_object)
|
197
232
|
receive_and_send_cud('update')
|
198
233
|
end
|
@@ -201,8 +236,9 @@ describe "ClientSync" do
|
|
201
236
|
msg = "Error delete record"
|
202
237
|
error_objs = add_error_object({},"Error delete record")
|
203
238
|
op_data = {'delete'=>error_objs}
|
204
|
-
@
|
205
|
-
@
|
239
|
+
@cud_handler.params = op_data
|
240
|
+
@cud_handler.run
|
241
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""}, {"count"=>0}, {"progress_count"=>0}, {"total_count"=>0},
|
206
242
|
{"delete-error"=>{"#{ERROR}-error"=>{"message"=>msg},ERROR=>error_objs[ERROR]}}]
|
207
243
|
end
|
208
244
|
|
@@ -210,64 +246,39 @@ describe "ClientSync" do
|
|
210
246
|
msg = "Error delete record"
|
211
247
|
error_objs = add_error_object({},"Error delete record")
|
212
248
|
op_data = {'delete'=>error_objs}
|
213
|
-
@
|
214
|
-
@
|
249
|
+
@cud_handler.params = op_data
|
250
|
+
@cud_handler.run
|
251
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""}, {"count"=>0}, {"progress_count"=>0}, {"total_count"=>0},
|
215
252
|
{"delete-error"=>{"#{ERROR}-error"=>{"message"=>msg},ERROR=>error_objs[ERROR]}}]
|
216
253
|
verify_result(@c.docname(:delete_errors) => {})
|
217
|
-
@
|
254
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""}, {"count"=>0}, {"progress_count"=>0}, {"total_count"=>0},{}]
|
218
255
|
end
|
219
256
|
|
220
257
|
|
221
258
|
end
|
222
259
|
|
223
260
|
it "should handle receive_cud" do
|
224
|
-
|
225
|
-
|
261
|
+
set_doc_state(@s, :md => {'3'=>@product3})
|
262
|
+
set_doc_state(@c, :cd => {'3'=>@product3})
|
226
263
|
params = {'create'=>{'1'=>@product1},
|
227
264
|
'update'=>{'2'=>@product2},'delete'=>{'3'=>@product3}}
|
228
|
-
@
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
265
|
+
@cud_handler.params = params
|
266
|
+
@cud_handler.run
|
267
|
+
verify_source_queue_data(@s, {:create => [],
|
268
|
+
:update => [],
|
269
|
+
:delete => []})
|
270
|
+
verify_doc_result(@s, :md => {})
|
271
|
+
verify_doc_result(@c, :cd => {})
|
235
272
|
end
|
236
273
|
|
237
274
|
it "should handle send_cud with query_params" do
|
238
275
|
expected = {'1'=>@product1}
|
239
276
|
set_state('test_db_storage' => {'1'=>@product1,'2'=>@product2,'4'=>@product4})
|
240
277
|
params = {'name' => 'iPhone'}
|
241
|
-
@
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
end
|
246
|
-
|
247
|
-
describe "reset" do
|
248
|
-
it "should handle reset" do
|
249
|
-
set_state(@c.docname(:cd) => @data)
|
250
|
-
ClientSync.reset(@c)
|
251
|
-
verify_result(@c.docname(:cd) => {})
|
252
|
-
Client.load(@c.id,{:source_name => @s.name}).should_not be_nil
|
253
|
-
end
|
254
|
-
|
255
|
-
it "should handle reset on individual source adapters" do
|
256
|
-
@c.source_name = 'SampleAdapter'
|
257
|
-
set_state(@c.docname(:cd) => @data)
|
258
|
-
verify_result(@c.docname(:cd) => @data)
|
259
|
-
|
260
|
-
@c.source_name = 'SimpleAdapter'
|
261
|
-
set_state(@c.docname(:cd) => @data)
|
262
|
-
verify_result(@c.docname(:cd) => @data)
|
263
|
-
|
264
|
-
sources = [{'name'=>'SimpleAdapter'}]
|
265
|
-
ClientSync.reset(@c, {:sources => sources})
|
266
|
-
|
267
|
-
@c.source_name = 'SampleAdapter'
|
268
|
-
verify_result(@c.docname(:cd) => @data)
|
269
|
-
@c.source_name = 'SimpleAdapter'
|
270
|
-
verify_result(@c.docname(:cd) => {})
|
278
|
+
@sync_handler.engine.params = {:query => params}
|
279
|
+
@sync_handler.run
|
280
|
+
verify_doc_result(@s, :md => expected)
|
281
|
+
verify_doc_result(@sync_handler.client, :cd => expected)
|
271
282
|
end
|
272
283
|
end
|
273
284
|
|
@@ -277,13 +288,18 @@ describe "ClientSync" do
|
|
277
288
|
@c_fields.delete(:id)
|
278
289
|
@c1 = Client.create(@c_fields,{:source_name => @s_fields[:name]})
|
279
290
|
@s1 = Source.create(@s_fields,@s_params)
|
280
|
-
|
291
|
+
search_handler = lambda { @model.search(params[:search]) }
|
292
|
+
@model1 = Rhoconnect::Model::Base.create(@s2)
|
293
|
+
@cs = Rhoconnect::Handler::Search::Runner.new(@model, @c, search_handler, {})
|
294
|
+
@cs1 = Rhoconnect::Handler::Search::Runner.new(@model1,@c1, search_handler, { :p_size => 2 })
|
281
295
|
end
|
282
296
|
|
283
297
|
def search_and_verify_res(params)
|
284
|
-
|
298
|
+
@cs.params = params
|
299
|
+
@cs.engine.params = params
|
300
|
+
res = @cs.run
|
285
301
|
token = @c.get_value(:search_token)
|
286
|
-
res[0]['version'].should ==
|
302
|
+
res[0]['version'].should == Rhoconnect::SYNC_VERSION
|
287
303
|
res[1]['token'].should == token
|
288
304
|
res[2]['source'].should == @s.name
|
289
305
|
res[3]['count'].should == 1
|
@@ -293,23 +309,24 @@ describe "ClientSync" do
|
|
293
309
|
it "should handle search" do
|
294
310
|
params = {:search => {'name' => 'iPhone'}}
|
295
311
|
set_state('test_db_storage' => @data)
|
296
|
-
|
312
|
+
@cs.engine.params = params
|
313
|
+
res = @cs.run
|
297
314
|
token = @c.get_value(:search_token)
|
298
|
-
res.should == [{'version'=>
|
315
|
+
res.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>token},
|
299
316
|
{'source'=>@s.name},{'count'=>1},{'insert'=>{'1'=>@product1}}]
|
300
|
-
|
301
|
-
|
317
|
+
verify_doc_result(@c, {:search => {'1'=>@product1},
|
318
|
+
:search_errors => {}})
|
302
319
|
end
|
303
320
|
|
304
321
|
it "should handle search with no params" do
|
305
322
|
@cs.p_size = @data.size
|
306
323
|
set_state('test_db_storage' => @data)
|
307
|
-
res = @cs.
|
324
|
+
res = @cs.run
|
308
325
|
token = @c.get_value(:search_token)
|
309
|
-
res.should == [{'version'=>
|
326
|
+
res.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>token},
|
310
327
|
{'source'=>@s.name},{'count'=>@data.size},{'insert'=>@data}]
|
311
|
-
|
312
|
-
|
328
|
+
verify_doc_result(@c, {:search => @data,
|
329
|
+
:search_errors => {}})
|
313
330
|
end
|
314
331
|
|
315
332
|
it "should handle search with more than one page" do
|
@@ -319,188 +336,107 @@ describe "ClientSync" do
|
|
319
336
|
@data['4'] = product4
|
320
337
|
set_state('test_db_storage' => @data)
|
321
338
|
inserts = search_and_verify_res(params)
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
339
|
+
verify_doc_result(@c, {:search => {'1'=>@product1,'4'=>product4},
|
340
|
+
:cd_size => '1',
|
341
|
+
:cd => @c.get_data(:search_page),
|
342
|
+
:search_errors => {}})
|
343
|
+
verify_doc_result(@s, {:md_size => '1',
|
344
|
+
:md => @c.get_data(:search_page)})
|
345
|
+
|
329
346
|
# ack the token
|
330
347
|
params[:token] = @c.get_value(:search_token)
|
331
348
|
new_inserts = search_and_verify_res(params)
|
332
349
|
inserts.merge!(new_inserts)
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
350
|
+
verify_doc_result(@c, {:search => {'1'=>@product1,'4'=>product4},
|
351
|
+
:cd => inserts,
|
352
|
+
:search_errors => {}})
|
353
|
+
verify_doc_result(@s, :md => inserts)
|
337
354
|
@c.get_data(:search_page).size.should == 1
|
338
355
|
|
339
356
|
# ack the last token
|
340
357
|
params[:token] = @c.get_value(:search_token)
|
341
|
-
@cs.
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
358
|
+
@cs.params = params
|
359
|
+
@cs.run.should == []
|
360
|
+
verify_doc_result(@c, {:search => {},
|
361
|
+
:cd => inserts,
|
362
|
+
:search_errors => {},
|
363
|
+
:search_page => {},
|
364
|
+
:search_token => nil})
|
365
|
+
verify_doc_result(@s, :md => inserts)
|
348
366
|
end
|
349
367
|
|
350
368
|
it "should handle search with nil result" do
|
351
369
|
params = {:search => {'name' => 'foo'}}
|
352
370
|
set_state('test_db_storage' => @data)
|
353
|
-
@cs.
|
354
|
-
|
355
|
-
|
371
|
+
@cs.engine.params = params
|
372
|
+
@cs.run.should == []
|
373
|
+
verify_doc_result(@c, {:search => {},
|
374
|
+
:search_errors => {}})
|
356
375
|
end
|
357
376
|
|
358
377
|
it "should resend search by search_token" do
|
359
378
|
@source = @s
|
360
|
-
|
361
|
-
token =
|
362
|
-
@cs.
|
363
|
-
|
364
|
-
|
365
|
-
|
379
|
+
set_doc_state(@c, :search_page => {'1'=>@product1})
|
380
|
+
token = @cs.client.compute_token(:search_token)
|
381
|
+
@cs.params = {:resend => true,:token => token}
|
382
|
+
@cs.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>token},{'source'=>@s.name},{'count'=>1},{'insert'=>{'1'=>@product1}}]
|
383
|
+
verify_doc_result(@c, {:search_page => {'1'=>@product1},
|
384
|
+
:search_errors => {},
|
385
|
+
:search_token => token})
|
366
386
|
end
|
367
387
|
|
368
388
|
it "should handle search ack" do
|
369
|
-
@
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
@cs.
|
374
|
-
|
375
|
-
|
376
|
-
|
389
|
+
set_doc_state(@c, {:search => {'1'=>@product1}})
|
390
|
+
set_doc_state(@c, {:cd => {'1'=>@product1}})
|
391
|
+
token = @cs.client.compute_token(:search_token)
|
392
|
+
@cs.params = {:token => token}
|
393
|
+
@cs.run.should == []
|
394
|
+
verify_doc_result(@c, {:search => {},
|
395
|
+
:search_errors => {},
|
396
|
+
:search_token => nil})
|
377
397
|
end
|
378
398
|
|
379
399
|
it "should return error on invalid ack token" do
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
400
|
+
set_doc_state(@c, {:search_page => {'1'=>@product1}})
|
401
|
+
set_doc_state(@c, :search_token => 'validtoken')
|
402
|
+
params = {:token => 'abc',
|
403
|
+
:search => {'name' => 'iPhone'}}
|
404
|
+
@cs.params = params
|
405
|
+
@cs.engine.params = params
|
406
|
+
@cs.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'source'=>@s.name},{'search-error'=>{'search-error'=>
|
386
407
|
{'message'=>"Search error - invalid token"}}}]
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
end
|
391
|
-
|
392
|
-
it "should handle search all" do
|
393
|
-
sources = [{'name'=>'SampleAdapter'}]
|
394
|
-
set_state('test_db_storage' => @data)
|
395
|
-
res = ClientSync.search_all(@c,{:sources => sources,:search => {'name' => 'iPhone'}})
|
396
|
-
token = Store.get_value(@cs.client.docname(:search_token))
|
397
|
-
res.should == [[{'version'=>ClientSync::SYNC_VERSION},{'token'=>token},
|
398
|
-
{'source'=>sources[0]['name']},{'count'=>1},{'insert'=>{'1'=>@product1}}]]
|
399
|
-
verify_result(@c.docname(:search) => {'1'=>@product1},
|
400
|
-
@c.docname(:search_errors) => {})
|
401
|
-
end
|
402
|
-
|
403
|
-
it "should handle search all for pass through" do
|
404
|
-
sources = [{'name'=>'SampleAdapter'}]
|
405
|
-
set_state('test_db_storage' => @data)
|
406
|
-
@s.pass_through = 'true'
|
407
|
-
res = ClientSync.search_all(@c,{:sources => sources,:search => {'name' => 'iPhone'}})
|
408
|
-
token = Store.get_value(@cs.client.docname(:search_token))
|
409
|
-
res.should == [[{'version'=>ClientSync::SYNC_VERSION},{'token'=>token},
|
410
|
-
{'source'=>sources[0]['name']},{'count'=>1},{'insert'=>{'1'=>@product1}}]]
|
411
|
-
verify_result(@c.docname(:search) => {},
|
412
|
-
@c.docname(:search_errors) => {})
|
413
|
-
end
|
414
|
-
|
415
|
-
it "should handle search all error" do
|
416
|
-
sources = [{'name'=>'SampleAdapter'}]
|
417
|
-
msg = "Error during search"
|
418
|
-
error = set_test_data('test_db_storage',@data,msg,'search error')
|
419
|
-
res = ClientSync.search_all(@c,{:sources => sources,:search => {'name' => 'iPhone'}})
|
420
|
-
token = Store.get_value(@cs.client.docname(:search_token))
|
421
|
-
res.should == [[{'version'=>ClientSync::SYNC_VERSION},{'source'=>sources[0]['name']},{'search-error'=>{'search-error'=>{'message'=>msg}}}]]
|
422
|
-
verify_result(@c.docname(:search) => {})
|
408
|
+
verify_doc_result(@c, {:search => {},
|
409
|
+
:search_errors => {},
|
410
|
+
:search_token => nil})
|
423
411
|
end
|
424
412
|
|
425
|
-
it "should handle search
|
413
|
+
it "should handle search login error" do
|
426
414
|
@u.login = nil
|
427
|
-
sources = [{'name'=>'SampleAdapter'}]
|
428
415
|
msg = "Error logging in"
|
429
416
|
error = set_test_data('test_db_storage',@data,msg,'search error')
|
430
|
-
|
431
|
-
|
432
|
-
{'search-error'=>{'login-error'=>{'message'=>msg}}}]
|
433
|
-
|
434
|
-
|
417
|
+
@cs.engine.params = {:search => {'name' => 'iPhone'}}
|
418
|
+
@cs.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'source'=>@s.name},
|
419
|
+
{'search-error'=>{'login-error'=>{'message'=>msg}}}]
|
420
|
+
verify_doc_result(@c, {:search => {},
|
421
|
+
:search_token => nil})
|
435
422
|
end
|
436
|
-
|
437
|
-
it "should handle multiple source search all" do
|
438
|
-
set_test_data('test_db_storage',@data)
|
439
|
-
sources = [{'name'=>'SimpleAdapter'},{'name'=>'SampleAdapter'}]
|
440
|
-
res = ClientSync.search_all(@c,{:sources => sources,:search => {'name' => 'iPhone'}})
|
441
|
-
@c.source_name = 'SampleAdapter'
|
442
|
-
token = Store.get_value(@c.docname(:search_token))
|
443
|
-
res.sort.should == [[{'version'=>ClientSync::SYNC_VERSION},{'token'=>token},
|
444
|
-
{"source"=>"SampleAdapter"},{"count"=>1},{"insert"=>{'1'=>@product1}}],[]].sort
|
445
|
-
end
|
446
|
-
|
447
|
-
it "should handle search and accumulate params" do
|
448
|
-
set_test_data('test_db_storage',@data)
|
449
|
-
sources = [{'name'=>'SimpleAdapter'},{'name'=>'SampleAdapter'}]
|
450
|
-
res = ClientSync.search_all(@c,{:sources => sources,:search => {'search'=>'bar'}})
|
451
|
-
@c.source_name = 'SimpleAdapter'
|
452
|
-
token = Store.get_value(@c.docname(:search_token))
|
453
|
-
@c.source_name = 'SampleAdapter'
|
454
|
-
token1 = Store.get_value(@c.docname(:search_token))
|
455
|
-
res.should == [[{'version'=>ClientSync::SYNC_VERSION},{'token'=>token},
|
456
|
-
{"source"=>"SimpleAdapter"},{"count"=>1},{"insert"=>{'obj'=>{'foo'=>'bar'}}}],
|
457
|
-
[{'version'=>ClientSync::SYNC_VERSION},{'token'=>token1},{"source"=>"SampleAdapter"},
|
458
|
-
{"count"=>1}, {"insert"=>{'1'=>@product1}}]]
|
459
|
-
end
|
460
|
-
|
461
|
-
it "should handle search and ack of search results" do
|
462
|
-
set_test_data('test_db_storage',@data)
|
463
|
-
sources = [{'name'=>'SimpleAdapter'},{'name'=>'SampleAdapter'}]
|
464
|
-
ClientSync.search_all(@c,{:sources => sources,:search => {'search'=>'bar'}})
|
465
|
-
@c.source_name = 'SimpleAdapter'
|
466
|
-
token = Store.get_value(@c.docname(:search_token))
|
467
|
-
token.should_not be_nil
|
468
|
-
sources[0]['token'] = token
|
469
|
-
Store.get_data(@c.docname(:search)).should == {'obj'=>{'foo'=>'bar'}}
|
470
|
-
@c.source_name = 'SampleAdapter'
|
471
|
-
token1 = Store.get_value(@c.docname(:search_token))
|
472
|
-
token1.should_not be_nil
|
473
|
-
sources[1]['token'] = token1
|
474
|
-
Store.get_data(@c.docname(:search)).should == {'1'=>@product1}
|
475
|
-
# do ack on multiple sources
|
476
|
-
res = ClientSync.search_all(@c,{:sources => sources,:search => {'search'=>'bar'}})
|
477
|
-
@c.source_name = 'SimpleAdapter'
|
478
|
-
token = Store.get_value(@c.docname(:search_token))
|
479
|
-
token.should be_nil
|
480
|
-
Store.get_data(@c.docname(:search)).should == {}
|
481
|
-
@c.source_name = 'SampleAdapter'
|
482
|
-
token1 = Store.get_value(@c.docname(:search_token))
|
483
|
-
token1.should be_nil
|
484
|
-
Store.get_data(@c.docname(:search)).should == {}
|
485
|
-
end
|
486
|
-
|
487
423
|
end
|
488
424
|
|
489
425
|
describe "page methods" do
|
490
426
|
it "should return diffs between master documents and client documents limited by page size" do
|
491
|
-
|
492
|
-
|
493
|
-
|
427
|
+
@s.put_data(:md,@data).should == true
|
428
|
+
@s.get_data(:md).should == @data
|
429
|
+
@s.put_value(:md_size,@data.size)
|
494
430
|
|
495
|
-
total_count, res = @
|
431
|
+
total_count, res = @sync_handler.compute_page
|
496
432
|
total_count.to_i.should == 3
|
497
433
|
res.each do |key, value|
|
498
434
|
@data.has_key?(key).should == true
|
499
435
|
@data[key].should == value
|
500
436
|
end
|
501
437
|
|
502
|
-
|
503
|
-
|
438
|
+
@sync_handler.client.get_value(:cd_size).to_i.should == 0
|
439
|
+
@sync_handler.client.get_data(:page).each do |key, value|
|
504
440
|
@data.has_key?(key).should == true
|
505
441
|
@data[key].should == value
|
506
442
|
end
|
@@ -508,41 +444,43 @@ describe "ClientSync" do
|
|
508
444
|
|
509
445
|
it "appends diff to the client document" do
|
510
446
|
@cd = {'3'=>@product3}
|
511
|
-
|
512
|
-
|
447
|
+
@c.put_data(:cd,@cd)
|
448
|
+
@c.get_data(:cd).should == @cd
|
513
449
|
|
514
450
|
@page = {'1'=>@product1,'2'=>@product2}
|
515
451
|
@expected = {'1'=>@product1,'2'=>@product2,'3'=>@product3}
|
516
452
|
|
517
|
-
|
518
|
-
|
453
|
+
@c.put_data(:cd,@page,true).should == true
|
454
|
+
@c.get_data(:cd).should == @expected
|
519
455
|
end
|
520
456
|
|
521
457
|
it "should delete objects from the client document and return deleted objects in the page" do
|
522
|
-
|
523
|
-
|
458
|
+
@s.put_data(:md,@data).should == true
|
459
|
+
@s.get_data(:md).should == @data
|
524
460
|
|
525
461
|
@cd = {'1'=>@product1,'2'=>@product2,'3'=>@product3,'4'=>@product4}
|
526
|
-
|
527
|
-
|
462
|
+
@sync_handler.client.put_data(:cd,@cd)
|
463
|
+
@sync_handler.client.get_data(:cd).should == @cd
|
528
464
|
|
529
465
|
@expected = {'4'=>@product4}
|
530
|
-
@
|
531
|
-
|
532
|
-
|
466
|
+
@sync_handler.send_new_page
|
467
|
+
@sync_handler.client.get_data(:delete_page).should == @expected
|
468
|
+
@sync_handler.client.get_data(:cd).should == @data
|
533
469
|
end
|
534
470
|
|
535
471
|
it "should resend page if page exists and no token provided" do
|
536
472
|
expected = {'1'=>@product1}
|
537
473
|
set_test_data('test_db_storage',{'1'=>@product1,'2'=>@product2,'4'=>@product4})
|
538
474
|
params = {'name' => 'iPhone'}
|
539
|
-
@
|
475
|
+
@sync_handler.engine.params = {:query => params}
|
476
|
+
@sync_handler.run
|
540
477
|
token = @c.get_value(:page_token)
|
541
|
-
@
|
478
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
|
542
479
|
{"count"=>1}, {"progress_count"=>0},{"total_count"=>1},{'insert' => expected}]
|
543
|
-
@
|
480
|
+
@sync_handler.params[:token] = token
|
481
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""},
|
544
482
|
{"count"=>0}, {"progress_count"=>0}, {"total_count"=>1}, {}]
|
545
|
-
|
483
|
+
@sync_handler.client.get_data(:page).should == {}
|
546
484
|
@c.get_value(:page_token).should be_nil
|
547
485
|
end
|
548
486
|
|
@@ -551,9 +489,9 @@ describe "ClientSync" do
|
|
551
489
|
set_state('test_db_storage' => expected)
|
552
490
|
metadata = "{\"foo\":\"bar\"}"
|
553
491
|
mock_metadata_method([SampleAdapter]) do
|
554
|
-
result = @
|
492
|
+
result = @sync_handler.run
|
555
493
|
token = @c.get_value(:page_token)
|
556
|
-
result.should == [{'version'=>
|
494
|
+
result.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
|
557
495
|
{"count"=>1}, {"progress_count"=>0},{"total_count"=>1},
|
558
496
|
{'metadata'=>metadata,'insert'=>expected}]
|
559
497
|
@c.get_value(:metadata_page).should == metadata
|
@@ -564,9 +502,9 @@ describe "ClientSync" do
|
|
564
502
|
expected = {'1'=>@product1}
|
565
503
|
set_state('test_db_storage' => expected)
|
566
504
|
mock_metadata_method([SampleAdapter]) do
|
567
|
-
result = @
|
505
|
+
result = @sync_handler.run
|
568
506
|
token = @c.get_value(:page_token)
|
569
|
-
@
|
507
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
|
570
508
|
{"count"=>1}, {"progress_count"=>0},{"total_count"=>1},
|
571
509
|
{'metadata'=>"{\"foo\":\"bar\"}",'insert'=>expected}]
|
572
510
|
end
|
@@ -576,9 +514,10 @@ describe "ClientSync" do
|
|
576
514
|
expected = {'1'=>@product1}
|
577
515
|
set_state('test_db_storage' => expected)
|
578
516
|
mock_metadata_method([SampleAdapter]) do
|
579
|
-
result = @
|
517
|
+
result = @sync_handler.run
|
580
518
|
token = @c.get_value(:page_token)
|
581
|
-
@
|
519
|
+
@sync_handler.params[:token] = token
|
520
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""},
|
582
521
|
{"count"=>0}, {"progress_count"=>0},{"total_count"=>1},{}]
|
583
522
|
@c.get_value(:metadata_page).should be_nil
|
584
523
|
end
|
@@ -588,9 +527,9 @@ describe "ClientSync" do
|
|
588
527
|
expected = {'1'=>@product1}
|
589
528
|
set_state('test_db_storage' => expected)
|
590
529
|
mock_schema_method([SampleAdapter]) do
|
591
|
-
result = @
|
530
|
+
result = @sync_handler.run
|
592
531
|
token = @c.get_value(:page_token)
|
593
|
-
result.should == [{'version'=>
|
532
|
+
result.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
|
594
533
|
{"count"=>1}, {"progress_count"=>0},{"total_count"=>1},{'insert'=>expected}]
|
595
534
|
@c.get_value(:schema_sha1).should == sha1
|
596
535
|
end
|
@@ -599,9 +538,9 @@ describe "ClientSync" do
|
|
599
538
|
it "should send schema-changed instead of page" do
|
600
539
|
mock_schema_method([SampleAdapter]) do
|
601
540
|
@c.put_value(:schema_sha1,'foo')
|
602
|
-
result = @
|
541
|
+
result = @sync_handler.run
|
603
542
|
token = @c.get_value(:page_token)
|
604
|
-
result.should == [{'version'=>
|
543
|
+
result.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
|
605
544
|
{"count"=>0}, {"progress_count"=>0},{"total_count"=>0},{'schema-changed'=>'true'}]
|
606
545
|
@c.get_value(:schema_page).should == sha1
|
607
546
|
@c.get_value(:schema_sha1).should == sha1
|
@@ -611,9 +550,9 @@ describe "ClientSync" do
|
|
611
550
|
it "should re-send schema-changed if no token sent" do
|
612
551
|
mock_schema_method([SampleAdapter]) do
|
613
552
|
@c.put_value(:schema_sha1,'foo')
|
614
|
-
result = @
|
553
|
+
result = @sync_handler.run
|
615
554
|
token = @c.get_value(:page_token)
|
616
|
-
@
|
555
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
|
617
556
|
{"count"=>0}, {"progress_count"=>0},{"total_count"=>0},{'schema-changed'=>'true'}]
|
618
557
|
@c.get_value(:schema_page).should == sha1
|
619
558
|
@c.get_value(:schema_sha1).should == sha1
|
@@ -623,9 +562,10 @@ describe "ClientSync" do
|
|
623
562
|
it "should ack schema-changed with token" do
|
624
563
|
mock_schema_method([SampleAdapter]) do
|
625
564
|
@c.put_value(:schema_sha1,'foo')
|
626
|
-
result = @
|
565
|
+
result = @sync_handler.run
|
627
566
|
token = @c.get_value(:page_token)
|
628
|
-
@
|
567
|
+
@sync_handler.params[:token] = token
|
568
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""},
|
629
569
|
{"count"=>0}, {"progress_count"=>0},{"total_count"=>0},{}]
|
630
570
|
@c.get_value(:schema_page).should be_nil
|
631
571
|
@c.get_value(:schema_sha1).should == sha1
|
@@ -642,9 +582,10 @@ describe "ClientSync" do
|
|
642
582
|
data.refresh_time = Time.now.to_i + 600
|
643
583
|
mock_schema_method([SampleAdapter]) do
|
644
584
|
@c.put_value(:schema_sha1,'foo')
|
645
|
-
result = @
|
585
|
+
result = @sync_handler.run
|
646
586
|
token = @c.get_value(:page_token)
|
647
|
-
@
|
587
|
+
@sync_handler.params[:token] = token
|
588
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""},
|
648
589
|
{"count"=>0}, {"progress_count"=>0},{"total_count"=>0},{}]
|
649
590
|
@c.get_value(:schema_page).should be_nil
|
650
591
|
@c.get_value(:schema_sha1).should == sha1
|
@@ -653,123 +594,20 @@ describe "ClientSync" do
|
|
653
594
|
end
|
654
595
|
end
|
655
596
|
end
|
656
|
-
|
657
|
-
describe "bulk data" do
|
658
|
-
after(:each) do
|
659
|
-
delete_data_directory
|
660
|
-
end
|
661
|
-
|
662
|
-
it "should create bulk data job user parition if none exists" do
|
663
|
-
ClientSync.bulk_data(:user,@c).should == {:result => :wait}
|
664
|
-
Resque.peek(:bulk_data).should == {"args"=>
|
665
|
-
[{"data_name"=>File.join(@a_fields[:name],@u_fields[:login],@u_fields[:login])}],
|
666
|
-
"class"=>"Rhoconnect::BulkDataJob"}
|
667
|
-
end
|
668
|
-
|
669
|
-
it "should create bulk data job app partition if none exists and no partition sources" do
|
670
|
-
@s2.delete
|
671
|
-
@a.sources.delete("SimpleAdapter")
|
672
|
-
@a.sources.delete("OtherAdapter")
|
673
|
-
ClientSync.bulk_data(:app,@c).should == {:result => :nop}
|
674
|
-
Resque.peek(:bulk_data).should == nil
|
675
|
-
end
|
676
|
-
|
677
|
-
it "should create bulk data job app partition with partition sources" do
|
678
|
-
@s.partition = :app
|
679
|
-
ClientSync.bulk_data(:app,@c).should == {:result => :wait}
|
680
|
-
Resque.peek(:bulk_data).should == {"args"=>
|
681
|
-
[{"data_name"=>File.join(@a_fields[:name],@a_fields[:name])}],
|
682
|
-
"class"=>"Rhoconnect::BulkDataJob"}
|
683
|
-
end
|
684
|
-
|
685
|
-
it "should return bulk data url for completed bulk data user partition" do
|
686
|
-
set_state('test_db_storage' => @data)
|
687
|
-
ClientSync.bulk_data(:user,@c)
|
688
|
-
do_bulk_data_job("data_name" => bulk_data_docname(@a.id,@u.id))
|
689
|
-
ClientSync.bulk_data(:user,@c).should == {:result => :url,
|
690
|
-
:url => BulkData.load(bulk_data_docname(@a.id,@u.id)).url}
|
691
|
-
verify_result(
|
692
|
-
"client:#{@a_fields[:name]}:#{@u_fields[:login]}:#{@c.id}:#{@s_fields[:name]}:cd" => @data,
|
693
|
-
"source:#{@a_fields[:name]}:#{@u_fields[:login]}:#{@s_fields[:name]}:md" => @data,
|
694
|
-
"source:#{@a_fields[:name]}:#{@u_fields[:login]}:#{@s_fields[:name]}:md_copy" => @data)
|
695
|
-
end
|
696
|
-
|
697
|
-
it "should return empty bulk data url if there are errors in query" do
|
698
|
-
ClientSync.bulk_data(:user,@c)
|
699
|
-
do_bulk_data_job("data_name" => bulk_data_docname(@a.id,@u.id))
|
700
|
-
errordoc = @s.docname(:errors) # source SampleAdapter
|
701
|
-
operation = 'query'
|
702
|
-
Store.lock(errordoc) do
|
703
|
-
Store.put_data(errordoc,{"#{operation}-error"=>{'message'=>"Some exception message"}}, true)
|
704
|
-
end
|
705
|
-
ClientSync.bulk_data(:user,@c).should == {:result => :url, :url => ''}
|
706
|
-
end
|
707
|
-
|
708
|
-
it "should escape bulk data url" do
|
709
|
-
name = 'a b'
|
710
|
-
data = BulkData.create(:name => bulk_data_docname(@a.id,name),
|
711
|
-
:state => :inprogress,
|
712
|
-
:app_id => @a.id,
|
713
|
-
:user_id => name,
|
714
|
-
:sources => [@s_fields[:name]])
|
715
|
-
do_bulk_data_job("data_name" => bulk_data_docname(@a.id,name))
|
716
|
-
data = BulkData.load(bulk_data_docname(@a.id,name))
|
717
|
-
data.url.should match /a%20b/
|
718
|
-
data.delete
|
719
|
-
end
|
720
|
-
|
721
|
-
it "should return bulk data url for completed bulk data app partition" do
|
722
|
-
set_state('test_db_storage' => @data)
|
723
|
-
@s.partition = :app
|
724
|
-
ClientSync.bulk_data(:app,@c)
|
725
|
-
do_bulk_data_job("data_name" => bulk_data_docname(@a.id,"*"))
|
726
|
-
ClientSync.bulk_data(:app,@c).should == {:result => :url,
|
727
|
-
:url => BulkData.load(bulk_data_docname(@a.id,"*")).url}
|
728
|
-
verify_result(
|
729
|
-
"client:#{@a_fields[:name]}:#{@u_fields[:login]}:#{@c.id}:#{@s_fields[:name]}:cd" => @data,
|
730
|
-
"source:#{@a_fields[:name]}:__shared__:#{@s_fields[:name]}:md" => @data,
|
731
|
-
"source:#{@a_fields[:name]}:__shared__:#{@s_fields[:name]}:md_copy" => @data)
|
732
|
-
end
|
733
|
-
|
734
|
-
it "should return bulk data url for completed bulk data with bulk_sync_only source" do
|
735
|
-
set_state('test_db_storage' => @data)
|
736
|
-
@s.sync_type = :bulk_sync_only
|
737
|
-
ClientSync.bulk_data(:user,@c)
|
738
|
-
do_bulk_data_job("data_name" => bulk_data_docname(@a.id,@u.id))
|
739
|
-
ClientSync.bulk_data(:user,@c).should == {:result => :url,
|
740
|
-
:url => BulkData.load(bulk_data_docname(@a.id,@u.id)).url}
|
741
|
-
verify_result(
|
742
|
-
"client:#{@a_fields[:name]}:#{@u_fields[:login]}:#{@c.id}:#{@s_fields[:name]}:cd" => {},
|
743
|
-
"source:#{@a_fields[:name]}:#{@u_fields[:login]}:#{@s_fields[:name]}:md" => @data,
|
744
|
-
"source:#{@a_fields[:name]}:#{@u_fields[:login]}:#{@s_fields[:name]}:md_copy" => {})
|
745
|
-
end
|
746
|
-
|
747
|
-
it "should create bulk data job if no file exists" do
|
748
|
-
set_state('test_db_storage' => @data)
|
749
|
-
Rhoconnect.blackberry_bulk_sync = true
|
750
|
-
ClientSync.bulk_data(:user,@c)
|
751
|
-
do_bulk_data_job("data_name" => bulk_data_docname(@a.id,@u.id))
|
752
|
-
data = BulkData.load(bulk_data_docname(@a.id,@u.id))
|
753
|
-
ClientSync.bulk_data(:user,@c).should == {:result => :url, :url => data.url}
|
754
|
-
File.delete(data.dbfile)
|
755
|
-
ClientSync.bulk_data(:user,@c).should == {:result => :wait}
|
756
|
-
Resque.peek(:bulk_data).should == {"args"=>
|
757
|
-
[{"data_name"=>bulk_data_docname(@a.id,@u.id)}], "class"=>"Rhoconnect::BulkDataJob"}
|
758
|
-
end
|
759
|
-
end
|
760
597
|
end
|
761
598
|
def receive_and_send_cud(operation)
|
762
599
|
msg = "Error #{operation} record"
|
763
600
|
op_data = {operation=>{ERROR=>{'an_attribute'=>msg,'name'=>'wrongname'}}}
|
764
|
-
@
|
601
|
+
@cud_handler.params = op_data
|
602
|
+
@cud_handler.run
|
765
603
|
if operation == 'update'
|
766
|
-
@
|
604
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""}, {"count"=>0}, {"progress_count"=>0}, {"total_count"=>1},
|
767
605
|
{
|
768
606
|
"update-rollback"=>{"0_broken_object_id"=>{"price"=>"99.99"}},
|
769
607
|
"#{operation}-error"=>{"#{ERROR}-error"=>{"message"=>msg},ERROR=>op_data[operation][ERROR]}
|
770
608
|
}]
|
771
609
|
else
|
772
|
-
@
|
610
|
+
@sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""}, {"count"=>0}, {"progress_count"=>0}, {"total_count"=>0},
|
773
611
|
{"#{operation}-error"=>{"#{ERROR}-error"=>{"message"=>msg},ERROR=>op_data[operation][ERROR]}}]
|
774
612
|
end
|
775
613
|
end
|