riaction 0.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/Gemfile +4 -0
- data/Gemfile.lock +59 -0
- data/README +110 -0
- data/Rakefile +1 -0
- data/lib/riaction.rb +3 -0
- data/lib/riaction/iactionable/api.rb +209 -0
- data/lib/riaction/iactionable/connection.rb +114 -0
- data/lib/riaction/iactionable/error.rb +17 -0
- data/lib/riaction/iactionable/objects.rb +6 -0
- data/lib/riaction/iactionable/objects/achievement.rb +19 -0
- data/lib/riaction/iactionable/objects/awardable.rb +44 -0
- data/lib/riaction/iactionable/objects/challenge.rb +18 -0
- data/lib/riaction/iactionable/objects/goal.rb +19 -0
- data/lib/riaction/iactionable/objects/i_actionable_object.rb +40 -0
- data/lib/riaction/iactionable/objects/identifier.rb +11 -0
- data/lib/riaction/iactionable/objects/leaderboard.rb +10 -0
- data/lib/riaction/iactionable/objects/leaderboard_report.rb +23 -0
- data/lib/riaction/iactionable/objects/level.rb +18 -0
- data/lib/riaction/iactionable/objects/level_type.rb +10 -0
- data/lib/riaction/iactionable/objects/point_type.rb +10 -0
- data/lib/riaction/iactionable/objects/profile_level.rb +16 -0
- data/lib/riaction/iactionable/objects/profile_points.rb +21 -0
- data/lib/riaction/iactionable/objects/profile_summary.rb +24 -0
- data/lib/riaction/iactionable/objects/progress.rb +37 -0
- data/lib/riaction/iactionable/settings.rb +30 -0
- data/lib/riaction/riaction.rb +368 -0
- data/lib/riaction/version.rb +3 -0
- data/lib/tasks/riaction.rake +101 -0
- data/riaction.gemspec +32 -0
- data/spec/api_spec.rb +288 -0
- data/spec/connection_spec.rb +111 -0
- data/spec/riaction_spec.rb +253 -0
- data/spec/settings_spec.rb +52 -0
- data/spec/spec_helper.rb +1 -0
- metadata +153 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
namespace 'iactionable' do
|
|
2
|
+
namespace 'list' do
|
|
3
|
+
desc "List all registered events"
|
|
4
|
+
task :events => :environment do
|
|
5
|
+
Dir.glob(File.join(RAILS_ROOT,"app","models","*.rb")).each do |rbfile|
|
|
6
|
+
require rbfile
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
Riaction::EVENT_LOGGING_CLASSES.each do |klass|
|
|
10
|
+
puts "#{klass} defines the following events:"
|
|
11
|
+
klass.riaction_events.each_pair do |name, deets|
|
|
12
|
+
puts " :#{name}:"
|
|
13
|
+
if Riaction.crud_actions.include? deets[:trigger]
|
|
14
|
+
puts " Trigger: Fired on ActiveRecord after_#{deets[:trigger]} callback"
|
|
15
|
+
else
|
|
16
|
+
puts " Trigger: By calling :trigger_#{deets[:trigger]}!"
|
|
17
|
+
end
|
|
18
|
+
case deets[:profile]
|
|
19
|
+
when Symbol
|
|
20
|
+
if deets[:profile] == :self
|
|
21
|
+
puts " Profile: (self)"
|
|
22
|
+
else
|
|
23
|
+
puts " Profile: Value returned by :#{deets[:profile]}"
|
|
24
|
+
end
|
|
25
|
+
when Proc
|
|
26
|
+
puts " Profile: Returned via Proc"
|
|
27
|
+
end
|
|
28
|
+
case deets[:params]
|
|
29
|
+
when NilClass
|
|
30
|
+
puts " Event Params: None"
|
|
31
|
+
when Symbol
|
|
32
|
+
puts " Event Params: Hash returned by :#{deets[:params]}"
|
|
33
|
+
when Proc
|
|
34
|
+
puts " Event Params: Hash returned via Proc"
|
|
35
|
+
when Hash
|
|
36
|
+
puts " Event Params: #{deets[:params]}"
|
|
37
|
+
end
|
|
38
|
+
case deets[:guard]
|
|
39
|
+
when NilClass
|
|
40
|
+
puts " Guard: None"
|
|
41
|
+
when Proc
|
|
42
|
+
puts " Guard: Boolean returned via Proc"
|
|
43
|
+
when Hash
|
|
44
|
+
puts " Guard: Boolean returned by :#{deets[:guard]}"
|
|
45
|
+
end
|
|
46
|
+
puts ""
|
|
47
|
+
end
|
|
48
|
+
puts "-------------------------------------------------------"
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
desc "List all registered profiles"
|
|
53
|
+
task :profiles => :environment do
|
|
54
|
+
Dir.glob(File.join(RAILS_ROOT,"app","models","*.rb")).each do |rbfile|
|
|
55
|
+
require rbfile
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
Riaction::PROFILE_CLASSES.each do |klass|
|
|
59
|
+
puts "#{klass} defines the following profile types:"
|
|
60
|
+
klass.riaction_profiles.each_pair do |type, ids|
|
|
61
|
+
puts " :#{type}:"
|
|
62
|
+
puts " With the following ID types, and field used for the value:"
|
|
63
|
+
ids.each_pair do |id_type, id|
|
|
64
|
+
puts " :#{id_type} => :#{id}"
|
|
65
|
+
end
|
|
66
|
+
puts ""
|
|
67
|
+
end
|
|
68
|
+
puts "-------------------------------------------------------"
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
namespace 'process' do
|
|
74
|
+
desc "Run through all classes acting as profiles and make sure each record/instance exists on IActionable"
|
|
75
|
+
task :profiles => :environment do
|
|
76
|
+
Dir.glob(File.join(RAILS_ROOT,"app","models","*.rb")).each do |rbfile|
|
|
77
|
+
require rbfile
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
Riaction::PROFILE_CLASSES.each do |klass|
|
|
81
|
+
begin
|
|
82
|
+
klass.all.each do |obj|
|
|
83
|
+
puts "Addressing #{klass} record #{obj.id}..."
|
|
84
|
+
klass.riaction_profiles.each_pair do |type, ids|
|
|
85
|
+
puts "...creating profile under type '#{type}'"
|
|
86
|
+
obj.riaction_create_profile(type)
|
|
87
|
+
default_keys = obj.riaction_profile_keys(type)
|
|
88
|
+
ids.each_pair do |id_type, id|
|
|
89
|
+
value = obj.send(id)
|
|
90
|
+
puts "...updating profile with id type #{id_type} and value #{value}"
|
|
91
|
+
obj.riaction_update_profile(type, default_keys[:profile_type], id_type)
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
rescue IAction::Error::NoProfileDefined => e
|
|
96
|
+
puts "ERROR: #{klass} does not properly define a profile; skipping"
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
data/riaction.gemspec
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
|
3
|
+
require "riaction/version"
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |s|
|
|
6
|
+
s.name = "riaction"
|
|
7
|
+
s.version = Riaction::VERSION
|
|
8
|
+
s.authors = ["Chris Eberz"]
|
|
9
|
+
s.email = ["ceberz@elctech.com"]
|
|
10
|
+
s.homepage = ""
|
|
11
|
+
s.summary = %q{Wrapper for IActionable's restful API and an "acts-as" style interface for models to behave as profiles and drive game events.}
|
|
12
|
+
s.description = %q{Wrapper for IActionable's restful API and an "acts-as" style interface for models to behave as profiles and drive game events.}
|
|
13
|
+
|
|
14
|
+
s.rubyforge_project = "riaction"
|
|
15
|
+
|
|
16
|
+
s.files = `git ls-files`.split("\n")
|
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
19
|
+
s.require_paths = ["lib", "spec"]
|
|
20
|
+
|
|
21
|
+
# specify any dependencies here; for example:
|
|
22
|
+
# s.add_development_dependency "rspec"
|
|
23
|
+
# s.add_runtime_dependency "rest-client"
|
|
24
|
+
|
|
25
|
+
s.add_development_dependency "rspec", "~> 2.6"
|
|
26
|
+
|
|
27
|
+
s.add_runtime_dependency "faraday"
|
|
28
|
+
s.add_runtime_dependency "faraday-stack"
|
|
29
|
+
s.add_runtime_dependency "activesupport", "~> 2.0"
|
|
30
|
+
s.add_runtime_dependency "activerecord"
|
|
31
|
+
s.add_runtime_dependency "resque"
|
|
32
|
+
end
|
data/spec/api_spec.rb
ADDED
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
require 'spec_helper.rb'
|
|
2
|
+
|
|
3
|
+
describe IActionable::Api do
|
|
4
|
+
before do
|
|
5
|
+
@mock_settings = mock("mock settings")
|
|
6
|
+
@mock_connection = mock("connection")
|
|
7
|
+
@mock_response = mock("mock response")
|
|
8
|
+
@mock_response_item = mock("mock response item")
|
|
9
|
+
|
|
10
|
+
IActionable::Connection.stub!(:new).and_return(@mock_connection)
|
|
11
|
+
IActionable::Settings.stub!(:new).and_return(@mock_settings)
|
|
12
|
+
|
|
13
|
+
@mock_response.stub!(:map).and_yield(@mock_response_item).and_return(@mock_response)
|
|
14
|
+
@mock_response.stub!(:[]).and_return(@mock_response)
|
|
15
|
+
|
|
16
|
+
IActionable::Api.init_settings(nil)
|
|
17
|
+
|
|
18
|
+
@api = IActionable::Api.new
|
|
19
|
+
@profile_type = "user"
|
|
20
|
+
@id_type = "custom"
|
|
21
|
+
@id = 42
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe "initialization" do
|
|
25
|
+
it "should initialize the connection with the previously initialized settings" do
|
|
26
|
+
IActionable::Settings.should_receive(:new).once.with({:foo => "bar"})
|
|
27
|
+
IActionable::Connection.should_receive(:new).once.with(@mock_settings)
|
|
28
|
+
IActionable::Api.init_settings({:foo => "bar"})
|
|
29
|
+
IActionable::Api.new
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
describe "without having been pre-initialized with settings" do
|
|
33
|
+
before do
|
|
34
|
+
IActionable::Api.class_variable_set(:@@settings, nil)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should raise a config error" do
|
|
38
|
+
lambda { IActionable::Api.new }.should raise_error(IActionable::ConfigError)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
describe "event creation" do
|
|
44
|
+
before do
|
|
45
|
+
@event_key = "some_event"
|
|
46
|
+
@mock_event_attrs = mock("mock event attrs")
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should make the correct IActionable API all" do
|
|
50
|
+
@mock_connection.should_receive(:request).once.ordered.and_return(@mock_connection)
|
|
51
|
+
@mock_connection.should_receive(:with_app_key).and_return(@mock_connection)
|
|
52
|
+
@mock_connection.should_receive(:with_api_key).and_return(@mock_connection)
|
|
53
|
+
@mock_connection.should_receive(:to).with("/#{@profile_type}/#{@id_type}/#{@id}/events/#{@event_key}").and_return(@mock_connection)
|
|
54
|
+
@mock_connection.should_receive(:with_params).with(@mock_event_attrs).and_return(@mock_connection)
|
|
55
|
+
@mock_connection.should_receive(:post).and_return(@mock_response)
|
|
56
|
+
@api.log_event(@profile_type, @id_type, @id, @event_key, @mock_event_attrs).should == @mock_response
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
describe "profile" do
|
|
61
|
+
before do
|
|
62
|
+
@mock_connection.should_receive(:request).once.ordered.and_return(@mock_connection)
|
|
63
|
+
@mock_connection.should_receive(:with_app_key).and_return(@mock_connection)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
describe "fetching" do
|
|
67
|
+
before do
|
|
68
|
+
@mock_connection.should_receive(:to).with("/#{@profile_type}/#{@id_type}/#{@id}").and_return(@mock_connection)
|
|
69
|
+
@mock_connection.should_receive(:get).and_return(@mock_response)
|
|
70
|
+
IActionable::Objects::ProfileSummary.stub!(:new)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
describe "with achivement count" do
|
|
74
|
+
before do
|
|
75
|
+
@achievement_count = 10
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "should be the correct IActionable API call" do
|
|
79
|
+
@mock_connection.should_receive(:with_params).with({:achievement_count => @achievement_count}).and_return(@mock_connection)
|
|
80
|
+
@api.get_profile_summary(@profile_type, @id_type, @id, @achievement_count)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
describe "without achievement count" do
|
|
85
|
+
it "should be the correct IActionable API call" do
|
|
86
|
+
@mock_connection.should_not_receive(:with_params)
|
|
87
|
+
@api.get_profile_summary(@profile_type, @id_type, @id, nil)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it "should return the response as a ProfileSummary object" do
|
|
92
|
+
IActionable::Objects::ProfileSummary.should_receive(:new).once.with(@mock_response)
|
|
93
|
+
@api.get_profile_summary(@profile_type, @id_type, @id, nil)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
describe "creation" do
|
|
98
|
+
before do
|
|
99
|
+
@mock_connection.should_receive(:with_api_key).and_return(@mock_connection)
|
|
100
|
+
@mock_connection.should_receive(:to).with("/#{@profile_type}/#{@id_type}/#{@id}").and_return(@mock_connection)
|
|
101
|
+
@mock_connection.should_receive(:post).and_return(@mock_response)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
describe "with optional display name" do
|
|
105
|
+
before do
|
|
106
|
+
@display_name = "zortnac"
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it "should be the correct IActionable API call" do
|
|
110
|
+
@mock_connection.should_receive(:with_params).with({:display_name => @display_name}).and_return(@mock_connection)
|
|
111
|
+
@api.create_profile(@profile_type, @id_type, @id, @display_name).should == @mock_response
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
describe "without optional display name" do
|
|
116
|
+
it "should be the correct IActionable API call" do
|
|
117
|
+
@mock_connection.should_not_receive(:with_params)
|
|
118
|
+
@api.create_profile(@profile_type, @id_type, @id, nil).should == @mock_response
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
describe "updating" do
|
|
124
|
+
it "should make the correct IActionable API all" do
|
|
125
|
+
new_type = "email"
|
|
126
|
+
new_id = 2
|
|
127
|
+
@mock_connection.should_receive(:with_api_key).and_return(@mock_connection)
|
|
128
|
+
@mock_connection.should_receive(:to).with("/#{@profile_type}/#{@id_type}/#{@id}/identifiers/#{new_type}/#{new_id}").and_return(@mock_connection)
|
|
129
|
+
@mock_connection.should_receive(:post).and_return(@mock_response)
|
|
130
|
+
@api.add_profile_identifier(@profile_type, @id_type, @id, new_type, new_id).should == @mock_response
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
describe "profile points" do
|
|
136
|
+
before do
|
|
137
|
+
@mock_connection.should_receive(:request).once.ordered.and_return(@mock_connection)
|
|
138
|
+
@mock_connection.should_receive(:with_app_key).and_return(@mock_connection)
|
|
139
|
+
@point_type = "experience_points"
|
|
140
|
+
IActionable::Objects::ProfilePoints.stub!(:new).and_return(@mock_response)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
describe "fetching" do
|
|
144
|
+
it "should make the correct IActionable API all" do
|
|
145
|
+
@mock_connection.should_receive(:to).with("/#{@profile_type}/#{@id_type}/#{@id}/points/#{@point_type}").and_return(@mock_connection)
|
|
146
|
+
@mock_connection.should_receive(:get).and_return(@mock_response)
|
|
147
|
+
@api.get_profile_points(@profile_type, @id_type, @id, @point_type)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
it "should return the response as a ProfileSummary object" do
|
|
151
|
+
@mock_connection.stub!(:to).and_return(@mock_connection)
|
|
152
|
+
@mock_connection.stub!(:get).and_return(@mock_response)
|
|
153
|
+
IActionable::Objects::ProfilePoints.should_receive(:new).once.with(@mock_response).and_return(@mock_response)
|
|
154
|
+
@api.get_profile_points(@profile_type, @id_type, @id, @point_type).should == @mock_response
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
describe "updating" do
|
|
159
|
+
before do
|
|
160
|
+
@amount = 100
|
|
161
|
+
@mock_connection.should_receive(:with_api_key).and_return(@mock_connection)
|
|
162
|
+
@mock_connection.should_receive(:to).with("/#{@profile_type}/#{@id_type}/#{@id}/points/#{@point_type}").and_return(@mock_connection)
|
|
163
|
+
@mock_connection.should_receive(:with_params).with(hash_including(:value => @amount)).and_return(@mock_connection)
|
|
164
|
+
@mock_connection.should_receive(:post).and_return(@mock_response)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
describe "with optional reason" do
|
|
168
|
+
it "should make the correct IActionable API all" do
|
|
169
|
+
reason = "some reason"
|
|
170
|
+
@mock_connection.should_receive(:with_params).with(hash_including(:description => reason)).and_return(@mock_connection)
|
|
171
|
+
@api.update_profile_points(@profile_type, @id_type, @id, @point_type, @amount, reason)
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
describe "without optional reason" do
|
|
176
|
+
it "should make the correct IActionable API all" do
|
|
177
|
+
reason = "some reason"
|
|
178
|
+
@mock_connection.should_not_receive(:with_params).with(hash_including(:description => reason))
|
|
179
|
+
@api.update_profile_points(@profile_type, @id_type, @id, @point_type, @amount, nil)
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
it "should return the response as a ProfileSummary object" do
|
|
184
|
+
IActionable::Objects::ProfilePoints.should_receive(:new).once.with(@mock_response).and_return(@mock_response)
|
|
185
|
+
@api.update_profile_points(@profile_type, @id_type, @id, @point_type, @amount, nil).should == @mock_response
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
[ [:achievements, IActionable::Objects::Achievement],
|
|
191
|
+
[:challenges, IActionable::Objects::Challenge],
|
|
192
|
+
[:goals, IActionable::Objects::Goal]].each do |type|
|
|
193
|
+
describe "loading all #{type} for a profile" do
|
|
194
|
+
before do
|
|
195
|
+
type[1].stub!(:new)
|
|
196
|
+
@mock_connection.should_receive(:request).once.ordered.and_return(@mock_connection)
|
|
197
|
+
@mock_connection.should_receive(:with_app_key).and_return(@mock_connection)
|
|
198
|
+
@mock_connection.should_receive(:get).and_return(@mock_response)
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
describe "filtered by available" do
|
|
202
|
+
it "should make the correct IActionable API all" do
|
|
203
|
+
@mock_connection.should_receive(:to).once.with("/#{@profile_type}/#{@id_type}/#{@id}/#{type[0]}/Available").and_return(@mock_connection)
|
|
204
|
+
@api.send("get_profile_#{type[0]}", @profile_type, @id_type, @id, :available)
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
it "should return as the proper object type" do
|
|
208
|
+
@mock_connection.stub!(:to).and_return(@mock_connection)
|
|
209
|
+
type[1].should_receive(:new).once.with(@mock_response_item)
|
|
210
|
+
@api.send("get_profile_#{type[0]}", @profile_type, @id_type, @id, :available).should == @mock_response
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
describe "filtered by complete" do
|
|
215
|
+
it "should make the correct IActionable API all" do
|
|
216
|
+
@mock_connection.should_receive(:to).once.with("/#{@profile_type}/#{@id_type}/#{@id}/#{type[0]}/Completed").and_return(@mock_connection)
|
|
217
|
+
@api.send("get_profile_#{type[0]}", @profile_type, @id_type, @id, :completed)
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
it "should return as the proper object type" do
|
|
221
|
+
@mock_connection.stub!(:to).and_return(@mock_connection)
|
|
222
|
+
type[1].should_receive(:new).once.with(@mock_response_item)
|
|
223
|
+
@api.send("get_profile_#{type[0]}", @profile_type, @id_type, @id, :completed).should == @mock_response
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
describe "unfiltered" do
|
|
228
|
+
it "should make the correct IActionable API all" do
|
|
229
|
+
@mock_connection.should_receive(:to).once.with("/#{@profile_type}/#{@id_type}/#{@id}/#{type[0]}").and_return(@mock_connection)
|
|
230
|
+
@api.send("get_profile_#{type[0]}", @profile_type, @id_type, @id, nil)
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
it "should return as the proper object type, in a hash with both filter types" do
|
|
234
|
+
@mock_connection.stub!(:to).and_return(@mock_connection)
|
|
235
|
+
type[1].should_receive(:new).twice.with(@mock_response_item)
|
|
236
|
+
@api.send("get_profile_#{type[0]}", @profile_type, @id_type, @id, nil).should == {:available => @mock_response, :completed => @mock_response}
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
describe "leaderboards" do
|
|
243
|
+
before do
|
|
244
|
+
@point_type = "experience_points"
|
|
245
|
+
@leaderboard = "top_players"
|
|
246
|
+
@page_number = 3
|
|
247
|
+
@page_count = 9
|
|
248
|
+
@mock_connection.should_receive(:request).once.ordered.and_return(@mock_connection)
|
|
249
|
+
@mock_connection.should_receive(:with_app_key).and_return(@mock_connection)
|
|
250
|
+
IActionable::Objects::LeaderboardReport.stub!(:new).and_return(@mock_response)
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
describe "fetching" do
|
|
254
|
+
it "should make the correct IActionable API all" do
|
|
255
|
+
@mock_connection.should_receive(:to).with("/#{@profile_type}/leaderboards/points/#{@point_type}/#{@leaderboard}").and_return(@mock_connection)
|
|
256
|
+
@mock_connection.should_receive(:with_params).with(hash_including(:pageNumber => @page_number)).and_return(@mock_connection)
|
|
257
|
+
@mock_connection.should_receive(:with_params).with(hash_including(:pageCount => @page_count)).and_return(@mock_connection)
|
|
258
|
+
@mock_connection.should_receive(:with_params).with(hash_including(:id => @id)).and_return(@mock_connection)
|
|
259
|
+
@mock_connection.should_receive(:with_params).with(hash_including(:idType => @id_type)).and_return(@mock_connection)
|
|
260
|
+
@mock_connection.should_receive(:get).and_return(@mock_response)
|
|
261
|
+
@api.get_leaderboard(@profile_type, @point_type, @leaderboard, @page_number, @page_count, @id, @id_type)
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
it "should return the response as a LeaderboardReport object" do
|
|
265
|
+
@mock_connection.stub!(:to).and_return(@mock_connection)
|
|
266
|
+
@mock_connection.stub!(:with_params).and_return(@mock_connection)
|
|
267
|
+
@mock_connection.stub!(:get).and_return(@mock_response)
|
|
268
|
+
IActionable::Objects::LeaderboardReport.should_receive(:new).once.with(@mock_response).and_return(@mock_response)
|
|
269
|
+
@api.get_leaderboard(@profile_type, @point_type, @leaderboard, nil, nil, nil, nil).should == @mock_response
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
describe "notifications" do
|
|
275
|
+
it "should make the correct IActionable API all" do
|
|
276
|
+
IActionable::Objects::Achievement.stub!(:new)
|
|
277
|
+
IActionable::Objects::Challenge.stub!(:new)
|
|
278
|
+
IActionable::Objects::Goal.stub!(:new)
|
|
279
|
+
IActionable::Objects::Level.stub!(:new)
|
|
280
|
+
IActionable::Objects::ProfilePoints.stub!(:new)
|
|
281
|
+
@mock_connection.should_receive(:request).once.ordered.and_return(@mock_connection)
|
|
282
|
+
@mock_connection.should_receive(:with_app_key).and_return(@mock_connection)
|
|
283
|
+
@mock_connection.should_receive(:to).with("/#{@profile_type}/#{@id_type}/#{@id}/notifications").and_return(@mock_connection)
|
|
284
|
+
@mock_connection.should_receive(:get).and_return(@mock_response)
|
|
285
|
+
@api.get_profile_notifications(@profile_type, @id_type, @id)
|
|
286
|
+
end
|
|
287
|
+
end
|
|
288
|
+
end
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
require 'spec_helper.rb'
|
|
2
|
+
|
|
3
|
+
describe IActionable::Connection do
|
|
4
|
+
before do
|
|
5
|
+
@settings_hash = {
|
|
6
|
+
:app_key => "12345",
|
|
7
|
+
:api_key => "abcde",
|
|
8
|
+
:version => "3"
|
|
9
|
+
}
|
|
10
|
+
@settings = IActionable::Settings.new(@settings_hash)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
describe "initialization" do
|
|
14
|
+
it "should initialize a new Faraday connection object" do
|
|
15
|
+
mock_faraday_bulder = mock("faraday builder")
|
|
16
|
+
|
|
17
|
+
Faraday.should_receive(:new).once.with("http://api.iactionable.com/v#{@settings.version}/").and_yield(mock_faraday_bulder)
|
|
18
|
+
mock_faraday_bulder.should_receive(:use).once.with(FaradayStack::ResponseJSON, {:content_type => 'application/json'})
|
|
19
|
+
mock_faraday_bulder.should_receive(:use).once.with(Faraday::Response::RaiseError)
|
|
20
|
+
mock_faraday_bulder.should_receive(:use).once.with(Faraday::Adapter::NetHttp)
|
|
21
|
+
|
|
22
|
+
IActionable::Connection.new(@settings)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
describe "requests" do
|
|
27
|
+
before do
|
|
28
|
+
@mock_faraday_connection = mock("mock faraday connection")
|
|
29
|
+
@mock_faraday_response = mock("mock faraday response")
|
|
30
|
+
@mock_faraday_request_builder = mock("mock faraday request builder")
|
|
31
|
+
@mock_response_body = mock("mock response body")
|
|
32
|
+
@mock_faraday_request_headers = mock("mock faraday request headers")
|
|
33
|
+
@mock_faraday_response.stub!(:body).and_return(@mock_response_body)
|
|
34
|
+
@mock_faraday_request_builder.stub!(:headers).and_return(@mock_faraday_request_headers)
|
|
35
|
+
@mock_faraday_request_headers.stub!(:merge!).and_return(true)
|
|
36
|
+
Faraday.stub!(:new).and_return(@mock_faraday_connection)
|
|
37
|
+
@connection = IActionable::Connection.new(@settings)
|
|
38
|
+
@path = "/test/path"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
describe "using get method" do
|
|
42
|
+
describe "requiring an app key" do
|
|
43
|
+
describe "with optional params" do
|
|
44
|
+
it "should request correctly through faraday and return the body" do
|
|
45
|
+
@mock_faraday_connection.should_receive(:get).and_yield(@mock_faraday_request_builder).and_return(@mock_faraday_response)
|
|
46
|
+
@mock_faraday_request_builder.should_receive(:url).once.with(@path, hash_including(:appKey => @settings.app_key, :foo => :bar))
|
|
47
|
+
@mock_faraday_request_builder.should_receive(:headers).any_number_of_times
|
|
48
|
+
@connection.request.to(@path).with_app_key.with_params(:foo => :bar).get.should == @mock_response_body
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
describe "without optional params" do
|
|
53
|
+
it "should request correctly through faraday and return the body" do
|
|
54
|
+
@mock_faraday_connection.should_receive(:get).and_yield(@mock_faraday_request_builder).and_return(@mock_faraday_response)
|
|
55
|
+
@mock_faraday_request_builder.should_receive(:url).once.with(@path, hash_including(:appKey => @settings.app_key))
|
|
56
|
+
@mock_faraday_request_builder.should_receive(:headers).any_number_of_times
|
|
57
|
+
@connection.request.to(@path).with_app_key.get.should == @mock_response_body
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
describe "using post method" do
|
|
64
|
+
describe "requiring an app key" do
|
|
65
|
+
describe "requiring an api key" do
|
|
66
|
+
describe "with optional params" do
|
|
67
|
+
it "should request correctly through faraday and return the body" do
|
|
68
|
+
@mock_faraday_connection.should_receive(:post).and_yield(@mock_faraday_request_builder).and_return(@mock_faraday_response)
|
|
69
|
+
@mock_faraday_request_builder.should_receive(:url).once.with(@path, hash_including(:appKey => @settings.app_key, :foo => :bar))
|
|
70
|
+
@mock_faraday_request_builder.should_receive(:headers).once.and_return(@mock_faraday_request_headers)
|
|
71
|
+
@mock_faraday_request_headers.should_receive(:merge!).once.with(:Authorization => @settings.api_key)
|
|
72
|
+
@connection.request.to(@path).with_app_key.with_api_key.with_params(:foo => :bar).post.should == @mock_response_body
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
describe "without optional params" do
|
|
77
|
+
it "should request correctly through faraday and return the body" do
|
|
78
|
+
@mock_faraday_connection.should_receive(:post).and_yield(@mock_faraday_request_builder).and_return(@mock_faraday_response)
|
|
79
|
+
@mock_faraday_request_builder.should_receive(:url).once.with(@path, hash_including(:appKey => @settings.app_key))
|
|
80
|
+
@mock_faraday_request_builder.should_receive(:headers).once.and_return(@mock_faraday_request_headers)
|
|
81
|
+
@mock_faraday_request_headers.should_receive(:merge!).once.with(:Authorization => @settings.api_key)
|
|
82
|
+
@connection.request.to(@path).with_app_key.with_api_key.post.should == @mock_response_body
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
describe "with an optional body" do
|
|
87
|
+
it "should request correctly through faraday and return the body" do
|
|
88
|
+
@mock_faraday_connection.should_receive(:post).and_yield(@mock_faraday_request_builder).and_return(@mock_faraday_response)
|
|
89
|
+
@mock_faraday_request_builder.should_receive(:url).once.with(@path, hash_including(:appKey => @settings.app_key))
|
|
90
|
+
@mock_faraday_request_builder.should_receive(:headers).once.and_return(@mock_faraday_request_headers)
|
|
91
|
+
@mock_faraday_request_headers.should_receive(:merge!).once.with(:Authorization => @settings.api_key)
|
|
92
|
+
@mock_faraday_request_builder.should_receive(:body=).once.with(:foo => :bar)
|
|
93
|
+
@connection.request.to(@path).with_app_key.with_api_key.with_body(:foo => :bar).post.should == @mock_response_body
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
describe "without an optional body" do
|
|
98
|
+
it "should request correctly through faraday and return the body" do
|
|
99
|
+
@mock_faraday_connection.should_receive(:post).and_yield(@mock_faraday_request_builder).and_return(@mock_faraday_response)
|
|
100
|
+
@mock_faraday_request_builder.should_receive(:url).once.with(@path, hash_including(:appKey => @settings.app_key))
|
|
101
|
+
@mock_faraday_request_builder.should_receive(:headers).once.and_return(@mock_faraday_request_headers)
|
|
102
|
+
@mock_faraday_request_headers.should_receive(:merge!).once.with(:Authorization => @settings.api_key)
|
|
103
|
+
@mock_faraday_request_builder.should_not_receive(:body=)
|
|
104
|
+
@connection.request.to(@path).with_app_key.with_api_key.post.should == @mock_response_body
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|