sift 1.1.7.3 → 2.0.0.0
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.
- checksums.yaml +5 -13
- data/.travis.yml +5 -0
- data/HISTORY +6 -2
- data/README.rdoc +36 -11
- data/lib/sift.rb +33 -8
- data/lib/sift/client.rb +347 -107
- data/lib/sift/version.rb +2 -2
- data/sift.gemspec +2 -2
- data/spec/unit/client_203_spec.rb +192 -0
- data/spec/unit/client_label_spec.rb +55 -11
- data/spec/unit/client_spec.rb +141 -49
- metadata +26 -17
data/lib/sift/version.rb
CHANGED
data/sift.gemspec
CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.name = "sift"
|
7
7
|
s.version = Sift::VERSION
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
|
-
s.authors = ["Fred Sadaghiani", "Yoav Schatzberg"]
|
9
|
+
s.authors = ["Fred Sadaghiani", "Yoav Schatzberg", "Jacob Burnim"]
|
10
10
|
s.email = ["support@siftscience.com"]
|
11
11
|
s.homepage = "http://siftscience.com"
|
12
12
|
s.summary = %q{Sift Science Ruby API Gem}
|
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
|
22
22
|
# Gems that must be intalled for sift to compile and build
|
23
23
|
s.add_development_dependency "rspec", ">=2.14.1"
|
24
|
-
s.add_development_dependency "webmock", ">= 1.16.0"
|
24
|
+
s.add_development_dependency "webmock", ">= 1.16.0", "< 2"
|
25
25
|
|
26
26
|
# Gems that must be intalled for sift to work
|
27
27
|
s.add_dependency "httparty", ">= 0.11.0"
|
@@ -0,0 +1,192 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "spec_helper"))
|
2
|
+
|
3
|
+
describe Sift::Client do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
Sift.api_key = nil
|
7
|
+
end
|
8
|
+
|
9
|
+
def valid_transaction_properties
|
10
|
+
{
|
11
|
+
:$buyer_user_id => "123456",
|
12
|
+
:$seller_user_id => "654321",
|
13
|
+
:$amount => 1253200,
|
14
|
+
:$currency_code => "USD",
|
15
|
+
:$time => Time.now.to_i,
|
16
|
+
:$transaction_id => "my_transaction_id",
|
17
|
+
:$billing_name => "Mike Snow",
|
18
|
+
:$billing_bin => "411111",
|
19
|
+
:$billing_last4 => "1111",
|
20
|
+
:$billing_address1 => "123 Main St.",
|
21
|
+
:$billing_city => "San Francisco",
|
22
|
+
:$billing_region => "CA",
|
23
|
+
:$billing_country => "US",
|
24
|
+
:$billing_zip => "94131",
|
25
|
+
:$user_email => "mike@example.com"
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
def score_response_json
|
30
|
+
{
|
31
|
+
:user_id => "247019",
|
32
|
+
:score => 0.93,
|
33
|
+
:reasons => [{
|
34
|
+
:name => "UsersPerDevice",
|
35
|
+
:value => 4,
|
36
|
+
:details => {
|
37
|
+
:users => "a, b, c, d"
|
38
|
+
}
|
39
|
+
}],
|
40
|
+
:status => 0,
|
41
|
+
:error_message => "OK"
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
def action_response_json
|
46
|
+
{
|
47
|
+
:user_id => "247019",
|
48
|
+
:score => 0.93,
|
49
|
+
:actions => [{
|
50
|
+
:action_id => "1234567890abcdefghijklmn",
|
51
|
+
:time => 1437421587052,
|
52
|
+
:triggers => [{
|
53
|
+
:triggerType => "FORMULA",
|
54
|
+
:source => "synchronous_action",
|
55
|
+
:trigger_id => "12345678900987654321abcd"
|
56
|
+
}],
|
57
|
+
:entity => {
|
58
|
+
:type => "USER",
|
59
|
+
:id => "23056"
|
60
|
+
}
|
61
|
+
},
|
62
|
+
{
|
63
|
+
:action_id => "12345678901234567890abcd",
|
64
|
+
:time => 1437421587410,
|
65
|
+
:triggers => [{
|
66
|
+
:triggerType => "FORMULA",
|
67
|
+
:source => "synchronous_action",
|
68
|
+
:trigger_id => "abcd12345678901234567890"
|
69
|
+
}],
|
70
|
+
:entity => {
|
71
|
+
:type => "ORDER",
|
72
|
+
:id => "order_at_ 1437421587009"
|
73
|
+
}
|
74
|
+
}],
|
75
|
+
:status => 0,
|
76
|
+
:error_message => "OK"
|
77
|
+
}
|
78
|
+
end
|
79
|
+
|
80
|
+
def fully_qualified_api_endpoint
|
81
|
+
Sift::Client::API_ENDPOINT + Sift.rest_api_path
|
82
|
+
end
|
83
|
+
|
84
|
+
it "Successfully submits a v203 event with overridden key" do
|
85
|
+
response_json = { :status => 0, :error_message => "OK"}
|
86
|
+
stub_request(:post, "https://api.siftscience.com/v203/events").
|
87
|
+
with { | request|
|
88
|
+
parsed_body = JSON.parse(request.body)
|
89
|
+
expect(parsed_body).to include("$buyer_user_id" => "123456")
|
90
|
+
expect(parsed_body).to include("$api_key" => "overridden")
|
91
|
+
}.to_return(:status => 200, :body => MultiJson.dump(response_json), :headers => {})
|
92
|
+
|
93
|
+
api_key = "foobar"
|
94
|
+
event = "$transaction"
|
95
|
+
properties = valid_transaction_properties
|
96
|
+
|
97
|
+
response = Sift::Client.new(:api_key => api_key, :version => "203")
|
98
|
+
.track(event, properties, :api_key => "overridden")
|
99
|
+
expect(response.ok?).to eq(true)
|
100
|
+
expect(response.api_status).to eq(0)
|
101
|
+
expect(response.api_error_message).to eq("OK")
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
it "Successfully fetches a v203 score" do
|
106
|
+
|
107
|
+
api_key = "foobar"
|
108
|
+
response_json = score_response_json
|
109
|
+
|
110
|
+
stub_request(:get, "https://api.siftscience.com/v203/score/247019/?api_key=foobar")
|
111
|
+
.to_return(:status => 200, :body => MultiJson.dump(response_json),
|
112
|
+
:headers => {"content-type"=>"application/json; charset=UTF-8",
|
113
|
+
"content-length"=> "74"})
|
114
|
+
|
115
|
+
response = Sift::Client.new(:api_key => api_key)
|
116
|
+
.score(score_response_json[:user_id], :version => 203)
|
117
|
+
expect(response.ok?).to eq(true)
|
118
|
+
expect(response.api_status).to eq(0)
|
119
|
+
expect(response.api_error_message).to eq("OK")
|
120
|
+
|
121
|
+
expect(response.body["score"]).to eq(0.93)
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
it "Successfully fetches a v203 score with an overridden key" do
|
126
|
+
|
127
|
+
api_key = "foobar"
|
128
|
+
response_json = score_response_json
|
129
|
+
|
130
|
+
stub_request(:get, "https://api.siftscience.com/v203/score/247019/?api_key=overridden")
|
131
|
+
.to_return(:status => 200, :body => MultiJson.dump(response_json), :headers => {})
|
132
|
+
|
133
|
+
response = Sift::Client.new(:api_key => api_key, :version => 203)
|
134
|
+
.score(score_response_json[:user_id], :api_key => "overridden")
|
135
|
+
expect(response.ok?).to eq(true)
|
136
|
+
expect(response.api_status).to eq(0)
|
137
|
+
expect(response.api_error_message).to eq("OK")
|
138
|
+
|
139
|
+
expect(response.body["score"]).to eq(0.93)
|
140
|
+
end
|
141
|
+
|
142
|
+
|
143
|
+
it "Successfuly make a v203 sync score request" do
|
144
|
+
|
145
|
+
api_key = "foobar"
|
146
|
+
response_json = {
|
147
|
+
:status => 0,
|
148
|
+
:error_message => "OK",
|
149
|
+
:score_response => score_response_json
|
150
|
+
}
|
151
|
+
|
152
|
+
stub_request(:post, "https://api.siftscience.com/v203/events?return_score=true")
|
153
|
+
.to_return(:status => 200, :body => MultiJson.dump(response_json),
|
154
|
+
:headers => {"content-type"=>"application/json; charset=UTF-8",
|
155
|
+
"content-length"=> "74"})
|
156
|
+
|
157
|
+
event = "$transaction"
|
158
|
+
properties = valid_transaction_properties
|
159
|
+
response = Sift::Client.new(:api_key => api_key)
|
160
|
+
.track(event, properties, :return_score => true, :version => "203")
|
161
|
+
expect(response.ok?).to eq(true)
|
162
|
+
expect(response.api_status).to eq(0)
|
163
|
+
expect(response.api_error_message).to eq("OK")
|
164
|
+
expect(response.body["score_response"]["score"]).to eq(0.93)
|
165
|
+
end
|
166
|
+
|
167
|
+
|
168
|
+
it "Successfuly make a v203 sync action request" do
|
169
|
+
|
170
|
+
api_key = "foobar"
|
171
|
+
response_json = {
|
172
|
+
:status => 0,
|
173
|
+
:error_message => "OK",
|
174
|
+
:score_response => action_response_json
|
175
|
+
}
|
176
|
+
|
177
|
+
stub_request(:post, "https://api.siftscience.com/v203/events?return_action=true")
|
178
|
+
.to_return(:status => 200, :body => MultiJson.dump(response_json),
|
179
|
+
:headers => {"content-type"=>"application/json; charset=UTF-8",
|
180
|
+
"content-length"=> "74"})
|
181
|
+
|
182
|
+
event = "$transaction"
|
183
|
+
properties = valid_transaction_properties
|
184
|
+
response = Sift::Client.new(:api_key => api_key, :version => "203")
|
185
|
+
.track(event, properties, :return_action => true)
|
186
|
+
expect(response.ok?).to eq(true)
|
187
|
+
expect(response.api_status).to eq(0)
|
188
|
+
expect(response.api_error_message).to eq("OK")
|
189
|
+
expect(response.body["score_response"]["actions"].first["entity"]["type"]).to eq("USER")
|
190
|
+
end
|
191
|
+
|
192
|
+
end
|
@@ -3,6 +3,14 @@ require File.expand_path(File.join(File.dirname(__FILE__), "..", "spec_helper"))
|
|
3
3
|
describe Sift::Client do
|
4
4
|
|
5
5
|
def valid_label_properties
|
6
|
+
{
|
7
|
+
:$abuse_type => 'content_abuse',
|
8
|
+
:$is_bad => true,
|
9
|
+
:$description => "Listed a fake item"
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
def valid_label_properties_203
|
6
14
|
{
|
7
15
|
:$reasons => [ "$fake" ],
|
8
16
|
:$is_bad => true,
|
@@ -10,39 +18,75 @@ describe Sift::Client do
|
|
10
18
|
}
|
11
19
|
end
|
12
20
|
|
13
|
-
|
14
|
-
|
21
|
+
|
22
|
+
it "Successfuly handles a $label and returns OK" do
|
23
|
+
|
24
|
+
response_json = { :status => 0, :error_message => "OK" }
|
25
|
+
user_id = "frodo_baggins"
|
26
|
+
|
27
|
+
stub_request(:post, "https://api.siftscience.com/v204/users/frodo_baggins/labels")
|
28
|
+
.with(:body => ('{"$abuse_type":"content_abuse","$is_bad":true,"$description":"Listed a fake item","$type":"$label","$api_key":"foobar"}'))
|
29
|
+
.to_return(:body => MultiJson.dump(response_json), :status => 200,
|
30
|
+
:headers => {"content-type"=>"application/json; charset=UTF-8",
|
31
|
+
"content-length"=> "74"})
|
32
|
+
|
33
|
+
api_key = "foobar"
|
34
|
+
properties = valid_label_properties
|
35
|
+
|
36
|
+
response = Sift::Client.new(:api_key => api_key).label(user_id, properties)
|
37
|
+
expect(response.ok?).to eq(true)
|
38
|
+
expect(response.api_status).to eq(0)
|
39
|
+
expect(response.api_error_message).to eq("OK")
|
15
40
|
end
|
16
41
|
|
42
|
+
|
43
|
+
it "Successfully handles an $unlabel and returns OK" do
|
44
|
+
response_json = { :status => 0, :error_message => "OK" }
|
45
|
+
user_id = "frodo_baggins"
|
46
|
+
|
47
|
+
stub_request(:delete,
|
48
|
+
"https://api.siftscience.com/v204/users/frodo_baggins/labels?api_key=foobar&abuse_type=payment_abuse")
|
49
|
+
.to_return(:status => 204)
|
50
|
+
|
51
|
+
api_key = "foobar"
|
52
|
+
|
53
|
+
response = Sift::Client.new(:api_key => api_key).unlabel(user_id, :abuse_type => 'payment_abuse')
|
54
|
+
expect(response.ok?).to eq(true)
|
55
|
+
end
|
56
|
+
|
57
|
+
|
17
58
|
it "Successfuly handles a $label with the v203 API and returns OK" do
|
18
59
|
|
19
60
|
response_json = { :status => 0, :error_message => "OK" }
|
20
61
|
user_id = "frodo_baggins"
|
21
62
|
|
22
|
-
stub_request(:post, "https://api.siftscience.com/v203/users/frodo_baggins/labels")
|
23
|
-
with(:body => '{"$reasons":["$fake"],"$is_bad":true,"$description":"Listed a fake item","$type":"$label","$api_key":"foobar"}')
|
24
|
-
to_return(:body => MultiJson.dump(response_json), :status => 200,
|
25
|
-
|
63
|
+
stub_request(:post, "https://api.siftscience.com/v203/users/frodo_baggins/labels")
|
64
|
+
.with(:body => ('{"$reasons":["$fake"],"$is_bad":true,"$description":"Listed a fake item","$type":"$label","$api_key":"foobar"}'))
|
65
|
+
.to_return(:body => MultiJson.dump(response_json), :status => 200,
|
66
|
+
:headers => {"content-type"=>"application/json; charset=UTF-8",
|
67
|
+
"content-length"=> "74"})
|
26
68
|
|
27
69
|
api_key = "foobar"
|
28
|
-
properties =
|
70
|
+
properties = valid_label_properties_203
|
29
71
|
|
30
|
-
response = Sift::Client.new(api_key).label(user_id, properties)
|
72
|
+
response = Sift::Client.new(:api_key => api_key, :version => 203).label(user_id, properties)
|
31
73
|
expect(response.ok?).to eq(true)
|
32
74
|
expect(response.api_status).to eq(0)
|
33
75
|
expect(response.api_error_message).to eq("OK")
|
34
76
|
end
|
35
77
|
|
78
|
+
|
36
79
|
it "Successfully handles an $unlabel with the v203 API endpoing and returns OK" do
|
37
80
|
response_json = { :status => 0, :error_message => "OK" }
|
38
81
|
user_id = "frodo_baggins"
|
39
82
|
|
40
|
-
stub_request(:delete,
|
41
|
-
|
83
|
+
stub_request(:delete,
|
84
|
+
"https://api.siftscience.com/v203/users/frodo_baggins/labels?api_key=foobar")
|
85
|
+
.to_return(:status => 204)
|
42
86
|
|
43
87
|
api_key = "foobar"
|
44
88
|
|
45
|
-
response = Sift::Client.new(api_key).unlabel(user_id)
|
89
|
+
response = Sift::Client.new(:api_key => api_key).unlabel(user_id, :version => "203")
|
46
90
|
expect(response.ok?).to eq(true)
|
47
91
|
end
|
48
92
|
|
data/spec/unit/client_spec.rb
CHANGED
@@ -78,60 +78,69 @@ describe Sift::Client do
|
|
78
78
|
end
|
79
79
|
|
80
80
|
def fully_qualified_api_endpoint
|
81
|
-
Sift::Client::API_ENDPOINT + Sift.
|
81
|
+
Sift::Client::API_ENDPOINT + Sift.rest_api_path
|
82
82
|
end
|
83
83
|
|
84
|
+
|
84
85
|
it "Can instantiate client with blank api key if Sift.api_key set" do
|
85
86
|
Sift.api_key = "test_global_api_key"
|
86
87
|
expect(Sift::Client.new().api_key).to eq(Sift.api_key)
|
87
88
|
end
|
88
89
|
|
90
|
+
|
89
91
|
it "Parameter passed api key takes precedence over Sift.api_key" do
|
90
92
|
Sift.api_key = "test_global_api_key"
|
91
93
|
api_key = "test_local_api_key"
|
92
|
-
expect(Sift::Client.new(api_key).api_key).to eq(api_key)
|
94
|
+
expect(Sift::Client.new(:api_key => api_key).api_key).to eq(api_key)
|
93
95
|
end
|
94
96
|
|
97
|
+
|
95
98
|
it "Cannot instantiate client with nil, empty, non-string, or blank api key" do
|
96
|
-
expect(lambda { Sift::Client.new(nil) }).to raise_error(StandardError)
|
97
|
-
expect(lambda { Sift::Client.new("") }).to raise_error(StandardError)
|
98
|
-
expect(lambda { Sift::Client.new(123456) }).to raise_error(StandardError)
|
99
|
+
expect(lambda { Sift::Client.new(:api_key => nil) }).to raise_error(StandardError)
|
100
|
+
expect(lambda { Sift::Client.new(:api_key => "") }).to raise_error(StandardError)
|
101
|
+
expect(lambda { Sift::Client.new(:api_key => 123456) }).to raise_error(StandardError)
|
99
102
|
expect(lambda { Sift::Client.new() }).to raise_error(StandardError)
|
100
103
|
end
|
101
104
|
|
102
|
-
|
105
|
+
|
106
|
+
it "Cannot instantiate client with empty, non-string, or blank path" do
|
103
107
|
api_key = "test_local_api_key"
|
104
|
-
expect(lambda { Sift::Client.new(
|
105
|
-
expect(lambda { Sift::Client.new(
|
106
|
-
expect(lambda { Sift::Client.new(api_key, 123456) }).to raise_error(StandardError)
|
108
|
+
expect(lambda { Sift::Client.new(:path => "") }).to raise_error(StandardError)
|
109
|
+
expect(lambda { Sift::Client.new(:path => 123456) }).to raise_error(StandardError)
|
107
110
|
end
|
108
111
|
|
112
|
+
|
109
113
|
it "Can instantiate client with non-default timeout" do
|
110
|
-
expect(lambda { Sift::Client.new("
|
114
|
+
expect(lambda { Sift::Client.new(:api_key => "foo", :timeout => 4) })
|
115
|
+
.not_to raise_error
|
111
116
|
end
|
112
117
|
|
118
|
+
|
113
119
|
it "Track call must specify an event name" do
|
114
|
-
expect(lambda { Sift::Client.new(
|
115
|
-
expect(lambda { Sift::Client.new(
|
120
|
+
expect(lambda { Sift::Client.new().track(nil) }).to raise_error(StandardError)
|
121
|
+
expect(lambda { Sift::Client.new().track("") }).to raise_error(StandardError)
|
116
122
|
end
|
117
123
|
|
124
|
+
|
118
125
|
it "Must specify an event name" do
|
119
|
-
expect(lambda { Sift::Client.new(
|
120
|
-
expect(lambda { Sift::Client.new(
|
126
|
+
expect(lambda { Sift::Client.new().track(nil) }).to raise_error(StandardError)
|
127
|
+
expect(lambda { Sift::Client.new().track("") }).to raise_error(StandardError)
|
121
128
|
end
|
122
129
|
|
130
|
+
|
123
131
|
it "Must specify properties" do
|
124
132
|
event = "custom_event_name"
|
125
|
-
expect(lambda { Sift::Client.new(
|
133
|
+
expect(lambda { Sift::Client.new().track(event) }).to raise_error(StandardError)
|
126
134
|
end
|
127
135
|
|
136
|
+
|
128
137
|
it "Score call must specify a user_id" do
|
129
|
-
expect(lambda { Sift::Client.new(
|
130
|
-
expect(lambda { Sift::Client.new(
|
138
|
+
expect(lambda { Sift::Client.new().score(nil) }).to raise_error(StandardError)
|
139
|
+
expect(lambda { Sift::Client.new().score("") }).to raise_error(StandardError)
|
131
140
|
end
|
132
141
|
|
133
|
-
it "Doesn't raise an exception on Net/HTTP errors" do
|
134
142
|
|
143
|
+
it "Doesn't raise an exception on Net/HTTP errors" do
|
135
144
|
api_key = "foobar"
|
136
145
|
event = "$transaction"
|
137
146
|
properties = valid_transaction_properties
|
@@ -140,11 +149,11 @@ describe Sift::Client do
|
|
140
149
|
|
141
150
|
# This method should just return nil -- the track call failed because
|
142
151
|
# of an HTTP error
|
143
|
-
expect(Sift::Client.new(api_key).track(event, properties)).to eq(nil)
|
152
|
+
expect(Sift::Client.new(:api_key => api_key).track(event, properties)).to eq(nil)
|
144
153
|
end
|
145
154
|
|
146
|
-
it "Returns nil when a StandardError occurs within the request" do
|
147
155
|
|
156
|
+
it "Returns nil when a StandardError occurs within the request" do
|
148
157
|
api_key = "foobar"
|
149
158
|
event = "$transaction"
|
150
159
|
properties = valid_transaction_properties
|
@@ -153,32 +162,35 @@ describe Sift::Client do
|
|
153
162
|
|
154
163
|
# This method should just return nil -- the track call failed because
|
155
164
|
# a StandardError exception was thrown
|
156
|
-
expect(Sift::Client.new(api_key).track(event, properties)).to eq(nil)
|
165
|
+
expect(Sift::Client.new(:api_key => api_key).track(event, properties)).to eq(nil)
|
157
166
|
end
|
158
167
|
|
159
|
-
it "Successfuly handles an event and returns OK" do
|
160
168
|
|
169
|
+
it "Successfuly handles an event and returns OK" do
|
161
170
|
response_json = { :status => 0, :error_message => "OK" }
|
162
171
|
|
163
|
-
stub_request(:post, "https://api.siftscience.com/
|
172
|
+
stub_request(:post, "https://api.siftscience.com/v204/events").
|
164
173
|
with { |request|
|
165
174
|
parsed_body = JSON.parse(request.body)
|
166
175
|
expect(parsed_body).to include("$buyer_user_id" => "123456")
|
167
|
-
|
176
|
+
}.to_return(:status => 200, :body => MultiJson.dump(response_json),
|
177
|
+
:headers => {"content-type"=>"application/json; charset=UTF-8",
|
178
|
+
"content-length"=> "74"})
|
168
179
|
|
169
180
|
api_key = "foobar"
|
170
181
|
event = "$transaction"
|
171
182
|
properties = valid_transaction_properties
|
172
183
|
|
173
|
-
response = Sift::Client.new(api_key).track(event, properties)
|
184
|
+
response = Sift::Client.new(:api_key => api_key).track(event, properties)
|
174
185
|
expect(response.ok?).to eq(true)
|
175
186
|
expect(response.api_status).to eq(0)
|
176
187
|
expect(response.api_error_message).to eq("OK")
|
177
188
|
end
|
178
189
|
|
190
|
+
|
179
191
|
it "Successfully submits event with overridden key" do
|
180
192
|
response_json = { :status => 0, :error_message => "OK"}
|
181
|
-
stub_request(:post, "https://api.siftscience.com/
|
193
|
+
stub_request(:post, "https://api.siftscience.com/v204/events").
|
182
194
|
with { | request|
|
183
195
|
parsed_body = JSON.parse(request.body)
|
184
196
|
expect(parsed_body).to include("$buyer_user_id" => "123456")
|
@@ -189,22 +201,25 @@ describe Sift::Client do
|
|
189
201
|
event = "$transaction"
|
190
202
|
properties = valid_transaction_properties
|
191
203
|
|
192
|
-
response = Sift::Client.new(api_key
|
204
|
+
response = Sift::Client.new(:api_key => api_key)
|
205
|
+
.track(event, properties, :api_key => "overridden")
|
193
206
|
expect(response.ok?).to eq(true)
|
194
207
|
expect(response.api_status).to eq(0)
|
195
208
|
expect(response.api_error_message).to eq("OK")
|
196
209
|
end
|
197
210
|
|
198
|
-
it "Successfuly scrubs nils" do
|
199
211
|
|
212
|
+
it "Successfully scrubs nils" do
|
200
213
|
response_json = { :status => 0, :error_message => "OK" }
|
201
214
|
|
202
|
-
stub_request(:post, "https://api.siftscience.com/
|
203
|
-
with { |request|
|
215
|
+
stub_request(:post, "https://api.siftscience.com/v204/events")
|
216
|
+
.with { |request|
|
204
217
|
parsed_body = JSON.parse(request.body)
|
205
218
|
expect(parsed_body).not_to include("fake_property")
|
206
219
|
expect(parsed_body).to include("sub_object" => {"one" => "two"})
|
207
|
-
|
220
|
+
}.to_return(:status => 200, :body => MultiJson.dump(response_json),
|
221
|
+
:headers => {"content-type"=>"application/json; charset=UTF-8",
|
222
|
+
"content-length"=> "74"})
|
208
223
|
|
209
224
|
api_key = "foobar"
|
210
225
|
event = "$transaction"
|
@@ -215,21 +230,23 @@ describe Sift::Client do
|
|
215
230
|
"three" => nil
|
216
231
|
}
|
217
232
|
)
|
218
|
-
response = Sift::Client.new(api_key).track(event, properties)
|
233
|
+
response = Sift::Client.new(:api_key => api_key).track(event, properties)
|
219
234
|
expect(response.ok?).to eq(true)
|
220
235
|
expect(response.api_status).to eq(0)
|
221
236
|
expect(response.api_error_message).to eq("OK")
|
222
237
|
end
|
223
238
|
|
224
|
-
it "Successfully fetches a score" do
|
225
239
|
|
240
|
+
it "Successfully fetches a score" do
|
226
241
|
api_key = "foobar"
|
227
242
|
response_json = score_response_json
|
228
243
|
|
229
|
-
stub_request(:get, "https://api.siftscience.com/
|
230
|
-
to_return(:status => 200, :body => MultiJson.dump(response_json),
|
244
|
+
stub_request(:get, "https://api.siftscience.com/v204/score/247019/?api_key=foobar")
|
245
|
+
.to_return(:status => 200, :body => MultiJson.dump(response_json),
|
246
|
+
:headers => {"content-type"=>"application/json; charset=UTF-8",
|
247
|
+
"content-length"=> "74"})
|
231
248
|
|
232
|
-
response = Sift::Client.new(api_key).score(score_response_json[:user_id])
|
249
|
+
response = Sift::Client.new(:api_key => api_key).score(score_response_json[:user_id])
|
233
250
|
expect(response.ok?).to eq(true)
|
234
251
|
expect(response.api_status).to eq(0)
|
235
252
|
expect(response.api_error_message).to eq("OK")
|
@@ -237,15 +254,16 @@ describe Sift::Client do
|
|
237
254
|
expect(response.body["score"]).to eq(0.93)
|
238
255
|
end
|
239
256
|
|
240
|
-
it "Successfully fetches a score with an overridden key" do
|
241
257
|
|
258
|
+
it "Successfully fetches a score with an overridden key" do
|
242
259
|
api_key = "foobar"
|
243
260
|
response_json = score_response_json
|
244
261
|
|
245
|
-
stub_request(:get, "https://api.siftscience.com/
|
246
|
-
to_return(:status => 200, :body => MultiJson.dump(response_json), :headers => {})
|
262
|
+
stub_request(:get, "https://api.siftscience.com/v204/score/247019/?api_key=overridden")
|
263
|
+
.to_return(:status => 200, :body => MultiJson.dump(response_json), :headers => {})
|
247
264
|
|
248
|
-
response = Sift::Client.new(api_key
|
265
|
+
response = Sift::Client.new(:api_key => api_key)
|
266
|
+
.score(score_response_json[:user_id], :api_key => "overridden")
|
249
267
|
expect(response.ok?).to eq(true)
|
250
268
|
expect(response.api_status).to eq(0)
|
251
269
|
expect(response.api_error_message).to eq("OK")
|
@@ -254,8 +272,7 @@ describe Sift::Client do
|
|
254
272
|
end
|
255
273
|
|
256
274
|
|
257
|
-
it "
|
258
|
-
|
275
|
+
it "Successfully make a sync score request" do
|
259
276
|
api_key = "foobar"
|
260
277
|
response_json = {
|
261
278
|
:status => 0,
|
@@ -263,20 +280,23 @@ describe Sift::Client do
|
|
263
280
|
:score_response => score_response_json
|
264
281
|
}
|
265
282
|
|
266
|
-
stub_request(:post, "https://api.siftscience.com/
|
267
|
-
to_return(:status => 200, :body => MultiJson.dump(response_json),
|
283
|
+
stub_request(:post, "https://api.siftscience.com/v204/events?return_score=true")
|
284
|
+
.to_return(:status => 200, :body => MultiJson.dump(response_json),
|
285
|
+
:headers => {"content-type"=>"application/json; charset=UTF-8",
|
286
|
+
"content-length"=> "74"})
|
268
287
|
|
269
288
|
event = "$transaction"
|
270
289
|
properties = valid_transaction_properties
|
271
|
-
response = Sift::Client.new(api_key
|
290
|
+
response = Sift::Client.new(:api_key => api_key)
|
291
|
+
.track(event, properties, :return_score => true)
|
272
292
|
expect(response.ok?).to eq(true)
|
273
293
|
expect(response.api_status).to eq(0)
|
274
294
|
expect(response.api_error_message).to eq("OK")
|
275
295
|
expect(response.body["score_response"]["score"]).to eq(0.93)
|
276
296
|
end
|
277
297
|
|
278
|
-
it "Successfuly make a sync action request" do
|
279
298
|
|
299
|
+
it "Successfully make a sync action request" do
|
280
300
|
api_key = "foobar"
|
281
301
|
response_json = {
|
282
302
|
:status => 0,
|
@@ -284,12 +304,15 @@ describe Sift::Client do
|
|
284
304
|
:score_response => action_response_json
|
285
305
|
}
|
286
306
|
|
287
|
-
stub_request(:post, "https://api.siftscience.com/
|
288
|
-
to_return(:status => 200, :body => MultiJson.dump(response_json),
|
307
|
+
stub_request(:post, "https://api.siftscience.com/v204/events?return_action=true")
|
308
|
+
.to_return(:status => 200, :body => MultiJson.dump(response_json),
|
309
|
+
:headers => {"content-type"=>"application/json; charset=UTF-8",
|
310
|
+
"content-length"=> "74"})
|
289
311
|
|
290
312
|
event = "$transaction"
|
291
313
|
properties = valid_transaction_properties
|
292
|
-
response = Sift::Client.new(api_key
|
314
|
+
response = Sift::Client.new(:api_key => api_key)
|
315
|
+
.track(event, properties, :return_action => true)
|
293
316
|
expect(response.ok?).to eq(true)
|
294
317
|
expect(response.api_status).to eq(0)
|
295
318
|
expect(response.api_error_message).to eq("OK")
|
@@ -297,5 +320,74 @@ describe Sift::Client do
|
|
297
320
|
end
|
298
321
|
|
299
322
|
|
323
|
+
it "Successfully make a sync workflow request" do
|
324
|
+
api_key = "foobar"
|
325
|
+
response_json = {
|
326
|
+
:status => 0,
|
327
|
+
:error_message => "OK",
|
328
|
+
:score_response => {
|
329
|
+
:status => -1,
|
330
|
+
:error_message => "Internal server error."
|
331
|
+
}
|
332
|
+
}
|
333
|
+
|
334
|
+
stub_request(:post,
|
335
|
+
"https://api.siftscience.com/v204/events?return_workflow_status=true&abuse_types=legacy,payment_abuse")
|
336
|
+
.to_return(:status => 200, :body => MultiJson.dump(response_json),
|
337
|
+
:headers => {"content-type"=>"application/json; charset=UTF-8",
|
338
|
+
"content-length"=> "74"})
|
339
|
+
|
340
|
+
event = "$transaction"
|
341
|
+
properties = valid_transaction_properties
|
342
|
+
response = Sift::Client.new(:api_key => api_key)
|
343
|
+
.track(event, properties,
|
344
|
+
:return_workflow_status => true, :abuse_types => ['legacy', 'payment_abuse'])
|
345
|
+
expect(response.ok?).to eq(true)
|
346
|
+
expect(response.api_status).to eq(0)
|
347
|
+
expect(response.api_error_message).to eq("OK")
|
348
|
+
end
|
349
|
+
|
350
|
+
|
351
|
+
it "Successfully make a workflow status request" do
|
352
|
+
response_text = '{"id":"skdjfnkse","config":{"id":"5rrbr4iaaa","version":"1468367620871"},"config_display_name":"workflow config","abuse_types":["payment_abuse"],"state":"running","entity":{"id":"example_user","type":"user"},"history":[{"app":"user","name":"Entity","state":"finished","config":{}}]}'
|
353
|
+
|
354
|
+
stub_request(:get, "https://foobar:@api3.siftscience.com/v3/accounts/ACCT/workflows/runs/skdjfnkse")
|
355
|
+
.to_return(:status => 200, :body => response_text, :headers => {})
|
356
|
+
|
357
|
+
client = Sift::Client.new(:api_key => "foobar", :account_id => "ACCT")
|
358
|
+
response = client.get_workflow_status("skdjfnkse")
|
359
|
+
|
360
|
+
expect(response.ok?).to eq(true)
|
361
|
+
expect(response.body["id"]).to eq("skdjfnkse")
|
362
|
+
expect(response.body["state"]).to eq("running")
|
363
|
+
end
|
364
|
+
|
365
|
+
|
366
|
+
it "Successfully make a user decisions request" do
|
367
|
+
response_text = '{"decisions":{"content_abuse":{"decision":{"id":"user_decision"},"time":1468707128659,"webhook_succeeded":false}}}'
|
368
|
+
|
369
|
+
stub_request(:get, "https://foobar:@api3.siftscience.com/v3/accounts/ACCT/users/example_user/decisions")
|
370
|
+
.to_return(:status => 200, :body => response_text, :headers => {})
|
371
|
+
|
372
|
+
client = Sift::Client.new(:api_key => "foobar", :account_id => "ACCT")
|
373
|
+
response = client.get_user_decisions("example_user")
|
374
|
+
|
375
|
+
expect(response.ok?).to eq(true)
|
376
|
+
expect(response.body["decisions"]["content_abuse"]["decision"]["id"]).to eq("user_decision")
|
377
|
+
end
|
378
|
+
|
379
|
+
|
380
|
+
it "Successfully make an order decisions request" do
|
381
|
+
response_text = '{"decisions":{"payment_abuse":{"decision":{"id":"decision7"},"time":1468599638005,"webhook_succeeded":false},"promotion_abuse":{"decision":{"id":"good_order"},"time":1468517407135,"webhook_succeeded":true}}}'
|
382
|
+
|
383
|
+
stub_request(:get, "https://foobar:@api3.siftscience.com/v3/accounts/ACCT/orders/example_order/decisions")
|
384
|
+
.to_return(:status => 200, :body => response_text, :headers => {})
|
385
|
+
|
386
|
+
client = Sift::Client.new(:api_key => "foobar", :account_id => "ACCT")
|
387
|
+
response = client.get_order_decisions("example_order", :timeout => 3)
|
388
|
+
|
389
|
+
expect(response.ok?).to eq(true)
|
390
|
+
expect(response.body["decisions"]["payment_abuse"]["decision"]["id"]).to eq("decision7")
|
391
|
+
end
|
300
392
|
|
301
393
|
end
|