commission_junction 1.4.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/.gitignore +2 -0
- data/Gemfile +4 -0
- data/LICENSE +24 -0
- data/README.md +94 -0
- data/Rakefile +10 -0
- data/commission_junction.gemspec +20 -0
- data/lib/commission_junction/version.rb +3 -0
- data/lib/commission_junction.rb +184 -0
- data/test/commission_junction_test.rb +340 -0
- data/test/test_helper.rb +6 -0
- metadata +78 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
Copyright (c) 2012, Albert Vernon
|
|
2
|
+
All rights reserved.
|
|
3
|
+
|
|
4
|
+
Redistribution and use in source and binary forms, with or without modification,
|
|
5
|
+
are permitted provided that the following conditions are met:
|
|
6
|
+
* Redistributions of source code must retain the above copyright notice,
|
|
7
|
+
this list of conditions and the following disclaimer.
|
|
8
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
|
9
|
+
this list of conditions and the following disclaimer in the documentation
|
|
10
|
+
and/or other materials provided with the distribution.
|
|
11
|
+
* The names of its contributors may not be used to endorse or promote
|
|
12
|
+
products derived from this software without specific prior written
|
|
13
|
+
permission.
|
|
14
|
+
|
|
15
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
16
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
17
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
18
|
+
DISCLAIMED. IN NO EVENT SHALL ALBERT VERNON BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
19
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
20
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
21
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
22
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
|
23
|
+
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
24
|
+
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# commission_junction
|
|
2
|
+
|
|
3
|
+
Ruby wrapper for the Commission Junction web services APIs (REST)
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
Add this line to your application's Gemfile:
|
|
8
|
+
|
|
9
|
+
`gem 'commission_junction'`
|
|
10
|
+
|
|
11
|
+
And then execute
|
|
12
|
+
|
|
13
|
+
`bundle`
|
|
14
|
+
|
|
15
|
+
Or install it yourself as:
|
|
16
|
+
|
|
17
|
+
`gem install commission_junction`
|
|
18
|
+
|
|
19
|
+
## Example
|
|
20
|
+
|
|
21
|
+
```ruby
|
|
22
|
+
require 'rubygems'
|
|
23
|
+
require 'commission_junction'
|
|
24
|
+
|
|
25
|
+
# See https://api.cj.com/sign_up.cj
|
|
26
|
+
DEVELOPER_KEY = '????????'
|
|
27
|
+
|
|
28
|
+
# See cj.com > Account > Web site Settings > PID
|
|
29
|
+
WEBSITE_ID = '????????'
|
|
30
|
+
|
|
31
|
+
cj = CommissionJunction.new(DEVELOPER_KEY, WEBSITE_ID)
|
|
32
|
+
|
|
33
|
+
# See http://help.cj.com/en/web_services/product_catalog_search_service_rest.htm
|
|
34
|
+
# for the list of request and response parameters.
|
|
35
|
+
cj.product_search('keywords' => '+blue +jeans',
|
|
36
|
+
'advertiser-ids' => 'joined',
|
|
37
|
+
'serviceable-area' => 'us',
|
|
38
|
+
'currency' => 'usd',
|
|
39
|
+
'records-per-page' => '5').each do |product|
|
|
40
|
+
puts product.name
|
|
41
|
+
puts product.price
|
|
42
|
+
puts product.image_url
|
|
43
|
+
puts ''
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# See http://help.cj.com/en/web_services/advertiser_lookup_service_rest.htm
|
|
47
|
+
# for the list of request and response parameters.
|
|
48
|
+
cj.advertiser_lookup('keywords' => '+used +books',
|
|
49
|
+
'advertiser-ids' => 'joined',
|
|
50
|
+
'records-per-page' => '5').each do |advertiser|
|
|
51
|
+
puts advertiser.advertiser_name
|
|
52
|
+
puts advertiser.network_rank
|
|
53
|
+
puts advertiser.program_url
|
|
54
|
+
puts ''
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# See http://help.cj.com/en/web_services/support_services_rest.htm
|
|
58
|
+
# for the list of request and response parameters.
|
|
59
|
+
puts cj.categories
|
|
60
|
+
|
|
61
|
+
# See http://help.cj.com/en/web_services/Commission_Detail_Service.htm
|
|
62
|
+
# for the list of request and response parameters.
|
|
63
|
+
cj.commissions.each do |commission|
|
|
64
|
+
puts commission.action_type
|
|
65
|
+
puts commission.aid
|
|
66
|
+
puts commission.commission_id
|
|
67
|
+
puts commission.event_date
|
|
68
|
+
puts commission.advertiser_name
|
|
69
|
+
puts commission.commission_amount
|
|
70
|
+
puts commission.sid
|
|
71
|
+
puts ''
|
|
72
|
+
end
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Dependencies
|
|
76
|
+
|
|
77
|
+
* httparty
|
|
78
|
+
|
|
79
|
+
## Contributing
|
|
80
|
+
|
|
81
|
+
* Feel free to file a bug report or enhancement request, even if you don't have time to submit a patch.
|
|
82
|
+
* Please try to include a test for any patch you submit. If you don't include a test, I'll have to write one, and it'll take longer to get your code in.
|
|
83
|
+
* Remember to send me a pull request.
|
|
84
|
+
|
|
85
|
+
## Authors
|
|
86
|
+
|
|
87
|
+
* [Albert Vernon](https://github.com/aevernon)
|
|
88
|
+
* [C.J. Sanders](https://github.com/cjsanders)
|
|
89
|
+
* [Michael Nutt](https://github.com/mnutt)
|
|
90
|
+
* [Jean-Sebastien Boulanger](https://github.com/jsboulanger)
|
|
91
|
+
|
|
92
|
+
## Copyright
|
|
93
|
+
|
|
94
|
+
Copyright (c) 2012 Albert Vernon. See LICENSE for details.
|
data/Rakefile
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
require 'commission_junction/version'
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |gem|
|
|
7
|
+
gem.name = 'commission_junction'
|
|
8
|
+
gem.version = CommissionJunction::VERSION
|
|
9
|
+
gem.author = 'Albert Vernon'
|
|
10
|
+
gem.email = 'aev@vernon.nu'
|
|
11
|
+
gem.description = %q{Ruby wrapper for the Commission Junction web services APIs (REST)}
|
|
12
|
+
gem.summary = %q{Commission Junction web services APIs (REST)}
|
|
13
|
+
gem.homepage = %q{https://github.com/aevernon/commission_junction}
|
|
14
|
+
|
|
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']
|
|
19
|
+
gem.add_dependency 'httparty', '~> 0.8.3'
|
|
20
|
+
end
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
require 'commission_junction/version'
|
|
2
|
+
require 'httparty'
|
|
3
|
+
|
|
4
|
+
# Silence peer certificate warnings from Net::HTTP.
|
|
5
|
+
# Credit: http://www.5dollarwhitebox.org/drupal/node/64
|
|
6
|
+
class Net::HTTP
|
|
7
|
+
alias_method :old_initialize, :initialize
|
|
8
|
+
|
|
9
|
+
def initialize(*args)
|
|
10
|
+
old_initialize(*args)
|
|
11
|
+
@ssl_context = OpenSSL::SSL::SSLContext.new
|
|
12
|
+
@ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Interact with CJ web services.
|
|
17
|
+
class CommissionJunction
|
|
18
|
+
include HTTParty
|
|
19
|
+
format(:xml)
|
|
20
|
+
#debug_output $stderr
|
|
21
|
+
|
|
22
|
+
attr_reader :total_matched,
|
|
23
|
+
:records_returned,
|
|
24
|
+
:page_number,
|
|
25
|
+
:cj_objects
|
|
26
|
+
|
|
27
|
+
WEB_SERVICE_URIS =
|
|
28
|
+
{
|
|
29
|
+
:product_search => 'https://product-search.api.cj.com/v2/product-search',
|
|
30
|
+
:advertiser_lookup => 'https://advertiser-lookup.api.cj.com/v3/advertiser-lookup',
|
|
31
|
+
:categories => 'https://support-services.api.cj.com/v2/categories',
|
|
32
|
+
:commissions => 'https://commission-detail.api.cj.com/v3/commissions'
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
def initialize(developer_key, website_id, timeout = 10)
|
|
36
|
+
raise ArgumentError, "developer_key must be a String; got #{developer_key.class} instead" unless developer_key.is_a?(String)
|
|
37
|
+
raise ArgumentError, "You must supply your developer key.\nSee https://api.cj.com/sign_up.cj" unless developer_key.length > 0
|
|
38
|
+
|
|
39
|
+
website_id = website_id.to_s
|
|
40
|
+
raise ArgumentError, "You must supply your website ID.\nSee cj.com > Account > Web site Settings > PID" unless website_id.length > 0
|
|
41
|
+
@website_id = website_id
|
|
42
|
+
|
|
43
|
+
raise ArgumentError, "timeout must be a Fixnum; got #{timeout.class} instead" unless timeout.is_a?(Fixnum)
|
|
44
|
+
raise ArgumentError, "timeout must be > 0; got #{timeout} instead" unless timeout > 0
|
|
45
|
+
@timeout = timeout
|
|
46
|
+
|
|
47
|
+
self_class = self.class
|
|
48
|
+
self_class.headers('authorization' => developer_key)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def categories(params = {})
|
|
52
|
+
raise ArgumentError, "params must be a Hash; got #{params.class} instead" unless params.is_a?(Hash)
|
|
53
|
+
|
|
54
|
+
params = {'locale' => 'en'}.merge(params)
|
|
55
|
+
|
|
56
|
+
response = self.class.get(WEB_SERVICE_URIS[:categories], :query => params, :timeout => @timeout)
|
|
57
|
+
|
|
58
|
+
cj_api = response['cj_api']
|
|
59
|
+
error_message = cj_api['error_message']
|
|
60
|
+
|
|
61
|
+
raise ArgumentError, error_message if error_message
|
|
62
|
+
|
|
63
|
+
@categories = cj_api['categories']['category']
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def advertiser_lookup(params = {})
|
|
67
|
+
raise ArgumentError, "params must be a Hash; got #{params.class} instead" unless params.is_a?(Hash)
|
|
68
|
+
|
|
69
|
+
params = {'advertiser-ids' => 'joined'}.merge(params)
|
|
70
|
+
|
|
71
|
+
@cj_objects = []
|
|
72
|
+
|
|
73
|
+
begin
|
|
74
|
+
response = self.class.get(WEB_SERVICE_URIS[:advertiser_lookup], :query => params)
|
|
75
|
+
cj_api = response['cj_api']
|
|
76
|
+
error_message = cj_api['error_message']
|
|
77
|
+
|
|
78
|
+
raise ArgumentError, error_message if error_message
|
|
79
|
+
|
|
80
|
+
advertisers = cj_api['advertisers']
|
|
81
|
+
|
|
82
|
+
@total_matched = advertisers['total_matched'].to_i
|
|
83
|
+
@records_returned = advertisers['records_returned'].to_i
|
|
84
|
+
@page_number = advertisers['page_number'].to_i
|
|
85
|
+
|
|
86
|
+
advertiser = advertisers['advertiser']
|
|
87
|
+
advertiser = [advertiser] if advertiser.is_a?(Hash) # If we got exactly one result, put it in an array.
|
|
88
|
+
advertiser.each { |item| @cj_objects << Advertiser.new(item) } if advertiser
|
|
89
|
+
rescue Timeout::Error
|
|
90
|
+
@total_matched = @records_returned = @page_number = 0
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
@cj_objects
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def product_search(params)
|
|
97
|
+
raise ArgumentError, "params must be a Hash; got #{params.class} instead" unless params.is_a?(Hash)
|
|
98
|
+
|
|
99
|
+
unless params.size > 0
|
|
100
|
+
raise ArgumentError, "You must provide at least one request parameter, for example, \"keywords\".\nSee http://help.cj.com/en/web_services/product_catalog_search_service_rest.htm"
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
params['website-id'] = @website_id
|
|
104
|
+
|
|
105
|
+
@cj_objects = []
|
|
106
|
+
|
|
107
|
+
begin
|
|
108
|
+
response = self.class.get(WEB_SERVICE_URIS[:product_search], :query => params, :timeout => @timeout)
|
|
109
|
+
|
|
110
|
+
cj_api = response['cj_api']
|
|
111
|
+
error_message = cj_api['error_message']
|
|
112
|
+
|
|
113
|
+
raise ArgumentError, error_message if error_message
|
|
114
|
+
|
|
115
|
+
products = cj_api['products']
|
|
116
|
+
|
|
117
|
+
@total_matched = products['total_matched'].to_i
|
|
118
|
+
@records_returned = products['records_returned'].to_i
|
|
119
|
+
@page_number = products['page_number'].to_i
|
|
120
|
+
|
|
121
|
+
product = products['product']
|
|
122
|
+
product = [product] if product.is_a?(Hash) # If we got exactly one result, put it in an array.
|
|
123
|
+
product.each { |item| @cj_objects << Product.new(item) } if product
|
|
124
|
+
rescue Timeout::Error
|
|
125
|
+
@total_matched = @records_returned = @page_number = 0
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
@cj_objects
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def commissions(params = {})
|
|
132
|
+
raise ArgumentError, "params must be a Hash; got #{params.class} instead" unless params.is_a?(Hash)
|
|
133
|
+
|
|
134
|
+
params = {'date-type' => 'event'}.merge(params)
|
|
135
|
+
|
|
136
|
+
@cj_objects = []
|
|
137
|
+
|
|
138
|
+
begin
|
|
139
|
+
response = self.class.get(WEB_SERVICE_URIS[:commissions], :query => params)
|
|
140
|
+
cj_api = response['cj_api']
|
|
141
|
+
error_message = cj_api['error_message']
|
|
142
|
+
|
|
143
|
+
raise ArgumentError, error_message if error_message
|
|
144
|
+
|
|
145
|
+
commissions = cj_api['commissions']
|
|
146
|
+
|
|
147
|
+
@total_matched = commissions['total_matched'].to_i
|
|
148
|
+
@records_returned = commissions['records_returned'].to_i
|
|
149
|
+
@page_number = commissions['page_number'].to_i
|
|
150
|
+
|
|
151
|
+
commission = commissions['commission']
|
|
152
|
+
commission = [commission] if commission.is_a?(Hash) # If we got exactly one result, put it in an array.
|
|
153
|
+
commission.each { |item| @cj_objects << Commission.new(item) } if commission
|
|
154
|
+
rescue Timeout::Error
|
|
155
|
+
@total_matched = @records_returned = @page_number = 0
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
@cj_objects
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
class CjObject
|
|
162
|
+
def initialize(params)
|
|
163
|
+
raise ArgumentError, "params must be a Hash; got #{params.class} instead" unless params.is_a?(Hash)
|
|
164
|
+
raise ArgumentError, 'Expecting at least one parameter' unless params.size > 0
|
|
165
|
+
|
|
166
|
+
# Create instance variables and attribute readers on the fly.
|
|
167
|
+
# Credit: http://listlibrary.net/ruby-talk/2004/03/00sGI1cD
|
|
168
|
+
params.each do |key, val|
|
|
169
|
+
raise ArgumentError, "key must be a String; got #{key.class} instead" unless key.is_a?(String)
|
|
170
|
+
instance_variable_set("@#{key}".intern, val)
|
|
171
|
+
instance_eval %Q{ class << self ; attr_reader #{key.intern.inspect} ; end }
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
class Product < CjObject
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
class Advertiser < CjObject
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
class Commission < CjObject
|
|
183
|
+
end
|
|
184
|
+
end
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class CommissionJunctionTest < Test::Unit::TestCase
|
|
4
|
+
def test_new_cj_with_no_params
|
|
5
|
+
assert_raise ArgumentError do
|
|
6
|
+
CommissionJunction.new
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_new_cj_with_one_param
|
|
11
|
+
assert_raise ArgumentError do
|
|
12
|
+
CommissionJunction.new('fake')
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_new_cj_with_nil_param
|
|
17
|
+
assert_raise ArgumentError do
|
|
18
|
+
CommissionJunction.new(nil, 'website_id')
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
assert_raise ArgumentError do
|
|
22
|
+
CommissionJunction.new('developer_key', nil)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
assert_raise ArgumentError do
|
|
26
|
+
CommissionJunction.new('developer_key', 'website_id', nil)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_new_cj_with_empty_param
|
|
31
|
+
assert_raise ArgumentError do
|
|
32
|
+
CommissionJunction.new('', 'website_id')
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
assert_raise ArgumentError do
|
|
36
|
+
CommissionJunction.new('developer_key', '')
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def test_new_cj_with_non_string_param
|
|
41
|
+
assert_raise ArgumentError do
|
|
42
|
+
CommissionJunction.new(123456, 'website_id')
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
assert_nothing_raised ArgumentError do
|
|
46
|
+
CommissionJunction.new('developer_key', 123456)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_new_cj_with_non_fixnum_timeout
|
|
51
|
+
assert_raise ArgumentError do
|
|
52
|
+
CommissionJunction.new('developer_key', 'website_id', '10')
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def test_new_cj_with_non_positive_timeout
|
|
57
|
+
assert_raise ArgumentError do
|
|
58
|
+
CommissionJunction.new('developer_key', 'website_id', 0)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
assert_raise ArgumentError do
|
|
62
|
+
CommissionJunction.new('developer_key', 'website_id', -1)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def test_new_cj_with_correct_types
|
|
67
|
+
assert_nothing_raised do
|
|
68
|
+
assert_instance_of(CommissionJunction, CommissionJunction.new('developer_key', 'website_id'))
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
assert_nothing_raised do
|
|
72
|
+
assert_instance_of(CommissionJunction, CommissionJunction.new('developer_key', 'website_id', 50))
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def test_new_product_with_no_params
|
|
77
|
+
assert_raise ArgumentError do
|
|
78
|
+
CommissionJunction::Product.new
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def test_new_product_with_nil_params
|
|
83
|
+
assert_raise ArgumentError do
|
|
84
|
+
CommissionJunction::Product.new(nil)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def test_new_product_with_empty_params
|
|
89
|
+
assert_raise ArgumentError do
|
|
90
|
+
CommissionJunction::Product.new({})
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def test_new_product_with_non_hash_params
|
|
95
|
+
assert_raise ArgumentError do
|
|
96
|
+
CommissionJunction::Product.new([1, 2, 3])
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def test_new_product_with_hash_params_and_non_string_keys
|
|
101
|
+
assert_raise ArgumentError do
|
|
102
|
+
CommissionJunction::Product.new(:name => 'blue jeans', :price => '49.95')
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def test_new_product_with_hash_params_and_string_keys
|
|
107
|
+
assert_nothing_raised do
|
|
108
|
+
product = CommissionJunction::Product.new('name' => 'blue jeans', 'price' => '49.95')
|
|
109
|
+
assert_instance_of(CommissionJunction::Product, product)
|
|
110
|
+
assert_respond_to(product, :name)
|
|
111
|
+
assert_equal('blue jeans', product.name)
|
|
112
|
+
assert_respond_to(product, :price)
|
|
113
|
+
assert_equal('49.95', product.price)
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def test_product_search_with_no_params
|
|
118
|
+
assert_raise ArgumentError do
|
|
119
|
+
CommissionJunction.new('developer_key', 'website_id').product_search
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def test_product_search_with_nil_params
|
|
124
|
+
assert_raise ArgumentError do
|
|
125
|
+
CommissionJunction.new('developer_key', 'website_id').product_search(nil)
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def test_product_search_with_empty_params
|
|
130
|
+
assert_raise ArgumentError do
|
|
131
|
+
CommissionJunction.new('developer_key', 'website_id').product_search({})
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def test_product_search_with_non_hash_params
|
|
136
|
+
assert_raise ArgumentError do
|
|
137
|
+
CommissionJunction.new('developer_key', 'website_id').product_search([1, 2, 3])
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def test_product_search_with_bad_key
|
|
142
|
+
cj = CommissionJunction.new('bad_key', 'website_id')
|
|
143
|
+
|
|
144
|
+
assert_raise ArgumentError do
|
|
145
|
+
cj.product_search('keywords' => '+some +product')
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def test_product_search_with_keywords_live
|
|
150
|
+
key_file = File.join(ENV['HOME'], '.commission_junction.yaml')
|
|
151
|
+
|
|
152
|
+
skip "#{key_file} does not exist. Put your CJ developer key and website ID in there to enable live testing." unless File.exist?(key_file)
|
|
153
|
+
|
|
154
|
+
credentials = YAML.load(File.read(key_file))
|
|
155
|
+
cj = CommissionJunction.new(credentials['developer_key'], credentials['website_id'])
|
|
156
|
+
|
|
157
|
+
# Zero results
|
|
158
|
+
assert_nothing_raised do
|
|
159
|
+
cj.product_search('keywords' => 'no_matching_results')
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
check_search_results(cj)
|
|
163
|
+
|
|
164
|
+
# One result
|
|
165
|
+
assert_nothing_raised do
|
|
166
|
+
cj.product_search('keywords' => '+blue +jeans', 'records-per-page' => '1')
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
check_search_results(cj)
|
|
170
|
+
|
|
171
|
+
# Multiple results
|
|
172
|
+
assert_nothing_raised do
|
|
173
|
+
cj.product_search('keywords' => '+blue +jeans', 'records-per-page' => '2')
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
check_search_results(cj)
|
|
177
|
+
|
|
178
|
+
# Short timeout
|
|
179
|
+
cj = CommissionJunction.new(credentials['developer_key'], credentials['website_id'], 1)
|
|
180
|
+
|
|
181
|
+
assert_nothing_raised do
|
|
182
|
+
cj.product_search('keywords' => 'One Great Blue Jean~No Limits', 'records-per-page' => '1')
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
check_search_results(cj)
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def check_search_results(results)
|
|
189
|
+
assert_instance_of(Fixnum, results.total_matched)
|
|
190
|
+
assert_instance_of(Fixnum, results.records_returned)
|
|
191
|
+
assert_instance_of(Fixnum, results.page_number)
|
|
192
|
+
assert_instance_of(Array, results.cj_objects)
|
|
193
|
+
|
|
194
|
+
results.cj_objects.each do |product|
|
|
195
|
+
assert_instance_of(CommissionJunction::Product, product)
|
|
196
|
+
assert_respond_to(product, :ad_id)
|
|
197
|
+
assert_respond_to(product, :advertiser_id)
|
|
198
|
+
assert_respond_to(product, :advertiser_name)
|
|
199
|
+
assert_respond_to(product, :buy_url)
|
|
200
|
+
assert_respond_to(product, :catalog_id)
|
|
201
|
+
assert_respond_to(product, :currency)
|
|
202
|
+
assert_respond_to(product, :description)
|
|
203
|
+
assert_respond_to(product, :image_url)
|
|
204
|
+
assert_respond_to(product, :in_stock)
|
|
205
|
+
assert_respond_to(product, :isbn)
|
|
206
|
+
assert_respond_to(product, :manufacturer_name)
|
|
207
|
+
assert_respond_to(product, :manufacturer_sku)
|
|
208
|
+
assert_respond_to(product, :name)
|
|
209
|
+
assert_respond_to(product, :price)
|
|
210
|
+
assert_respond_to(product, :retail_price)
|
|
211
|
+
assert_respond_to(product, :sale_price)
|
|
212
|
+
assert_respond_to(product, :sku)
|
|
213
|
+
assert_respond_to(product, :upc)
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def test_advertiser_lookup_live
|
|
218
|
+
key_file = File.join(ENV['HOME'], '.commission_junction.yaml')
|
|
219
|
+
|
|
220
|
+
skip "#{key_file} does not exist. Put your CJ developer key and website ID in there to enable live testing." unless File.exist?(key_file)
|
|
221
|
+
|
|
222
|
+
credentials = YAML.load(File.read(key_file))
|
|
223
|
+
cj = CommissionJunction.new(credentials['developer_key'], credentials['website_id'])
|
|
224
|
+
|
|
225
|
+
# Use default lookup parameters.
|
|
226
|
+
assert_nothing_raised do
|
|
227
|
+
cj.advertiser_lookup
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
check_advertiser_lookup_results(cj)
|
|
231
|
+
|
|
232
|
+
# One result
|
|
233
|
+
assert_nothing_raised do
|
|
234
|
+
cj.advertiser_lookup('advertiser-ids' => 'joined', 'page-number' => '1')
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
check_advertiser_lookup_results(cj)
|
|
238
|
+
|
|
239
|
+
# Multiple results
|
|
240
|
+
assert_nothing_raised do
|
|
241
|
+
cj.advertiser_lookup('keywords' => '+blue +jeans', 'records-per-page' => '2')
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
check_advertiser_lookup_results(cj)
|
|
245
|
+
|
|
246
|
+
# Short timeout
|
|
247
|
+
cj = CommissionJunction.new(credentials['developer_key'], credentials['website_id'], 1)
|
|
248
|
+
|
|
249
|
+
assert_nothing_raised do
|
|
250
|
+
cj.advertiser_lookup('keywords' => 'One Great Blue Jean~No Limits', 'records-per-page' => '1')
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
check_advertiser_lookup_results(cj)
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
def check_advertiser_lookup_results(results)
|
|
257
|
+
assert_instance_of(Fixnum, results.total_matched)
|
|
258
|
+
assert_instance_of(Fixnum, results.records_returned)
|
|
259
|
+
assert_instance_of(Fixnum, results.page_number)
|
|
260
|
+
assert_instance_of(Array, results.cj_objects)
|
|
261
|
+
|
|
262
|
+
results.cj_objects.each do |advertiser|
|
|
263
|
+
assert_instance_of(CommissionJunction::Advertiser, advertiser)
|
|
264
|
+
assert_respond_to(advertiser, :advertiser_id)
|
|
265
|
+
assert_respond_to(advertiser, :advertiser_name)
|
|
266
|
+
assert_respond_to(advertiser, :language)
|
|
267
|
+
assert_respond_to(advertiser, :link_types)
|
|
268
|
+
assert_respond_to(advertiser, :network_rank)
|
|
269
|
+
assert_respond_to(advertiser, :performance_incentives)
|
|
270
|
+
assert_respond_to(advertiser, :primary_category)
|
|
271
|
+
assert_respond_to(advertiser, :program_url)
|
|
272
|
+
assert_respond_to(advertiser, :relationship_status)
|
|
273
|
+
assert_respond_to(advertiser, :seven_day_epc)
|
|
274
|
+
assert_respond_to(advertiser, :three_month_epc)
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
def test_categories_live
|
|
279
|
+
key_file = File.join(ENV['HOME'], '.commission_junction.yaml')
|
|
280
|
+
|
|
281
|
+
skip "#{key_file} does not exist. Put your CJ developer key and website ID in there to enable live testing." unless File.exist?(key_file)
|
|
282
|
+
|
|
283
|
+
credentials = YAML.load(File.read(key_file))
|
|
284
|
+
cj = CommissionJunction.new(credentials['developer_key'], credentials['website_id'])
|
|
285
|
+
|
|
286
|
+
assert cj.categories.size > 0
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
def test_commissions_live
|
|
290
|
+
key_file = File.join(ENV['HOME'], '.commission_junction.yaml')
|
|
291
|
+
|
|
292
|
+
skip "#{key_file} does not exist. Put your CJ developer key and website ID in there to enable live testing." unless File.exist?(key_file)
|
|
293
|
+
|
|
294
|
+
credentials = YAML.load(File.read(key_file))
|
|
295
|
+
cj = CommissionJunction.new(credentials['developer_key'], credentials['website_id'])
|
|
296
|
+
|
|
297
|
+
assert_nothing_raised do
|
|
298
|
+
cj.commissions
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
check_commission_lookup_results(cj)
|
|
302
|
+
|
|
303
|
+
assert_nothing_raised do
|
|
304
|
+
cj.commissions('date-type' => 'posting')
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
check_commission_lookup_results(cj)
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
def check_commission_lookup_results(results)
|
|
311
|
+
assert_instance_of(Fixnum, results.total_matched)
|
|
312
|
+
assert_instance_of(Fixnum, results.records_returned)
|
|
313
|
+
assert_instance_of(Fixnum, results.page_number)
|
|
314
|
+
assert_instance_of(Array, results.cj_objects)
|
|
315
|
+
|
|
316
|
+
results.cj_objects.each do |commission|
|
|
317
|
+
assert_instance_of(CommissionJunction::Commission, commission)
|
|
318
|
+
assert_respond_to(commission, :action_status)
|
|
319
|
+
assert_respond_to(commission, :action_type)
|
|
320
|
+
assert_respond_to(commission, :action_tracker_id)
|
|
321
|
+
assert_respond_to(commission, :action_tracker_name)
|
|
322
|
+
assert_respond_to(commission, :aid)
|
|
323
|
+
assert_respond_to(commission, :commission_id)
|
|
324
|
+
assert_respond_to(commission, :country)
|
|
325
|
+
assert_respond_to(commission, :event_date)
|
|
326
|
+
assert_respond_to(commission, :locking_date)
|
|
327
|
+
assert_respond_to(commission, :order_id)
|
|
328
|
+
assert_respond_to(commission, :original)
|
|
329
|
+
assert_respond_to(commission, :original_action_id)
|
|
330
|
+
assert_respond_to(commission, :posting_date)
|
|
331
|
+
assert_respond_to(commission, :website_id)
|
|
332
|
+
assert_respond_to(commission, :cid)
|
|
333
|
+
assert_respond_to(commission, :advertiser_name)
|
|
334
|
+
assert_respond_to(commission, :commission_amount)
|
|
335
|
+
assert_respond_to(commission, :order_discount)
|
|
336
|
+
assert_respond_to(commission, :sid)
|
|
337
|
+
assert_respond_to(commission, :sale_amount)
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: commission_junction
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.4.1
|
|
5
|
+
prerelease:
|
|
6
|
+
platform: ruby
|
|
7
|
+
authors:
|
|
8
|
+
- Albert Vernon
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2012-09-03 00:00:00.000000000 Z
|
|
13
|
+
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: httparty
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
|
+
none: false
|
|
18
|
+
requirements:
|
|
19
|
+
- - ~>
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: 0.8.3
|
|
22
|
+
type: :runtime
|
|
23
|
+
prerelease: false
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
none: false
|
|
26
|
+
requirements:
|
|
27
|
+
- - ~>
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: 0.8.3
|
|
30
|
+
description: Ruby wrapper for the Commission Junction web services APIs (REST)
|
|
31
|
+
email: aev@vernon.nu
|
|
32
|
+
executables: []
|
|
33
|
+
extensions: []
|
|
34
|
+
extra_rdoc_files: []
|
|
35
|
+
files:
|
|
36
|
+
- .gitignore
|
|
37
|
+
- Gemfile
|
|
38
|
+
- LICENSE
|
|
39
|
+
- README.md
|
|
40
|
+
- Rakefile
|
|
41
|
+
- commission_junction.gemspec
|
|
42
|
+
- lib/commission_junction.rb
|
|
43
|
+
- lib/commission_junction/version.rb
|
|
44
|
+
- test/commission_junction_test.rb
|
|
45
|
+
- test/test_helper.rb
|
|
46
|
+
homepage: https://github.com/aevernon/commission_junction
|
|
47
|
+
licenses: []
|
|
48
|
+
post_install_message:
|
|
49
|
+
rdoc_options: []
|
|
50
|
+
require_paths:
|
|
51
|
+
- lib
|
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
53
|
+
none: false
|
|
54
|
+
requirements:
|
|
55
|
+
- - ! '>='
|
|
56
|
+
- !ruby/object:Gem::Version
|
|
57
|
+
version: '0'
|
|
58
|
+
segments:
|
|
59
|
+
- 0
|
|
60
|
+
hash: 2510825910021186561
|
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
62
|
+
none: false
|
|
63
|
+
requirements:
|
|
64
|
+
- - ! '>='
|
|
65
|
+
- !ruby/object:Gem::Version
|
|
66
|
+
version: '0'
|
|
67
|
+
segments:
|
|
68
|
+
- 0
|
|
69
|
+
hash: 2510825910021186561
|
|
70
|
+
requirements: []
|
|
71
|
+
rubyforge_project:
|
|
72
|
+
rubygems_version: 1.8.24
|
|
73
|
+
signing_key:
|
|
74
|
+
specification_version: 3
|
|
75
|
+
summary: Commission Junction web services APIs (REST)
|
|
76
|
+
test_files:
|
|
77
|
+
- test/commission_junction_test.rb
|
|
78
|
+
- test/test_helper.rb
|