nitroapi 0.0.5 → 0.0.7
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/.gitignore +51 -0
- data/Gemfile +4 -16
- data/Gemfile.lock +26 -20
- data/README.md +9 -3
- data/Rakefile +1 -13
- data/lib/nitro_api.rb +114 -94
- data/lib/nitro_api/batch_calls.rb +62 -0
- data/lib/nitro_api/challenge.rb +5 -0
- data/lib/nitro_api/rule.rb +5 -0
- data/lib/nitro_api/site_calls.rb +33 -0
- data/lib/nitro_api/user_calls.rb +155 -0
- data/lib/nitro_api/version.rb +3 -0
- data/nitroapi.gemspec +21 -62
- data/spec/nitro_api_spec.rb +321 -18
- metadata +56 -41
- data/VERSION +0 -1
@@ -0,0 +1,62 @@
|
|
1
|
+
module NitroApi
|
2
|
+
module BatchCalls
|
3
|
+
|
4
|
+
private
|
5
|
+
|
6
|
+
# Actually perform the batch call.
|
7
|
+
# @return [Hash] The hash containing the results from the nitro server
|
8
|
+
def make_run_batch_call
|
9
|
+
return false if @batch.nil? or @batch.size == 0
|
10
|
+
|
11
|
+
# The nitro API returns a differently formatted result if called with
|
12
|
+
# only one action. Thus, they need to be handled differently.
|
13
|
+
if @batch.size == 1
|
14
|
+
handle_batch_single_action
|
15
|
+
else
|
16
|
+
handle_batch_multiple_actions
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# This function handles making the call when there is only one call in
|
21
|
+
# the batch.
|
22
|
+
def handle_batch_single_action
|
23
|
+
result = really_make_call(@batch[0][:params], @batch[0][:method])
|
24
|
+
@batch = nil
|
25
|
+
|
26
|
+
# TODO: improve the handling of other methods if only one is called with batch
|
27
|
+
if result['method'] == 'user.login' and result['res'] == 'ok'
|
28
|
+
@session = result['Login']['sessionKey']
|
29
|
+
end
|
30
|
+
result
|
31
|
+
end
|
32
|
+
|
33
|
+
# This function handles making the call when there is more than one call in
|
34
|
+
# the batch.
|
35
|
+
def handle_batch_multiple_actions
|
36
|
+
# TODO: improve handling of errors in the batch response
|
37
|
+
actions = []
|
38
|
+
@batch.each do |action|
|
39
|
+
actions << to_query(action[:params])
|
40
|
+
end
|
41
|
+
|
42
|
+
results = really_make_call({'method' => 'batch.run','methodFeed' => JSON.dump(actions)}, :post)
|
43
|
+
@batch = nil
|
44
|
+
extract_session_key results
|
45
|
+
results
|
46
|
+
end
|
47
|
+
|
48
|
+
# Extracts the session key from the results when multiple method calls are
|
49
|
+
# made in the batch.
|
50
|
+
# @param [Hash] batch_results The hash containing the results from the
|
51
|
+
# batch call
|
52
|
+
def extract_session_key batch_results
|
53
|
+
batch_results['Nitro'].each do |result|
|
54
|
+
if result['method'] == 'user.login' and result['res'] == 'ok'
|
55
|
+
@session = result['Login']['sessionKey']
|
56
|
+
break
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
data/lib/nitro_api/challenge.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
module NitroApi
|
2
|
+
module SiteCalls
|
3
|
+
def make_points_leaders_call opts
|
4
|
+
params = {
|
5
|
+
:method => 'site.getPointsLeaders'
|
6
|
+
}
|
7
|
+
|
8
|
+
# Only include the session key when it is present. This is to make batch
|
9
|
+
# calls work for this method.
|
10
|
+
params[:sessionKey] = @session if @session
|
11
|
+
|
12
|
+
opts_list = {
|
13
|
+
'criteria' => 'criteria',
|
14
|
+
'point_category' => 'pointCategory',
|
15
|
+
'return_count' => 'returnCount',
|
16
|
+
'start' => 'start',
|
17
|
+
'duration' => 'duration',
|
18
|
+
'user_ids' => 'userIds',
|
19
|
+
'tags' => 'tags',
|
20
|
+
'tags_operator' => 'tagsOperator',
|
21
|
+
'group_name' => 'groupName',
|
22
|
+
'with_rank' => 'withRank',
|
23
|
+
'with_surrounding_users' => 'withSurroundingUsers',
|
24
|
+
'preferences' => 'preferences'
|
25
|
+
}
|
26
|
+
|
27
|
+
opts.each do |key,value|
|
28
|
+
params[opts_list[key]] = value if opts_list.has_key?(key)
|
29
|
+
end
|
30
|
+
make_call(params, :get)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
module NitroApi
|
2
|
+
module UserCalls
|
3
|
+
|
4
|
+
def make_login_call
|
5
|
+
ts = Time.now.utc.to_i.to_s
|
6
|
+
params = {
|
7
|
+
:sig => sign(ts),
|
8
|
+
:ts => ts,
|
9
|
+
:apiKey => @api_key,
|
10
|
+
:userId => @user,
|
11
|
+
:method => 'user.login'
|
12
|
+
}
|
13
|
+
response = make_call(params)
|
14
|
+
if response.is_a?(Hash)
|
15
|
+
@session = response["Login"]["sessionKey"]
|
16
|
+
end
|
17
|
+
response
|
18
|
+
end
|
19
|
+
|
20
|
+
def make_log_action_call actions, opts={}
|
21
|
+
value = opts.delete(:value)
|
22
|
+
user_id = opts.delete(:other_user)
|
23
|
+
session_key = opts.delete(:session_key)
|
24
|
+
params = {
|
25
|
+
:tags => actions.is_a?(Array) ? actions.join(",") : actions,
|
26
|
+
:method => 'user.logAction'
|
27
|
+
}
|
28
|
+
|
29
|
+
# Only include the session key when it is present. This is to make batch
|
30
|
+
# calls work for this method.
|
31
|
+
if session_key or @session
|
32
|
+
params[:sessionKey] = session_key ? session_key : (@session ? @session : nil)
|
33
|
+
end
|
34
|
+
|
35
|
+
params[:value] = value.to_s if value && !value.to_s.empty?
|
36
|
+
params[:userId] = user_id if user_id && !user_id.to_s.empty
|
37
|
+
make_call(params)
|
38
|
+
end
|
39
|
+
|
40
|
+
def make_challenge_progress_call opts={}
|
41
|
+
# TODO: add support for the user.getChallengeProgress call to nitroapi
|
42
|
+
if not @batch.nil?
|
43
|
+
raise NitroError.new(10000), "user.getChallengeProgress not supported in batch mode by nitroapi"
|
44
|
+
end
|
45
|
+
|
46
|
+
params = {
|
47
|
+
:sessionKey => @session,
|
48
|
+
:method => 'user.getChallengeProgress'
|
49
|
+
}
|
50
|
+
challenge = opts[:challenge]
|
51
|
+
params['challengeName'] = challenge if challenge and !challenge.to_s.empty?
|
52
|
+
params['showOnlyTrophies'] = opts.delete(:trophies_only) || false
|
53
|
+
params['folder'] = opts.delete(:folder) if opts.has_key?(:folder)
|
54
|
+
|
55
|
+
response = make_call(params)
|
56
|
+
|
57
|
+
if valid_response?(response['challenges'])
|
58
|
+
items = ensure_array(response['challenges']['Challenge'])
|
59
|
+
items.reduce([]) do |challenges, item|
|
60
|
+
challenge = Challenge.new
|
61
|
+
challenge.name = item["name"]
|
62
|
+
challenge.description = item["description"]
|
63
|
+
challenge.full_url = item["fullUrl"]
|
64
|
+
challenge.thumb_url = item["thumbUrl"]
|
65
|
+
challenge.completed = item["completionCount"].to_i
|
66
|
+
|
67
|
+
if valid_response?(item["rules"])
|
68
|
+
ensure_array(item["rules"]['Rule']).each do |rule_elm|
|
69
|
+
rule = Rule.new
|
70
|
+
rule.action = rule_elm['actionTag']
|
71
|
+
rule.type = rule_elm['type'].to_sym
|
72
|
+
rule.completed = rule_elm['type'] == 'true'
|
73
|
+
if rule_elm['goal'] && !rule_elm['goal'].empty?
|
74
|
+
rule.goal = rule_elm['goal'].to_i
|
75
|
+
end
|
76
|
+
challenge.rules<< rule
|
77
|
+
end
|
78
|
+
end
|
79
|
+
challenges<< challenge
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def make_award_challenge_call(challenge)
|
85
|
+
params = {
|
86
|
+
:sessionKey => @session,
|
87
|
+
:userId => @user,
|
88
|
+
:method => 'user.awardChallenge',
|
89
|
+
:challenge => challenge
|
90
|
+
}
|
91
|
+
make_call(params)
|
92
|
+
end
|
93
|
+
|
94
|
+
def make_action_history_call actions=[]
|
95
|
+
# TODO: add support for the user.getActionHistory call to nitroapi
|
96
|
+
if not @batch.nil?
|
97
|
+
raise NitroError.new(10000), "user.getActionHistory not supported in batch mode by nitroapi"
|
98
|
+
end
|
99
|
+
|
100
|
+
params = {
|
101
|
+
:sessionKey => @session,
|
102
|
+
:method => 'user.getActionHistory'
|
103
|
+
}
|
104
|
+
if actions && !actions.empty?
|
105
|
+
params[:tags] = actions.is_a?(Array) ? actions.join(",") : actions
|
106
|
+
end
|
107
|
+
response = make_call(params)
|
108
|
+
if valid_response?(response['ActionHistoryRecord'])
|
109
|
+
items = ensure_array(response['ActionHistoryRecord']['ActionHistoryItem'])
|
110
|
+
items.reduce([]) do
|
111
|
+
|history, item|
|
112
|
+
history<< {:tags => item['tags'],
|
113
|
+
:ts => Time.at(item['ts'].to_i),
|
114
|
+
:value => item['value'].to_i
|
115
|
+
}
|
116
|
+
end
|
117
|
+
else
|
118
|
+
[]
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def make_join_group_call group
|
123
|
+
params = {
|
124
|
+
:sessionKey => @session,
|
125
|
+
:method => 'user.joinGroup',
|
126
|
+
:groupName => group
|
127
|
+
}
|
128
|
+
make_call(params)
|
129
|
+
end
|
130
|
+
|
131
|
+
def make_get_points_balance_call opts={}
|
132
|
+
params = {
|
133
|
+
:method => 'user.getPointsBalance'
|
134
|
+
}
|
135
|
+
|
136
|
+
# Only include the session key when it is present. This is to make batch
|
137
|
+
# calls work for this method.
|
138
|
+
params[:sessionKey] = @session if @session
|
139
|
+
|
140
|
+
opts_list = {
|
141
|
+
'criteria' => 'criteria',
|
142
|
+
'point_category' => 'pointCategory',
|
143
|
+
'start' => 'start',
|
144
|
+
'end' => 'end',
|
145
|
+
'user_id' => 'userId',
|
146
|
+
'tags' => 'tags',
|
147
|
+
}
|
148
|
+
|
149
|
+
opts.each do |key,value|
|
150
|
+
params[opts_list[key]] = value if opts_list.has_key?(key)
|
151
|
+
end
|
152
|
+
make_call(params, :get)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
data/nitroapi.gemspec
CHANGED
@@ -1,69 +1,28 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'nitro_api/version'
|
5
5
|
|
6
|
-
Gem::Specification.new do |
|
7
|
-
|
8
|
-
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "nitroapi"
|
8
|
+
gem.version = NitroApi::VERSION
|
9
|
+
gem.authors = ["Gilad Buchman", "James H. Linder"]
|
10
|
+
gem.email = ["gems@jlinder.com"]
|
11
|
+
gem.description = %q{Api client for Bunchball's Nitro. http://www.bunchball.com/nitro/}
|
12
|
+
gem.summary = %q{Api client for Bunchball's Nitro}
|
13
|
+
gem.homepage = %q{http://github.com/jlinder/nitroapi}
|
9
14
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
s.extra_rdoc_files = [
|
15
|
-
"LICENSE.txt",
|
16
|
-
"README.md"
|
17
|
-
]
|
18
|
-
s.files = [
|
19
|
-
".document",
|
20
|
-
".rspec",
|
21
|
-
"Gemfile",
|
22
|
-
"Gemfile.lock",
|
23
|
-
"LICENSE.txt",
|
24
|
-
"README.md",
|
25
|
-
"Rakefile",
|
26
|
-
"VERSION",
|
27
|
-
"examples/award_challenge.rb",
|
28
|
-
"examples/log_and_check_status.rb",
|
29
|
-
"keys.json.example",
|
30
|
-
"lib/nitro_api.rb",
|
31
|
-
"lib/nitro_api/challenge.rb",
|
32
|
-
"nitroapi.gemspec",
|
33
|
-
"spec/nitro_api_spec.rb",
|
34
|
-
"spec/spec_helper.rb"
|
35
|
-
]
|
36
|
-
s.homepage = %q{http://github.com/Keasinc/nitroapi}
|
37
|
-
s.licenses = ["MIT"]
|
38
|
-
s.require_paths = ["lib"]
|
39
|
-
s.rubygems_version = %q{1.6.2}
|
40
|
-
s.summary = %q{Api client for Bunchball's Nitro}
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
41
19
|
|
42
|
-
|
43
|
-
|
20
|
+
# Please keep me alphabetized!
|
21
|
+
gem.add_dependency('activesupport')
|
22
|
+
gem.add_dependency('json')
|
44
23
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
|
49
|
-
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
50
|
-
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
51
|
-
s.add_development_dependency(%q<rcov>, [">= 0"])
|
52
|
-
else
|
53
|
-
s.add_dependency(%q<activesupport>, [">= 0"])
|
54
|
-
s.add_dependency(%q<json>, [">= 0"])
|
55
|
-
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
56
|
-
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
57
|
-
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
58
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
59
|
-
end
|
60
|
-
else
|
61
|
-
s.add_dependency(%q<activesupport>, [">= 0"])
|
62
|
-
s.add_dependency(%q<json>, [">= 0"])
|
63
|
-
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
64
|
-
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
65
|
-
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
66
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
67
|
-
end
|
24
|
+
gem.add_development_dependency('bundler', ['~> 1.2.2'])
|
25
|
+
gem.add_development_dependency('rspec', ['~> 2.3.0'])
|
26
|
+
gem.add_development_dependency('simplecov', ['~> 0.7.1'])
|
68
27
|
end
|
69
28
|
|
data/spec/nitro_api_spec.rb
CHANGED
@@ -6,22 +6,24 @@ describe NitroApi do
|
|
6
6
|
@api_key = "key"
|
7
7
|
@secret = "secret"
|
8
8
|
@nitro = NitroApi::NitroApi.new @user, @api_key, @secret
|
9
|
+
@nitro.protocol = 'http'
|
9
10
|
@success = {"Nitro" => {"res" => "ok"}}.to_json
|
10
11
|
@session = "1"
|
11
12
|
end
|
12
13
|
|
13
14
|
describe "#sign" do
|
14
15
|
it "takes MD5 like in http://wiki.bunchball.com/w/page/12748060/user_login" do
|
15
|
-
|
16
|
+
ts = Time.now.utc.to_i.to_s
|
17
|
+
to_digest = @api_key + @secret + ts + @user.to_s
|
16
18
|
to_digest += to_digest.length.to_s
|
17
|
-
@nitro.sign.should == Digest::MD5.hexdigest(to_digest)
|
19
|
+
@nitro.sign(ts).should == Digest::MD5.hexdigest(to_digest)
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
21
23
|
describe "#login" do
|
22
24
|
it "should set session id for a successful call" do
|
23
25
|
mock_json = {"Nitro" => {"Login" => {"sessionKey" => @session}}}
|
24
|
-
url =
|
26
|
+
url = @nitro.base_url + "?.*method=user.login.*"
|
25
27
|
stub_http_request(:get, Regexp.new(url)).
|
26
28
|
to_return(:body => mock_json.to_json)
|
27
29
|
|
@@ -30,6 +32,34 @@ describe NitroApi do
|
|
30
32
|
end
|
31
33
|
end
|
32
34
|
|
35
|
+
describe "#base_url" do
|
36
|
+
before do
|
37
|
+
@user = "user"
|
38
|
+
@api_key = "key"
|
39
|
+
@secret = "secret"
|
40
|
+
@nitro = NitroApi::NitroApi.new @user, @api_key, @secret
|
41
|
+
end
|
42
|
+
|
43
|
+
it "has the correct default URL" do
|
44
|
+
@nitro.base_url.should == 'https://sandbox.bunchball.net/nitro/json'
|
45
|
+
end
|
46
|
+
|
47
|
+
it "correctly uses the configured protocol value" do
|
48
|
+
@nitro.protocol = 'http'
|
49
|
+
@nitro.base_url.should == 'http://sandbox.bunchball.net/nitro/json'
|
50
|
+
end
|
51
|
+
|
52
|
+
it "correctly uses the configured host value" do
|
53
|
+
@nitro.host = 'example.com'
|
54
|
+
@nitro.base_url.should == 'https://example.com/nitro/json'
|
55
|
+
end
|
56
|
+
|
57
|
+
it "correctly uses the configured accepts value" do
|
58
|
+
@nitro.accepts = 'xml'
|
59
|
+
@nitro.base_url.should == 'https://sandbox.bunchball.net/nitro/xml'
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
33
63
|
context "when authenticated" do
|
34
64
|
before do
|
35
65
|
@nitro.session = @session
|
@@ -42,7 +72,7 @@ describe NitroApi do
|
|
42
72
|
"sessionKey" => @session,
|
43
73
|
"method" => "user.logAction"
|
44
74
|
}
|
45
|
-
url =
|
75
|
+
url = @nitro.base_url + "?.*method=user.logAction.*"
|
46
76
|
stub_http_request(:get, Regexp.new(url)).
|
47
77
|
with(:query => params).
|
48
78
|
to_return(:body => @success)
|
@@ -56,38 +86,70 @@ describe NitroApi do
|
|
56
86
|
"sessionKey" => @session,
|
57
87
|
"method" => "user.logAction"
|
58
88
|
}
|
59
|
-
url =
|
89
|
+
url = @nitro.base_url + "?.*method=user.logAction.*"
|
60
90
|
stub_http_request(:get, Regexp.new(url)).
|
61
91
|
with(:query => params).
|
62
92
|
to_return(:body => @success)
|
63
93
|
|
64
94
|
@nitro.log_action actions
|
65
95
|
end
|
96
|
+
|
97
|
+
it "sends one action with specified session key on query string" do
|
98
|
+
action_name = "action"
|
99
|
+
session = '2'
|
100
|
+
params = {"tags" => action_name,
|
101
|
+
"sessionKey" => session,
|
102
|
+
"method" => "user.logAction"
|
103
|
+
}
|
104
|
+
opts = {session_key: session}
|
105
|
+
url = @nitro.base_url + "?.*method=user.logAction.*"
|
106
|
+
stub_http_request(:get, Regexp.new(url)).
|
107
|
+
with(:query => params).
|
108
|
+
to_return(:body => @success)
|
109
|
+
|
110
|
+
@nitro.log_action action_name, opts
|
111
|
+
end
|
66
112
|
end
|
67
113
|
|
68
114
|
describe "#challenge_progress" do
|
69
|
-
|
115
|
+
before do
|
70
116
|
params = {
|
71
117
|
"showOnlyTrophies" => "false",
|
72
118
|
"sessionKey" => @session,
|
73
119
|
"method" => "user.getChallengeProgress"
|
74
120
|
}
|
75
|
-
url =
|
121
|
+
url = @nitro.base_url + "?.*method=user.getChallengeProgress.*"
|
122
|
+
mock_rules = {"goal" => "1", "type" => "none", "completed" => "false",
|
123
|
+
"actionTag" => "action"}
|
124
|
+
|
76
125
|
mock_data = [{"completionCount"=>"1",
|
77
126
|
"description" => "some description",
|
78
|
-
"name" => "Watch 10 Videos"
|
127
|
+
"name" => "Watch 10 Videos",
|
128
|
+
"rules" => {"Rule" => mock_rules}}]
|
79
129
|
|
80
130
|
mock_json = {"Nitro" => {"challenges" => {"Challenge" => mock_data}}}
|
81
131
|
stub_http_request(:get, Regexp.new(url)).
|
82
132
|
with(:query => params).
|
83
133
|
to_return(:body => mock_json.to_json)
|
84
134
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
challenge.
|
135
|
+
response = @nitro.challenge_progress
|
136
|
+
@challenge = response[0]
|
137
|
+
end
|
138
|
+
|
139
|
+
it "returns the challenge part of the response" do
|
140
|
+
@challenge.should_not be_nil
|
141
|
+
@challenge.description.should == "some description"
|
142
|
+
@challenge.completed.should == 1
|
143
|
+
end
|
144
|
+
|
145
|
+
it "has rules in the challenge" do
|
146
|
+
@challenge.rules.should_not be_empty
|
147
|
+
@challenge.rules.size.should == 1
|
148
|
+
rule = @challenge.rules.first
|
149
|
+
rule.type.should == :none
|
150
|
+
rule.completed.should be_false
|
151
|
+
rule.action.should == "action"
|
152
|
+
rule.goal.should == 1
|
91
153
|
end
|
92
154
|
end
|
93
155
|
|
@@ -99,7 +161,7 @@ describe NitroApi do
|
|
99
161
|
"challenge" => "TestChallenge",
|
100
162
|
"method" => "user.awardChallenge"
|
101
163
|
}
|
102
|
-
url =
|
164
|
+
url = @nitro.base_url + "?.*method=user.awardChallenge.*"
|
103
165
|
stub_http_request(:get, Regexp.new(url)).
|
104
166
|
with(:query => params).
|
105
167
|
to_return(:body => @success)
|
@@ -126,7 +188,7 @@ describe NitroApi do
|
|
126
188
|
"sessionKey" => @session,
|
127
189
|
"method" => "user.getActionHistory"
|
128
190
|
}
|
129
|
-
url =
|
191
|
+
url = @nitro.base_url + "?.*method=user.getActionHistory.*"
|
130
192
|
stub_http_request(:get, Regexp.new(url)).
|
131
193
|
with(:query => params).
|
132
194
|
to_return(:body => @mock_json)
|
@@ -144,7 +206,7 @@ describe NitroApi do
|
|
144
206
|
"method" => "user.getActionHistory",
|
145
207
|
"tags" => "action1"
|
146
208
|
}
|
147
|
-
url =
|
209
|
+
url = @nitro.base_url + "?.*method=user.getActionHistory.*"
|
148
210
|
stub_http_request(:get, Regexp.new(url)).
|
149
211
|
with(:query => params).
|
150
212
|
to_return(:body => @mock_json)
|
@@ -159,7 +221,7 @@ describe NitroApi do
|
|
159
221
|
"sessionKey" => @session,
|
160
222
|
"method" => "user.joinGroup"
|
161
223
|
}
|
162
|
-
url =
|
224
|
+
url = @nitro.base_url + "?.*method=user.joinGroup.*"
|
163
225
|
stub_http_request(:get, Regexp.new(url)).
|
164
226
|
with(:query => params).
|
165
227
|
to_return(:body => @success)
|
@@ -167,5 +229,246 @@ describe NitroApi do
|
|
167
229
|
@nitro.join_group "group"
|
168
230
|
end
|
169
231
|
end
|
232
|
+
|
233
|
+
describe "#get_points_balance options_hash" do
|
234
|
+
it "gets the default points" do
|
235
|
+
params = {"sessionKey" => @session,
|
236
|
+
"method" => "user.getPointsBalance"
|
237
|
+
}
|
238
|
+
url = @nitro.base_url + "?.*method=user.getPointsBalance.*"
|
239
|
+
stub_http_request(:get, Regexp.new(url)).
|
240
|
+
with(:query => params).
|
241
|
+
to_return(:body => @success)
|
242
|
+
|
243
|
+
@nitro.get_points_balance
|
244
|
+
end
|
245
|
+
|
246
|
+
it "passes through all the expected parameters" do
|
247
|
+
options = {
|
248
|
+
'point_category' => 'other_points',
|
249
|
+
'criteria' => 'BALANCE',
|
250
|
+
'start' => '1354636962',
|
251
|
+
'end' => '1354637015',
|
252
|
+
'tags' => 'beans,rice',
|
253
|
+
'user_id' => 'another_user',
|
254
|
+
}
|
255
|
+
url = @nitro.base_url + '?criteria=BALANCE&end=1354637015&method=user.getPointsBalance&pointCategory=other_points&sessionKey=1&start=1354636962&tags=beans,rice&userId=another_user'
|
256
|
+
stub_http_request(:get, url).
|
257
|
+
to_return(:body => @success)
|
258
|
+
|
259
|
+
@nitro.get_points_balance options
|
260
|
+
end
|
261
|
+
|
262
|
+
it "passes through only the expected parameters" do
|
263
|
+
options = {
|
264
|
+
'point_category' => 'other_points',
|
265
|
+
'criteria' => 'BALANCE',
|
266
|
+
'start' => '1354636962',
|
267
|
+
'end' => '1354637015',
|
268
|
+
'tags' => 'beans,rice',
|
269
|
+
'user_id' => 'another_user',
|
270
|
+
'non_param' => 'some_unknown_param'
|
271
|
+
}
|
272
|
+
url = @nitro.base_url + '?criteria=BALANCE&end=1354637015&method=user.getPointsBalance&pointCategory=other_points&sessionKey=1&start=1354636962&tags=beans,rice&userId=another_user'
|
273
|
+
stub_http_request(:get, url).
|
274
|
+
to_return(:body => @success)
|
275
|
+
|
276
|
+
@nitro.get_points_balance options
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
describe "#get_points_leaders options_hash" do
|
281
|
+
it "gets points leaders" do
|
282
|
+
options = {
|
283
|
+
'return_count' => 20,
|
284
|
+
'duration' => 'ALLTIME',
|
285
|
+
'point_category' => 'points',
|
286
|
+
'criteria' => 'CREDITS'
|
287
|
+
}
|
288
|
+
|
289
|
+
results = { 'Nitro' => {
|
290
|
+
"res"=>"ok",
|
291
|
+
"method"=>"site.getPointsLeaders",
|
292
|
+
"leaders"=> {
|
293
|
+
"Leader"=>[ {
|
294
|
+
"UserPreferences"=>true,
|
295
|
+
"userId"=>"user_id1",
|
296
|
+
"points"=>"860"
|
297
|
+
}, {
|
298
|
+
"UserPreferences"=>true,
|
299
|
+
"userId"=>"user_id2",
|
300
|
+
"points"=>"620"
|
301
|
+
} ]
|
302
|
+
}
|
303
|
+
}}
|
304
|
+
|
305
|
+
# TODO: Figure out why when passing these params into the http request stub
|
306
|
+
# the mock doesn't work (it errors out).
|
307
|
+
#params = {
|
308
|
+
# 'method' => 'site.getPointsLeaders',
|
309
|
+
# 'sessionKey' => @session,
|
310
|
+
# 'returnCount' => 20,
|
311
|
+
# 'duration' => 'ALLTIME',
|
312
|
+
# 'pointCategory' => 'points',
|
313
|
+
# 'criteria' => 'CREDITS'
|
314
|
+
#}
|
315
|
+
|
316
|
+
url = @nitro.base_url + "?.*method=site.getPointsLeaders.*"
|
317
|
+
stub_http_request(:any, Regexp.new(url)).
|
318
|
+
#with(:query => params).
|
319
|
+
to_return(status: 200, body: results.to_json)
|
320
|
+
|
321
|
+
s = @nitro.get_points_leaders options
|
322
|
+
s['res'].should == results['Nitro']['res']
|
323
|
+
s['method'].should == results['Nitro']['method']
|
324
|
+
s['leaders']['Leader'][0]['userId'].should == results['Nitro']['leaders']['Leader'][0]['userId']
|
325
|
+
s['leaders']['Leader'][0]['points'].should == results['Nitro']['leaders']['Leader'][0]['points']
|
326
|
+
s['leaders']['Leader'][1]['userId'].should == results['Nitro']['leaders']['Leader'][1]['userId']
|
327
|
+
s['leaders']['Leader'][1]['points'].should == results['Nitro']['leaders']['Leader'][1]['points']
|
328
|
+
end
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
|
333
|
+
context "batch jobs" do
|
334
|
+
describe "#start_batch!" do
|
335
|
+
it "starts a batch successfully" do
|
336
|
+
@nitro.start_batch!
|
337
|
+
end
|
338
|
+
|
339
|
+
it "errors on second call to start_batch!" do
|
340
|
+
@nitro.start_batch!
|
341
|
+
expect {@nitro.start_batch!}.to raise_error(NitroApi::NitroError)
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
describe "#cancel_batch" do
|
346
|
+
it "cancels a batch successfully" do
|
347
|
+
@nitro.start_batch!
|
348
|
+
@nitro.cancel_batch
|
349
|
+
end
|
350
|
+
end
|
351
|
+
|
352
|
+
describe "#run_batch" do
|
353
|
+
describe "#login" do
|
354
|
+
it "should set session id for a successful batch call" do
|
355
|
+
mock_json = {'Nitro' => {'Login' => {'sessionKey' => @session}, 'method' => 'user.login', 'res' => 'ok'}}
|
356
|
+
url = @nitro.base_url #+ "?.*method=batch.run.*"
|
357
|
+
stub_http_request(:get, Regexp.new(url)).
|
358
|
+
to_return(:body => mock_json.to_json)
|
359
|
+
|
360
|
+
@nitro.start_batch!
|
361
|
+
@nitro.login
|
362
|
+
@nitro.run_batch
|
363
|
+
|
364
|
+
@nitro.session.should == @session
|
365
|
+
end
|
366
|
+
end
|
367
|
+
|
368
|
+
it "should call two methods successfully" do
|
369
|
+
action_name = "action"
|
370
|
+
mock_json = { 'Nitro' =>
|
371
|
+
{ 'res' => 'ok',
|
372
|
+
'method' => 'batch.run',
|
373
|
+
'Nitro' => [
|
374
|
+
{'Login' => {'sessionKey' => @session}, 'method' => 'user.login', 'res' => 'ok'},
|
375
|
+
{'res' => 'ok', 'method' => 'user.logAction'}
|
376
|
+
]
|
377
|
+
}
|
378
|
+
}
|
379
|
+
url = @nitro.base_url #+ "?.*method=batch.run.*"
|
380
|
+
stub_http_request(:post, Regexp.new(url)).
|
381
|
+
to_return(:body => mock_json.to_json)
|
382
|
+
|
383
|
+
@nitro.start_batch!
|
384
|
+
@nitro.login
|
385
|
+
@nitro.log_action action_name
|
386
|
+
s = @nitro.run_batch
|
387
|
+
|
388
|
+
@nitro.session.should == @session
|
389
|
+
s['res'].should == mock_json['Nitro']['res']
|
390
|
+
s['method'].should == mock_json['Nitro']['method']
|
391
|
+
s['Nitro'][1]['res'].should == mock_json['Nitro']['Nitro'][1]['res']
|
392
|
+
s['Nitro'][1]['method'].should == mock_json['Nitro']['Nitro'][1]['method']
|
393
|
+
end
|
394
|
+
|
395
|
+
it "should call the same method twice successfully" do
|
396
|
+
action_name1 = "action1"
|
397
|
+
action_name2 = "action2"
|
398
|
+
mock_json = { 'Nitro' =>
|
399
|
+
{ 'res' => 'ok',
|
400
|
+
'method' => 'batch.run',
|
401
|
+
'Nitro' => [
|
402
|
+
{'res' => 'ok', 'method' => 'user.logAction'},
|
403
|
+
{'res' => 'ok', 'method' => 'user.logAction'}
|
404
|
+
]
|
405
|
+
}
|
406
|
+
}
|
407
|
+
url = @nitro.base_url #+ "?.*method=batch.run.*"
|
408
|
+
stub_http_request(:post, Regexp.new(url)).
|
409
|
+
to_return(:body => mock_json.to_json)
|
410
|
+
|
411
|
+
@nitro.session = @session
|
412
|
+
@nitro.start_batch!
|
413
|
+
@nitro.log_action action_name1
|
414
|
+
@nitro.log_action action_name2
|
415
|
+
s = @nitro.run_batch
|
416
|
+
|
417
|
+
s['res'].should == mock_json['Nitro']['res']
|
418
|
+
s['method'].should == mock_json['Nitro']['method']
|
419
|
+
s['Nitro'][1]['res'].should == mock_json['Nitro']['Nitro'][1]['res']
|
420
|
+
s['Nitro'][1]['method'].should == mock_json['Nitro']['Nitro'][1]['method']
|
421
|
+
end
|
422
|
+
|
423
|
+
it "should call the same method twice but using different session keys successfully" do
|
424
|
+
action_name1 = "action1"
|
425
|
+
action_name2 = "action2"
|
426
|
+
session_key1 = '111'
|
427
|
+
session_key2 = '222'
|
428
|
+
|
429
|
+
mock_json = { 'Nitro' =>
|
430
|
+
{ 'res' => 'ok',
|
431
|
+
'method' => 'batch.run',
|
432
|
+
'Nitro' => [
|
433
|
+
{'res' => 'ok', 'method' => 'user.logAction'},
|
434
|
+
{'res' => 'ok', 'method' => 'user.logAction'}
|
435
|
+
]
|
436
|
+
}
|
437
|
+
}
|
438
|
+
expected_post_body = "method=batch.run&methodFeed=%5B%22tags%3Daction1%26method%3Duser.logAction%26sessionKey%3D111%22%2C%22tags%3Daction2%26method%3Duser.logAction%26sessionKey%3D222%22%5D"
|
439
|
+
|
440
|
+
url = @nitro.base_url #+ "?.*method=batch.run.*"
|
441
|
+
stub_http_request(:post, Regexp.new(url)).
|
442
|
+
with(body: expected_post_body).
|
443
|
+
to_return(body: mock_json.to_json)
|
444
|
+
|
445
|
+
@nitro.session = @session
|
446
|
+
@nitro.start_batch!
|
447
|
+
@nitro.log_action(action_name1, {session_key: session_key1})
|
448
|
+
@nitro.log_action(action_name2, {session_key: session_key2})
|
449
|
+
s = @nitro.run_batch
|
450
|
+
|
451
|
+
s['res'].should == mock_json['Nitro']['res']
|
452
|
+
s['method'].should == mock_json['Nitro']['method']
|
453
|
+
s['Nitro'][1]['res'].should == mock_json['Nitro']['Nitro'][1]['res']
|
454
|
+
s['Nitro'][1]['method'].should == mock_json['Nitro']['Nitro'][1]['method']
|
455
|
+
end
|
456
|
+
|
457
|
+
describe "#challenge_progress" do
|
458
|
+
it "should not allow the call in batch mode" do
|
459
|
+
@nitro.start_batch
|
460
|
+
expect {@nitro.challenge_progress }.to raise_error(NitroApi::NitroError)
|
461
|
+
end
|
462
|
+
end
|
463
|
+
|
464
|
+
describe "#action_history" do
|
465
|
+
it "should not allow the call in batch mode" do
|
466
|
+
@nitro.start_batch
|
467
|
+
expect {@nitro.action_history 'action1'}.to raise_error(NitroApi::NitroError)
|
468
|
+
end
|
469
|
+
end
|
470
|
+
|
471
|
+
end
|
170
472
|
end
|
171
473
|
end
|
474
|
+
|