ebay_enterprise_affiliate_network 1.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.
@@ -0,0 +1,2 @@
1
+ *.gem
2
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in pepperjam.gemspec
4
+ gemspec
@@ -0,0 +1,10 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard :test do
5
+ watch(%r{^test/.+_test\.rb$})
6
+ watch("test/test_helper.rb") { "test" }
7
+
8
+ watch(%r{^app/models/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" }
9
+ watch(%r{^app/validators/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" }
10
+ end
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2013- Venture Media Labs, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,132 @@
1
+ # eBay Enterprise Affiliate Network API
2
+
3
+ Ruby wrapper for [eBay Enterprise Affiliate Network API](http://help.pepperjamnetwork.com/api/) (formerly PepperJam Exchange API). Only [Publisher API](http://help.pepperjamnetwork.com/api/publisher) is supported at this moment. If you need [Advertiser API](http://help.pepperjamnetwork.com/api/advertiser) or [Partner API](http://help.pepperjamnetwork.com/api/partner), feel free to [contribute](#contributing).
4
+
5
+ For questions or bugs please [create an issue](issues/new).
6
+
7
+ ## <a id="installation"></a>Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'ebay_enterprise_affiliate_network'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install ebay_enterprise_affiliate_network
20
+
21
+ ## <a id="requirement"></a>Requirements
22
+
23
+ [Ruby](http://www.ruby-lang.org/en/downloads/) 1.9 or above.
24
+
25
+ ## <a id="usage"></a>Usage
26
+
27
+ The gem is designed to support all existing and future [Publisher API](http://help.pepperjamnetwork.com/api/publisher) resources.
28
+
29
+ To start using the gem, you need to set up the api key first. If you use Ruby on Rails, the API key can be set in a configuration file (i.e. `app/config/initializers/ebay_enterprise_affiliate_network.rb`), otherwise just set it in your script. API Key can be found at http://www.pepperjamnetwork.com/affiliate/api/.
30
+
31
+ ```ruby
32
+ require "ebay_enterprise_affiliate_network" # no need for RoR
33
+ EBayEnterpriseAffiliateNetwork.api_key = ENV["EEAN_API_KEY"]
34
+ ```
35
+
36
+ ### Examples
37
+
38
+ #### <a href="http://help.pepperjamnetwork.com/api/publisher#advertiser-category" target="_blank" title="Advertiser Categories">Advertiser Categories</a>
39
+
40
+ ```ruby
41
+ publisher = EBayEnterpriseAffiliateNetwork::Publisher.new
42
+ response = publisher.get("advertiser/category")
43
+ response.data.each do |category|
44
+ puts "#{category.name} (ID #{category.id})"
45
+ end
46
+
47
+ # Retrieve the actual request URL sent to the API
48
+ puts response.request.uri.to_s
49
+ ```
50
+
51
+ #### <a href="http://help.pepperjamnetwork.com/api/publisher#advertiser" target="_blank" title="Advertisers">Advertiser Details</a>
52
+
53
+ Get the list of [advertisers](http://help.pepperjamnetwork.com/api/publisher#advertiser) that you have a `joined` relationship with. The second argument of `get` method accepts a `Hash` of parameters. See the [API documentation](http://help.pepperjamnetwork.com/api/publisher) for a list of parameters for each API resource.
54
+ Note that the API resource used must match the ones available in documentation, except the `publisher/` prefix that needs to be removed.
55
+
56
+ ```ruby
57
+ publisher = EBayEnterpriseAffiliateNetwork::Publisher.new
58
+ response = publisher.get("advertiser", status: :joined)
59
+ # Return the number of total records
60
+ response.meta.pagination.total_results
61
+ # Return the number of pages
62
+ response.meta.pagination.total_pages
63
+
64
+ response.data.each do |advertiser|
65
+ # Do something
66
+ end
67
+ ```
68
+ If there are multiple pages (each page has a maximum of 500 records, value that cannot be changed), you can retrieve all pages by using the `all` method, as follows:
69
+
70
+ ```ruby
71
+ response.all.each do |advertiser|
72
+ # Do something
73
+ end
74
+ ```
75
+ When using the `all` method, `response` object is updated with the data returned by the last API request (last page). `response.all` returns the `data` array.
76
+
77
+ #### <a href="http://help.pepperjamnetwork.com/api/publisher#creative-product" target="_blank" title="Product Creatives">Product Creatives</a>
78
+
79
+ Filter [Target](http://www.target.com) products by `canon camera` keywords.
80
+
81
+ ```ruby
82
+ params = {
83
+ programIds: 6759, # Target ID
84
+ keywords: "canon camera"
85
+ }
86
+ publisher = EBayEnterpriseAffiliateNetwork::Publisher.new
87
+ response = publisher.get("creative/product", params)
88
+ response.data.each do |product|
89
+ puts "<a href=\"#{product.buy_url}\" title=\"#{product.name}\" target=\"_blank\">#{product.name}</a>"
90
+ end
91
+ ```
92
+
93
+ #### <a href="http://help.pepperjamnetwork.com/api/publisher#report-transaction-details" target="_blank" title="Transaction Details">Transaction Details</a>
94
+
95
+ Retrieve all transactions in the last day
96
+
97
+ ```ruby
98
+ require "date"
99
+ # Note that the API uses ET as time zone, although is not specified anywhere
100
+ yesterday = (Date.today - 1).to_s
101
+ today = Date.today.to_s
102
+ params = {
103
+ startDate: yesterday,
104
+ endDate: today,
105
+ website: 12345 # replace with your website id
106
+ }
107
+ publisher = EBayEnterpriseAffiliateNetwork::Publisher.new
108
+ response = publisher.get("report/transaction-details", params)
109
+ response.data.each do |transaction|
110
+ # Generate report
111
+ end
112
+ ```
113
+
114
+ Website ID can be retrieved from http://www.pepperjamnetwork.com/affiliate.
115
+
116
+ ### Extra Configuration
117
+
118
+ * `EBayEnterpriseAffiliateNetwork.api_base_url` - default value is `http://api.pepperjamnetwork.com`
119
+ * `EBayEnterpriseAffiliateNetwork.api_version` - default value is `20120402`
120
+ * `EBayEnterpriseAffiliateNetwork.api_timeout` - the timeout set when initiating requests to eBay Enterprise Affiliate Network API (default value is 30 seconds)
121
+
122
+ ## <a id="contributing"></a>Contributing
123
+
124
+ 1. Fork it
125
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
126
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
127
+ 4. Push to the branch (`git push origin my-new-feature`)
128
+ 5. Create new Pull Request
129
+
130
+ ## <a id="license"></a>License
131
+
132
+ [MIT](LICENSE.md)
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |test|
5
+ test.libs << "lib" << "test"
6
+ test.pattern = "test/**/*_test.rb"
7
+ test.verbose = true
8
+ end
9
+
10
+ task default: :test
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.1
@@ -0,0 +1,33 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "ebay_enterprise_affiliate_network/version"
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "ebay_enterprise_affiliate_network"
8
+ s.version = EBayEnterpriseAffiliateNetwork::VERSION
9
+ s.authors = ["Razvan Marescu"]
10
+ s.email = ["razvan@marescu.net"]
11
+ s.description = %q{Ruby wrapper for eBay Enterprise Affiliate Network API (formerly PepperJam Exchange API). See http://help.pepperjamnetwork.com/api for details.}
12
+ s.summary = %q{eBay Enterprise Affiliate Network API}
13
+ s.homepage = "https://github.com/rmarescu/ebay_enterprise_affiliate_network"
14
+ s.license = "MIT"
15
+ s.required_ruby_version = ">= 1.9"
16
+
17
+ s.files = `git ls-files`.split($/)
18
+ s.test_files = s.files.grep(%r{^(test|s|features)/})
19
+ s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_dependency "addressable", "~> 2.3.5"
23
+ s.add_dependency "htmlentities", "~> 4.3.1"
24
+ s.add_dependency "httparty", "~> 0.11.0"
25
+ s.add_dependency "json", "~> 1.8.0"
26
+ s.add_dependency "recursive-open-struct", "~> 0.4.3"
27
+
28
+ s.add_development_dependency "bundler", "~> 1.3"
29
+ s.add_development_dependency "rake"
30
+ s.add_development_dependency "webmock"
31
+ s.add_development_dependency "test-unit"
32
+ s.add_development_dependency "guard-test"
33
+ end
@@ -0,0 +1,45 @@
1
+ require "addressable/uri"
2
+ require "cgi"
3
+ require "htmlentities"
4
+ require "httparty"
5
+ require "json"
6
+ require "net/http"
7
+ require "recursive_open_struct"
8
+ require "uri"
9
+
10
+ # Version
11
+ require "ebay_enterprise_affiliate_network/version"
12
+
13
+ # Resources
14
+ require "ebay_enterprise_affiliate_network/api_resource"
15
+ require "ebay_enterprise_affiliate_network/publisher"
16
+ require "ebay_enterprise_affiliate_network/api_response"
17
+
18
+ # Errors
19
+ require "ebay_enterprise_affiliate_network/errors/error"
20
+ require "ebay_enterprise_affiliate_network/errors/authentication_error"
21
+ require "ebay_enterprise_affiliate_network/errors/connection_error"
22
+ require "ebay_enterprise_affiliate_network/errors/invalid_request_error"
23
+
24
+ module EBayEnterpriseAffiliateNetwork
25
+ @api_base_url = "http://api.pepperjamnetwork.com"
26
+ @api_version = 20120402
27
+ @api_timeout = 30
28
+
29
+ class << self
30
+ attr_accessor :api_key, :api_base_url
31
+ attr_reader :api_version, :api_timeout
32
+ end
33
+
34
+ def self.api_version=(version)
35
+ raise ArgumentError, "Version must be a Fixnum (YYYYMMDD format); got #{version.class} instead." unless version.is_a? Fixnum
36
+ raise ArgumentError, "Please provide the version of the API Key." unless version > 0
37
+ @api_version = version
38
+ end
39
+
40
+ def self.api_timeout=(timeout)
41
+ raise ArgumentError, "Timeout must be a Fixnum; got #{timeout.class} instead" unless timeout.is_a? Fixnum
42
+ raise ArgumentError, "Timeout must be > 0; got #{timeout} instead" unless timeout > 0
43
+ @api_timeout = timeout
44
+ end
45
+ end
@@ -0,0 +1,66 @@
1
+ module EBayEnterpriseAffiliateNetwork
2
+ class APIResource
3
+ include HTTParty
4
+
5
+ def class_name
6
+ self.class.name.split('::')[-1]
7
+ end
8
+
9
+ def base_path
10
+ if self == APIResource
11
+ raise NotImplementedError.new("APIResource is an abstract class. You should perform actions on its subclasses (i.e. Publisher)")
12
+ end
13
+ "/#{EBayEnterpriseAffiliateNetwork.api_version}/#{CGI.escape(class_name.downcase)}/"
14
+ end
15
+
16
+ def get(api_resource, params = {})
17
+ @resource ||= api_resource
18
+ unless api_key ||= EBayEnterpriseAffiliateNetwork.api_key
19
+ raise AuthenticationError.new(
20
+ "No API key provided. Set your API key using 'EBayEnterpriseAffiliateNetwork.api_key = <API-KEY>'. " +
21
+ "You can retrieve your API key from the eBay Enterprise web interface. " +
22
+ "See http://www.pepperjamnetwork.com/affiliate/api/ for details."
23
+ )
24
+ end
25
+ if api_key =~ /\s/
26
+ raise AuthenticationError.new(
27
+ "Your API key looks invalid. " +
28
+ "Double-check your API key at http://www.pepperjamnetwork.com/affiliate/api/"
29
+ )
30
+ end
31
+ raise ArgumentError, "Params must be a Hash; got #{params.class} instead" unless params.is_a? Hash
32
+
33
+ params.merge!({
34
+ apiKey: api_key,
35
+ format: :json
36
+ })
37
+ resource_url = EBayEnterpriseAffiliateNetwork.api_base_url + base_path + api_resource
38
+ request(resource_url, params)
39
+ end
40
+
41
+ def request(resource_url, params)
42
+ timeout = EBayEnterpriseAffiliateNetwork.api_timeout
43
+ begin
44
+ response = self.class.get(resource_url, query: params, timeout: timeout)
45
+ rescue Timeout::Error
46
+ raise ConnectionError.new("Timeout error (#{timeout}s)")
47
+ end
48
+ process(response)
49
+ end
50
+
51
+ private
52
+
53
+ def process(response)
54
+ case response.code
55
+ when 200, 201, 204
56
+ APIResponse.new(response)
57
+ when 400, 404
58
+ raise InvalidRequestError.new(response.message, response.code)
59
+ when 401
60
+ raise AuthenticationError.new(response.message, response.code)
61
+ else
62
+ raise Error.new(response.message, response.code)
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,31 @@
1
+ module EBayEnterpriseAffiliateNetwork
2
+ class APIResponse
3
+ attr_reader :meta, :data, :request
4
+
5
+ def initialize(response)
6
+ @request = response.request
7
+ body = JSON.parse(response.body)
8
+ @meta = RecursiveOpenStruct.new(body["meta"])
9
+ @data = parse(body["data"])
10
+ end
11
+
12
+ def all
13
+ while meta.pagination.next
14
+ uri = Addressable::URI.parse(meta.pagination.next.href)
15
+ next_page_response = EBayEnterpriseAffiliateNetwork::Publisher.new.request(uri.origin + uri.path, uri.query_values)
16
+ @meta = next_page_response.meta
17
+ @data += next_page_response.data
18
+ end
19
+ @data
20
+ end
21
+
22
+ private
23
+
24
+ def parse(raw_data)
25
+ data = []
26
+ data = [raw_data] if raw_data.is_a?(Hash) # If we got exactly one result, put it in an array.
27
+ raw_data.each { |item| data << RecursiveOpenStruct.new(item) } if raw_data
28
+ data
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,4 @@
1
+ module EBayEnterpriseAffiliateNetwork
2
+ class AuthenticationError < Error
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module EBayEnterpriseAffiliateNetwork
2
+ class ConnectionError < Error
3
+ end
4
+ end
@@ -0,0 +1,15 @@
1
+ module EBayEnterpriseAffiliateNetwork
2
+ class Error < StandardError
3
+ attr_reader :message, :code
4
+
5
+ def initialize(message = nil, code = nil)
6
+ @message = message
7
+ @code = code
8
+ end
9
+
10
+ def to_s
11
+ code_string = code.nil? ? "" : " (Code #{code})"
12
+ "#{message}#{code_string}"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,4 @@
1
+ module EBayEnterpriseAffiliateNetwork
2
+ class InvalidRequestError < Error
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module EBayEnterpriseAffiliateNetwork
2
+ class Publisher < APIResource
3
+ end
4
+ end
@@ -0,0 +1,3 @@
1
+ module EBayEnterpriseAffiliateNetwork
2
+ VERSION = "1.0.1"
3
+ end
@@ -0,0 +1,299 @@
1
+ require "test_helper"
2
+
3
+ class EBayEnterpriseAffiliateNetworkTest < Test::Unit::TestCase
4
+ def test_with_invalid_key
5
+ EBayEnterpriseAffiliateNetwork.api_key = nil
6
+ ebay = EBayEnterpriseAffiliateNetwork::Publisher.new
7
+ assert_raise EBayEnterpriseAffiliateNetwork::AuthenticationError do
8
+ ebay.get('advertiser')
9
+ end
10
+
11
+ EBayEnterpriseAffiliateNetwork.api_key = "key with spaces"
12
+ assert_raise EBayEnterpriseAffiliateNetwork::AuthenticationError do
13
+ ebay.get('advertiser')
14
+ end
15
+ end
16
+
17
+ def test_invalid_version
18
+ assert_raise ArgumentError do
19
+ EBayEnterpriseAffiliateNetwork.api_version = ""
20
+ end
21
+
22
+ assert_raise ArgumentError do
23
+ EBayEnterpriseAffiliateNetwork.api_version = 0
24
+ end
25
+ end
26
+
27
+ def test_invalid_timeout
28
+ assert_raise ArgumentError do
29
+ EBayEnterpriseAffiliateNetwork.api_timeout = ""
30
+ end
31
+
32
+ assert_raise ArgumentError do
33
+ EBayEnterpriseAffiliateNetwork.api_timeout = "20"
34
+ end
35
+
36
+ assert_raise ArgumentError do
37
+ EBayEnterpriseAffiliateNetwork.api_timeout = 0
38
+ end
39
+
40
+ assert_raise ArgumentError do
41
+ EBayEnterpriseAffiliateNetwork.api_timeout = -1
42
+ end
43
+ end
44
+
45
+ def test_new_publisher
46
+ EBayEnterpriseAffiliateNetwork.api_key = "key"
47
+ assert_nothing_raised do
48
+ EBayEnterpriseAffiliateNetwork::Publisher.new
49
+ end
50
+ end
51
+
52
+ def test_invalid_params_for_resource
53
+ EBayEnterpriseAffiliateNetwork.api_key = "key"
54
+ assert_raise ArgumentError do
55
+ EBayEnterpriseAffiliateNetwork::Publisher.new.get("advertiser", "foo")
56
+ end
57
+ end
58
+
59
+ def test_publisher_base_path
60
+ publisher = EBayEnterpriseAffiliateNetwork::Publisher.new
61
+ assert_equal "/#{EBayEnterpriseAffiliateNetwork.api_version}/publisher/", publisher.base_path
62
+ end
63
+
64
+ def test_raise_invalid_request_error_on_code_400
65
+ EBayEnterpriseAffiliateNetwork.api_key = "key"
66
+ publisher = EBayEnterpriseAffiliateNetwork::Publisher.new
67
+ json_response = <<-JSON
68
+ {
69
+ "meta": {
70
+ "status": { "code": 400, "message": "foo is not a valid program status option." },
71
+ "requests": { "current": 384, "maximum": 1500 }
72
+ },
73
+ "data": []
74
+ }
75
+ JSON
76
+ stub_request(
77
+ :get,
78
+ "http://api.pepperjamnetwork.com/20120402/publisher/advertiser?apiKey=#{EBayEnterpriseAffiliateNetwork.api_key}&format=json&status=foo").
79
+ with(headers: {}).
80
+ to_return(
81
+ status: [400, "foo is not a valid program status option."],
82
+ body: json_response,
83
+ headers: {}
84
+ )
85
+ e = assert_raise EBayEnterpriseAffiliateNetwork::InvalidRequestError do
86
+ publisher.get("advertiser", status: :foo)
87
+ end
88
+ assert_equal "foo is not a valid program status option. (Code 400)", e.to_s
89
+ end
90
+
91
+ def test_raise_error_on_code_500
92
+ EBayEnterpriseAffiliateNetwork.api_key = "key"
93
+ publisher = EBayEnterpriseAffiliateNetwork::Publisher.new
94
+ json_response = <<-JSON
95
+ {
96
+ "meta": {
97
+ "status": { "code": 500, "message": "Internal Server Error" },
98
+ "requests": { "current": 384, "maximum": 1500 }
99
+ },
100
+ "data": []
101
+ }
102
+ JSON
103
+ stub_request(
104
+ :get,
105
+ "http://api.pepperjamnetwork.com/20120402/publisher/advertiser/category?apiKey=#{EBayEnterpriseAffiliateNetwork.api_key}&format=json").
106
+ with(headers: {}).
107
+ to_return(
108
+ status: [500, "Internal Server Error"],
109
+ body: json_response,
110
+ headers: {}
111
+ )
112
+ e = assert_raise EBayEnterpriseAffiliateNetwork::Error do
113
+ publisher.get("advertiser/category")
114
+ end
115
+ assert_equal "Internal Server Error (Code 500)", e.to_s
116
+ end
117
+
118
+ def test_raise_error_on_code_401
119
+ EBayEnterpriseAffiliateNetwork.api_key = "wrong_key"
120
+ publisher = EBayEnterpriseAffiliateNetwork::Publisher.new
121
+ json_response = <<-JSON
122
+ {
123
+ meta: {
124
+ status: {
125
+ code: 401,
126
+ message: "Authentication error."
127
+ }
128
+ },
129
+ data: []
130
+ }
131
+ JSON
132
+ stub_request(
133
+ :get,
134
+ "http://api.pepperjamnetwork.com/20120402/publisher/advertiser/category?apiKey=#{EBayEnterpriseAffiliateNetwork.api_key}&format=json").
135
+ with(headers: {}).
136
+ to_return(
137
+ status: [401, "Authentication error."],
138
+ body: json_response,
139
+ headers: {}
140
+ )
141
+ e = assert_raise EBayEnterpriseAffiliateNetwork::AuthenticationError do
142
+ publisher.get("advertiser/category")
143
+ end
144
+ assert_equal "Authentication error. (Code 401)", e.to_s
145
+ end
146
+
147
+ def test_publisher_get_category_resource
148
+ EBayEnterpriseAffiliateNetwork.api_key = "key"
149
+ publisher = EBayEnterpriseAffiliateNetwork::Publisher.new
150
+ json_response = <<-JSON
151
+ {
152
+ "meta": {
153
+ "status": { "code": 200, "message": "OK" },
154
+ "pagination": { "total_results": 3, "total_pages": 1 },
155
+ "requests": { "current": 359, "maximum": 1500 }
156
+ },
157
+ "data": [
158
+ { "name": "Commerce", "id": "1" },
159
+ { "name": "Computer & Electronics", "id": "2" },
160
+ { "name": "Education", "id": "3" },
161
+ { "name": "Accessories", "id": "7" }
162
+ ]
163
+ }
164
+ JSON
165
+ stub_request(
166
+ :get,
167
+ "http://api.pepperjamnetwork.com/20120402/publisher/advertiser/category?apiKey=#{EBayEnterpriseAffiliateNetwork.api_key}&format=json").
168
+ with(headers: {}).
169
+ to_return(status: 200, body: json_response, headers: {})
170
+
171
+ response = publisher.get("advertiser/category")
172
+ check_results(response)
173
+
174
+ assert_equal 200, response.meta.status.code
175
+ assert_equal 3, response.meta.pagination.total_results
176
+ assert_equal 1, response.meta.pagination.total_pages
177
+ assert_equal 4, response.data.size
178
+ assert_equal "Commerce", response.data.first.name
179
+ assert_equal "1", response.data.first.id
180
+ assert_equal "Accessories", response.data.last.name
181
+ assert_equal "7", response.data.last.id
182
+ end
183
+
184
+ def test_publisher_get_all_results
185
+ EBayEnterpriseAffiliateNetwork.api_key = "key"
186
+ publisher = EBayEnterpriseAffiliateNetwork::Publisher.new
187
+ response_page_1 = <<-JSON
188
+ {
189
+ "meta": {
190
+ "status": { "code": 200, "message": "OK" },
191
+ "pagination": {
192
+ "total_results": 10,
193
+ "total_pages": 3,
194
+ "next": {
195
+ "rel": "next",
196
+ "href": "http://api.pepperjamnetwork.com/20120402/publisher/advertiser/category?apiKey=#{EBayEnterpriseAffiliateNetwork.api_key}&format=json&page=2",
197
+ "description": "Next Page"
198
+ }
199
+ },
200
+ "requests": { "current": 359, "maximum": 1500 }
201
+ },
202
+ "data": [
203
+ { "name": "Commerce", "id": "1" },
204
+ { "name": "Computer & Electronics", "id": "2" },
205
+ { "name": "Education", "id": "3" },
206
+ { "name": "Accessories", "id": "7" }
207
+ ]
208
+ }
209
+ JSON
210
+ response_page_2 = <<-JSON
211
+ {
212
+ "meta": {
213
+ "status": { "code": 200, "message": "OK" },
214
+ "pagination": {
215
+ "total_results": 10,
216
+ "total_pages": 3,
217
+ "next": {
218
+ "rel": "next",
219
+ "href": "http://api.pepperjamnetwork.com/20120402/publisher/advertiser/category?apiKey=#{EBayEnterpriseAffiliateNetwork.api_key}&format=json&page=3",
220
+ "description": "Next Page"
221
+ },
222
+ "prev": {
223
+ "rel": "prev",
224
+ "href": "http://api.pepperjamnetwork.com/20120402/publisher/advertiser/category?apiKey=#{EBayEnterpriseAffiliateNetwork.api_key}&format=json&page=1",
225
+ "description": "Previous Page"
226
+ }
227
+ },
228
+ "requests": { "current": 360, "maximum": 1500 }
229
+ },
230
+ "data": [
231
+ { "name": "Art/Photo/Music", "id": "9" },
232
+ { "name": "Automotive", "id": "11" },
233
+ { "name": "Books/Media", "id": "13" },
234
+ { "name": "Business", "id": "15" }
235
+ ]
236
+ }
237
+ JSON
238
+ response_page_3 = <<-JSON
239
+ {
240
+ "meta": {
241
+ "status": { "code": 200, "message": "OK" },
242
+ "pagination": {
243
+ "total_results": 10,
244
+ "total_pages": 3,
245
+ "prev": {
246
+ "rel": "prev",
247
+ "href": "http://api.pepperjamnetwork.com/20120402/publisher/advertiser/category?apiKey=#{EBayEnterpriseAffiliateNetwork.api_key}&format=json&page=2",
248
+ "description": "Previous Page"
249
+ }
250
+ },
251
+ "requests": { "current": 361, "maximum": 1500 }
252
+ },
253
+ "data": [
254
+ { "name": "Careers", "id": "17" },
255
+ { "name": "Clothing/Apparel", "id": "19" },
256
+ { "name": "Entertainment", "id": "23" }
257
+ ]
258
+ }
259
+ JSON
260
+ stub_request(
261
+ :get,
262
+ "http://api.pepperjamnetwork.com/20120402/publisher/advertiser/category?apiKey=#{EBayEnterpriseAffiliateNetwork.api_key}&format=json").
263
+ with(headers: {}).
264
+ to_return(status: 200, body: response_page_1, headers: {})
265
+
266
+ response = publisher.get("advertiser/category")
267
+ stub_request(
268
+ :get,
269
+ "http://api.pepperjamnetwork.com/20120402/publisher/advertiser/category?apiKey=#{EBayEnterpriseAffiliateNetwork.api_key}&format=json&page=2").
270
+ with(headers: {}).
271
+ to_return(status: 200, body: response_page_2, headers: {})
272
+ stub_request(
273
+ :get,
274
+ "http://api.pepperjamnetwork.com/20120402/publisher/advertiser/category?apiKey=#{EBayEnterpriseAffiliateNetwork.api_key}&format=json&page=3").
275
+ with(headers: {}).
276
+ to_return(status: 200, body: response_page_3, headers: {})
277
+ all_categories = response.all
278
+ check_results(response)
279
+
280
+ assert_equal 11, all_categories.count
281
+ assert_equal 23, all_categories.last.id.to_i
282
+ end
283
+
284
+ private
285
+
286
+ def check_results(response)
287
+ assert_instance_of(RecursiveOpenStruct, response.meta)
288
+ assert_instance_of(Fixnum, response.meta.status.code)
289
+ assert_instance_of(String, response.meta.status.message)
290
+ assert_instance_of(Fixnum, response.meta.pagination.total_results)
291
+ assert_instance_of(Fixnum, response.meta.pagination.total_pages)
292
+ assert_instance_of(Array, response.data)
293
+
294
+ response.data.each do |item|
295
+ assert_instance_of(RecursiveOpenStruct, item)
296
+ assert_respond_to(item, :name)
297
+ end
298
+ end
299
+ end
@@ -0,0 +1,7 @@
1
+ require "rubygems"
2
+ require "test/unit"
3
+ require "webmock/test_unit"
4
+
5
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
6
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
7
+ require "ebay_enterprise_affiliate_network"
metadata ADDED
@@ -0,0 +1,228 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ebay_enterprise_affiliate_network
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Razvan Marescu
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-08-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: addressable
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 2.3.5
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: 2.3.5
30
+ - !ruby/object:Gem::Dependency
31
+ name: htmlentities
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 4.3.1
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 4.3.1
46
+ - !ruby/object:Gem::Dependency
47
+ name: httparty
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 0.11.0
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.11.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: json
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 1.8.0
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 1.8.0
78
+ - !ruby/object:Gem::Dependency
79
+ name: recursive-open-struct
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 0.4.3
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 0.4.3
94
+ - !ruby/object:Gem::Dependency
95
+ name: bundler
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: '1.3'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: '1.3'
110
+ - !ruby/object:Gem::Dependency
111
+ name: rake
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: webmock
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: test-unit
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: guard-test
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ description: Ruby wrapper for eBay Enterprise Affiliate Network API (formerly PepperJam
175
+ Exchange API). See http://help.pepperjamnetwork.com/api for details.
176
+ email:
177
+ - razvan@marescu.net
178
+ executables: []
179
+ extensions: []
180
+ extra_rdoc_files: []
181
+ files:
182
+ - .gitignore
183
+ - Gemfile
184
+ - Guardfile
185
+ - LICENSE.txt
186
+ - README.md
187
+ - Rakefile
188
+ - VERSION
189
+ - ebay_enterprise_affiliate_network.gemspec
190
+ - lib/ebay_enterprise_affiliate_network.rb
191
+ - lib/ebay_enterprise_affiliate_network/api_resource.rb
192
+ - lib/ebay_enterprise_affiliate_network/api_response.rb
193
+ - lib/ebay_enterprise_affiliate_network/errors/authentication_error.rb
194
+ - lib/ebay_enterprise_affiliate_network/errors/connection_error.rb
195
+ - lib/ebay_enterprise_affiliate_network/errors/error.rb
196
+ - lib/ebay_enterprise_affiliate_network/errors/invalid_request_error.rb
197
+ - lib/ebay_enterprise_affiliate_network/publisher.rb
198
+ - lib/ebay_enterprise_affiliate_network/version.rb
199
+ - test/ebay_enterprise_affiliate_network_test.rb
200
+ - test/test_helper.rb
201
+ homepage: https://github.com/rmarescu/ebay_enterprise_affiliate_network
202
+ licenses:
203
+ - MIT
204
+ post_install_message:
205
+ rdoc_options: []
206
+ require_paths:
207
+ - lib
208
+ required_ruby_version: !ruby/object:Gem::Requirement
209
+ none: false
210
+ requirements:
211
+ - - ! '>='
212
+ - !ruby/object:Gem::Version
213
+ version: '1.9'
214
+ required_rubygems_version: !ruby/object:Gem::Requirement
215
+ none: false
216
+ requirements:
217
+ - - ! '>='
218
+ - !ruby/object:Gem::Version
219
+ version: '0'
220
+ requirements: []
221
+ rubyforge_project:
222
+ rubygems_version: 1.8.23
223
+ signing_key:
224
+ specification_version: 3
225
+ summary: eBay Enterprise Affiliate Network API
226
+ test_files:
227
+ - test/ebay_enterprise_affiliate_network_test.rb
228
+ - test/test_helper.rb