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
@@ -6,151 +6,157 @@ describe "Rhoconnect::Controller::JsBase" do
6
6
  include Rack::Test::Methods
7
7
  include Rhoconnect
8
8
 
9
- it_behaves_like "SharedRhoconnectHelper", :rhoconnect_data => true do
10
- def app
11
- @app = Rack::URLMap.new Rhoconnect.url_map
12
- end
9
+ include_examples "SharedRhoconnectHelper", :rhoconnect_data => true
10
+
11
+ def app
12
+ @app = Rack::URLMap.new Rhoconnect.url_map
13
+ end
13
14
 
14
- def remove_application_controller
15
- Object.send(:remove_const, :ApplicationController) rescue nil
15
+ def remove_application_controller
16
+ Object.send(:remove_const, :ApplicationController) rescue nil
17
+ end
18
+
19
+ after(:all) do
20
+ Rhoconnect.use_node = false
21
+ end
22
+
23
+ def bootstrap_rhoconnect(jsapp = false)
24
+ Rhoconnect::Server.set :environment, :test
25
+ Rhoconnect::Server.set :secret, "secure!"
26
+ Rhoconnect.use_node = true
27
+ if jsapp
28
+ Rhoconnect.bootstrap(get_jstestapp_path)
29
+ else
30
+ Rhoconnect.bootstrap(get_testapp_path)
31
+ end
32
+ # reload ruby controllers
33
+ Dir[File.join(Rhoconnect.app_directory,'controllers','ruby','*.rb')].each do |controller_file|
34
+ load controller_file
35
+ end
36
+ # reload ruby models
37
+ Dir[File.join(Rhoconnect.app_directory,'models','ruby','*.rb')].each do |model_file|
38
+ load model_file
16
39
  end
40
+ end
17
41
 
42
+ describe "ApplicationController" do
18
43
  after(:all) do
19
- Rhoconnect.use_node = false
20
- end
21
-
22
- def bootstrap_rhoconnect(jsapp = false)
23
- Rhoconnect::Server.set :environment, :test
24
- Rhoconnect::Server.set :secret, "secure!"
25
- Rhoconnect.use_node = true
26
- if jsapp
27
- Rhoconnect.bootstrap(get_jstestapp_path)
28
- else
29
- Rhoconnect.bootstrap(get_testapp_path)
30
- end
31
- # reload ruby controllers
32
- Dir[File.join(Rhoconnect.app_directory,'controllers','ruby','*.rb')].each do |controller_file|
33
- load controller_file
34
- end
35
- # reload ruby models
36
- Dir[File.join(Rhoconnect.app_directory,'models','ruby','*.rb')].each do |model_file|
37
- load model_file
38
- end
39
- end
40
-
41
- describe "ApplicationController" do
42
- after(:each) do
43
- Rhoconnect.remove_from_url_map(ApplicationController)
44
- remove_application_controller
45
- end
46
-
47
- it "should call Store api in ApplicationController" do
48
- Rhoconnect.remove_from_url_map(ApplicationController)
49
- remove_application_controller
50
- bootstrap_rhoconnect(true)
51
- do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => 'storeapitest', "password" => 'testpass'
52
- Store.get_value('loginkey').should == 'storeapitest'
53
- end
54
- end
55
-
56
- describe "Named Controller" do
57
-
58
- before(:each) do
59
- bootstrap_rhoconnect
60
- do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => @u.login, "password" => 'testpass'
61
- end
62
-
63
- it "should get / of js controller with route overridden" do
64
- get '/app/v1/JsSample', {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
65
- last_response.should be_ok
66
- body = JSON.parse(last_response.body)
67
- body[2]['count'].should == 1
68
- body.last['insert'].should == {'1' => {'name' => 'iPhone'}}
69
- end
70
-
71
- it "should get /custom_route of js controller" do
72
- get '/app/v1/JsSample/custom_route', {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
73
- last_response.body.should == 'testuser'
74
- end
75
-
76
- it "should get /source from custom route" do
77
- get '/app/v1/JsSample/custom_route2', {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
78
- last_response.body.should == 'JsSample'
79
- end
80
-
81
- it "should get stash_result from js model" do
82
- pending "stash_result not supported yet"
83
- get '/app/v1/JsSample/custom_route3',{}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
84
- res = JSON.parse(last_response.body)
85
- res[2]["count"].should == 1
86
- end
87
-
88
- it "should register sync route" do
89
- get '/app/v1/Sample2', {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
90
- res = JSON.parse(last_response.body)
91
- res[2]["count"].should == 1
92
- end
93
-
94
- it "should post to js controller" do
95
- hsh = {'1'=>{'name'=>'testname','price'=>'$199'}}
96
- post '/app/v1/JsSample',hsh, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
97
- last_response.should be_ok
98
- end
99
-
100
- it "should put to js controller" do
101
- put '/app/v1/JsSample/2', {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
102
- last_response.body.should == ''
103
- end
104
-
105
- it "should delete to js controller" do
106
- @c1 = Client.create({:user_id => @u.id,:app_id => @a.id},{:source_name => 'JsSample'})
107
- set_doc_state(@c1, :cd => @data)
108
- delete '/app/v1/JsSample/2', {}, {Rhoconnect::CLIENT_ID_HEADER => @c1.id}
109
- last_response.should be_ok
110
- end
111
-
112
- it "should call route that overrides default option" do
113
- get '/app/v1/JsSample/no_client_route', {}
114
- last_response.should be_ok
115
- last_response.body.should == 'no client required!'
116
- end
117
-
118
- it "should upload blob in multipart post" do
119
- file1,file2 = 'upload1.txt'
120
- @product1['txtfile-rhoblob'] = file1
121
- @product1['_id'] = 'tempobj1'
122
- cud = {'create'=>{'1'=>{'name'=>'hello'}},
123
- :blob_fields => ['txtfile-rhoblob']}.to_json
124
- post "/app/#{Rhoconnect::API_VERSION}/JsSample",
125
- {:cud => cud,'txtfile-rhoblob-1' =>
126
- Rack::Test::UploadedFile.new(File.join(File.dirname(__FILE__),'..','testdata',file1), "application/octet-stream")},
127
- {Rhoconnect::CLIENT_ID_HEADER => @c.id}
128
- last_response.should be_ok
129
- get "/app/#{Rhoconnect::API_VERSION}/JsSample", {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
130
- json = JSON.parse(last_response.body)
131
- json[5]['links'].should == { "1" => { "l" => "blob_created" } }
132
- json[5]['delete'].should == { "blob_created" => { "name" => "hello", "txtfile-rhoblob" => "blob_created" } }
133
- end
134
-
135
- it "should push_objects to js controller" do
136
- s = Source.load('JsSample', @s_params)
137
- data = {'1' => @product1, '2' => @product2, '3' => @product3}
138
- post "/app/#{Rhoconnect::API_VERSION}/JsSample/push_objects",
139
- {:user_id => @u.id, :objects => data}, {Rhoconnect::API_TOKEN_HEADER => @api_token}
140
- last_response.should be_ok
141
- verify_doc_result(s, {:md => data, :md_size=>'3'})
142
- end
143
-
144
- it "should push_deletes to js controller" do
145
- data = {'1' => @product1, '2' => @product2, '3' => @product3}
146
- s = Source.load('JsSample',@s_params)
147
- set_doc_state(s, {:md => data, :md_size => '3'})
148
- data.delete('2')
149
- post "/app/#{Rhoconnect::API_VERSION}/JsSample/push_deletes",
150
- {:user_id => @u.id, :objects => ['2']}, {Rhoconnect::API_TOKEN_HEADER => @api_token}
151
- last_response.should be_ok
152
- verify_doc_result(s, {:md => data, :md_size=>'2'})
153
- end
44
+ Rhoconnect.remove_from_url_map(ApplicationController)
45
+ remove_application_controller
46
+ end
47
+
48
+ it "should call Store api in ApplicationController" do
49
+ Rhoconnect.remove_from_url_map(ApplicationController)
50
+ remove_application_controller
51
+ bootstrap_rhoconnect(true)
52
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => 'storeapitest', "password" => 'testpass'
53
+ Store.get_value('loginkey').should == 'storeapitest'
54
+ end
55
+
56
+ it "should use user defined :node_channel_timeout value for test environment" do
57
+ Rhoconnect.remove_from_url_map(ApplicationController)
58
+ remove_application_controller
59
+ bootstrap_rhoconnect(true)
60
+ Rhoconnect::NodeChannel.timeout.should == 60
61
+ end
62
+ end
63
+
64
+ describe "Named Controller" do
65
+ before(:each) do
66
+ bootstrap_rhoconnect
67
+ do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => @u.login, "password" => 'testpass'
68
+ end
69
+
70
+ it "should get / of js controller with route overridden" do
71
+ get '/app/v1/JsSample', {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
72
+ last_response.should be_ok
73
+ body = JSON.parse(last_response.body)
74
+ body[2]['count'].should == 1
75
+ body.last['insert'].should == {'1' => {'name' => 'iPhone'}}
76
+ end
77
+
78
+ it "should get /custom_route of js controller" do
79
+ get '/app/v1/JsSample/custom_route', {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
80
+ last_response.body.should == 'testuser'
81
+ end
82
+
83
+ it "should get /source from custom route" do
84
+ get '/app/v1/JsSample/custom_route2', {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
85
+ last_response.body.should == 'JsSample'
86
+ end
87
+
88
+ it "should get stash_result from js model" do
89
+ pending "stash_result not supported yet"
90
+ get '/app/v1/JsSample/custom_route3',{}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
91
+ res = JSON.parse(last_response.body)
92
+ res[2]["count"].should == 1
93
+ end
94
+
95
+ it "should register sync route" do
96
+ get '/app/v1/Sample2', {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
97
+ res = JSON.parse(last_response.body)
98
+ res[2]["count"].should == 1
99
+ end
100
+
101
+ it "should post to js controller" do
102
+ hsh = {'1'=>{'name'=>'testname','price'=>'$199'}}
103
+ post '/app/v1/JsSample',hsh, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
104
+ last_response.should be_ok
105
+ end
106
+
107
+ it "should put to js controller" do
108
+ put '/app/v1/JsSample/2', {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
109
+ last_response.body.should == ''
110
+ end
111
+
112
+ it "should delete to js controller" do
113
+ @c1 = Client.create({:user_id => @u.id,:app_id => @a.id},{:source_name => 'JsSample'})
114
+ set_doc_state(@c1, :cd => @data)
115
+ delete '/app/v1/JsSample/2', {}, {Rhoconnect::CLIENT_ID_HEADER => @c1.id}
116
+ last_response.should be_ok
117
+ end
118
+
119
+ it "should call route that overrides default option" do
120
+ get '/app/v1/JsSample/no_client_route', {}
121
+ last_response.should be_ok
122
+ last_response.body.should == 'no client required!'
123
+ end
124
+
125
+ it "should upload blob in multipart post" do
126
+ file1,file2 = 'upload1.txt'
127
+ @product1['txtfile-rhoblob'] = file1
128
+ @product1['_id'] = 'tempobj1'
129
+ cud = {'create'=>{'1'=>{'name'=>'hello'}},
130
+ :blob_fields => ['txtfile-rhoblob']}.to_json
131
+ post "/app/#{Rhoconnect::API_VERSION}/JsSample",
132
+ {:cud => cud,'txtfile-rhoblob-1' =>
133
+ Rack::Test::UploadedFile.new(File.join(File.dirname(__FILE__),'..','testdata',file1), "application/octet-stream")},
134
+ {Rhoconnect::CLIENT_ID_HEADER => @c.id}
135
+ last_response.should be_ok
136
+ get "/app/#{Rhoconnect::API_VERSION}/JsSample", {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
137
+ json = JSON.parse(last_response.body)
138
+ json[5]['links'].should == { "1" => { "l" => "blob_created" } }
139
+ json[5]['delete'].should == { "blob_created" => { "name" => "hello", "txtfile-rhoblob" => "blob_created" } }
140
+ end
141
+
142
+ it "should push_objects to js controller" do
143
+ s = Source.load('JsSample', @s_params)
144
+ data = {'1' => @product1, '2' => @product2, '3' => @product3}
145
+ post "/app/#{Rhoconnect::API_VERSION}/JsSample/push_objects",
146
+ {:user_id => @u.id, :objects => data}, {Rhoconnect::API_TOKEN_HEADER => @api_token}
147
+ last_response.should be_ok
148
+ verify_doc_result(s, {:md => data, :md_size=>'3'})
149
+ end
150
+
151
+ it "should push_deletes to js controller" do
152
+ data = {'1' => @product1, '2' => @product2, '3' => @product3}
153
+ s = Source.load('JsSample',@s_params)
154
+ set_doc_state(s, {:md => data, :md_size => '3'})
155
+ data.delete('2')
156
+ post "/app/#{Rhoconnect::API_VERSION}/JsSample/push_deletes",
157
+ {:user_id => @u.id, :objects => ['2']}, {Rhoconnect::API_TOKEN_HEADER => @api_token}
158
+ last_response.should be_ok
159
+ verify_doc_result(s, {:md => data, :md_size=>'2'})
154
160
  end
155
161
  end
156
162
  end
data/spec/doc/doc_spec.rb CHANGED
@@ -5,11 +5,11 @@ require 'rspec/autorun'
5
5
  require File.join(File.dirname(__FILE__),'..','spec_helper')
6
6
  require File.join(File.dirname(__FILE__),'..','..','lib','rhoconnect','server.rb')
7
7
 
8
- describe "Protocol" do
8
+ describe "Protocol" do
9
9
  include Rack::Test::Methods
10
- include Rhoconnect
10
+ include Rhoconnect
11
11
  include TestHelpers
12
-
12
+
13
13
  let(:test_app_name) { 'application' }
14
14
 
15
15
  let(:source) { 'Product' }
@@ -17,10 +17,10 @@ describe "Protocol" do
17
17
  let(:client_id) { 1 }
18
18
  let(:product1) { {'name' => 'iPhone', 'brand' => 'Apple', 'price' => '199.99'} }
19
19
  let(:product2) { {'name' => 'G2', 'brand' => 'Android', 'price' => '99.99'} }
20
- let(:product3) { {'name' => 'Fuze', 'brand' => 'HTC', 'price' => '299.99'} }
20
+ let(:product3) { {'name' => 'Fuze', 'brand' => 'HTC', 'price' => '299.99'} }
21
21
  let(:product4) { {'name' => 'Droid', 'brand' => 'Android', 'price' => '249.99'} }
22
22
  let(:products) { {'1' => product1,'2' => product2,'3'=> product3} }
23
-
23
+
24
24
  before(:all) do
25
25
  Rhoconnect.bootstrap(get_testapp_path) do |rhoconnect|
26
26
  rhoconnect.vendor_directory = File.join(File.dirname(__FILE__),'..','vendor')
@@ -31,21 +31,20 @@ describe "Protocol" do
31
31
  Store.create
32
32
  Store.flush_all
33
33
  end
34
-
35
- # it_should_behave_like "DBObjectsHelper"
34
+
36
35
  before(:each) do
37
36
  @a_fields = { :name => test_app_name }
38
37
  # @a = App.create(@a_fields)
39
38
  @a = (App.load(test_app_name) || App.create(@a_fields))
40
39
  @u_fields = {:login => 'testuser'}
41
- @u = User.create(@u_fields)
40
+ @u = User.create(@u_fields)
42
41
  @u.password = 'testpass'
43
42
  @c_fields = {
44
43
  :device_type => 'Apple',
45
44
  :device_pin => 'abcd',
46
45
  :device_port => '3333',
47
46
  :user_id => @u.id,
48
- :app_id => @a.id
47
+ :app_id => @a.id
49
48
  }
50
49
  @s_fields = {
51
50
  :name => 'SampleAdapter',
@@ -70,9 +69,9 @@ describe "Protocol" do
70
69
  Source.update_associations(@a.sources)
71
70
  @a.users << @u.id
72
71
  end
73
-
72
+
74
73
  Rhoconnect.log_disabled = true
75
-
74
+
76
75
  before(:each) do
77
76
  $rand_id ||= 0
78
77
  $content_table ||= []
@@ -85,58 +84,58 @@ describe "Protocol" do
85
84
  Rhoconnect::Server.set :run, false
86
85
  Rhoconnect::Server.set :secret, "secure!"
87
86
  end
88
-
87
+
89
88
  before(:each) do
90
89
  do_post "/#{@a.name}/clientlogin", "login" => @u.login, "password" => 'testpass'
91
90
  @title,@description = nil,nil
92
91
  $rand_id += 1
93
92
  end
94
-
93
+
95
94
  def app
96
95
  @app ||= Rhoconnect::Server.new
97
96
  end
98
-
97
+
99
98
  after(:each) do
100
99
  #_print_messages
101
100
  _print_markdown if @title and @description
102
101
  end
103
-
102
+
104
103
  after(:all) do
105
104
  _write_doc if $content and $content.length > 0
106
105
  end
107
-
106
+
108
107
  it "clientlogin" do
109
108
  do_post "/#{@a.name}/clientlogin", "login" => @u.login, "password" => 'testpass'
110
109
  @title,@description = 'clientlogin', 'authenticate client'
111
110
  end
112
-
111
+
113
112
  it "wrong login or password clientlogin" do
114
113
  do_post "/#{@a.name}/clientlogin", "login" => @u.login, "password" => 'wrongpass'
115
114
  @title,@description = 'clientlogin', 'login failure'
116
115
  end
117
-
118
- it "clientcreate" do
116
+
117
+ it "clientcreate" do
119
118
  get "/#{@a.name}/clientcreate"
120
- @title,@description = 'clientcreate', 'create client id'
119
+ @title,@description = 'clientcreate', 'create client id'
121
120
  end
122
-
123
- it "clientcreate" do
121
+
122
+ it "clientcreate" do
124
123
  get "/#{@a.name}/clientcreate?device_type=iPhone&device_pin=abcd&device_port=3333"
125
- @title,@description = 'clientcreate-and-register', 'create client id with register params'
124
+ @title,@description = 'clientcreate-and-register', 'create client id with register params'
126
125
  end
127
-
126
+
128
127
  it "clientregister" do
129
- do_post "/#{@a.name}/clientregister",
130
- "device_type" => "iPhone", "device_pin" => "abcd",
128
+ do_post "/#{@a.name}/clientregister",
129
+ "device_type" => "iPhone", "device_pin" => "abcd",
131
130
  "device_port" => "3333", "client_id" => @c.id
132
- @title,@description = 'clientregister', 'register client with params'
131
+ @title,@description = 'clientregister', 'register client with params'
133
132
  end
134
-
133
+
135
134
  it "clientreset" do
136
135
  get "/#{@a.name}/clientreset", :client_id => @c.id
137
136
  @title,@description = 'clientreset', 'reset client database'
138
137
  end
139
-
138
+
140
139
  ['create','update','delete'].each do |operation|
141
140
  it "client #{operation} object(s)" do
142
141
  params = {operation=>{'1'=>product1},
@@ -146,7 +145,7 @@ describe "Protocol" do
146
145
  @title,@description = operation, "#{operation} object(s)"
147
146
  end
148
147
  end
149
-
148
+
150
149
  it "client creates blobs" do
151
150
  body = <<eol
152
151
  <pre>------------XnJLe9ZIbbGUYtzPQJ16u1
@@ -167,7 +166,7 @@ Content-Disposition: form-data; name="cud"
167
166
  {"client_id":"278c76a7ab2a4f64ba804c1aa22504f3","source_name":"SampleAdapter","version":3,"create":{"1":{"price":"199.99","brand":"Apple","name":"iPhone","txtfile-rhoblob":"upload1.txt","_id":"tempobj1"},"2":{"price":"99.99","brand":"Android","name":"G2","txtfile-rhoblob":"upload2.txt","_id":"tempobj2"}},"blob_fields":["txtfile-rhoblob"]}
168
167
  ------------XnJLe9ZIbbGUYtzPQJ16u1--</pre>
169
168
  eol
170
- @title,@description = 'create', 'client creates blobs'
169
+ @title,@description = 'create', 'client creates blobs'
171
170
  $content_table << {$rand_id => "#{@title} - #{@description}"}
172
171
  data = {
173
172
  :title => @title,
@@ -187,9 +186,9 @@ eol
187
186
  :res_body => ''
188
187
  }
189
188
  $content << data
190
- @title,@description = nil,nil
189
+ @title,@description = nil,nil
191
190
  end
192
-
191
+
193
192
  it "client create,update,delete objects" do
194
193
  params = {'create'=>{'1'=>product1},
195
194
  'update'=>{'2'=>product2},
@@ -199,7 +198,7 @@ eol
199
198
  do_post "/#{@a.name}", params
200
199
  @title,@description = 'create-update-delete', 'create,update,delete object(s)'
201
200
  end
202
-
201
+
203
202
  it "server sends link created object" do
204
203
  product4['link'] = 'test link'
205
204
  params = {'create'=>{'4'=>product4},
@@ -210,25 +209,25 @@ eol
210
209
  :version => Rhoconnect::SYNC_VERSION
211
210
  @title,@description = 'create-with-link', 'send link for created object'
212
211
  end
213
-
212
+
214
213
  it "server send source query error to client" do
215
214
  set_test_data('test_db_storage',{},"Error during query",'query error')
216
215
  get "/#{@a.name}",:client_id => @c.id,:source_name => @s.name,:version => Rhoconnect::SYNC_VERSION
217
216
  @title,@description = 'query-error', 'send query error'
218
217
  end
219
-
218
+
220
219
  it "server send source login error to client" do
221
220
  @u.login = nil
222
221
  get "/#{@a.name}",:client_id => @c.id,:source_name => @s.name,:version => Rhoconnect::SYNC_VERSION
223
222
  @title,@description = 'login-error', 'send login error'
224
223
  end
225
-
224
+
226
225
  it "server send source logoff error to client" do
227
226
  set_test_data('test_db_storage',{},"Error logging off",'logoff error')
228
227
  get "/#{@a.name}",:client_id => @c.id,:source_name => @s.name,:version => Rhoconnect::SYNC_VERSION
229
228
  @title,@description = 'logoff-error', 'send logoff error'
230
229
  end
231
-
230
+
232
231
  ['create','update','delete'].each do |operation|
233
232
  it "client #{operation} object(s) with error" do
234
233
  if operation == 'update'
@@ -244,7 +243,7 @@ eol
244
243
  @title,@description = "#{operation}-error", "send #{operation} error"
245
244
  end
246
245
  end
247
-
246
+
248
247
  it "server send insert objects to client" do
249
248
  cs = ClientSync.new(@s,@c,1)
250
249
  data = {'1'=>product1,'2'=>product2}
@@ -252,7 +251,7 @@ eol
252
251
  get "/#{@a.name}",:client_id => @c.id,:source_name => @s.name,:version => Rhoconnect::SYNC_VERSION
253
252
  @title,@description = 'insert objects', 'send insert objects'
254
253
  end
255
-
254
+
256
255
  it "server send metadata to client" do
257
256
  mock_metadata_method([SampleAdapter]) do
258
257
  cs = ClientSync.new(@s,@c,1)
@@ -261,8 +260,8 @@ eol
261
260
  end
262
261
  @title,@description = 'metadata', 'send metadata'
263
262
  end
264
-
265
- it "server send delete objects to client" do
263
+
264
+ it "server send delete objects to client" do
266
265
  cs = ClientSync.new(@s,@c,1)
267
266
  data = {'1'=>product1,'2'=>product2}
268
267
  set_test_data('test_db_storage',data)
@@ -274,8 +273,8 @@ eol
274
273
  :version => Rhoconnect::SYNC_VERSION
275
274
  @title,@description = 'delete objects', 'send delete objects'
276
275
  end
277
-
278
- it "server send insert,delete objects to client" do
276
+
277
+ it "server send insert,delete objects to client" do
279
278
  cs = ClientSync.new(@s,@c,1)
280
279
  data = {'1'=>product1,'2'=>product2}
281
280
  set_test_data('test_db_storage',data)
@@ -287,7 +286,7 @@ eol
287
286
  :version => Rhoconnect::SYNC_VERSION
288
287
  @title,@description = 'insert-delete objects', 'send insert and delete objects'
289
288
  end
290
-
289
+
291
290
  it "server send search results" do
292
291
  sources = [{:name=>'SampleAdapter'}]
293
292
  Store.put_data('test_db_storage',products)
@@ -296,7 +295,7 @@ eol
296
295
  get "/#{@a.name}/search",params
297
296
  @title,@description = 'search result', 'send search results'
298
297
  end
299
-
298
+
300
299
  it "should get search results with error" do
301
300
  sources = [{:name=>'SampleAdapter'}]
302
301
  msg = "Error during search"
@@ -306,7 +305,7 @@ eol
306
305
  get "/#{@a.name}/search",params
307
306
  @title,@description = 'search error', 'send search error'
308
307
  end
309
-
308
+
310
309
  it "should get multiple source search results" do
311
310
  Store.put_data('test_db_storage',products)
312
311
  sources = [{:name=>'SimpleAdapter'},{:name=>'SampleAdapter'}]
@@ -314,8 +313,8 @@ eol
314
313
  :version => Rhoconnect::SYNC_VERSION}
315
314
  get "/#{@a.name}/search",params
316
315
  @title,@description = 'multi source search', 'send multiple sources in search results'
317
- end
318
-
316
+ end
317
+
319
318
  it "should ack multiple sources search results" do
320
319
  set_test_data('test_db_storage',products)
321
320
  sources = [{'name'=>'SimpleAdapter'},{'name'=>'SampleAdapter'}]
@@ -332,7 +331,7 @@ eol
332
331
  get "/#{@a.name}/search",params
333
332
  @title,@description = 'multi source search ack', 'acknowledge search result on multiple sources'
334
333
  end
335
-
334
+
336
335
  private
337
336
  def _print_markdown
338
337
  $content_table << {$rand_id => "#{@title} - #{@description}"}
@@ -356,7 +355,7 @@ eol
356
355
  last_request.body.rewind
357
356
  $content << data
358
357
  end
359
-
358
+
360
359
  def _write_doc
361
360
  File.open(File.join('doc','protocol.html'),'w') do |file|
362
361
  header = ERB.new(File.read(File.join(File.dirname(__FILE__),'header.html'))).result(binding)
@@ -369,7 +368,7 @@ eol
369
368
  file.write(footer)
370
369
  end
371
370
  end
372
-
371
+
373
372
  def _get_header_text(header)
374
373
  header ? header : '&nbsp;'
375
374
  end