rhoconnect 4.0.0 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +8 -0
- data/Gemfile.lock +16 -18
- data/Rakefile +4 -4
- data/bench/benchapp/Rakefile +10 -16
- data/bench/blobapp/Rakefile +9 -18
- data/bench/distr_bench/distr_bench_main +1 -1
- data/bench/distr_bench/run_distr_client.sh +2 -1
- data/bench/lib/bench.rb +1 -1
- data/bench/lib/bench/cli.rb +2 -0
- data/bench/lib/bench/distr_runner.rb +5 -5
- data/bench/lib/bench/test_data.rb +2 -2
- data/bench/scripts/test_query_script.rb +7 -6
- data/bin/rhoconnect +2 -0
- data/bin/rhoconnect-benchmark +13 -1
- data/commands/redis/redis_download.rb +1 -1
- data/commands/rhoconnect/routes.rb +12 -0
- data/doc/authentication.txt +1 -1
- data/doc/command-line.txt +1 -1
- data/doc/deploying.txt +2 -2
- data/doc/migration.txt +21 -12
- data/doc/push-client-setup-android.txt +1 -1
- data/doc/push-client-setup-rps.txt +3 -1
- data/doc/supported-platforms.txt +14 -7
- data/examples/simple/Rakefile +0 -1
- data/generators/rhoconnect.rb +15 -3
- data/generators/templates/application/Rakefile +1 -2
- data/js-adapters/ballroom.js +36 -9
- data/js-adapters/node.rb +8 -2
- data/js-adapters/node_channel.rb +10 -6
- data/js-adapters/rhoconnect_helpers.js +4 -0
- data/js-adapters/router.js +5 -3
- data/js-adapters/server.js +1 -1
- data/lib/rhoconnect.rb +9 -5
- data/lib/rhoconnect/api_token.rb +1 -2
- data/lib/rhoconnect/client.rb +1 -1
- data/lib/rhoconnect/controller/js_base.rb +7 -2
- data/lib/rhoconnect/model/base.rb +1 -1
- data/lib/rhoconnect/predefined_adapters/controllers/js/rho_internal_js_bench_adapter_controller.js +12 -0
- data/lib/rhoconnect/predefined_adapters/models/js/rho_internal_js_bench_adapter.js +107 -0
- data/lib/rhoconnect/source.rb +5 -0
- data/lib/rhoconnect/store.rb +3 -0
- data/lib/rhoconnect/version.rb +1 -1
- data/lib/rhoconnect/web-console/server.rb +1 -2
- data/rhoconnect.gemspec +0 -1
- data/spec/apps/jstestapp/Rakefile +1 -0
- data/spec/apps/jstestapp/config.ru +16 -0
- data/spec/apps/jstestapp/controllers/js/application_controller.js +18 -0
- data/spec/apps/jstestapp/settings/license.key +1 -0
- data/spec/apps/jstestapp/settings/settings.yml +13 -0
- data/spec/controllers/js_base_spec.rb +129 -97
- data/spec/predefined_adapters/rho_internal_bench_adapter_controller_js_spec.rb +111 -0
- data/spec/predefined_adapters/rho_internal_js_bench_adapter_js_spec.rb +44 -0
- data/spec/spec_helper.rb +4 -0
- data/tasks/redis.rake +9 -127
- metadata +19 -20
- data/lib/rhoconnect/tasks.rb +0 -315
data/js-adapters/server.js
CHANGED
data/lib/rhoconnect.rb
CHANGED
@@ -2,6 +2,7 @@ require 'redis'
|
|
2
2
|
require 'cgi'
|
3
3
|
require 'json'
|
4
4
|
require 'base64'
|
5
|
+
require 'securerandom'
|
5
6
|
require 'zip/zip'
|
6
7
|
require 'yaml'
|
7
8
|
require 'rhoconnect/license'
|
@@ -55,7 +56,7 @@ module Rhoconnect
|
|
55
56
|
:log_disabled, :license, :bulk_sync_poll_interval, :stats, :appserver, :api_token,
|
56
57
|
:raise_on_expired_lock, :lock_duration, :cookie_expire, :predefined_sources,
|
57
58
|
:connection_pool_size, :connection_pool_timeout, :redis_timeout, :store_key_ttl,
|
58
|
-
:disable_resque_console, :disable_rc_console, :use_node, :restart_node_on_error
|
59
|
+
:disable_resque_console, :disable_rc_console, :use_node, :restart_node_on_error, :redis_url
|
59
60
|
end
|
60
61
|
|
61
62
|
# this mixin adds the controller into the Application's URL Map
|
@@ -69,10 +70,13 @@ module Rhoconnect
|
|
69
70
|
# Rhoconnect API version
|
70
71
|
def add_to_url_map(subclass)
|
71
72
|
@controllers_map ||= Set.new
|
72
|
-
#puts " adding to URL map #{subclass.name}"
|
73
73
|
@controllers_map << subclass
|
74
74
|
end
|
75
75
|
|
76
|
+
def remove_from_url_map(subclass)
|
77
|
+
@controllers_map.delete(subclass) if @controllers_map
|
78
|
+
end
|
79
|
+
|
76
80
|
def url_map
|
77
81
|
@controllers_map ||= Set.new
|
78
82
|
app_url_map = {}
|
@@ -288,9 +292,9 @@ _MIGRATE_TO_NEW_RHOCONNECT
|
|
288
292
|
[res[0], res[1], res[2]]
|
289
293
|
end
|
290
294
|
|
291
|
-
# Get random
|
292
|
-
def
|
293
|
-
|
295
|
+
# Get secure random string
|
296
|
+
def get_random_identifier
|
297
|
+
SecureRandom.hex
|
294
298
|
end
|
295
299
|
|
296
300
|
# Generates new token (64-bit integer) based on # of
|
data/lib/rhoconnect/api_token.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'uuidtools'
|
2
1
|
module Rhoconnect
|
3
2
|
class ApiToken < StoreOrm
|
4
3
|
field :value,:string
|
@@ -6,7 +5,7 @@ module Rhoconnect
|
|
6
5
|
validates_presence_of :user_id
|
7
6
|
|
8
7
|
def self.create(fields)
|
9
|
-
fields[:value] = fields[:value] ||
|
8
|
+
fields[:value] = fields[:value] || get_random_identifier
|
10
9
|
fields[:id] = fields[:value]
|
11
10
|
super(fields)
|
12
11
|
end
|
data/lib/rhoconnect/client.rb
CHANGED
@@ -44,7 +44,7 @@ module Rhoconnect
|
|
44
44
|
|
45
45
|
def self.create(fields,params={})
|
46
46
|
Rhoconnect.license.check_and_use_seat
|
47
|
-
fields[:id] ||=
|
47
|
+
fields[:id] ||= get_random_identifier
|
48
48
|
res = super(fields,params)
|
49
49
|
user = User.load(fields[:user_id])
|
50
50
|
user.clients << res.id
|
@@ -11,7 +11,7 @@ module Rhoconnect
|
|
11
11
|
Rhoconnect::DefaultServer.helpers Rhoconnect::Controller::JsBaseHelpers
|
12
12
|
|
13
13
|
helpers Rhoconnect::Controller::JsBaseHelpers
|
14
|
-
register Rhoconnect::Handler::PluginCallbacks
|
14
|
+
#register Rhoconnect::Handler::PluginCallbacks
|
15
15
|
|
16
16
|
# source name is available inherently from controller
|
17
17
|
before do
|
@@ -32,6 +32,11 @@ module Rhoconnect
|
|
32
32
|
Rhoconnect.add_to_url_map(klass)
|
33
33
|
process_defaults(klass,val['defaults'])
|
34
34
|
process_routes(klass,val['routes'])
|
35
|
+
|
36
|
+
# add PluginCallback routes (but only for Adapter Controllers)
|
37
|
+
unless controller_name == "ApplicationController"
|
38
|
+
klass.register Rhoconnect::Handler::PluginCallbacks
|
39
|
+
end
|
35
40
|
end
|
36
41
|
end
|
37
42
|
|
@@ -74,7 +79,7 @@ module Rhoconnect
|
|
74
79
|
:route => 'request'
|
75
80
|
}
|
76
81
|
json[:user] = @model.current_user.login if @model
|
77
|
-
return_value = NodeChannel.publish_channel_and_wait(json,@model)
|
82
|
+
return_value = NodeChannel.publish_channel_and_wait(json,@model || self)
|
78
83
|
if finish_block
|
79
84
|
self.send(finish_block, return_value)
|
80
85
|
else
|
data/lib/rhoconnect/predefined_adapters/controllers/js/rho_internal_js_bench_adapter_controller.js
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
var app = require('ballroom');
|
2
|
+
var rc_helpers = require('rhoconnect_helpers');
|
3
|
+
//var RhoInternalJsBenchAdapter = require('../../models/js/rho_internal_js_bench_adapter');
|
4
|
+
|
5
|
+
app.controllerName('RhoInternalJsBenchAdapter');
|
6
|
+
app.registerHandler('sync');
|
7
|
+
|
8
|
+
// app.post('/',{}, function(req,resp){
|
9
|
+
// console.log("inside of controller post");
|
10
|
+
// var result = {'id':req.params};
|
11
|
+
// resp.send(result);
|
12
|
+
// });
|
@@ -0,0 +1,107 @@
|
|
1
|
+
var rc = require('rhoconnect_helpers');
|
2
|
+
var Store = rc.Store;
|
3
|
+
|
4
|
+
var RhoInternalJsBenchAdapter = function() {
|
5
|
+
|
6
|
+
this.query = function(resp){
|
7
|
+
rc.source(resp,function(resp){
|
8
|
+
var source = resp.result;
|
9
|
+
var result;
|
10
|
+
var db_name = get_db_name(source);
|
11
|
+
resp.params = db_name;
|
12
|
+
if(source.simulate_time > 0){
|
13
|
+
setTimeout(rc.Store.getData(resp,function(resp){
|
14
|
+
resp.send(resp.result);
|
15
|
+
}), source.simulate_time);
|
16
|
+
}
|
17
|
+
else{
|
18
|
+
rc.Store.getData(resp,function(resp){
|
19
|
+
resp.send(resp.result);
|
20
|
+
});
|
21
|
+
}
|
22
|
+
});
|
23
|
+
};
|
24
|
+
|
25
|
+
this.create = function(resp){
|
26
|
+
var hsh = resp.params.create_object;
|
27
|
+
var mockId2 = hsh["mock_id"];
|
28
|
+
rc.source(resp,function(resp){
|
29
|
+
var source = resp.result;
|
30
|
+
var create_hash = {}
|
31
|
+
create_hash[mockId2] = hsh;
|
32
|
+
var p = [get_db_name(source),create_hash,true];
|
33
|
+
resp.params = p;
|
34
|
+
rc.Store.putData(resp,function(resp){
|
35
|
+
console.log(JSON.stringify(resp));
|
36
|
+
resp.send(mockId2);
|
37
|
+
});
|
38
|
+
});
|
39
|
+
};
|
40
|
+
|
41
|
+
this.update = function(resp){
|
42
|
+
var id = resp.params["id"];
|
43
|
+
var update_hash = resp.params["update_object"];
|
44
|
+
|
45
|
+
rc.source(resp,function(resp){
|
46
|
+
var source = resp.result;
|
47
|
+
var db = get_db_name(source);
|
48
|
+
resp.params = db;
|
49
|
+
rc.Store.getData(resp,function(resp){
|
50
|
+
var data = resp.result;
|
51
|
+
//console.log("data_raw is"+JSON.stringify(data));
|
52
|
+
if(data == null || JSON.stringify(data) === "{}"){
|
53
|
+
new rc.Exception(resp, 'there is no data to update.');
|
54
|
+
}
|
55
|
+
for(var key in update_hash){
|
56
|
+
data[id][key] = update_hash[key];
|
57
|
+
}
|
58
|
+
//console.log("data is"+JSON.stringify(data));
|
59
|
+
resp.params = [db,data];
|
60
|
+
rc.Store.putData(resp,function(resp){
|
61
|
+
resp.send(id);
|
62
|
+
});
|
63
|
+
});
|
64
|
+
|
65
|
+
});
|
66
|
+
};
|
67
|
+
|
68
|
+
this.del = function(resp){
|
69
|
+
var id = resp.params["id"];
|
70
|
+
var delete_hash = resp.params["delete_object"];
|
71
|
+
rc.source(resp,function(resp){
|
72
|
+
var source = resp.result;
|
73
|
+
var del_obj = {}
|
74
|
+
del_obj[id] = delete_hash
|
75
|
+
resp.params = [get_db_name(source),del_obj];
|
76
|
+
rc.Store.deleteData(resp,function(resp){
|
77
|
+
resp.send(id);
|
78
|
+
});
|
79
|
+
});
|
80
|
+
};
|
81
|
+
|
82
|
+
this.login = function(resp){
|
83
|
+
resp.send(true);
|
84
|
+
};
|
85
|
+
|
86
|
+
this.logoff = function(resp){
|
87
|
+
resp.send(true);
|
88
|
+
};
|
89
|
+
|
90
|
+
this.sync = function(resp){
|
91
|
+
console.log("called sync");
|
92
|
+
};
|
93
|
+
|
94
|
+
|
95
|
+
function get_db_name(source){
|
96
|
+
var res;
|
97
|
+
if(source.user_id.substring(0,2) == 'nq')
|
98
|
+
res = "test_db_storage:"+source.app_id + ":nquser";
|
99
|
+
else if(source.user_id.substring(0,2) == 'mq')
|
100
|
+
res = "test_db_storage:"+source.app_id+":mquser";
|
101
|
+
else
|
102
|
+
res = "test_db_storage:"+source.app_id+":benchuser";
|
103
|
+
return res;
|
104
|
+
}
|
105
|
+
|
106
|
+
};
|
107
|
+
module.exports = new RhoInternalJsBenchAdapter();
|
data/lib/rhoconnect/source.rb
CHANGED
data/lib/rhoconnect/store.rb
CHANGED
@@ -874,11 +874,13 @@ module Rhoconnect
|
|
874
874
|
def _get_redis(server=nil)
|
875
875
|
url = ENV[REDIS_URL] || ENV[REDISTOGO_URL] || nil
|
876
876
|
if url
|
877
|
+
Rhoconnect.redis_url = url
|
877
878
|
ConnectionPool::Wrapper.new(:size => Rhoconnect.connection_pool_size,
|
878
879
|
:timeout => Rhoconnect.connection_pool_timeout) do
|
879
880
|
Redis.connect(:url => url, :timeout => Rhoconnect.redis_timeout, :thread_safe => true)
|
880
881
|
end
|
881
882
|
elsif server and server.is_a?(String)
|
883
|
+
Rhoconnect.redis_url = "redis://#{server}"
|
882
884
|
host,port,db,password = server.split(':')
|
883
885
|
ConnectionPool::Wrapper.new(:size => Rhoconnect.connection_pool_size,
|
884
886
|
:timeout => Rhoconnect.connection_pool_timeout) do
|
@@ -888,6 +890,7 @@ module Rhoconnect
|
|
888
890
|
elsif server and (server.is_a?(Redis) or server.is_a?(ConnectionPool::Wrapper))
|
889
891
|
server
|
890
892
|
else
|
893
|
+
Rhoconnect.redis_url = "redis://localhost:6379"
|
891
894
|
ConnectionPool::Wrapper.new(:size => 5, :timeout => 30) do
|
892
895
|
Redis.connect(:timeout => 30, :thread_safe => true)
|
893
896
|
end
|
data/lib/rhoconnect/version.rb
CHANGED
@@ -30,8 +30,7 @@ module RhoconnectConsole
|
|
30
30
|
@token = session[:token] if ENV['INSTANCE_ID']
|
31
31
|
@heroku = RestClient.get('http://nav.heroku.com/v1/providers/header') if @token
|
32
32
|
@version = Rhoconnect::VERSION
|
33
|
-
@domain =
|
34
|
-
@domain += "/application" if @domain and !ENV['RHODES_URL']
|
33
|
+
@domain = "#{request.scheme}://#{request.host_with_port}"
|
35
34
|
erb :index
|
36
35
|
end
|
37
36
|
|
data/rhoconnect.gemspec
CHANGED
@@ -45,7 +45,6 @@ Gem::Specification.new do |s|
|
|
45
45
|
s.add_dependency('rake', '~> 10.0.0')
|
46
46
|
s.add_dependency('json', '~> 1.7.7')
|
47
47
|
s.add_dependency('rubyzip', '~> 0.9.4')
|
48
|
-
s.add_dependency('uuidtools', '>= 2.1.1')
|
49
48
|
s.add_dependency('connection_pool', '~> 1.0.0')
|
50
49
|
s.add_dependency('redis', '>= 3.0.1')
|
51
50
|
s.add_dependency('resque', '>= 1.22.0')
|
@@ -0,0 +1 @@
|
|
1
|
+
# Dummy Rakefile for testing...
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rhoconnect/application/init'
|
3
|
+
|
4
|
+
# secret is generated along with the app
|
5
|
+
Rhoconnect::Server.set :secret, 'not a secret'
|
6
|
+
|
7
|
+
# !!! Add your custom initializers and overrides here !!!
|
8
|
+
# For example, uncomment the following line to enable Stats
|
9
|
+
#Rhoconnect::Server.enable :stats
|
10
|
+
# uncomment the following line to disable Resque Front-end console
|
11
|
+
#Rhoconnect.disable_resque_console = true
|
12
|
+
# uncomment the following line to disable Rhoconnect Front-end console
|
13
|
+
#Rhoconnect.disable_rc_console = true
|
14
|
+
|
15
|
+
# run RhoConnect Application
|
16
|
+
run Rhoconnect.app
|
@@ -0,0 +1,18 @@
|
|
1
|
+
var app = require('ballroom');
|
2
|
+
var rc = require('rhoconnect_helpers');
|
3
|
+
var Store = rc.Store;
|
4
|
+
app.controllerName('Application');
|
5
|
+
|
6
|
+
app.post('/login',{'rc_handler':'authenticate'}, function(req,resp){
|
7
|
+
console.log("inside application_controller.js");
|
8
|
+
var login = req.params.login;
|
9
|
+
var password = req.params.password;
|
10
|
+
if(login === 'storeapitest') {
|
11
|
+
resp.params = ['loginkey',login]
|
12
|
+
Store.putValue(resp, function(resp){
|
13
|
+
resp.send(true);
|
14
|
+
});
|
15
|
+
} else {
|
16
|
+
resp.send(true);
|
17
|
+
}
|
18
|
+
});
|
@@ -0,0 +1 @@
|
|
1
|
+
858fc60fadfde40273d0ac505906969318aa4931d1a2c4aeb24d98393c74379f60e226651601969874257f7f1fbda9b099ecd551a641519aa46819947fda0191
|
@@ -0,0 +1,13 @@
|
|
1
|
+
:sources:
|
2
|
+
:development:
|
3
|
+
:licensefile: settings/license.key
|
4
|
+
:redis: localhost:6379
|
5
|
+
:syncserver: http://localhost:9292/
|
6
|
+
:test:
|
7
|
+
:licensefile: settings/license.key
|
8
|
+
:redis: localhost:6379
|
9
|
+
:syncserver: http://localhost:9292/
|
10
|
+
:production:
|
11
|
+
:licensefile: settings/license.key
|
12
|
+
:redis: localhost:6379
|
13
|
+
:syncserver: http://localhost:9292/
|
@@ -8,113 +8,145 @@ describe "Rhoconnect::Controller::JsBase" do
|
|
8
8
|
|
9
9
|
it_behaves_like "SharedRhoconnectHelper", :rhoconnect_data => true do
|
10
10
|
def app
|
11
|
-
@app
|
11
|
+
@app = Rack::URLMap.new Rhoconnect.url_map
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
Rhoconnect::Server.set :secret, "secure!"
|
17
|
-
Rhoconnect.use_node = true
|
18
|
-
Rhoconnect.bootstrap(get_testapp_path)
|
19
|
-
do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => @u.login, "password" => 'testpass'
|
20
|
-
end
|
21
|
-
|
22
|
-
after(:each) do
|
23
|
-
Rhoconnect::Node.kill_process
|
24
|
-
end
|
25
|
-
|
26
|
-
it "should get / of js controller with route overridden" do
|
27
|
-
get '/app/v1/JsSample', {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
|
28
|
-
last_response.should be_ok
|
29
|
-
body = JSON.parse(last_response.body)
|
30
|
-
body[2]['count'].should == 1
|
31
|
-
body.last['insert'].should == {'1' => {'name' => 'iPhone'}}
|
32
|
-
end
|
33
|
-
|
34
|
-
it "should get /custom_route of js controller" do
|
35
|
-
get '/app/v1/JsSample/custom_route', {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
|
36
|
-
last_response.body.should == 'testuser'
|
37
|
-
end
|
38
|
-
|
39
|
-
it "should get /source from custom route" do
|
40
|
-
get '/app/v1/JsSample/custom_route2', {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
|
41
|
-
last_response.body.should == 'JsSample'
|
42
|
-
end
|
43
|
-
|
44
|
-
it "should get stash_result from js model" do
|
45
|
-
pending "stash_result not supported yet"
|
46
|
-
get '/app/v1/JsSample/custom_route3',{}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
|
47
|
-
res = JSON.parse(last_response.body)
|
48
|
-
res[2]["count"].should == 1
|
14
|
+
def remove_application_controller
|
15
|
+
Object.send(:remove_const, :ApplicationController) rescue nil
|
49
16
|
end
|
50
17
|
|
51
|
-
|
52
|
-
|
53
|
-
res = JSON.parse(last_response.body)
|
54
|
-
res[2]["count"].should == 1
|
18
|
+
after(:all) do
|
19
|
+
Rhoconnect.use_node = false
|
55
20
|
end
|
56
21
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
set_doc_state(@c1, :cd => @data)
|
71
|
-
delete '/app/v1/JsSample/2', {}, {Rhoconnect::CLIENT_ID_HEADER => @c1.id}
|
72
|
-
last_response.should be_ok
|
73
|
-
end
|
74
|
-
|
75
|
-
it "should call route that overrides default option" do
|
76
|
-
get '/app/v1/JsSample/no_client_route', {}
|
77
|
-
last_response.should be_ok
|
78
|
-
last_response.body.should == 'no client required!'
|
79
|
-
end
|
80
|
-
|
81
|
-
it "should upload blob in multipart post" do
|
82
|
-
file1,file2 = 'upload1.txt'
|
83
|
-
@product1['txtfile-rhoblob'] = file1
|
84
|
-
@product1['_id'] = 'tempobj1'
|
85
|
-
cud = {'create'=>{'1'=>{'name'=>'hello'}},
|
86
|
-
:blob_fields => ['txtfile-rhoblob']}.to_json
|
87
|
-
post "/app/#{Rhoconnect::API_VERSION}/JsSample",
|
88
|
-
{:cud => cud,'txtfile-rhoblob-1' =>
|
89
|
-
Rack::Test::UploadedFile.new(File.join(File.dirname(__FILE__),'..','testdata',file1), "application/octet-stream")},
|
90
|
-
{Rhoconnect::CLIENT_ID_HEADER => @c.id}
|
91
|
-
last_response.should be_ok
|
92
|
-
get "/app/#{Rhoconnect::API_VERSION}/JsSample", {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
|
93
|
-
json = JSON.parse(last_response.body)
|
94
|
-
json[5]['links'].should == { "1" => { "l" => "blob_created" } }
|
95
|
-
json[5]['delete'].should == { "blob_created" => { "name" => "hello", "txtfile-rhoblob" => "blob_created" } }
|
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
|
96
35
|
end
|
97
36
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
37
|
+
describe "ApplicationController" do
|
38
|
+
after(:each) do
|
39
|
+
Rhoconnect.remove_from_url_map(ApplicationController)
|
40
|
+
remove_application_controller
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should call Store api in ApplicationController" do
|
44
|
+
Rhoconnect.remove_from_url_map(ApplicationController)
|
45
|
+
remove_application_controller
|
46
|
+
bootstrap_rhoconnect(true)
|
47
|
+
do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => 'storeapitest', "password" => 'testpass'
|
48
|
+
Store.get_value('loginkey').should == 'storeapitest'
|
49
|
+
end
|
105
50
|
end
|
106
51
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
52
|
+
describe "Named Controller" do
|
53
|
+
|
54
|
+
before(:each) do
|
55
|
+
bootstrap_rhoconnect
|
56
|
+
do_post "/rc/#{Rhoconnect::API_VERSION}/app/login", "login" => @u.login, "password" => 'testpass'
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should get / of js controller with route overridden" do
|
60
|
+
get '/app/v1/JsSample', {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
|
61
|
+
last_response.should be_ok
|
62
|
+
body = JSON.parse(last_response.body)
|
63
|
+
body[2]['count'].should == 1
|
64
|
+
body.last['insert'].should == {'1' => {'name' => 'iPhone'}}
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should get /custom_route of js controller" do
|
68
|
+
get '/app/v1/JsSample/custom_route', {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
|
69
|
+
last_response.body.should == 'testuser'
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should get /source from custom route" do
|
73
|
+
get '/app/v1/JsSample/custom_route2', {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
|
74
|
+
last_response.body.should == 'JsSample'
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should get stash_result from js model" do
|
78
|
+
pending "stash_result not supported yet"
|
79
|
+
get '/app/v1/JsSample/custom_route3',{}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
|
80
|
+
res = JSON.parse(last_response.body)
|
81
|
+
res[2]["count"].should == 1
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should register sync route" do
|
85
|
+
get '/app/v1/Sample2', {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
|
86
|
+
res = JSON.parse(last_response.body)
|
87
|
+
res[2]["count"].should == 1
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should post to js controller" do
|
91
|
+
hsh = {'1'=>{'name'=>'testname','price'=>'$199'}}
|
92
|
+
post '/app/v1/JsSample',hsh, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
|
93
|
+
last_response.should be_ok
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should put to js controller" do
|
97
|
+
put '/app/v1/JsSample/2', {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
|
98
|
+
last_response.body.should == ''
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should delete to js controller" do
|
102
|
+
@c1 = Client.create({:user_id => @u.id,:app_id => @a.id},{:source_name => 'JsSample'})
|
103
|
+
set_doc_state(@c1, :cd => @data)
|
104
|
+
delete '/app/v1/JsSample/2', {}, {Rhoconnect::CLIENT_ID_HEADER => @c1.id}
|
105
|
+
last_response.should be_ok
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should call route that overrides default option" do
|
109
|
+
get '/app/v1/JsSample/no_client_route', {}
|
110
|
+
last_response.should be_ok
|
111
|
+
last_response.body.should == 'no client required!'
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should upload blob in multipart post" do
|
115
|
+
file1,file2 = 'upload1.txt'
|
116
|
+
@product1['txtfile-rhoblob'] = file1
|
117
|
+
@product1['_id'] = 'tempobj1'
|
118
|
+
cud = {'create'=>{'1'=>{'name'=>'hello'}},
|
119
|
+
:blob_fields => ['txtfile-rhoblob']}.to_json
|
120
|
+
post "/app/#{Rhoconnect::API_VERSION}/JsSample",
|
121
|
+
{:cud => cud,'txtfile-rhoblob-1' =>
|
122
|
+
Rack::Test::UploadedFile.new(File.join(File.dirname(__FILE__),'..','testdata',file1), "application/octet-stream")},
|
123
|
+
{Rhoconnect::CLIENT_ID_HEADER => @c.id}
|
124
|
+
last_response.should be_ok
|
125
|
+
get "/app/#{Rhoconnect::API_VERSION}/JsSample", {}, {Rhoconnect::CLIENT_ID_HEADER => @c.id}
|
126
|
+
json = JSON.parse(last_response.body)
|
127
|
+
json[5]['links'].should == { "1" => { "l" => "blob_created" } }
|
128
|
+
json[5]['delete'].should == { "blob_created" => { "name" => "hello", "txtfile-rhoblob" => "blob_created" } }
|
129
|
+
end
|
130
|
+
|
131
|
+
it "should push_objects to js controller" do
|
132
|
+
s = Source.load('JsSample', @s_params)
|
133
|
+
data = {'1' => @product1, '2' => @product2, '3' => @product3}
|
134
|
+
post "/app/#{Rhoconnect::API_VERSION}/JsSample/push_objects",
|
135
|
+
{:user_id => @u.id, :objects => data}, {Rhoconnect::API_TOKEN_HEADER => @api_token}
|
136
|
+
last_response.should be_ok
|
137
|
+
verify_doc_result(s, {:md => data, :md_size=>'3'})
|
138
|
+
end
|
139
|
+
|
140
|
+
it "should push_deletes to js controller" do
|
141
|
+
data = {'1' => @product1, '2' => @product2, '3' => @product3}
|
142
|
+
s = Source.load('JsSample',@s_params)
|
143
|
+
set_doc_state(s, {:md => data, :md_size => '3'})
|
144
|
+
data.delete('2')
|
145
|
+
post "/app/#{Rhoconnect::API_VERSION}/JsSample/push_deletes",
|
146
|
+
{:user_id => @u.id, :objects => ['2']}, {Rhoconnect::API_TOKEN_HEADER => @api_token}
|
147
|
+
last_response.should be_ok
|
148
|
+
verify_doc_result(s, {:md => data, :md_size=>'2'})
|
149
|
+
end
|
116
150
|
end
|
117
|
-
|
118
|
-
it "should register deprecated_route"
|
119
151
|
end
|
120
152
|
end
|