commission_junction 1.7.3 → 1.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +8 -0
- data/README.md +34 -10
- data/Rakefile +1 -1
- data/commission_junction.gemspec +6 -6
- data/lib/commission_junction/version.rb +1 -1
- data/lib/commission_junction.rb +50 -26
- data/test/commission_junction_test.rb +116 -47
- data/test/test_helper.rb +0 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bae9d34f121c997545515282c9ff05fb25a24a4a
|
4
|
+
data.tar.gz: 3ee56677421920706ceb322f6b038da241cb38d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dbb7d127f62de372d6aa32bbd6f0616ae0bb333e9e51c191da5c737f62532c33b8022897ea27a48f5f6089caa72a6aa51287acd4d2447860013ea8dbc32bd814
|
7
|
+
data.tar.gz: 8ac81f01181cc6050141d66203134657bf8e47affede11bd4b617d5ed070238e6e45092d36767e1d74f5abb5cbef467f4f0646e1c76a55cdd14061a4bfc97d9a
|
data/.rubocop.yml
ADDED
data/README.md
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
Ruby wrapper for the Commission Junction web services APIs (REST)
|
4
4
|
|
5
|
+
See https://cjcommunity.force.com/s/article/4777058.
|
6
|
+
|
5
7
|
[![Gem Version](https://badge.fury.io/rb/commission_junction.png)](http://badge.fury.io/rb/commission_junction)
|
6
8
|
|
7
9
|
## Installation
|
@@ -21,18 +23,17 @@ Or install it yourself as:
|
|
21
23
|
## Example
|
22
24
|
|
23
25
|
```ruby
|
24
|
-
require 'rubygems'
|
25
26
|
require 'commission_junction'
|
26
27
|
|
27
|
-
# See https://api.cj.com/sign_up.cj
|
28
|
-
DEVELOPER_KEY = '????????'
|
28
|
+
# See https://api.cj.com/sign_up.cj.
|
29
|
+
DEVELOPER_KEY = '????????'.freeze
|
29
30
|
|
30
|
-
# See cj.com > Account >
|
31
|
-
WEBSITE_ID = '????????'
|
31
|
+
# See cj.com > Account > Websites.
|
32
|
+
WEBSITE_ID = '????????'.freeze
|
32
33
|
|
33
34
|
cj = CommissionJunction.new(DEVELOPER_KEY, WEBSITE_ID)
|
34
35
|
|
35
|
-
# See
|
36
|
+
# See https://cjcommunity.force.com/s/article/4777185
|
36
37
|
# for the list of request and response parameters.
|
37
38
|
cj.product_search('keywords' => '+blue +jeans',
|
38
39
|
'advertiser-ids' => 'joined',
|
@@ -45,7 +46,7 @@ cj.product_search('keywords' => '+blue +jeans',
|
|
45
46
|
puts ''
|
46
47
|
end
|
47
48
|
|
48
|
-
# See
|
49
|
+
# See https://cjcommunity.force.com/s/article/4777195
|
49
50
|
# for the list of request and response parameters.
|
50
51
|
cj.advertiser_lookup('keywords' => '+used +books',
|
51
52
|
'advertiser-ids' => 'joined',
|
@@ -56,7 +57,7 @@ cj.advertiser_lookup('keywords' => '+used +books',
|
|
56
57
|
puts ''
|
57
58
|
end
|
58
59
|
|
59
|
-
# See
|
60
|
+
# See https://cjcommunity.force.com/s/article/4777180
|
60
61
|
# for the list of request and response parameters.
|
61
62
|
cj.link_search('keywords' => '+used +books',
|
62
63
|
'advertiser-ids' => 'joined',
|
@@ -68,13 +69,16 @@ cj.link_search('keywords' => '+used +books',
|
|
68
69
|
puts ''
|
69
70
|
end
|
70
71
|
|
71
|
-
# See
|
72
|
+
# See https://cjcommunity.force.com/s/article/4777190
|
72
73
|
# for the list of request and response parameters.
|
73
74
|
puts cj.categories
|
74
75
|
|
75
|
-
# See
|
76
|
+
# See https://cjcommunity.force.com/s/article/4777175
|
76
77
|
# for the list of request and response parameters.
|
78
|
+
ids = []
|
79
|
+
|
77
80
|
cj.commissions.each do |commission|
|
81
|
+
ids << commission.original_action_id
|
78
82
|
puts commission.action_type
|
79
83
|
puts commission.aid
|
80
84
|
puts commission.commission_id
|
@@ -84,6 +88,26 @@ cj.commissions.each do |commission|
|
|
84
88
|
puts commission.sid
|
85
89
|
puts ''
|
86
90
|
end
|
91
|
+
|
92
|
+
# Each commission comes from the sale of one or more items.
|
93
|
+
# Commissions and their items are linked by original_action_id.
|
94
|
+
cj.item_detail(ids[0, 50]).each do |item_detail|
|
95
|
+
puts item_detail['original_action_id']
|
96
|
+
|
97
|
+
items = item_detail['item']
|
98
|
+
# If there is exactly one item, put it in an array.
|
99
|
+
items = [items] if items.is_a?(Hash)
|
100
|
+
|
101
|
+
items.each do |item|
|
102
|
+
puts item['sku']
|
103
|
+
puts item['quantity']
|
104
|
+
puts item['posting_date']
|
105
|
+
puts item['commission_id']
|
106
|
+
puts item['sale_amount']
|
107
|
+
puts item['discount']
|
108
|
+
puts item['publisher_commission']
|
109
|
+
end if items
|
110
|
+
end
|
87
111
|
```
|
88
112
|
|
89
113
|
## Dependencies
|
data/Rakefile
CHANGED
data/commission_junction.gemspec
CHANGED
@@ -8,16 +8,16 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.version = CommissionJunction::VERSION
|
9
9
|
gem.author = 'Albert Vernon'
|
10
10
|
gem.email = 'aev@vernon.nu'
|
11
|
-
gem.description =
|
12
|
-
gem.summary =
|
13
|
-
gem.homepage =
|
11
|
+
gem.description = 'Ruby wrapper for the Commission Junction web services APIs (REST)'
|
12
|
+
gem.summary = 'Commission Junction web services APIs (REST)'
|
13
|
+
gem.homepage = 'https://github.com/aevernon/commission_junction'
|
14
14
|
|
15
|
-
gem.files = `git ls-files`.split(
|
16
|
-
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
15
|
+
gem.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
17
17
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
18
|
gem.require_paths = ['lib']
|
19
19
|
gem.add_dependency 'httparty', '~> 0.13'
|
20
20
|
gem.add_development_dependency 'minitest', '~> 0'
|
21
21
|
gem.add_dependency 'ox', '~> 2.1'
|
22
|
-
gem.license
|
22
|
+
gem.license = 'BSD-3-Clause'
|
23
23
|
end
|
data/lib/commission_junction.rb
CHANGED
@@ -3,11 +3,12 @@ require 'ox'
|
|
3
3
|
require 'httparty'
|
4
4
|
|
5
5
|
# Interact with CJ web services.
|
6
|
+
# See https://cjcommunity.force.com/s/article/4777058.
|
6
7
|
class CommissionJunction
|
7
8
|
include HTTParty
|
8
9
|
default_options.update(verify: false) # Skip SSL certificate verification.
|
9
10
|
format(:xml)
|
10
|
-
#debug_output $stderr
|
11
|
+
# debug_output $stderr
|
11
12
|
|
12
13
|
attr_reader :total_matched,
|
13
14
|
:records_returned,
|
@@ -15,20 +16,21 @@ class CommissionJunction
|
|
15
16
|
:cj_objects
|
16
17
|
|
17
18
|
WEB_SERVICE_URIS =
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
19
|
+
{
|
20
|
+
product_search: 'https://product-search.api.cj.com/v2/product-search',
|
21
|
+
link_search: 'https://link-search.api.cj.com/v2/link-search',
|
22
|
+
advertiser_lookup: 'https://advertiser-lookup.api.cj.com/v3/advertiser-lookup',
|
23
|
+
categories: 'https://support-services.api.cj.com/v2/categories',
|
24
|
+
commissions: 'https://commission-detail.api.cj.com/v3/commissions',
|
25
|
+
item_detail: 'https://commission-detail.api.cj.com/v3/item-detail/'
|
26
|
+
}.freeze
|
25
27
|
|
26
28
|
def initialize(developer_key, website_id, timeout = 10)
|
27
29
|
raise ArgumentError, "developer_key must be a String; got #{developer_key.class} instead" unless developer_key.is_a?(String)
|
28
|
-
raise ArgumentError, "You must supply your developer key.\nSee https://api.cj.com/sign_up.cj"
|
30
|
+
raise ArgumentError, "You must supply your developer key.\nSee https://api.cj.com/sign_up.cj" if developer_key.empty?
|
29
31
|
|
30
32
|
website_id = website_id.to_s
|
31
|
-
raise ArgumentError, "You must supply your website ID.\nSee cj.com > Account > Web site Settings > PID"
|
33
|
+
raise ArgumentError, "You must supply your website ID.\nSee cj.com > Account > Web site Settings > PID" if website_id.empty?
|
32
34
|
@website_id = website_id
|
33
35
|
|
34
36
|
raise ArgumentError, "timeout must be a Fixnum; got #{timeout.class} instead" unless timeout.is_a?(Fixnum)
|
@@ -42,21 +44,21 @@ class CommissionJunction
|
|
42
44
|
def categories(params = {})
|
43
45
|
raise ArgumentError, "params must be a Hash; got #{params.class} instead" unless params.is_a?(Hash)
|
44
46
|
|
45
|
-
params = {'locale' => 'en'}.merge(params)
|
47
|
+
params = { 'locale' => 'en' }.merge(params)
|
46
48
|
|
47
|
-
response = self.class.get(WEB_SERVICE_URIS[:categories], :
|
49
|
+
response = self.class.get(WEB_SERVICE_URIS[:categories], query: params, timeout: @timeout)
|
48
50
|
@categories = extract_contents(response, 'categories', 'category')
|
49
51
|
end
|
50
52
|
|
51
53
|
def advertiser_lookup(params = {})
|
52
54
|
raise ArgumentError, "params must be a Hash; got #{params.class} instead" unless params.is_a?(Hash)
|
53
55
|
|
54
|
-
params = {'advertiser-ids' => 'joined'}.merge(params)
|
56
|
+
params = { 'advertiser-ids' => 'joined' }.merge(params)
|
55
57
|
|
56
58
|
@cj_objects = []
|
57
59
|
|
58
60
|
begin
|
59
|
-
response = self.class.get(WEB_SERVICE_URIS[:advertiser_lookup], :
|
61
|
+
response = self.class.get(WEB_SERVICE_URIS[:advertiser_lookup], query: params)
|
60
62
|
advertisers = extract_contents(response, 'advertisers')
|
61
63
|
|
62
64
|
@total_matched = advertisers['total_matched'].to_i
|
@@ -76,8 +78,8 @@ class CommissionJunction
|
|
76
78
|
def product_search(params)
|
77
79
|
raise ArgumentError, "params must be a Hash; got #{params.class} instead" unless params.is_a?(Hash)
|
78
80
|
|
79
|
-
|
80
|
-
raise ArgumentError, "You must provide at least one request parameter, for example, \"keywords\".\nSee
|
81
|
+
if params.empty?
|
82
|
+
raise ArgumentError, "You must provide at least one request parameter, for example, \"keywords\".\nSee https://cjcommunity.force.com/s/article/4777185."
|
81
83
|
end
|
82
84
|
|
83
85
|
params['website-id'] = @website_id
|
@@ -85,7 +87,7 @@ class CommissionJunction
|
|
85
87
|
@cj_objects = []
|
86
88
|
|
87
89
|
begin
|
88
|
-
response = self.class.get(WEB_SERVICE_URIS[:product_search], :
|
90
|
+
response = self.class.get(WEB_SERVICE_URIS[:product_search], query: params, timeout: @timeout)
|
89
91
|
products = extract_contents(response, 'products')
|
90
92
|
|
91
93
|
@total_matched = products['total_matched'].to_i
|
@@ -105,8 +107,8 @@ class CommissionJunction
|
|
105
107
|
def link_search(params)
|
106
108
|
raise ArgumentError, "params must be a Hash; got #{params.class} instead" unless params.is_a?(Hash)
|
107
109
|
|
108
|
-
|
109
|
-
raise ArgumentError, "You must provide at least one request parameter, for example, \"keywords\".\nSee
|
110
|
+
if params.empty?
|
111
|
+
raise ArgumentError, "You must provide at least one request parameter, for example, \"keywords\".\nSee https://cjcommunity.force.com/s/article/4777180."
|
110
112
|
end
|
111
113
|
|
112
114
|
params['website-id'] = @website_id
|
@@ -114,7 +116,7 @@ class CommissionJunction
|
|
114
116
|
@cj_objects = []
|
115
117
|
|
116
118
|
begin
|
117
|
-
response = self.class.get(WEB_SERVICE_URIS[:link_search], :
|
119
|
+
response = self.class.get(WEB_SERVICE_URIS[:link_search], query: params, timeout: @timeout)
|
118
120
|
links = extract_contents(response, 'links')
|
119
121
|
|
120
122
|
@total_matched = links['total_matched'].to_i
|
@@ -134,12 +136,12 @@ class CommissionJunction
|
|
134
136
|
def commissions(params = {})
|
135
137
|
raise ArgumentError, "params must be a Hash; got #{params.class} instead" unless params.is_a?(Hash)
|
136
138
|
|
137
|
-
params = {'date-type' => 'event'}.merge(params)
|
139
|
+
params = { 'date-type' => 'event' }.merge(params)
|
138
140
|
|
139
141
|
@cj_objects = []
|
140
142
|
|
141
143
|
begin
|
142
|
-
response = self.class.get(WEB_SERVICE_URIS[:commissions], :
|
144
|
+
response = self.class.get(WEB_SERVICE_URIS[:commissions], query: params)
|
143
145
|
commissions = extract_contents(response, 'commissions')
|
144
146
|
|
145
147
|
@total_matched = commissions['total_matched'].to_i
|
@@ -156,10 +158,31 @@ class CommissionJunction
|
|
156
158
|
@cj_objects
|
157
159
|
end
|
158
160
|
|
159
|
-
def
|
161
|
+
def item_detail(original_action_ids)
|
162
|
+
raise ArgumentError, "original_action_ids must be an Array; got #{original_action_ids.class} instead" unless original_action_ids.is_a?(Array)
|
163
|
+
|
164
|
+
unless (1..50).cover?(original_action_ids.size)
|
165
|
+
raise ArgumentError, "You must provide between 1 and 50 original action IDs.\nSee https://cjcommunity.force.com/s/article/4777175."
|
166
|
+
end
|
167
|
+
|
168
|
+
@cj_objects = []
|
169
|
+
|
170
|
+
begin
|
171
|
+
ids = original_action_ids.join(',')
|
172
|
+
response = self.class.get(WEB_SERVICE_URIS[:item_detail] + ids, query: "original-action-id=#{ids}")
|
173
|
+
@cj_objects = extract_contents(response, 'item_details')
|
174
|
+
@cj_objects = [@cj_objects] if @cj_objects.is_a?(Hash) # If we got exactly one result, put it in an array.
|
175
|
+
rescue Timeout::Error
|
176
|
+
@total_matched = @records_returned = @page_number = 0
|
177
|
+
end
|
178
|
+
|
179
|
+
@cj_objects
|
180
|
+
end
|
181
|
+
|
182
|
+
def extract_contents(response, first_level, second_level = nil)
|
160
183
|
cj_api = response['cj_api']
|
161
184
|
|
162
|
-
raise ArgumentError,
|
185
|
+
raise ArgumentError, 'cj api missing from response' if cj_api.nil?
|
163
186
|
|
164
187
|
error_message = cj_api['error_message']
|
165
188
|
|
@@ -169,10 +192,11 @@ class CommissionJunction
|
|
169
192
|
cj_api[first_level][second_level]
|
170
193
|
end
|
171
194
|
|
195
|
+
# Turn a hash into an object where each key becomes an instance method.
|
172
196
|
class CjObject
|
173
197
|
def initialize(params)
|
174
198
|
raise ArgumentError, "params must be a Hash; got #{params.class} instead" unless params.is_a?(Hash)
|
175
|
-
raise ArgumentError, 'Expecting at least one parameter'
|
199
|
+
raise ArgumentError, 'Expecting at least one parameter' if params.empty?
|
176
200
|
|
177
201
|
# Create instance variables and attribute readers on the fly.
|
178
202
|
# Credit: http://listlibrary.net/ruby-talk/2004/03/00sGI1cD
|
@@ -180,7 +204,7 @@ class CommissionJunction
|
|
180
204
|
raise ArgumentError, "key must be a String; got #{key.class} instead" unless key.is_a?(String)
|
181
205
|
clean_key = clean_key_name(key)
|
182
206
|
instance_variable_set("@#{clean_key}".intern, val)
|
183
|
-
instance_eval %
|
207
|
+
instance_eval %( class << self ; attr_reader #{clean_key.intern.inspect} ; end )
|
184
208
|
end
|
185
209
|
end
|
186
210
|
|
@@ -43,11 +43,11 @@ class CommissionJunctionTest < Minitest::Test
|
|
43
43
|
|
44
44
|
def test_new_cj_with_non_string_param
|
45
45
|
assert_raises ArgumentError do
|
46
|
-
CommissionJunction.new(
|
46
|
+
CommissionJunction.new(123_456, 'website_id')
|
47
47
|
end
|
48
48
|
|
49
49
|
assert_nothing_raised ArgumentError do
|
50
|
-
CommissionJunction.new('developer_key',
|
50
|
+
CommissionJunction.new('developer_key', 123_456)
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
@@ -103,7 +103,7 @@ class CommissionJunctionTest < Minitest::Test
|
|
103
103
|
|
104
104
|
def test_new_product_with_hash_params_and_non_string_keys
|
105
105
|
assert_raises ArgumentError do
|
106
|
-
CommissionJunction::Product.new(:
|
106
|
+
CommissionJunction::Product.new(name: 'blue jeans', price: '49.95')
|
107
107
|
end
|
108
108
|
end
|
109
109
|
|
@@ -151,12 +151,11 @@ class CommissionJunctionTest < Minitest::Test
|
|
151
151
|
end
|
152
152
|
|
153
153
|
def test_product_search_with_keywords_live
|
154
|
-
|
155
|
-
|
156
|
-
|
154
|
+
unless ENV['CJ_DEVELOPER_KEY'] && ENV['CJ_WEBSITE_ID']
|
155
|
+
skip 'Skipping live testing because environment variables CJ_DEVELOPER_KEY and CJ_WEBSITE_ID are not set.'
|
156
|
+
end
|
157
157
|
|
158
|
-
|
159
|
-
cj = CommissionJunction.new(credentials['developer_key'], credentials['website_id'])
|
158
|
+
cj = CommissionJunction.new(ENV['CJ_DEVELOPER_KEY'], ENV['CJ_WEBSITE_ID'])
|
160
159
|
|
161
160
|
# Zero results
|
162
161
|
assert_nothing_raised do
|
@@ -180,7 +179,7 @@ class CommissionJunctionTest < Minitest::Test
|
|
180
179
|
check_search_results(cj)
|
181
180
|
|
182
181
|
# Short timeout
|
183
|
-
cj = CommissionJunction.new(
|
182
|
+
cj = CommissionJunction.new(ENV['CJ_DEVELOPER_KEY'], ENV['CJ_WEBSITE_ID'], 1)
|
184
183
|
|
185
184
|
assert_nothing_raised do
|
186
185
|
cj.product_search('keywords' => 'One Great Blue Jean~No Limits', 'records-per-page' => '1')
|
@@ -219,12 +218,11 @@ class CommissionJunctionTest < Minitest::Test
|
|
219
218
|
end
|
220
219
|
|
221
220
|
def test_advertiser_lookup_live
|
222
|
-
|
223
|
-
|
224
|
-
|
221
|
+
unless ENV['CJ_DEVELOPER_KEY'] && ENV['CJ_WEBSITE_ID']
|
222
|
+
skip 'Skipping live testing because environment variables CJ_DEVELOPER_KEY and CJ_WEBSITE_ID are not set.'
|
223
|
+
end
|
225
224
|
|
226
|
-
|
227
|
-
cj = CommissionJunction.new(credentials['developer_key'], credentials['website_id'])
|
225
|
+
cj = CommissionJunction.new(ENV['CJ_DEVELOPER_KEY'], ENV['CJ_WEBSITE_ID'])
|
228
226
|
|
229
227
|
# Use default lookup parameters.
|
230
228
|
assert_nothing_raised do
|
@@ -248,7 +246,7 @@ class CommissionJunctionTest < Minitest::Test
|
|
248
246
|
check_advertiser_lookup_results(cj)
|
249
247
|
|
250
248
|
# Short timeout
|
251
|
-
cj = CommissionJunction.new(
|
249
|
+
cj = CommissionJunction.new(ENV['CJ_DEVELOPER_KEY'], ENV['CJ_WEBSITE_ID'], 1)
|
252
250
|
|
253
251
|
assert_nothing_raised do
|
254
252
|
cj.advertiser_lookup('keywords' => 'One Great Blue Jean~No Limits', 'records-per-page' => '1')
|
@@ -280,23 +278,21 @@ class CommissionJunctionTest < Minitest::Test
|
|
280
278
|
end
|
281
279
|
|
282
280
|
def test_categories_live
|
283
|
-
|
284
|
-
|
285
|
-
|
281
|
+
unless ENV['CJ_DEVELOPER_KEY'] && ENV['CJ_WEBSITE_ID']
|
282
|
+
skip 'Skipping live testing because environment variables CJ_DEVELOPER_KEY and CJ_WEBSITE_ID are not set.'
|
283
|
+
end
|
286
284
|
|
287
|
-
|
288
|
-
cj = CommissionJunction.new(credentials['developer_key'], credentials['website_id'])
|
285
|
+
cj = CommissionJunction.new(ENV['CJ_DEVELOPER_KEY'], ENV['CJ_WEBSITE_ID'])
|
289
286
|
|
290
|
-
assert cj.categories.
|
287
|
+
assert !cj.categories.empty?
|
291
288
|
end
|
292
289
|
|
293
290
|
def test_commissions_live
|
294
|
-
|
295
|
-
|
296
|
-
|
291
|
+
unless ENV['CJ_DEVELOPER_KEY'] && ENV['CJ_WEBSITE_ID']
|
292
|
+
skip 'Skipping live testing because environment variables CJ_DEVELOPER_KEY and CJ_WEBSITE_ID are not set.'
|
293
|
+
end
|
297
294
|
|
298
|
-
|
299
|
-
cj = CommissionJunction.new(credentials['developer_key'], credentials['website_id'])
|
295
|
+
cj = CommissionJunction.new(ENV['CJ_DEVELOPER_KEY'], ENV['CJ_WEBSITE_ID'])
|
300
296
|
|
301
297
|
assert_nothing_raised do
|
302
298
|
cj.commissions
|
@@ -342,13 +338,86 @@ class CommissionJunctionTest < Minitest::Test
|
|
342
338
|
end
|
343
339
|
end
|
344
340
|
|
345
|
-
def
|
346
|
-
|
341
|
+
def test_item_detail_with_no_params
|
342
|
+
assert_raises ArgumentError do
|
343
|
+
CommissionJunction.new('developer_key', 'website_id').item_detail
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
347
|
+
def test_item_detail_with_nil_params
|
348
|
+
assert_raises ArgumentError do
|
349
|
+
CommissionJunction.new('developer_key', 'website_id').item_detail(nil)
|
350
|
+
end
|
351
|
+
end
|
352
|
+
|
353
|
+
def test_item_detail_with_too_few_ids
|
354
|
+
assert_raises ArgumentError do
|
355
|
+
CommissionJunction.new('developer_key', 'website_id').item_detail([])
|
356
|
+
end
|
357
|
+
end
|
358
|
+
|
359
|
+
def test_item_detail_with_too_many_ids
|
360
|
+
assert_raises ArgumentError do
|
361
|
+
CommissionJunction.new('developer_key', 'website_id').item_detail(Array.new(51))
|
362
|
+
end
|
363
|
+
end
|
347
364
|
|
348
|
-
|
365
|
+
def test_item_detail_with_non_array_params
|
366
|
+
assert_raises ArgumentError do
|
367
|
+
CommissionJunction.new('developer_key', 'website_id').item_detail('string')
|
368
|
+
end
|
369
|
+
end
|
370
|
+
|
371
|
+
def test_item_detail_live
|
372
|
+
unless ENV['CJ_DEVELOPER_KEY'] && ENV['CJ_WEBSITE_ID']
|
373
|
+
skip 'Skipping live testing because environment variables CJ_DEVELOPER_KEY and CJ_WEBSITE_ID are not set.'
|
374
|
+
end
|
375
|
+
|
376
|
+
cj = CommissionJunction.new(ENV['CJ_DEVELOPER_KEY'], ENV['CJ_WEBSITE_ID'])
|
377
|
+
|
378
|
+
ids = []
|
379
|
+
|
380
|
+
cj.commissions.each do |commission|
|
381
|
+
ids << commission.original_action_id
|
382
|
+
end
|
383
|
+
|
384
|
+
skip 'Skipping live testing of item_detail because there are no original action IDs in your account.' if ids.empty?
|
385
|
+
|
386
|
+
assert_nothing_raised do
|
387
|
+
cj.item_detail(ids[0, 1])
|
388
|
+
check_item_detail_results(cj)
|
389
|
+
cj.item_detail(ids[0, 2])
|
390
|
+
check_item_detail_results(cj)
|
391
|
+
end
|
392
|
+
end
|
393
|
+
|
394
|
+
def check_item_detail_results(results)
|
395
|
+
assert_instance_of(Array, results.cj_objects)
|
396
|
+
|
397
|
+
results.cj_objects.each do |item_detail|
|
398
|
+
assert_instance_of(Hash, item_detail)
|
399
|
+
assert item_detail.key?('original_action_id')
|
400
|
+
assert item_detail.key?('item')
|
401
|
+
|
402
|
+
item = item_detail['item']
|
403
|
+
item = item.first if item.is_a?(Array)
|
404
|
+
|
405
|
+
assert item.key?('sku')
|
406
|
+
assert item.key?('quantity')
|
407
|
+
assert item.key?('posting_date')
|
408
|
+
assert item.key?('commission_id')
|
409
|
+
assert item.key?('sale_amount')
|
410
|
+
assert item.key?('discount')
|
411
|
+
assert item.key?('publisher_commission')
|
412
|
+
end
|
413
|
+
end
|
414
|
+
|
415
|
+
def test_link_search_live
|
416
|
+
unless ENV['CJ_DEVELOPER_KEY'] && ENV['CJ_WEBSITE_ID']
|
417
|
+
skip 'Skipping live testing because environment variables CJ_DEVELOPER_KEY and CJ_WEBSITE_ID are not set.'
|
418
|
+
end
|
349
419
|
|
350
|
-
|
351
|
-
cj = CommissionJunction.new(credentials['developer_key'], credentials['website_id'])
|
420
|
+
cj = CommissionJunction.new(ENV['CJ_DEVELOPER_KEY'], ENV['CJ_WEBSITE_ID'])
|
352
421
|
|
353
422
|
assert_nothing_raised do
|
354
423
|
cj.link_search('keywords' => '+blue +jeans', 'advertiser-ids' => 'joined')
|
@@ -390,35 +459,35 @@ class CommissionJunctionTest < Minitest::Test
|
|
390
459
|
end
|
391
460
|
|
392
461
|
def set_up_service
|
393
|
-
CommissionJunction.new('developer_key',
|
462
|
+
CommissionJunction.new('developer_key', 123_456)
|
394
463
|
end
|
395
464
|
|
396
465
|
def test_contents_extractor_with_first_level
|
397
|
-
contents =
|
398
|
-
response = {'cj_api' => {'first' => contents}}
|
466
|
+
contents = 'abc'
|
467
|
+
response = { 'cj_api' => { 'first' => contents } }
|
399
468
|
|
400
469
|
cj = set_up_service
|
401
470
|
|
402
|
-
assert_equal(contents, cj.extract_contents(response,
|
471
|
+
assert_equal(contents, cj.extract_contents(response, 'first'))
|
403
472
|
end
|
404
473
|
|
405
474
|
def test_contents_extractor_with_second_level
|
406
|
-
contents =
|
407
|
-
response = {'cj_api' => {'first' => {'second' => contents}}}
|
475
|
+
contents = 'abc'
|
476
|
+
response = { 'cj_api' => { 'first' => { 'second' => contents } } }
|
408
477
|
|
409
478
|
cj = set_up_service
|
410
479
|
|
411
|
-
assert_equal(contents, cj.extract_contents(response,
|
480
|
+
assert_equal(contents, cj.extract_contents(response, 'first', 'second'))
|
412
481
|
end
|
413
482
|
|
414
483
|
def test_contents_extractor_with_error_message
|
415
|
-
contents =
|
416
|
-
response = {'cj_api' => {'error_message' => contents}}
|
484
|
+
contents = 'abc'
|
485
|
+
response = { 'cj_api' => { 'error_message' => contents } }
|
417
486
|
|
418
487
|
cj = set_up_service
|
419
488
|
|
420
489
|
assert_raises ArgumentError do
|
421
|
-
cj.extract_contents(response,
|
490
|
+
cj.extract_contents(response, 'first')
|
422
491
|
end
|
423
492
|
end
|
424
493
|
|
@@ -428,28 +497,28 @@ class CommissionJunctionTest < Minitest::Test
|
|
428
497
|
cj = set_up_service
|
429
498
|
|
430
499
|
assert_raises ArgumentError do
|
431
|
-
cj.extract_contents(response,
|
500
|
+
cj.extract_contents(response, 'first')
|
432
501
|
end
|
433
502
|
end
|
434
503
|
|
435
504
|
def set_up_cj_object
|
436
|
-
CommissionJunction::CjObject.new(
|
505
|
+
CommissionJunction::CjObject.new('a' => 'a')
|
437
506
|
end
|
438
507
|
|
439
508
|
def test_key_conversion_with_spaces
|
440
509
|
cjo = set_up_cj_object
|
441
510
|
|
442
|
-
assert_equal(
|
511
|
+
assert_equal('abc_def', cjo.clean_key_name('abc def'))
|
443
512
|
end
|
444
513
|
|
445
514
|
def test_key_conversion_with_trailing_spaces
|
446
515
|
cjo = set_up_cj_object
|
447
516
|
|
448
|
-
assert_equal(
|
517
|
+
assert_equal('abcdef', cjo.clean_key_name('abcdef '))
|
449
518
|
end
|
450
519
|
|
451
520
|
def test_initializing_product_using_key_with_spaces
|
452
|
-
product = CommissionJunction::Product.new(
|
453
|
-
assert_equal(product.abc_def,
|
521
|
+
product = CommissionJunction::Product.new('abc def' => '123')
|
522
|
+
assert_equal(product.abc_def, '123')
|
454
523
|
end
|
455
524
|
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: commission_junction
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Albert Vernon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-06-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -59,6 +59,7 @@ extensions: []
|
|
59
59
|
extra_rdoc_files: []
|
60
60
|
files:
|
61
61
|
- ".gitignore"
|
62
|
+
- ".rubocop.yml"
|
62
63
|
- Gemfile
|
63
64
|
- LICENSE
|
64
65
|
- README.md
|
@@ -88,7 +89,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
88
89
|
version: '0'
|
89
90
|
requirements: []
|
90
91
|
rubyforge_project:
|
91
|
-
rubygems_version: 2.
|
92
|
+
rubygems_version: 2.4.8
|
92
93
|
signing_key:
|
93
94
|
specification_version: 4
|
94
95
|
summary: Commission Junction web services APIs (REST)
|