rhoconnect 4.0.4 → 5.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +5 -13
  2. data/CHANGELOG.md +54 -5
  3. data/CREDITS +219 -219
  4. data/Gemfile +2 -2
  5. data/Gemfile.lock +68 -79
  6. data/Rakefile +1 -2
  7. data/bench/benchapp/spec/models/ruby/mock_adapter_spec.rb +17 -17
  8. data/bench/benchapp/spec/models/ruby/queue_mock_adapter_spec.rb +17 -17
  9. data/bench/benchapp/spec/spec_helper.rb +3 -3
  10. data/bench/blobapp/spec/models/ruby/blob_adapter_spec.rb +17 -17
  11. data/bench/blobapp/spec/spec_helper.rb +3 -3
  12. data/bench/lib/bench/runner.rb +1 -69
  13. data/bench/lib/bench.rb +18 -18
  14. data/bench/spec/mock_adapter_spec.rb +54 -55
  15. data/bench/spec/mock_client_spec.rb +47 -48
  16. data/bench/spec/result_spec.rb +41 -44
  17. data/bench/spec/utils_spec.rb +24 -25
  18. data/commands/generators/app.rb +7 -5
  19. data/commands/generators/controller.rb +7 -5
  20. data/commands/generators/model.rb +7 -5
  21. data/commands/generators/source.rb +7 -5
  22. data/commands/parser.rb +1 -1
  23. data/commands/redis/redis_download.rb +1 -1
  24. data/doc/async-jobs.txt +9 -9
  25. data/doc/supported-platforms.txt +0 -2
  26. data/generators/rhoconnect.rb +92 -212
  27. data/generators/templates/application/rcgemfile +3 -3
  28. data/generators/templates/application/spec/application_controller_spec.rb +14 -16
  29. data/generators/templates/application/spec/js_spec.rb +20 -20
  30. data/generators/templates/application/spec/spec_helper.rb +1 -1
  31. data/generators/templates/source/controllers/ruby/controller_spec.rb +18 -19
  32. data/generators/templates/source/models/ruby/model_spec.rb +17 -17
  33. data/install.sh +10 -21
  34. data/installer/unix-like/rho_connect_install_constants.rb +5 -5
  35. data/installer/unix-like/rho_connect_install_installers.rb +4 -4
  36. data/installer/utils/constants.rb +6 -6
  37. data/installer/utils/nix_install_test.rb +29 -29
  38. data/installer/utils/package_upload/repos.rake +16 -26
  39. data/js-adapters/node.rb +4 -4
  40. data/js-adapters/node_channel.rb +4 -8
  41. data/lib/rhoconnect/db_adapter.rb +13 -13
  42. data/lib/rhoconnect/handler/changes/engine.rb +1 -1
  43. data/lib/rhoconnect/jobs/bulk_data_job.rb +29 -29
  44. data/lib/rhoconnect/license.rb +7 -7
  45. data/lib/rhoconnect/model/helpers/find_duplicates_on_update.rb +13 -13
  46. data/lib/rhoconnect/ping/apple.rb +4 -4
  47. data/lib/rhoconnect/server.rb +2 -2
  48. data/lib/rhoconnect/source.rb +2 -2
  49. data/lib/rhoconnect/store.rb +12 -6
  50. data/lib/rhoconnect/utilities.rb +2 -2
  51. data/lib/rhoconnect/version.rb +1 -1
  52. data/lib/rhoconnect.rb +6 -4
  53. data/rhoconnect.gemspec +5 -6
  54. data/spec/api/api_helper.rb +1 -1
  55. data/spec/api/app/fast_delete_spec.rb +22 -22
  56. data/spec/api/app/fast_insert_spec.rb +23 -23
  57. data/spec/api/app/fast_update_spec.rb +63 -63
  58. data/spec/api/app/push_deletes_spec.rb +11 -13
  59. data/spec/api/app/push_objects_spec.rb +39 -39
  60. data/spec/api/client/client_get_db_doc_spec.rb +29 -29
  61. data/spec/api/client/client_set_db_doc_spec.rb +11 -11
  62. data/spec/api/client/get_client_params_spec.rb +29 -29
  63. data/spec/api/client/list_client_docs_spec.rb +32 -34
  64. data/spec/api/client/reset_spec.rb +30 -30
  65. data/spec/api/readstate/set_refresh_time_spec.rb +43 -43
  66. data/spec/api/source/get_source_params_spec.rb +32 -34
  67. data/spec/api/source/list_sources_spec.rb +13 -13
  68. data/spec/api/source/update_source_params_spec.rb +19 -19
  69. data/spec/api/store/get_db_doc_spec.rb +27 -27
  70. data/spec/api/store/set_db_doc_spec.rb +38 -38
  71. data/spec/api/system/adapter_spec.rb +27 -29
  72. data/spec/api/system/get_license_info_spec.rb +11 -11
  73. data/spec/api/system/login_spec.rb +37 -37
  74. data/spec/api/system/reset_spec.rb +15 -15
  75. data/spec/api/system/stats_spec.rb +70 -71
  76. data/spec/api/user/create_user_spec.rb +37 -37
  77. data/spec/api/user/delete_client_spec.rb +7 -7
  78. data/spec/api/user/delete_user_spec.rb +62 -62
  79. data/spec/api/user/list_clients_spec.rb +24 -24
  80. data/spec/api/user/list_source_docs_spec.rb +29 -29
  81. data/spec/api/user/list_users_spec.rb +22 -22
  82. data/spec/api/user/ping_spec.rb +18 -18
  83. data/spec/api/user/show_user_spec.rb +10 -10
  84. data/spec/api/user/update_user_spec.rb +43 -43
  85. data/spec/api/user/user_get_db_doc_spec.rb +12 -12
  86. data/spec/api/user/user_set_db_doc_spec.rb +37 -37
  87. data/spec/api_token_spec.rb +8 -8
  88. data/spec/app_spec.rb +18 -17
  89. data/spec/apps/jstestapp/settings/settings.yml +2 -0
  90. data/spec/async_spec.rb +9 -11
  91. data/spec/bulk_data/bulk_data_spec.rb +120 -120
  92. data/spec/cli/cli_spec.rb +50 -53
  93. data/spec/client_spec.rb +105 -105
  94. data/spec/client_sync_spec.rb +529 -528
  95. data/spec/controllers/js_base_spec.rb +147 -141
  96. data/spec/doc/doc_spec.rb +51 -52
  97. data/spec/document_spec.rb +58 -58
  98. data/spec/dynamic_adapter_spec.rb +33 -36
  99. data/spec/generator/generator_spec.rb +76 -42
  100. data/spec/jobs/bulk_data_job_spec.rb +101 -102
  101. data/spec/jobs/ping_job_spec.rb +176 -177
  102. data/spec/jobs/source_job_spec.rb +24 -25
  103. data/spec/license_spec.rb +54 -55
  104. data/spec/models/js_base_spec.rb +121 -120
  105. data/spec/perf/bulk_data_perf_spec.rb +23 -24
  106. data/spec/perf/perf_spec_helper.rb +7 -7
  107. data/spec/perf/store_perf_spec.rb +139 -140
  108. data/spec/ping/apple_spec.rb +65 -65
  109. data/spec/ping/gcm_spec.rb +83 -84
  110. data/spec/ping/rhoconnect_push_spec.rb +52 -53
  111. data/spec/predefined_adapters/rho_internal_bench_adapter_controller_js_spec.rb +100 -101
  112. data/spec/predefined_adapters/rho_internal_js_bench_adapter_js_spec.rb +29 -31
  113. data/spec/read_state_spec.rb +24 -25
  114. data/spec/rhoconnect_spec.rb +7 -7
  115. data/spec/server/server_spec.rb +664 -662
  116. data/spec/server/stats_spec.rb +12 -12
  117. data/spec/source_adapter_spec.rb +124 -125
  118. data/spec/source_spec.rb +148 -149
  119. data/spec/source_sync_spec.rb +736 -736
  120. data/spec/spec_helper.rb +4 -5
  121. data/spec/stats/record_spec.rb +22 -21
  122. data/spec/store_orm_spec.rb +48 -48
  123. data/spec/store_spec.rb +428 -426
  124. data/spec/support/shared_examples.rb +5 -7
  125. data/spec/sync_states_spec.rb +67 -67
  126. data/spec/test_methods_spec.rb +121 -123
  127. data/spec/testdata/10000-data.txt +0 -0
  128. data/spec/testdata/5000-data.txt +0 -0
  129. data/spec/user_spec.rb +102 -102
  130. data/tasks/redis.rake +3 -3
  131. metadata +154 -195
  132. data/bench/benchapp/tmp/pids/passenger.9292.pid.lock +0 -0
  133. data/bench/benchapp/tmp/restart.txt +0 -0
  134. data/bench/blobapp/settings/license.key.bak +0 -2
  135. data/bench/blobapp/tmp/restart.txt +0 -0
  136. data/bench/lib/testdata/1-data.txt +0 -0
  137. data/bench/lib/testdata/10-data.txt +0 -0
  138. data/bench/lib/testdata/2-data.txt +0 -0
  139. data/bench/lib/testdata/250-data.txt +0 -0
  140. data/bench/lib/testdata/5-blob_data.txt +0 -0
  141. data/bench/lib/testdata/5-data.txt +0 -0
  142. data/bench/lib/testdata/50-data.txt +0 -0
  143. data/bench/lib/testdata/500-data.txt +0 -0
  144. data/doc/protocol.html +0 -1993
  145. data/spec/coverage/rcov/assets/0.2.3/jquery-1.3.2.min.js +0 -19
  146. data/spec/coverage/rcov/assets/0.2.3/jquery.tablesorter.min.js +0 -15
  147. data/spec/coverage/rcov/assets/0.2.3/print.css +0 -12
  148. data/spec/coverage/rcov/assets/0.2.3/rcov.js +0 -42
  149. data/spec/coverage/rcov/assets/0.2.3/screen.css +0 -270
  150. data/spec/coverage/rcov/index.html +0 -88
  151. data/spec/generator/generator_spec_helper.rb +0 -9
@@ -1,89 +1,196 @@
1
1
  require File.join(File.dirname(__FILE__),'spec_helper')
2
2
 
3
3
  describe "ClientSync" do
4
- it_behaves_like "SharedRhoconnectHelper", :rhoconnect_data => true do
5
- it "should handle receive cud for dynamic adapter" do
6
- Rhoconnect.appserver = "http://test.com"
7
- params = {'create'=>{'1'=>@product1}}
8
- @c.source_name = 'Product2'
9
- # create handler
10
- lv = lambda { @model.create(@params[:create_object]) }
11
- @model = Rhoconnect::Model::Base.create(@s2)
12
- @cs1 = Rhoconnect::Handler::Changes::Runner.new(['create'],@model,@c,lv,params)
13
- stub_request(:post, "http://test.com/rhoconnect/authenticate")
14
- stub_request(:post, "http://test.com/rhoconnect/create").with(:headers => {'Content-Type' => 'application/json'}).to_return(:body => {:id => 5})
15
- @cs1.run
16
- verify_source_queue_data(@s2, {:create => [],
17
- :update => [],
18
- :delete => []})
19
- end
4
+ include_examples "SharedRhoconnectHelper", :rhoconnect_data => true
5
+
6
+ it "should handle receive cud for dynamic adapter" do
7
+ Rhoconnect.appserver = "http://test.com"
8
+ params = {'create'=>{'1'=>@product1}}
9
+ @c.source_name = 'Product2'
10
+ # create handler
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)
14
+ stub_request(:post, "http://test.com/rhoconnect/authenticate")
15
+ stub_request(:post, "http://test.com/rhoconnect/create").with(:headers => {'Content-Type' => 'application/json'}).to_return(:body => {:id => 5})
16
+ @cs1.run
17
+ verify_source_queue_data(@s2, {:create => [],
18
+ :update => [],
19
+ :delete => []})
20
+ end
20
21
 
21
- let(:mock_schema) { {"property" => { "name" => "string", "brand" => "string" }, "version" => "1.0"} }
22
- let(:sha1) { get_sha1(mock_schema['version']) }
23
-
24
- before(:each) do
25
- @s = Source.load(@s_fields[:name],@s_params)
26
- # CUD handler
27
- rhcud = lambda { @model.send params[:operation].to_sym, params["#{params[:operation]}_object".to_sym] }
28
- @model = Rhoconnect::Model::Base.create(@s)
29
- @cud_handler = Rhoconnect::Handler::Changes::Runner.new(['create','update','delete'],@model,@c,rhcud,{})
30
-
31
- # query handler
32
- params = {:p_size => 2}
33
- lv = lambda { @model.query(@params[:query]) }
34
- @sync_handler = Rhoconnect::Handler::Query::Runner.new(@model,@c, lv, params)
35
- end
36
-
37
- it "should handle receive cud" do
38
- @cud_handler.params = {'create'=>{'1'=>@product1},'update'=>{'2'=>@product2},'delete'=>{'3'=>@product3}}
39
- @cud_handler.run
40
- verify_source_queue_data(@s, {:create => [],
41
- :update => [],
42
- :delete => []})
43
- end
44
-
45
- it "should handle receive cud that triggers processing of the previously queued data" do
46
- queued_create_data = [[@s.name, [['1', @product1]]]]
47
- set_source_queue_state(@s, {:create => queued_create_data}, @c.id)
48
- verify_source_queue_data(@s, {:create => [queued_create_data],
49
- :update => [],
50
- :delete => []})
51
- @cud_handler.run
52
- verify_source_queue_data(@s, {:create => [],
53
- :update => [],
54
- :delete => []})
55
- end
22
+ let(:mock_schema) { {"property" => { "name" => "string", "brand" => "string" }, "version" => "1.0"} }
23
+ let(:sha1) { get_sha1(mock_schema['version']) }
56
24
 
57
- it "should handle receive cud from the custom queue_key that triggers processing of the previously queued data" do
58
- queue_key = "post:/my_custom_create_route"
59
- queue_name = "create:#{queue_key}"
60
- Source.define_valid_queues([queue_name])
61
- queued_create_data = [[@s.name, [['1', @product1]]]]
62
- set_source_queue_state(@s, {queue_name => queued_create_data}, @c.id)
63
- verify_source_queue_data(@s, {queue_name => [queued_create_data]})
64
- @cud_handler.params[:queue_key] = queue_key
65
- @cud_handler.engine.params[:queue_key] = queue_key
66
- @cud_handler.operations = ["create"]
67
- @cud_handler.engine.operations = ["create"]
68
- @cud_handler.run
69
- verify_source_queue_data(@s, {queue_name => []})
70
- end
71
-
72
- it "should handle receive cud with pass through" do
73
- params = {'create'=>{'1'=>@product1},'update'=>{'2'=>@product2},'delete'=>{'3'=>@product3}}
74
- @s.pass_through = 'true'
75
-
76
- rhcud = lambda { @model.send params[:operation].to_sym, params["#{params[:operation]}_object".to_sym] }
77
- @cud_handler = Rhoconnect::Handler::Changes::PassThroughRunner.new(['create','update','delete'],@model,@c,rhcud,params)
78
- JSON.parse(@cud_handler.run).should == {"processed" => ['1', '2', '3']}
79
- end
80
-
81
- it "should handle exeptions in receive cud with pass through" do
82
- params = {'create'=>{'1'=>@error},'update'=>{'2'=>@product2},'delete'=>{'3'=>@product3}}
83
- @s.pass_through = 'true'
84
- rhcud = lambda { @model.send params[:operation].to_sym, params["#{params[:operation]}_object".to_sym] }
85
- @cud_handler = Rhoconnect::Handler::Changes::PassThroughRunner.new(['create','update','delete'],@model,@c,rhcud,params)
86
- JSON.parse(@cud_handler.run).should == {"error" => {"message" => "undefined method `[]' for nil:NilClass" }, "processed" => []}
25
+ before(:each) do
26
+ @s = Source.load(@s_fields[:name],@s_params)
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)
36
+ end
37
+
38
+ it "should handle receive cud" do
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 => []})
44
+ end
45
+
46
+ it "should handle receive cud that triggers processing of the previously queued data" do
47
+ queued_create_data = [[@s.name, [['1', @product1]]]]
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 => []})
56
+ end
57
+
58
+ it "should handle receive cud from the custom queue_key that triggers processing of the previously queued data" do
59
+ queue_key = "post:/my_custom_create_route"
60
+ queue_name = "create:#{queue_key}"
61
+ Source.define_valid_queues([queue_name])
62
+ queued_create_data = [[@s.name, [['1', @product1]]]]
63
+ set_source_queue_state(@s, {queue_name => queued_create_data}, @c.id)
64
+ verify_source_queue_data(@s, {queue_name => [queued_create_data]})
65
+ @cud_handler.params[:queue_key] = queue_key
66
+ @cud_handler.engine.params[:queue_key] = queue_key
67
+ @cud_handler.operations = ["create"]
68
+ @cud_handler.engine.operations = ["create"]
69
+ @cud_handler.run
70
+ verify_source_queue_data(@s, {queue_name => []})
71
+ end
72
+
73
+ it "should handle receive cud with pass through" do
74
+ params = {'create'=>{'1'=>@product1},'update'=>{'2'=>@product2},'delete'=>{'3'=>@product3}}
75
+ @s.pass_through = 'true'
76
+
77
+ rhcud = lambda { @model.send params[:operation].to_sym, params["#{params[:operation]}_object".to_sym] }
78
+ @cud_handler = Rhoconnect::Handler::Changes::PassThroughRunner.new(['create','update','delete'],@model,@c,rhcud,params)
79
+ JSON.parse(@cud_handler.run).should == {"processed" => ['1', '2', '3']}
80
+ end
81
+
82
+ it "should handle exeptions in receive cud with pass through" do
83
+ params = {'create'=>{'1'=>@error},'update'=>{'2'=>@product2},'delete'=>{'3'=>@product3}}
84
+ @s.pass_through = 'true'
85
+ rhcud = lambda { @model.send params[:operation].to_sym, params["#{params[:operation]}_object".to_sym] }
86
+ @cud_handler = Rhoconnect::Handler::Changes::PassThroughRunner.new(['create','update','delete'],@model,@c,rhcud,params)
87
+ JSON.parse(@cud_handler.run).should == {"error" => {"message" => "undefined method `[]' for nil:NilClass" }, "processed" => []}
88
+ end
89
+
90
+ it "should handle send cud" do
91
+ data = {'1'=>@product1,'2'=>@product2}
92
+ expected = {'insert'=>data}
93
+ set_test_data('test_db_storage',data)
94
+ @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>@c.get_value(:page_token)},
95
+ {'count'=>data.size},{'progress_count'=>0},
96
+ {'total_count'=>data.size},expected]
97
+ verify_doc_result(@sync_handler.client, {:page => data,
98
+ :delete_page => {},
99
+ :cd => data})
100
+ end
101
+
102
+ it "should handle send cud with page size 0" do
103
+ data = {'1'=>@product1,'2'=>@product2}
104
+ expected = {}
105
+ set_test_data('test_db_storage',data)
106
+ @sync_handler.p_size = 0
107
+ @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>''},
108
+ {'count'=>0},{'progress_count'=>0},
109
+ {'total_count'=>data.size},expected]
110
+ verify_doc_result(@sync_handler.client, {:page => expected,
111
+ :delete_page => {},
112
+ :cd => expected})
113
+ end
114
+
115
+ it "should handle send cud for dynamic adapter" do
116
+ Rhoconnect.appserver = "http://test.com"
117
+ data = {'1'=>@product1}
118
+ expected = {'insert'=>data}
119
+ stub_request(:post, "http://test.com/rhoconnect/authenticate")
120
+ stub_request(:post, "http://test.com/rhoconnect/query").with(:headers => {'Content-Type' => 'application/json'}).to_return(:status => 200, :body => data.to_json)
121
+
122
+ @c.source_name = 'Product2'
123
+ # query handler
124
+ lv = lambda { @model.query(params[:query]) }
125
+ params = { :p_size => 2 }
126
+ @model = Rhoconnect::Model::Base.create(@s2)
127
+ @cs1 = Rhoconnect::Handler::Query::Runner.new(@model,@c, lv, params)
128
+ @cs1.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>@c.get_value(:page_token)},
129
+ {'count'=>data.size},{'progress_count'=>0},
130
+ {'total_count'=>data.size},expected]
131
+
132
+ verify_doc_result(@cs1.client, {:page => data,
133
+ :delete_page => {},
134
+ :cd => data})
135
+ end
136
+
137
+ it "should handle send cud with pass_through" do
138
+ data = {'1'=>@product1,'2'=>@product2}
139
+ expected = {'insert'=>data}
140
+ set_test_data('test_db_storage',data)
141
+ @s.pass_through = 'true'
142
+ lv = lambda { @model.query(params[:query]) }
143
+ params = { :p_size => 2 }
144
+ @ptsync = Rhoconnect::Handler::Query::PassThroughRunner.new(@model, @c, lv, params)
145
+ @ptsync.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>@c.get_value(:page_token)},
146
+ {'count'=>data.size},{'progress_count'=>0},
147
+ {'total_count'=>data.size},expected]
148
+ verify_doc_result(@ptsync.client, {:page => {},
149
+ :cd => {}})
150
+ end
151
+
152
+ it "should handle send cud if with pass_through no data" do
153
+ data = {}
154
+ expected = {}
155
+ #set_test_data('test_db_storage',data)
156
+ @s.pass_through = 'true'
157
+ lv = lambda { @model.query(params[:query]) }
158
+ params = { :p_size => 2 }
159
+ @ptsync = Rhoconnect::Handler::Query::PassThroughRunner.new(@model, @c, lv, params)
160
+ @ptsync.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>""},
161
+ {'count'=>data.size},{'progress_count'=>0},
162
+ {'total_count'=>data.size},expected]
163
+ verify_doc_result(@ptsync.client, {:page => {},
164
+ :cd => {}})
165
+ end
166
+
167
+ it "should return read errors in send cud" do
168
+ msg = "Error during query"
169
+ data = {'1'=>@product1,'2'=>@product2}
170
+ set_test_data('test_db_storage',data,msg,'query error')
171
+ @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""}, {"count"=>0}, {"progress_count"=>0},{"total_count"=>0},
172
+ {"source-error"=>{"query-error"=>{"message"=>msg}}}]
173
+ end
174
+
175
+ it "should return login errors in send cud" do
176
+ @u.login = nil
177
+ @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""},
178
+ {"count"=>0}, {"progress_count"=>0}, {"total_count"=>0},
179
+ {'source-error'=>{"login-error"=>{"message"=>"Error logging in"}}}]
180
+ end
181
+
182
+ it "should return logoff errors in send cud" do
183
+ msg = "Error logging off"
184
+ set_test_data('test_db_storage',{},msg,'logoff error')
185
+ @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>@c.get_value(:page_token)},
186
+ {"count"=>1}, {"progress_count"=>0}, {"total_count"=>1},
187
+ {"source-error"=>{"logoff-error"=>{"message"=>msg}},
188
+ "insert"=>{ERROR=>{"name"=>"logoff error", "an_attribute"=>msg}}}]
189
+ end
190
+
191
+ describe "send errors in send_cud" do
192
+ it "should handle create errors" do
193
+ receive_and_send_cud('create')
87
194
  end
88
195
 
89
196
  it "should handle send cud" do
@@ -94,529 +201,423 @@ describe "ClientSync" do
94
201
  {'count'=>data.size},{'progress_count'=>0},
95
202
  {'total_count'=>data.size},expected]
96
203
  verify_doc_result(@sync_handler.client, {:page => data,
97
- :delete_page => {},
98
- :cd => data})
204
+ :delete_page => {},
205
+ :cd => data})
99
206
  end
100
207
 
101
- it "should handle send cud with page size 0" do
102
- data = {'1'=>@product1,'2'=>@product2}
103
- expected = {}
104
- set_test_data('test_db_storage',data)
105
- @sync_handler.p_size = 0
106
- @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>''},
107
- {'count'=>0},{'progress_count'=>0},
108
- {'total_count'=>data.size},expected]
109
- verify_doc_result(@sync_handler.client, {:page => expected,
110
- :delete_page => {},
111
- :cd => expected})
112
- end
113
-
114
- it "should handle send cud for dynamic adapter" do
115
- Rhoconnect.appserver = "http://test.com"
116
- data = {'1'=>@product1}
117
- expected = {'insert'=>data}
118
- stub_request(:post, "http://test.com/rhoconnect/authenticate")
119
- stub_request(:post, "http://test.com/rhoconnect/query").with(:headers => {'Content-Type' => 'application/json'}).to_return(:status => 200, :body => data.to_json)
120
-
121
- @c.source_name = 'Product2'
122
- # query handler
123
- lv = lambda { @model.query(params[:query]) }
124
- params = { :p_size => 2 }
125
- @model = Rhoconnect::Model::Base.create(@s2)
126
- @cs1 = Rhoconnect::Handler::Query::Runner.new(@model,@c, lv, params)
127
- @cs1.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>@c.get_value(:page_token)},
128
- {'count'=>data.size},{'progress_count'=>0},
129
- {'total_count'=>data.size},expected]
130
-
131
- verify_doc_result(@cs1.client, {:page => data,
132
- :delete_page => {},
133
- :cd => data})
134
- end
135
-
136
- it "should handle send cud with pass_through" do
137
- data = {'1'=>@product1,'2'=>@product2}
138
- expected = {'insert'=>data}
139
- set_test_data('test_db_storage',data)
140
- @s.pass_through = 'true'
141
- lv = lambda { @model.query(params[:query]) }
142
- params = { :p_size => 2 }
143
- @ptsync = Rhoconnect::Handler::Query::PassThroughRunner.new(@model, @c, lv, params)
144
- @ptsync.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>@c.get_value(:page_token)},
145
- {'count'=>data.size},{'progress_count'=>0},
146
- {'total_count'=>data.size},expected]
147
- verify_doc_result(@ptsync.client, {:page => {},
148
- :cd => {}})
149
- end
150
-
151
- it "should handle send cud if with pass_through no data" do
152
- data = {}
153
- expected = {}
154
- #set_test_data('test_db_storage',data)
155
- @s.pass_through = 'true'
156
- lv = lambda { @model.query(params[:query]) }
157
- params = { :p_size => 2 }
158
- @ptsync = Rhoconnect::Handler::Query::PassThroughRunner.new(@model, @c, lv, params)
159
- @ptsync.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>""},
160
- {'count'=>data.size},{'progress_count'=>0},
161
- {'total_count'=>data.size},expected]
162
- verify_doc_result(@ptsync.client, {:page => {},
163
- :cd => {}})
164
- end
165
-
166
208
  it "should return read errors in send cud" do
167
209
  msg = "Error during query"
168
210
  data = {'1'=>@product1,'2'=>@product2}
169
211
  set_test_data('test_db_storage',data,msg,'query error')
170
- @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""}, {"count"=>0}, {"progress_count"=>0},{"total_count"=>0},
212
+ @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""}, {"count"=>0}, {"progress_count"=>0},{"total_count"=>0},
171
213
  {"source-error"=>{"query-error"=>{"message"=>msg}}}]
172
214
  end
173
-
215
+
174
216
  it "should return login errors in send cud" do
175
217
  @u.login = nil
176
- @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""},
218
+ @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""},
177
219
  {"count"=>0}, {"progress_count"=>0}, {"total_count"=>0},
178
220
  {'source-error'=>{"login-error"=>{"message"=>"Error logging in"}}}]
179
221
  end
180
-
222
+
181
223
  it "should return logoff errors in send cud" do
182
224
  msg = "Error logging off"
183
225
  set_test_data('test_db_storage',{},msg,'logoff error')
184
- @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>@c.get_value(:page_token)},
185
- {"count"=>1}, {"progress_count"=>0}, {"total_count"=>1},
186
- {"source-error"=>{"logoff-error"=>{"message"=>msg}},
226
+ @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>@c.get_value(:page_token)},
227
+ {"count"=>1}, {"progress_count"=>0}, {"total_count"=>1},
228
+ {"source-error"=>{"logoff-error"=>{"message"=>msg}},
187
229
  "insert"=>{ERROR=>{"name"=>"logoff error", "an_attribute"=>msg}}}]
188
230
  end
189
-
231
+
190
232
  describe "send errors in send_cud" do
191
233
  it "should handle create errors" do
192
234
  receive_and_send_cud('create')
193
235
  end
194
236
 
195
- it "should handle send cud" do
196
- data = {'1'=>@product1,'2'=>@product2}
197
- expected = {'insert'=>data}
198
- set_test_data('test_db_storage',data)
199
- @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>@c.get_value(:page_token)},
200
- {'count'=>data.size},{'progress_count'=>0},
201
- {'total_count'=>data.size},expected]
202
- verify_doc_result(@sync_handler.client, {:page => data,
203
- :delete_page => {},
204
- :cd => data})
237
+ it "should handle update errors" do
238
+ broken_object = { ERROR => { 'price' => '99.99' } }
239
+ set_doc_state(@c, :cd => broken_object)
240
+ set_test_data('test_db_storage',broken_object)
241
+ receive_and_send_cud('update')
205
242
  end
206
243
 
207
- it "should return read errors in send cud" do
208
- msg = "Error during query"
209
- data = {'1'=>@product1,'2'=>@product2}
210
- set_test_data('test_db_storage',data,msg,'query error')
211
- @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""}, {"count"=>0}, {"progress_count"=>0},{"total_count"=>0},
212
- {"source-error"=>{"query-error"=>{"message"=>msg}}}]
244
+ it "should handle delete errors" do
245
+ msg = "Error delete record"
246
+ error_objs = add_error_object({},"Error delete record")
247
+ op_data = {'delete'=>error_objs}
248
+ @cud_handler.params = op_data
249
+ @cud_handler.operations = ["delete"]
250
+ @cud_handler.engine.operations = ["delete"]
251
+ @cud_handler.run
252
+ @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""}, {"count"=>0}, {"progress_count"=>0}, {"total_count"=>0},
253
+ {"delete-error"=>{"#{ERROR}-error"=>{"message"=>msg},ERROR=>error_objs[ERROR]}}]
213
254
  end
214
255
 
215
- it "should return login errors in send cud" do
216
- @u.login = nil
217
- @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""},
218
- {"count"=>0}, {"progress_count"=>0}, {"total_count"=>0},
219
- {'source-error'=>{"login-error"=>{"message"=>"Error logging in"}}}]
256
+ it "should send cud errors only once" do
257
+ msg = "Error delete record"
258
+ error_objs = add_error_object({},"Error delete record")
259
+ op_data = {'delete'=>error_objs}
260
+ @cud_handler.params = op_data
261
+ @cud_handler.operations = ["delete"]
262
+ @cud_handler.engine.operations = ["delete"]
263
+ @cud_handler.run
264
+ @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""}, {"count"=>0}, {"progress_count"=>0}, {"total_count"=>0},
265
+ {"delete-error"=>{"#{ERROR}-error"=>{"message"=>msg},ERROR=>error_objs[ERROR]}}]
266
+ verify_result(@c.docname(:delete_errors) => {})
267
+ @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""}, {"count"=>0}, {"progress_count"=>0}, {"total_count"=>0},{}]
220
268
  end
221
269
 
222
- it "should return logoff errors in send cud" do
223
- msg = "Error logging off"
224
- set_test_data('test_db_storage',{},msg,'logoff error')
225
- @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>@c.get_value(:page_token)},
226
- {"count"=>1}, {"progress_count"=>0}, {"total_count"=>1},
227
- {"source-error"=>{"logoff-error"=>{"message"=>msg}},
228
- "insert"=>{ERROR=>{"name"=>"logoff error", "an_attribute"=>msg}}}]
229
- end
230
270
 
231
- describe "send errors in send_cud" do
232
- it "should handle create errors" do
233
- receive_and_send_cud('create')
234
- end
235
-
236
- it "should handle update errors" do
237
- broken_object = { ERROR => { 'price' => '99.99' } }
238
- set_doc_state(@c, :cd => broken_object)
239
- set_test_data('test_db_storage',broken_object)
240
- receive_and_send_cud('update')
241
- end
242
-
243
- it "should handle delete errors" do
244
- msg = "Error delete record"
245
- error_objs = add_error_object({},"Error delete record")
246
- op_data = {'delete'=>error_objs}
247
- @cud_handler.params = op_data
248
- @cud_handler.operations = ["delete"]
249
- @cud_handler.engine.operations = ["delete"]
250
- @cud_handler.run
251
- @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""}, {"count"=>0}, {"progress_count"=>0}, {"total_count"=>0},
252
- {"delete-error"=>{"#{ERROR}-error"=>{"message"=>msg},ERROR=>error_objs[ERROR]}}]
253
- end
254
-
255
- it "should send cud errors only once" do
256
- msg = "Error delete record"
257
- error_objs = add_error_object({},"Error delete record")
258
- op_data = {'delete'=>error_objs}
259
- @cud_handler.params = op_data
260
- @cud_handler.operations = ["delete"]
261
- @cud_handler.engine.operations = ["delete"]
262
- @cud_handler.run
263
- @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""}, {"count"=>0}, {"progress_count"=>0}, {"total_count"=>0},
264
- {"delete-error"=>{"#{ERROR}-error"=>{"message"=>msg},ERROR=>error_objs[ERROR]}}]
265
- verify_result(@c.docname(:delete_errors) => {})
266
- @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""}, {"count"=>0}, {"progress_count"=>0}, {"total_count"=>0},{}]
267
- end
268
-
269
-
270
- end
271
-
272
- it "should handle receive_cud and perform proper operation on the md and cd" do
273
- set_doc_state(@s, :md => {'3'=>@product3})
274
- set_doc_state(@c, :cd => {'3'=>@product3})
275
- params = {'create'=>{'1'=>@product1},
276
- 'update'=>{'2'=>@product2},'delete'=>{'3'=>@product3}}
277
- @cud_handler.params = params
278
- @cud_handler.run
279
- verify_source_queue_data(@s, {:create => [],
280
- :update => [],
281
- :delete => []})
282
- verify_doc_result(@s, :md => {})
283
- verify_doc_result(@c, :cd => {})
284
- verify_source_queue_data(@s2, {:create => [],
271
+ end
272
+
273
+ it "should handle receive_cud and perform proper operation on the md and cd" do
274
+ set_doc_state(@s, :md => {'3'=>@product3})
275
+ set_doc_state(@c, :cd => {'3'=>@product3})
276
+ params = {'create'=>{'1'=>@product1},
277
+ 'update'=>{'2'=>@product2},'delete'=>{'3'=>@product3}}
278
+ @cud_handler.params = params
279
+ @cud_handler.run
280
+ verify_source_queue_data(@s, {:create => [],
285
281
  :update => [],
286
282
  :delete => []})
287
- end
283
+ verify_doc_result(@s, :md => {})
284
+ verify_doc_result(@c, :cd => {})
285
+ verify_source_queue_data(@s2, {:create => [],
286
+ :update => [],
287
+ :delete => []})
288
+ end
288
289
 
289
- it "should handle send_cud with query_params" do
290
- expected = {'1'=>@product1}
291
- set_state('test_db_storage' => {'1'=>@product1,'2'=>@product2,'4'=>@product4})
292
- params = {'name' => 'iPhone'}
293
- @sync_handler.engine.params = {:query => params}
294
- @sync_handler.run
295
- verify_doc_result(@s, :md => expected)
296
- verify_doc_result(@sync_handler.client, :cd => expected)
297
- end
290
+ it "should handle send_cud with query_params" do
291
+ expected = {'1'=>@product1}
292
+ set_state('test_db_storage' => {'1'=>@product1,'2'=>@product2,'4'=>@product4})
293
+ params = {'name' => 'iPhone'}
294
+ @sync_handler.engine.params = {:query => params}
295
+ @sync_handler.run
296
+ verify_doc_result(@s, :md => expected)
297
+ verify_doc_result(@sync_handler.client, :cd => expected)
298
298
  end
299
-
300
- describe "search" do
301
- before(:each) do
302
- @s_fields[:name] = 'SimpleAdapter'
303
- @c_fields.delete(:id)
304
- @c1 = Client.create(@c_fields,{:source_name => @s_fields[:name]})
305
- @s1 = Source.create(@s_fields,@s_params)
306
- search_handler = lambda { @model.search(params[:search]) }
307
- @model1 = Rhoconnect::Model::Base.create(@s2)
308
- @cs = Rhoconnect::Handler::Search::Runner.new(@model, @c, search_handler, {})
309
- @cs1 = Rhoconnect::Handler::Search::Runner.new(@model1,@c1, search_handler, { :p_size => 2 })
310
- end
299
+ end
311
300
 
312
- def search_and_verify_res(params)
313
- @cs.params = params
314
- @cs.engine.params = params
315
- res = @cs.run
316
- token = @c.get_value(:search_token)
317
- res[0]['version'].should == Rhoconnect::SYNC_VERSION
318
- res[1]['token'].should == token
319
- res[2]['source'].should == @s.name
320
- res[3]['count'].should == 1
321
- res[4]['insert']
322
- end
301
+ describe "search" do
302
+ before(:each) do
303
+ @s_fields[:name] = 'SimpleAdapter'
304
+ @c_fields.delete(:id)
305
+ @c1 = Client.create(@c_fields,{:source_name => @s_fields[:name]})
306
+ @s1 = Source.create(@s_fields,@s_params)
307
+ search_handler = lambda { @model.search(params[:search]) }
308
+ @model1 = Rhoconnect::Model::Base.create(@s2)
309
+ @cs = Rhoconnect::Handler::Search::Runner.new(@model, @c, search_handler, {})
310
+ @cs1 = Rhoconnect::Handler::Search::Runner.new(@model1,@c1, search_handler, { :p_size => 2 })
311
+ end
323
312
 
324
- it "should handle search" do
325
- params = {:search => {'name' => 'iPhone'}}
326
- set_state('test_db_storage' => @data)
327
- @cs.engine.params = params
328
- res = @cs.run
329
- token = @c.get_value(:search_token)
330
- res.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>token},
331
- {'source'=>@s.name},{'count'=>1},{'insert'=>{'1'=>@product1}}]
332
- verify_doc_result(@c, {:search => {'1'=>@product1},
333
- :search_errors => {}})
334
- end
313
+ def search_and_verify_res(params)
314
+ @cs.params = params
315
+ @cs.engine.params = params
316
+ res = @cs.run
317
+ token = @c.get_value(:search_token)
318
+ res[0]['version'].should == Rhoconnect::SYNC_VERSION
319
+ res[1]['token'].should == token
320
+ res[2]['source'].should == @s.name
321
+ res[3]['count'].should == 1
322
+ res[4]['insert']
323
+ end
335
324
 
336
- it "should handle search with no params" do
337
- @cs.p_size = @data.size
338
- set_state('test_db_storage' => @data)
339
- res = @cs.run
340
- token = @c.get_value(:search_token)
341
- res.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>token},
342
- {'source'=>@s.name},{'count'=>@data.size},{'insert'=>@data}]
343
- verify_doc_result(@c, {:search => @data,
344
- :search_errors => {}})
345
- end
325
+ it "should handle search" do
326
+ params = {:search => {'name' => 'iPhone'}}
327
+ set_state('test_db_storage' => @data)
328
+ @cs.engine.params = params
329
+ res = @cs.run
330
+ token = @c.get_value(:search_token)
331
+ res.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>token},
332
+ {'source'=>@s.name},{'count'=>1},{'insert'=>{'1'=>@product1}}]
333
+ verify_doc_result(@c, {:search => {'1'=>@product1},
334
+ :search_errors => {}})
335
+ end
346
336
 
347
- it "should handle search with more than one page" do
348
- @cs.p_size = 1
349
- params = {:search => {'name' => 'iPhone'}}
350
- product4 = {'name' => 'iPhone', 'price' => '99.99'}
351
- @data['4'] = product4
352
- set_state('test_db_storage' => @data)
353
- inserts = search_and_verify_res(params)
354
- verify_doc_result(@c, {:search => {'1'=>@product1,'4'=>product4},
355
- :cd_size => '1',
356
- :cd => @c.get_data(:search_page),
357
- :search_errors => {}})
358
- verify_doc_result(@s, {:md_size => '1',
359
- :md => @c.get_data(:search_page)})
360
-
361
- # ack the token
362
- params[:token] = @c.get_value(:search_token)
363
- new_inserts = search_and_verify_res(params)
364
- inserts.merge!(new_inserts)
365
- verify_doc_result(@c, {:search => {'1'=>@product1,'4'=>product4},
366
- :cd => inserts,
367
- :search_errors => {}})
368
- verify_doc_result(@s, :md => inserts)
369
- @c.get_data(:search_page).size.should == 1
370
-
371
- # ack the last token
372
- params[:token] = @c.get_value(:search_token)
373
- @cs.params = params
374
- @cs.run.should == []
375
- verify_doc_result(@c, {:search => {},
337
+ it "should handle search with no params" do
338
+ @cs.p_size = @data.size
339
+ set_state('test_db_storage' => @data)
340
+ res = @cs.run
341
+ token = @c.get_value(:search_token)
342
+ res.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>token},
343
+ {'source'=>@s.name},{'count'=>@data.size},{'insert'=>@data}]
344
+ verify_doc_result(@c, {:search => @data,
345
+ :search_errors => {}})
346
+ end
347
+
348
+ it "should handle search with more than one page" do
349
+ @cs.p_size = 1
350
+ params = {:search => {'name' => 'iPhone'}}
351
+ product4 = {'name' => 'iPhone', 'price' => '99.99'}
352
+ @data['4'] = product4
353
+ set_state('test_db_storage' => @data)
354
+ inserts = search_and_verify_res(params)
355
+ verify_doc_result(@c, {:search => {'1'=>@product1,'4'=>product4},
356
+ :cd_size => '1',
357
+ :cd => @c.get_data(:search_page),
358
+ :search_errors => {}})
359
+ verify_doc_result(@s, {:md_size => '1',
360
+ :md => @c.get_data(:search_page)})
361
+
362
+ # ack the token
363
+ params[:token] = @c.get_value(:search_token)
364
+ new_inserts = search_and_verify_res(params)
365
+ inserts.merge!(new_inserts)
366
+ verify_doc_result(@c, {:search => {'1'=>@product1,'4'=>product4},
376
367
  :cd => inserts,
377
- :search_errors => {},
378
- :search_page => {},
379
- :search_token => nil})
380
- verify_doc_result(@s, :md => inserts)
381
- end
368
+ :search_errors => {}})
369
+ verify_doc_result(@s, :md => inserts)
370
+ @c.get_data(:search_page).size.should == 1
371
+
372
+ # ack the last token
373
+ params[:token] = @c.get_value(:search_token)
374
+ @cs.params = params
375
+ @cs.run.should == []
376
+ verify_doc_result(@c, {:search => {},
377
+ :cd => inserts,
378
+ :search_errors => {},
379
+ :search_page => {},
380
+ :search_token => nil})
381
+ verify_doc_result(@s, :md => inserts)
382
+ end
382
383
 
383
- it "should handle search with nil result" do
384
- params = {:search => {'name' => 'foo'}}
385
- set_state('test_db_storage' => @data)
386
- @cs.engine.params = params
387
- @cs.run.should == []
388
- verify_doc_result(@c, {:search => {},
389
- :search_errors => {}})
390
- end
384
+ it "should handle search with nil result" do
385
+ params = {:search => {'name' => 'foo'}}
386
+ set_state('test_db_storage' => @data)
387
+ @cs.engine.params = params
388
+ @cs.run.should == []
389
+ verify_doc_result(@c, {:search => {},
390
+ :search_errors => {}})
391
+ end
391
392
 
392
- it "should resend search by search_token" do
393
- @source = @s
394
- set_doc_state(@c, :search_page => {'1'=>@product1})
395
- token = @cs.client.compute_token(:search_token)
396
- @cs.params = {:resend => true,:token => token}
397
- @cs.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>token},{'source'=>@s.name},{'count'=>1},{'insert'=>{'1'=>@product1}}]
398
- verify_doc_result(@c, {:search_page => {'1'=>@product1},
399
- :search_errors => {},
400
- :search_token => token})
401
- end
393
+ it "should resend search by search_token" do
394
+ @source = @s
395
+ set_doc_state(@c, :search_page => {'1'=>@product1})
396
+ token = @cs.client.compute_token(:search_token)
397
+ @cs.params = {:resend => true,:token => token}
398
+ @cs.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'token'=>token},{'source'=>@s.name},{'count'=>1},{'insert'=>{'1'=>@product1}}]
399
+ verify_doc_result(@c, {:search_page => {'1'=>@product1},
400
+ :search_errors => {},
401
+ :search_token => token})
402
+ end
402
403
 
403
- it "should handle search ack" do
404
- set_doc_state(@c, {:search => {'1'=>@product1}})
405
- set_doc_state(@c, {:cd => {'1'=>@product1}})
406
- token = @cs.client.compute_token(:search_token)
407
- @cs.params = {:token => token}
408
- @cs.run.should == []
409
- verify_doc_result(@c, {:search => {},
410
- :search_errors => {},
411
- :search_token => nil})
412
- end
404
+ it "should handle search ack" do
405
+ set_doc_state(@c, {:search => {'1'=>@product1}})
406
+ set_doc_state(@c, {:cd => {'1'=>@product1}})
407
+ token = @cs.client.compute_token(:search_token)
408
+ @cs.params = {:token => token}
409
+ @cs.run.should == []
410
+ verify_doc_result(@c, {:search => {},
411
+ :search_errors => {},
412
+ :search_token => nil})
413
+ end
414
+
415
+ it "should return error on invalid ack token" do
416
+ set_doc_state(@c, {:search_page => {'1'=>@product1}})
417
+ set_doc_state(@c, :search_token => 'validtoken')
418
+ params = {:token => 'abc',
419
+ :search => {'name' => 'iPhone'}}
420
+ @cs.params = params
421
+ @cs.engine.params = params
422
+ @cs.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'source'=>@s.name},{'search-error'=>{'search-error'=>
423
+ {'message'=>"Search error - invalid token"}}}]
424
+ verify_doc_result(@c, {:search => {},
425
+ :search_errors => {},
426
+ :search_token => nil})
427
+ end
413
428
 
414
- it "should return error on invalid ack token" do
415
- set_doc_state(@c, {:search_page => {'1'=>@product1}})
416
- set_doc_state(@c, :search_token => 'validtoken')
417
- params = {:token => 'abc',
418
- :search => {'name' => 'iPhone'}}
419
- @cs.params = params
420
- @cs.engine.params = params
421
- @cs.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'source'=>@s.name},{'search-error'=>{'search-error'=>
422
- {'message'=>"Search error - invalid token"}}}]
423
- verify_doc_result(@c, {:search => {},
424
- :search_errors => {},
425
- :search_token => nil})
429
+ it "should handle search login error" do
430
+ @u.login = nil
431
+ msg = "Error logging in"
432
+ error = set_test_data('test_db_storage',@data,msg,'search error')
433
+ @cs.engine.params = {:search => {'name' => 'iPhone'}}
434
+ @cs.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'source'=>@s.name},
435
+ {'search-error'=>{'login-error'=>{'message'=>msg}}}]
436
+ verify_doc_result(@c, {:search => {},
437
+ :search_token => nil})
438
+ end
439
+ end
440
+
441
+ describe "page methods" do
442
+ it "should return diffs between master documents and client documents limited by page size" do
443
+ @s.put_data(:md,@data).should == true
444
+ @s.get_data(:md).should == @data
445
+ @s.put_value(:md_size,@data.size)
446
+
447
+ total_count, res = @sync_handler.compute_page
448
+ total_count.to_i.should == 3
449
+ res.each do |key, value|
450
+ @data.has_key?(key).should == true
451
+ @data[key].should == value
426
452
  end
427
453
 
428
- it "should handle search login error" do
429
- @u.login = nil
430
- msg = "Error logging in"
431
- error = set_test_data('test_db_storage',@data,msg,'search error')
432
- @cs.engine.params = {:search => {'name' => 'iPhone'}}
433
- @cs.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{'source'=>@s.name},
434
- {'search-error'=>{'login-error'=>{'message'=>msg}}}]
435
- verify_doc_result(@c, {:search => {},
436
- :search_token => nil})
454
+ @sync_handler.client.get_value(:cd_size).to_i.should == 0
455
+ @sync_handler.client.get_data(:page).each do |key, value|
456
+ @data.has_key?(key).should == true
457
+ @data[key].should == value
437
458
  end
438
459
  end
439
460
 
440
- describe "page methods" do
441
- it "should return diffs between master documents and client documents limited by page size" do
442
- @s.put_data(:md,@data).should == true
443
- @s.get_data(:md).should == @data
444
- @s.put_value(:md_size,@data.size)
445
-
446
- total_count, res = @sync_handler.compute_page
447
- total_count.to_i.should == 3
448
- res.each do |key, value|
449
- @data.has_key?(key).should == true
450
- @data[key].should == value
451
- end
452
-
453
- @sync_handler.client.get_value(:cd_size).to_i.should == 0
454
- @sync_handler.client.get_data(:page).each do |key, value|
455
- @data.has_key?(key).should == true
456
- @data[key].should == value
457
- end
458
- end
461
+ it "appends diff to the client document" do
462
+ @cd = {'3'=>@product3}
463
+ @c.put_data(:cd,@cd)
464
+ @c.get_data(:cd).should == @cd
465
+
466
+ @page = {'1'=>@product1,'2'=>@product2}
467
+ @expected = {'1'=>@product1,'2'=>@product2,'3'=>@product3}
459
468
 
460
- it "appends diff to the client document" do
461
- @cd = {'3'=>@product3}
462
- @c.put_data(:cd,@cd)
463
- @c.get_data(:cd).should == @cd
469
+ @c.put_data(:cd,@page,true).should == true
470
+ @c.get_data(:cd).should == @expected
471
+ end
464
472
 
465
- @page = {'1'=>@product1,'2'=>@product2}
466
- @expected = {'1'=>@product1,'2'=>@product2,'3'=>@product3}
473
+ it "should delete objects from the client document and return deleted objects in the page" do
474
+ @s.put_data(:md,@data).should == true
475
+ @s.get_data(:md).should == @data
467
476
 
468
- @c.put_data(:cd,@page,true).should == true
469
- @c.get_data(:cd).should == @expected
470
- end
477
+ @cd = {'1'=>@product1,'2'=>@product2,'3'=>@product3,'4'=>@product4}
478
+ @sync_handler.client.put_data(:cd,@cd)
479
+ @sync_handler.client.get_data(:cd).should == @cd
471
480
 
472
- it "should delete objects from the client document and return deleted objects in the page" do
473
- @s.put_data(:md,@data).should == true
474
- @s.get_data(:md).should == @data
475
-
476
- @cd = {'1'=>@product1,'2'=>@product2,'3'=>@product3,'4'=>@product4}
477
- @sync_handler.client.put_data(:cd,@cd)
478
- @sync_handler.client.get_data(:cd).should == @cd
479
-
480
- @expected = {'4'=>@product4}
481
- @sync_handler.send_new_page
482
- @sync_handler.client.get_data(:delete_page).should == @expected
483
- @sync_handler.client.get_data(:cd).should == @data
484
- end
485
-
486
- it "should resend page if page exists and no token provided" do
487
- expected = {'1'=>@product1}
488
- set_test_data('test_db_storage',{'1'=>@product1,'2'=>@product2,'4'=>@product4})
489
- params = {'name' => 'iPhone'}
490
- @sync_handler.engine.params = {:query => params}
491
- @sync_handler.run
492
- token = @c.get_value(:page_token)
493
- @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
494
- {"count"=>1}, {"progress_count"=>0},{"total_count"=>1},{'insert' => expected}]
495
- @sync_handler.params[:token] = token
496
- @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""},
497
- {"count"=>0}, {"progress_count"=>0}, {"total_count"=>1}, {}]
498
- @sync_handler.client.get_data(:page).should == {}
499
- @c.get_value(:page_token).should be_nil
500
- end
481
+ @expected = {'4'=>@product4}
482
+ @sync_handler.send_new_page
483
+ @sync_handler.client.get_data(:delete_page).should == @expected
484
+ @sync_handler.client.get_data(:cd).should == @data
485
+ end
486
+
487
+ it "should resend page if page exists and no token provided" do
488
+ expected = {'1'=>@product1}
489
+ set_test_data('test_db_storage',{'1'=>@product1,'2'=>@product2,'4'=>@product4})
490
+ params = {'name' => 'iPhone'}
491
+ @sync_handler.engine.params = {:query => params}
492
+ @sync_handler.run
493
+ token = @c.get_value(:page_token)
494
+ @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
495
+ {"count"=>1}, {"progress_count"=>0},{"total_count"=>1},{'insert' => expected}]
496
+ @sync_handler.params[:token] = token
497
+ @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""},
498
+ {"count"=>0}, {"progress_count"=>0}, {"total_count"=>1}, {}]
499
+ @sync_handler.client.get_data(:page).should == {}
500
+ @c.get_value(:page_token).should be_nil
501
+ end
501
502
 
502
- it "should send metadata with page" do
503
- expected = {'1'=>@product1}
504
- set_state('test_db_storage' => expected)
505
- metadata = "{\"foo\":\"bar\"}"
506
- mock_metadata_method([SampleAdapter]) do
507
- result = @sync_handler.run
508
- token = @c.get_value(:page_token)
509
- result.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
510
- {"count"=>1}, {"progress_count"=>0},{"total_count"=>1},
511
- {'metadata'=>metadata,'insert'=>expected}]
512
- @c.get_value(:metadata_page).should == metadata
513
- end
503
+ it "should send metadata with page" do
504
+ expected = {'1'=>@product1}
505
+ set_state('test_db_storage' => expected)
506
+ metadata = "{\"foo\":\"bar\"}"
507
+ mock_metadata_method([SampleAdapter]) do
508
+ result = @sync_handler.run
509
+ token = @c.get_value(:page_token)
510
+ result.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
511
+ {"count"=>1}, {"progress_count"=>0},{"total_count"=>1},
512
+ {'metadata'=>metadata,'insert'=>expected}]
513
+ @c.get_value(:metadata_page).should == metadata
514
514
  end
515
+ end
515
516
 
516
- it "should send metadata with resend page" do
517
- expected = {'1'=>@product1}
518
- set_state('test_db_storage' => expected)
519
- mock_metadata_method([SampleAdapter]) do
520
- result = @sync_handler.run
521
- token = @c.get_value(:page_token)
522
- @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
523
- {"count"=>1}, {"progress_count"=>0},{"total_count"=>1},
524
- {'metadata'=>"{\"foo\":\"bar\"}",'insert'=>expected}]
525
- end
517
+ it "should send metadata with resend page" do
518
+ expected = {'1'=>@product1}
519
+ set_state('test_db_storage' => expected)
520
+ mock_metadata_method([SampleAdapter]) do
521
+ result = @sync_handler.run
522
+ token = @c.get_value(:page_token)
523
+ @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
524
+ {"count"=>1}, {"progress_count"=>0},{"total_count"=>1},
525
+ {'metadata'=>"{\"foo\":\"bar\"}",'insert'=>expected}]
526
526
  end
527
+ end
527
528
 
528
- it "should ack metadata page with ack token" do
529
- expected = {'1'=>@product1}
530
- set_state('test_db_storage' => expected)
531
- mock_metadata_method([SampleAdapter]) do
532
- result = @sync_handler.run
533
- token = @c.get_value(:page_token)
534
- @sync_handler.params[:token] = token
535
- @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""},
536
- {"count"=>0}, {"progress_count"=>0},{"total_count"=>1},{}]
537
- @c.get_value(:metadata_page).should be_nil
538
- end
529
+ it "should ack metadata page with ack token" do
530
+ expected = {'1'=>@product1}
531
+ set_state('test_db_storage' => expected)
532
+ mock_metadata_method([SampleAdapter]) do
533
+ result = @sync_handler.run
534
+ token = @c.get_value(:page_token)
535
+ @sync_handler.params[:token] = token
536
+ @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""},
537
+ {"count"=>0}, {"progress_count"=>0},{"total_count"=>1},{}]
538
+ @c.get_value(:metadata_page).should be_nil
539
539
  end
540
+ end
540
541
 
541
- it "shouldn't send schema-changed if client schema sha1 is nil" do
542
- expected = {'1'=>@product1}
543
- set_state('test_db_storage' => expected)
544
- mock_schema_method([SampleAdapter]) do
545
- result = @sync_handler.run
546
- token = @c.get_value(:page_token)
547
- result.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
548
- {"count"=>1}, {"progress_count"=>0},{"total_count"=>1},{'insert'=>expected}]
549
- @c.get_value(:schema_sha1).should == sha1
550
- end
542
+ it "shouldn't send schema-changed if client schema sha1 is nil" do
543
+ expected = {'1'=>@product1}
544
+ set_state('test_db_storage' => expected)
545
+ mock_schema_method([SampleAdapter]) do
546
+ result = @sync_handler.run
547
+ token = @c.get_value(:page_token)
548
+ result.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
549
+ {"count"=>1}, {"progress_count"=>0},{"total_count"=>1},{'insert'=>expected}]
550
+ @c.get_value(:schema_sha1).should == sha1
551
551
  end
552
+ end
552
553
 
553
- it "should send schema-changed instead of page" do
554
- mock_schema_method([SampleAdapter]) do
555
- @c.put_value(:schema_sha1,'foo')
556
- result = @sync_handler.run
557
- token = @c.get_value(:page_token)
558
- result.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
559
- {"count"=>0}, {"progress_count"=>0},{"total_count"=>0},{'schema-changed'=>'true'}]
560
- @c.get_value(:schema_page).should == sha1
561
- @c.get_value(:schema_sha1).should == sha1
562
- end
554
+ it "should send schema-changed instead of page" do
555
+ mock_schema_method([SampleAdapter]) do
556
+ @c.put_value(:schema_sha1,'foo')
557
+ result = @sync_handler.run
558
+ token = @c.get_value(:page_token)
559
+ result.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
560
+ {"count"=>0}, {"progress_count"=>0},{"total_count"=>0},{'schema-changed'=>'true'}]
561
+ @c.get_value(:schema_page).should == sha1
562
+ @c.get_value(:schema_sha1).should == sha1
563
563
  end
564
+ end
564
565
 
565
- it "should re-send schema-changed if no token sent" do
566
- mock_schema_method([SampleAdapter]) do
567
- @c.put_value(:schema_sha1,'foo')
568
- result = @sync_handler.run
569
- token = @c.get_value(:page_token)
570
- @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
571
- {"count"=>0}, {"progress_count"=>0},{"total_count"=>0},{'schema-changed'=>'true'}]
572
- @c.get_value(:schema_page).should == sha1
573
- @c.get_value(:schema_sha1).should == sha1
574
- end
566
+ it "should re-send schema-changed if no token sent" do
567
+ mock_schema_method([SampleAdapter]) do
568
+ @c.put_value(:schema_sha1,'foo')
569
+ result = @sync_handler.run
570
+ token = @c.get_value(:page_token)
571
+ @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>token},
572
+ {"count"=>0}, {"progress_count"=>0},{"total_count"=>0},{'schema-changed'=>'true'}]
573
+ @c.get_value(:schema_page).should == sha1
574
+ @c.get_value(:schema_sha1).should == sha1
575
575
  end
576
+ end
576
577
 
577
- it "should ack schema-changed with token" do
578
- mock_schema_method([SampleAdapter]) do
579
- @c.put_value(:schema_sha1,'foo')
580
- result = @sync_handler.run
581
- token = @c.get_value(:page_token)
582
- @sync_handler.params[:token] = token
583
- @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""},
584
- {"count"=>0}, {"progress_count"=>0},{"total_count"=>0},{}]
585
- @c.get_value(:schema_page).should be_nil
586
- @c.get_value(:schema_sha1).should == sha1
587
- end
578
+ it "should ack schema-changed with token" do
579
+ mock_schema_method([SampleAdapter]) do
580
+ @c.put_value(:schema_sha1,'foo')
581
+ result = @sync_handler.run
582
+ token = @c.get_value(:page_token)
583
+ @sync_handler.params[:token] = token
584
+ @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""},
585
+ {"count"=>0}, {"progress_count"=>0},{"total_count"=>0},{}]
586
+ @c.get_value(:schema_page).should be_nil
587
+ @c.get_value(:schema_sha1).should == sha1
588
588
  end
589
+ end
589
590
 
590
- it "should expire bulk data if schema changed" do
591
- docname = bulk_data_docname(@a.id,@u.id)
592
- data = BulkData.create(:name => docname,
593
- :state => :inprogress,
594
- :app_id => @a.id,
595
- :user_id => @u.id,
596
- :sources => [@s_fields[:name]])
597
- data.refresh_time = Time.now.to_i + 600
598
- mock_schema_method([SampleAdapter]) do
599
- @c.put_value(:schema_sha1,'foo')
600
- result = @sync_handler.run
601
- token = @c.get_value(:page_token)
602
- @sync_handler.params[:token] = token
603
- @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""},
604
- {"count"=>0}, {"progress_count"=>0},{"total_count"=>0},{}]
605
- @c.get_value(:schema_page).should be_nil
606
- @c.get_value(:schema_sha1).should == sha1
607
- data = BulkData.load(docname)
608
- data.refresh_time.should <= Time.now.to_i
609
- end
591
+ it "should expire bulk data if schema changed" do
592
+ docname = bulk_data_docname(@a.id,@u.id)
593
+ data = BulkData.create(:name => docname,
594
+ :state => :inprogress,
595
+ :app_id => @a.id,
596
+ :user_id => @u.id,
597
+ :sources => [@s_fields[:name]])
598
+ data.refresh_time = Time.now.to_i + 600
599
+ mock_schema_method([SampleAdapter]) do
600
+ @c.put_value(:schema_sha1,'foo')
601
+ result = @sync_handler.run
602
+ token = @c.get_value(:page_token)
603
+ @sync_handler.params[:token] = token
604
+ @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""},
605
+ {"count"=>0}, {"progress_count"=>0},{"total_count"=>0},{}]
606
+ @c.get_value(:schema_page).should be_nil
607
+ @c.get_value(:schema_sha1).should == sha1
608
+ data = BulkData.load(docname)
609
+ data.refresh_time.should <= Time.now.to_i
610
610
  end
611
611
  end
612
612
  end
613
+
613
614
  def receive_and_send_cud(operation)
614
615
  msg = "Error #{operation} record"
615
616
  op_data = {operation=>{ERROR=>{'an_attribute'=>msg,'name'=>'wrongname'}}}
616
617
  @cud_handler.operations = [operation]
617
618
  @cud_handler.engine.operations = [operation]
618
619
  @cud_handler.params = op_data
619
- @cud_handler.run
620
+ @cud_handler.run
620
621
  if operation == 'update'
621
622
  @sync_handler.run.should == [{'version'=>Rhoconnect::SYNC_VERSION},{"token"=>""}, {"count"=>0}, {"progress_count"=>0}, {"total_count"=>1},
622
623
  {