agcod 0.0.4 → 0.0.6
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 +9 -4
- data/Gemfile +4 -0
- data/Rakefile +12 -39
- data/agcod.gemspec +20 -67
- data/lib/agcod.rb +1 -2
- data/lib/agcod/configuration.rb +16 -11
- data/lib/agcod/request.rb +34 -19
- data/lib/agcod/version.rb +3 -0
- data/test/agcod/configuration_test.rb +14 -7
- data/test/agcod/request_test.rb +45 -0
- data/test/fixtures/create_gift_card/non-error-failure.xml +22 -0
- data/test/fixtures/create_gift_card/retry.xml +17 -0
- data/test/fixtures/create_gift_card/success.xml +22 -0
- data/test/fixtures/health_check/success.xml +15 -0
- data/test/test_helper.rb +21 -3
- metadata +144 -48
- data/.document +0 -5
- data/VERSION +0 -1
data/.gitignore
CHANGED
@@ -1,9 +1,14 @@
|
|
1
|
+
*.gem
|
1
2
|
*.sw?
|
2
3
|
.DS_Store
|
4
|
+
.bundle
|
5
|
+
.rvmrc
|
6
|
+
Gemfile.lock
|
7
|
+
agcod_cucumber.log
|
3
8
|
coverage
|
4
|
-
rdoc
|
5
|
-
pkg
|
6
9
|
features/support/app_root/config/agcod.yml
|
7
|
-
log
|
8
|
-
agcod_cucumber.log
|
9
10
|
features/support/certification_requests
|
11
|
+
log
|
12
|
+
pkg/*
|
13
|
+
rdoc
|
14
|
+
vendor/bundle
|
data/Gemfile
ADDED
data/Rakefile
CHANGED
@@ -1,27 +1,13 @@
|
|
1
|
-
require '
|
2
|
-
require 'rake'
|
3
|
-
|
4
|
-
begin
|
5
|
-
require 'jeweler'
|
6
|
-
Jeweler::Tasks.new do |gem|
|
7
|
-
gem.name = "agcod"
|
8
|
-
gem.summary = %Q{A Wrapper for Amazon Gift Cards On Demand}
|
9
|
-
gem.email = "dpickett@enlightsolutions.com"
|
10
|
-
gem.homepage = "http://github.com/dpickett/agcod"
|
11
|
-
gem.authors = ["Dan Pickett"]
|
12
|
-
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
13
|
-
end
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake/testtask'
|
14
3
|
|
15
|
-
|
16
|
-
|
4
|
+
Rake::TestTask.new('test') do |t|
|
5
|
+
t.libs << 'lib' << 'test'
|
6
|
+
t.pattern = 'test/**/*_test.rb'
|
7
|
+
t.verbose = true
|
17
8
|
end
|
18
9
|
|
19
|
-
|
20
|
-
Rake::TestTask.new(:test) do |test|
|
21
|
-
test.libs << 'lib' << 'test'
|
22
|
-
test.pattern = 'test/**/*_test.rb'
|
23
|
-
test.verbose = true
|
24
|
-
end
|
10
|
+
task :default => :test
|
25
11
|
|
26
12
|
begin
|
27
13
|
require 'rcov/rcovtask'
|
@@ -37,30 +23,17 @@ rescue LoadError
|
|
37
23
|
end
|
38
24
|
end
|
39
25
|
|
40
|
-
|
41
|
-
|
42
|
-
Cucumber::Rake::Task.new(:features)
|
43
|
-
rescue LoadError
|
44
|
-
task :features do
|
45
|
-
abort "Cucumber is not available. In order to run features, you must: sudo gem install cucumber"
|
46
|
-
end
|
47
|
-
end
|
26
|
+
require 'cucumber/rake/task'
|
27
|
+
Cucumber::Rake::Task.new(:features)
|
48
28
|
|
49
29
|
require File.join(File.dirname(__FILE__), "lib", "agcod", "tasks")
|
50
30
|
|
51
|
-
task
|
52
|
-
|
53
|
-
require 'rake/rdoctask'
|
31
|
+
require 'rdoc/task'
|
54
32
|
Rake::RDocTask.new do |rdoc|
|
55
|
-
|
56
|
-
config = YAML.load(File.read('VERSION.yml'))
|
57
|
-
version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
|
58
|
-
else
|
59
|
-
version = ""
|
60
|
-
end
|
33
|
+
require 'agcod/version'
|
61
34
|
|
62
35
|
rdoc.rdoc_dir = 'rdoc'
|
63
|
-
rdoc.title = "agcod #{
|
36
|
+
rdoc.title = "agcod #{ Agcod::VERSION }"
|
64
37
|
rdoc.rdoc_files.include('README*')
|
65
38
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
66
39
|
end
|
data/agcod.gemspec
CHANGED
@@ -1,74 +1,27 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "agcod/version"
|
5
4
|
|
6
5
|
Gem::Specification.new do |s|
|
7
|
-
s.name
|
8
|
-
s.version
|
6
|
+
s.name = "agcod"
|
7
|
+
s.version = Agcod::VERSION
|
8
|
+
s.authors = ["Dan Pickett"]
|
9
|
+
s.email = %q{dpickett@enlightsolutions.com}
|
10
|
+
s.homepage = %q{http://github.com/dpickett/agcod}
|
11
|
+
s.summary = %q{A Wrapper for Amazon Gift Codes On Demand}
|
12
|
+
s.description = %q{Access the Amazon API to order gift codes}
|
9
13
|
|
10
|
-
s.
|
11
|
-
s.authors = ["Dan Pickett"]
|
12
|
-
s.date = %q{2010-11-18}
|
13
|
-
s.email = %q{dpickett@enlightsolutions.com}
|
14
|
-
s.extra_rdoc_files = [
|
15
|
-
"LICENSE",
|
16
|
-
"README.rdoc"
|
17
|
-
]
|
18
|
-
s.files = [
|
19
|
-
".document",
|
20
|
-
".gitignore",
|
21
|
-
"LICENSE",
|
22
|
-
"README.rdoc",
|
23
|
-
"Rakefile",
|
24
|
-
"VERSION",
|
25
|
-
"agcod.gemspec",
|
26
|
-
"cucumber.yml",
|
27
|
-
"features/error_handling.feature",
|
28
|
-
"features/step_definitions/agcod_steps.rb",
|
29
|
-
"features/success_certification.feature",
|
30
|
-
"features/support/app_root/config/agcod.example.yml",
|
31
|
-
"features/support/env.rb",
|
32
|
-
"lib/agcod.rb",
|
33
|
-
"lib/agcod/cancel_gift_card.rb",
|
34
|
-
"lib/agcod/configuration.rb",
|
35
|
-
"lib/agcod/create_gift_card.rb",
|
36
|
-
"lib/agcod/error/configuration_error.rb",
|
37
|
-
"lib/agcod/error/invalid_parameter.rb",
|
38
|
-
"lib/agcod/health_check.rb",
|
39
|
-
"lib/agcod/option_validators.rb",
|
40
|
-
"lib/agcod/request.rb",
|
41
|
-
"lib/agcod/tasks.rb",
|
42
|
-
"lib/agcod/tasks/certification.rake",
|
43
|
-
"lib/agcod/void_gift_card_creation.rb",
|
44
|
-
"manual_features/cancel_claimed_giftcard.feature",
|
45
|
-
"manual_features/insufficient_funds.feature",
|
46
|
-
"manual_features/retry_and_http.feature",
|
47
|
-
"tasks/agcod.rake",
|
48
|
-
"test/agcod/configuration_test.rb",
|
49
|
-
"test/app_root/config/agcod.yml",
|
50
|
-
"test/macros/configuration.rb",
|
51
|
-
"test/test_helper.rb"
|
52
|
-
]
|
53
|
-
s.homepage = %q{http://github.com/dpickett/agcod}
|
54
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
55
|
-
s.require_paths = ["lib"]
|
56
|
-
s.rubygems_version = %q{1.3.7}
|
57
|
-
s.summary = %q{A Wrapper for Amazon Gift Cards On Demand}
|
58
|
-
s.test_files = [
|
59
|
-
"test/agcod/configuration_test.rb",
|
60
|
-
"test/macros/configuration.rb",
|
61
|
-
"test/test_helper.rb"
|
62
|
-
]
|
14
|
+
s.rubyforge_project = "agcod"
|
63
15
|
|
64
|
-
|
65
|
-
|
66
|
-
|
16
|
+
s.add_development_dependency 'cucumber'
|
17
|
+
s.add_development_dependency 'fakeweb'
|
18
|
+
s.add_development_dependency 'mocha'
|
19
|
+
s.add_development_dependency 'rake'
|
20
|
+
s.add_development_dependency 'rspec'
|
21
|
+
s.add_development_dependency 'shoulda'
|
67
22
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
end
|
23
|
+
s.files = `git ls-files`.split("\n")
|
24
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
25
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
26
|
+
s.require_paths = ["lib"]
|
73
27
|
end
|
74
|
-
|
data/lib/agcod.rb
CHANGED
data/lib/agcod/configuration.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
module Agcod
|
2
2
|
class Configuration
|
3
|
-
REQUIRED_OPTIONS = ["access_key",
|
3
|
+
REQUIRED_OPTIONS = ["access_key",
|
4
4
|
"secret_key",
|
5
5
|
"partner_id",
|
6
6
|
"uri",
|
7
7
|
"discount_percentage"
|
8
|
-
]
|
9
|
-
|
8
|
+
]
|
9
|
+
|
10
10
|
class << self
|
11
11
|
attr_reader :options
|
12
12
|
attr_accessor :logger
|
@@ -17,11 +17,11 @@ module Agcod
|
|
17
17
|
else
|
18
18
|
@app_root = Rails.root if defined?(Rails)
|
19
19
|
end
|
20
|
-
|
21
|
-
if @app_root.nil? ||
|
20
|
+
|
21
|
+
if @app_root.nil? ||
|
22
22
|
!FileTest.exists?(config_filename = File.join(@app_root, 'config', 'agcod.yml'))
|
23
|
-
|
24
|
-
raise Error::ConfigurationError, "Configuration for AGCOD not found"
|
23
|
+
|
24
|
+
raise Error::ConfigurationError, "Configuration for AGCOD not found"
|
25
25
|
end
|
26
26
|
|
27
27
|
config_file = File.read(config_filename)
|
@@ -30,6 +30,7 @@ module Agcod
|
|
30
30
|
environment = env if env
|
31
31
|
|
32
32
|
@options = YAML.load(config_file)[environment]
|
33
|
+
raise Error::ConfigurationError, "Configuration for AGCOD (#{ environment } environment) not found" unless @options
|
33
34
|
validate_options
|
34
35
|
@options
|
35
36
|
end
|
@@ -41,7 +42,7 @@ module Agcod
|
|
41
42
|
validate_options
|
42
43
|
@options
|
43
44
|
end
|
44
|
-
|
45
|
+
|
45
46
|
def access_key
|
46
47
|
@options["access_key"]
|
47
48
|
end
|
@@ -62,14 +63,18 @@ module Agcod
|
|
62
63
|
@options["discount_percentage"]
|
63
64
|
end
|
64
65
|
|
66
|
+
def verify_mode
|
67
|
+
@options["verify_mode"]
|
68
|
+
end
|
69
|
+
|
65
70
|
private
|
66
|
-
|
71
|
+
|
67
72
|
def validate_options
|
68
73
|
REQUIRED_OPTIONS.each do |opt|
|
69
74
|
if options[opt].nil? || options[opt] == ""
|
70
|
-
raise Error::ConfigurationError, "#{opt} was not specified"
|
75
|
+
raise Error::ConfigurationError, "#{opt} was not specified"
|
71
76
|
end
|
72
|
-
end
|
77
|
+
end
|
73
78
|
end
|
74
79
|
end
|
75
80
|
end
|
data/lib/agcod/request.rb
CHANGED
@@ -35,7 +35,8 @@ module Agcod
|
|
35
35
|
#remove all the = and & from the serialized string
|
36
36
|
sanitized_string = string_to_sign.gsub(/=|&/, "")
|
37
37
|
# puts sanitized_string
|
38
|
-
|
38
|
+
digest = OpenSSL::Digest::Digest.new('sha1')
|
39
|
+
sha1 = OpenSSL::HMAC.digest(digest, Agcod::Configuration.secret_key, sanitized_string)
|
39
40
|
|
40
41
|
#Base64 encoding adds a linefeed to the end of the string so chop the last character!
|
41
42
|
CGI.escape(Base64.encode64(sha1).chomp)
|
@@ -49,12 +50,15 @@ module Agcod
|
|
49
50
|
@response_id || @options["response_id"]
|
50
51
|
end
|
51
52
|
|
52
|
-
|
53
|
+
def request_url
|
54
|
+
"#{ Agcod::Configuration.uri }?#{ build_sorted_and_signed_request_string }"
|
55
|
+
end
|
56
|
+
|
57
|
+
protected
|
53
58
|
|
54
59
|
def process_response
|
55
60
|
parse_response
|
56
61
|
|
57
|
-
|
58
62
|
@errors = []
|
59
63
|
|
60
64
|
self.xml_response.root.elements.each("Error") do |e|
|
@@ -63,6 +67,12 @@ module Agcod
|
|
63
67
|
|
64
68
|
@status = self.xml_response.root.elements["Status/statusCode"].text unless xml_response.root.elements["Status/statusCode"].nil?
|
65
69
|
|
70
|
+
# in some cases we have a failure and no Error elements. Check for
|
71
|
+
# a status message in this case
|
72
|
+
if @status == 'FAILURE'
|
73
|
+
@errors << self.xml_response.root.elements["Status/statusMessage"].text unless xml_response.root.elements["Status/statusMessage"].nil?
|
74
|
+
end
|
75
|
+
|
66
76
|
#something happened before it got to ACGWS (most likely a signature problem)
|
67
77
|
@status = "FAILURE" if self.errors.size > 0 && self.status.blank?
|
68
78
|
|
@@ -76,24 +86,29 @@ module Agcod
|
|
76
86
|
def attempt_retry
|
77
87
|
#check for retry error
|
78
88
|
if self.xml_response.root.elements["Status/errorCode"] &&
|
79
|
-
|
80
|
-
|
81
|
-
|
89
|
+
self.xml_response.root.elements["Status/errorCode"].text == "E100" &&
|
90
|
+
! @sent_retry
|
91
|
+
then
|
82
92
|
@sent_retry = true
|
83
|
-
submit
|
93
|
+
submit
|
84
94
|
end
|
85
95
|
end
|
86
96
|
|
87
|
-
protected
|
88
97
|
def send_request
|
89
98
|
#send the request
|
90
|
-
uri = URI.parse
|
99
|
+
uri = URI.parse request_url
|
91
100
|
http = Net::HTTP.new(uri.host, uri.port)
|
92
101
|
http.read_timeout = 20
|
93
102
|
http.open_timeout = 20
|
94
103
|
http.use_ssl = true
|
95
104
|
|
96
|
-
|
105
|
+
if Agcod::Configuration.verify_mode
|
106
|
+
http.verify_mode = Agcod::Configuration.verify_mode.constantize
|
107
|
+
end
|
108
|
+
|
109
|
+
@response = @xml_response = nil
|
110
|
+
net_response, @response = http.get(uri.path + "?" + uri.query)
|
111
|
+
@response ||= net_response.read_body
|
97
112
|
|
98
113
|
@sent = true
|
99
114
|
end
|
@@ -101,15 +116,15 @@ module Agcod
|
|
101
116
|
def default_parameters
|
102
117
|
@timestamp = Time.now.utc
|
103
118
|
{
|
104
|
-
"Action"
|
105
|
-
"AWSAccessKeyId"
|
106
|
-
"SignatureVersion"
|
107
|
-
"MessageHeader.recipientId"
|
108
|
-
"MessageHeader.sourceId"
|
109
|
-
"MessageHeader.retryCount"
|
119
|
+
"Action" => self.action,
|
120
|
+
"AWSAccessKeyId" => Agcod::Configuration.access_key,
|
121
|
+
"SignatureVersion" => "1",
|
122
|
+
"MessageHeader.recipientId" => "AMAZON",
|
123
|
+
"MessageHeader.sourceId" => Agcod::Configuration.partner_id,
|
124
|
+
"MessageHeader.retryCount" => "0",
|
110
125
|
"MessageHeader.contentVersion" => "2008-01-01",
|
111
|
-
"MessageHeader.messageType"
|
112
|
-
"Timestamp"
|
126
|
+
"MessageHeader.messageType" => self.action + "Request",
|
127
|
+
"Timestamp" => @timestamp.strftime("%Y-%m-%dT%H:%M:%S") + ".000Z"
|
113
128
|
}
|
114
129
|
end
|
115
130
|
|
@@ -144,7 +159,7 @@ module Agcod
|
|
144
159
|
log_string << " \##{self.request_id}" if self.request_id
|
145
160
|
log_string << " received response #{self.response_id}" if self.response_id
|
146
161
|
if self.respond_to?(:claim_code) && self.claim_code
|
147
|
-
log_string << " received claim_code #{self.claim_code}"
|
162
|
+
log_string << " received claim_code #{self.claim_code}"
|
148
163
|
end
|
149
164
|
Agcod::Configuration.logger.debug log_string
|
150
165
|
end
|
@@ -14,7 +14,7 @@ class Agcod::ConfigurationTest < Test::Unit::TestCase
|
|
14
14
|
end
|
15
15
|
|
16
16
|
should "raise an error if the configuration file isn't specified" do
|
17
|
-
assert_raise Agcod::Error::ConfigurationError do
|
17
|
+
assert_raise Agcod::Error::ConfigurationError do
|
18
18
|
Agcod::Configuration.load
|
19
19
|
end
|
20
20
|
end
|
@@ -25,22 +25,28 @@ class Agcod::ConfigurationTest < Test::Unit::TestCase
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
+
should "raise an error if the environment key is not included in the config file" do
|
29
|
+
assert_raise Agcod::Error::ConfigurationError do
|
30
|
+
Agcod::Configuration.load(File.join(File.dirname(__FILE__), "..", "app_root"), "staging")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
28
34
|
should "read configuration from a supplied app root" do
|
29
35
|
Agcod::Configuration.load(File.join(File.dirname(__FILE__), "..", "app_root"), "test")
|
30
36
|
Agcod::Configuration::REQUIRED_OPTIONS.each do |opt|
|
31
37
|
assert_not_nil Agcod::Configuration.send(opt)
|
32
38
|
end
|
33
39
|
end
|
34
|
-
|
40
|
+
|
35
41
|
should "allow me to set config options at runtime" do
|
36
42
|
Agcod::Configuration.set(@valid_options)
|
37
43
|
assert_equal Agcod::Configuration.access_key, @valid_options["access_key"]
|
38
44
|
end
|
39
45
|
|
40
46
|
should_require_config_options [
|
41
|
-
"access_key",
|
42
|
-
"secret_key",
|
43
|
-
"partner_id",
|
47
|
+
"access_key",
|
48
|
+
"secret_key",
|
49
|
+
"partner_id",
|
44
50
|
"uri",
|
45
51
|
"discount_percentage"
|
46
52
|
]
|
@@ -50,6 +56,7 @@ class Agcod::ConfigurationTest < Test::Unit::TestCase
|
|
50
56
|
setup do
|
51
57
|
configure_with_valid_options
|
52
58
|
@log_path = File.join(File.dirname(__FILE__), "..", "log", "test.log")
|
59
|
+
FileUtils.mkdir_p(File.dirname(@log_path))
|
53
60
|
FileUtils.touch(@log_path)
|
54
61
|
@logger = Logger.new(@log_path)
|
55
62
|
@logger.level = Logger::DEBUG
|
@@ -57,7 +64,7 @@ class Agcod::ConfigurationTest < Test::Unit::TestCase
|
|
57
64
|
Agcod::Configuration.logger = @logger
|
58
65
|
|
59
66
|
FakeWeb.allow_net_connect = false
|
60
|
-
|
67
|
+
|
61
68
|
@request = Agcod::CreateGiftCard.new("request_id" => 34234, "value" => 12)
|
62
69
|
@request.stubs(:response_id).returns(4323535)
|
63
70
|
@request.stubs(:send_request)
|
@@ -67,7 +74,7 @@ class Agcod::ConfigurationTest < Test::Unit::TestCase
|
|
67
74
|
end
|
68
75
|
|
69
76
|
teardown do
|
70
|
-
FileUtils.rm_f(@log_path)
|
77
|
+
FileUtils.rm_f(@log_path)
|
71
78
|
end
|
72
79
|
|
73
80
|
should "allow me to define a logger for logging requests" do
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class Agcod::RequestTest < Test::Unit::TestCase
|
4
|
+
context 'a health check request' do
|
5
|
+
setup do
|
6
|
+
Agcod::Configuration.load(File.join(File.dirname(__FILE__), "..", "app_root"), "test")
|
7
|
+
@request = Agcod::HealthCheck.new
|
8
|
+
end
|
9
|
+
|
10
|
+
should 'read response body' do
|
11
|
+
register_response @request.request_url, "health_check/success"
|
12
|
+
@request.submit
|
13
|
+
assert_equal "SUCCESS", @request.status
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'retrying a create gift card request' do
|
18
|
+
setup do
|
19
|
+
Agcod::Configuration.load(File.join(File.dirname(__FILE__), "..", "app_root"), "test")
|
20
|
+
@request = Agcod::CreateGiftCard.new('value' => 100, 'request_id' => 12345)
|
21
|
+
end
|
22
|
+
|
23
|
+
should 'use response of retried request' do
|
24
|
+
uri = URI.parse(@request.request_url)
|
25
|
+
register_response %r{^#{ uri.scheme }://#{ uri.host }}, %w( create_gift_card/retry create_gift_card/success )
|
26
|
+
@request.submit
|
27
|
+
assert_equal "SUCCESS", @request.status
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'handle for a non-error failure' do
|
32
|
+
setup do
|
33
|
+
Agcod::Configuration.load(File.join(File.dirname(__FILE__), "..", "app_root"), "test")
|
34
|
+
@request = Agcod::CreateGiftCard.new('value' => 13.57, 'request_id' => 12345)
|
35
|
+
end
|
36
|
+
|
37
|
+
should 'store failure from statusMessage' do
|
38
|
+
uri = URI.parse(@request.request_url)
|
39
|
+
register_response %r{^#{ uri.scheme }://#{ uri.host }}, %w( create_gift_card/non-error-failure create_gift_card/success )
|
40
|
+
@request.submit
|
41
|
+
assert_equal "FAILURE", @request.status
|
42
|
+
assert(@request.errors.count > 0)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<CreateGiftCardResponse xmlns="http://agcws.amazon.com/doc/2008-01-01/">
|
3
|
+
<MessageHeader>
|
4
|
+
<messageType>CreateGiftCardResponse</messageType>
|
5
|
+
<sourceId>AMAZON</sourceId>
|
6
|
+
<recipientId>SomebodyImportant</recipientId>
|
7
|
+
<contentVersion>2008-01-01</contentVersion>
|
8
|
+
<retryCount>1</retryCount>
|
9
|
+
</MessageHeader>
|
10
|
+
<Status>
|
11
|
+
<statusCode>FAILURE</statusCode>
|
12
|
+
<errorCode></errorCode>
|
13
|
+
<statusMessage>Request Error </statusMessage>
|
14
|
+
</Status>
|
15
|
+
<gcCreationRequestId>SomebodyImportant12345</gcCreationRequestId>
|
16
|
+
<gcCreationResponseId>ABC123DEF456</gcCreationResponseId>
|
17
|
+
<gcClaimCode>AB12-CDE345-FG67</gcClaimCode>
|
18
|
+
<gcValue>
|
19
|
+
<amount>13.57</amount>
|
20
|
+
<currencyCode>USD</currencyCode>
|
21
|
+
</gcValue>
|
22
|
+
</CreateGiftCardResponse>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<CreateGiftCardResponse xmlns="http://agcws.amazon.com/doc/2008-01-01/">
|
3
|
+
<MessageHeader>
|
4
|
+
<messageType>CreateGiftCardResponse</messageType>
|
5
|
+
<sourceId>AMAZON</sourceId>
|
6
|
+
<recipientId>SomebodyImportant</recipientId>
|
7
|
+
<contentVersion>2008-01-01</contentVersion>
|
8
|
+
<retryCount>0</retryCount>
|
9
|
+
</MessageHeader>
|
10
|
+
<Status>
|
11
|
+
<statusCode>FAILURE</statusCode>
|
12
|
+
<errorCode>E100</errorCode>
|
13
|
+
<statusMessage>Please retry</statusMessage>
|
14
|
+
</Status>
|
15
|
+
<gcCreationRequestId>SomebodyImportant12345</gcCreationRequestId>
|
16
|
+
<gcCreationResponseId>ABC123DEF456</gcCreationResponseId>
|
17
|
+
</CreateGiftCardResponse>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<CreateGiftCardResponse xmlns="http://agcws.amazon.com/doc/2008-01-01/">
|
3
|
+
<MessageHeader>
|
4
|
+
<messageType>CreateGiftCardResponse</messageType>
|
5
|
+
<sourceId>AMAZON</sourceId>
|
6
|
+
<recipientId>SomebodyImportant</recipientId>
|
7
|
+
<contentVersion>2008-01-01</contentVersion>
|
8
|
+
<retryCount>1</retryCount>
|
9
|
+
</MessageHeader>
|
10
|
+
<Status>
|
11
|
+
<statusCode>SUCCESS</statusCode>
|
12
|
+
<errorCode></errorCode>
|
13
|
+
<statusMessage>CreateGiftCard Request successful</statusMessage>
|
14
|
+
</Status>
|
15
|
+
<gcCreationRequestId>SomebodyImportant12345</gcCreationRequestId>
|
16
|
+
<gcCreationResponseId>ABC123DEF456</gcCreationResponseId>
|
17
|
+
<gcClaimCode>AB12-CDE345-FG67</gcClaimCode>
|
18
|
+
<gcValue>
|
19
|
+
<amount>100</amount>
|
20
|
+
<currencyCode>USD</currencyCode>
|
21
|
+
</gcValue>
|
22
|
+
</CreateGiftCardResponse>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<HealthCheckResponse xmlns="http://agcws.amazon.com/doc/2008-01-01/">
|
3
|
+
<MessageHeader>
|
4
|
+
<messageType>HealthCheckResponse</messageType>
|
5
|
+
<sourceId>AMAZON</sourceId>
|
6
|
+
<recipientId>SomebodyImportant</recipientId>
|
7
|
+
<contentVersion>2008-01-01</contentVersion>
|
8
|
+
<retryCount>0</retryCount>
|
9
|
+
</MessageHeader>
|
10
|
+
<Status>
|
11
|
+
<statusCode>SUCCESS</statusCode>
|
12
|
+
<errorCode/>
|
13
|
+
<statusMessage>HealthCheck Request successful</statusMessage>
|
14
|
+
</Status>
|
15
|
+
</HealthCheckResponse>
|
data/test/test_helper.rb
CHANGED
@@ -4,19 +4,37 @@ require 'shoulda'
|
|
4
4
|
require 'fakeweb'
|
5
5
|
require 'mocha'
|
6
6
|
|
7
|
+
module ActiveResource
|
8
|
+
class TimeoutError < StandardError
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class String
|
13
|
+
def blank?
|
14
|
+
empty?
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
7
18
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
8
19
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
9
20
|
require 'agcod'
|
10
21
|
|
11
|
-
begin
|
22
|
+
begin
|
23
|
+
require "redgreen"
|
24
|
+
rescue LoadError
|
25
|
+
end
|
12
26
|
|
13
27
|
FakeWeb.allow_net_connect = false
|
14
28
|
|
15
29
|
require "macros/configuration"
|
16
30
|
|
17
31
|
class Test::Unit::TestCase
|
18
|
-
def register_response(
|
19
|
-
|
32
|
+
def register_response(uri, fixtures)
|
33
|
+
fixtures = [fixtures].flatten.map do |f|
|
34
|
+
{ :body => IO.read(xml_fixture_path(f)) }
|
35
|
+
end
|
36
|
+
|
37
|
+
FakeWeb.register_uri(:get, uri, fixtures)
|
20
38
|
end
|
21
39
|
|
22
40
|
def xml_fixture_path(fixture)
|
metadata
CHANGED
@@ -1,40 +1,123 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: agcod
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 4
|
10
|
-
version: 0.0.4
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.6
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Dan Pickett
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
12
|
+
date: 2013-01-09 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: cucumber
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: fakeweb
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: mocha
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rake
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: rspec
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: shoulda
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
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: '0'
|
110
|
+
description: Access the Amazon API to order gift codes
|
23
111
|
email: dpickett@enlightsolutions.com
|
24
112
|
executables: []
|
25
|
-
|
26
113
|
extensions: []
|
27
|
-
|
28
|
-
|
29
|
-
- LICENSE
|
30
|
-
- README.rdoc
|
31
|
-
files:
|
32
|
-
- .document
|
114
|
+
extra_rdoc_files: []
|
115
|
+
files:
|
33
116
|
- .gitignore
|
117
|
+
- Gemfile
|
34
118
|
- LICENSE
|
35
119
|
- README.rdoc
|
36
120
|
- Rakefile
|
37
|
-
- VERSION
|
38
121
|
- agcod.gemspec
|
39
122
|
- cucumber.yml
|
40
123
|
- features/error_handling.feature
|
@@ -53,50 +136,63 @@ files:
|
|
53
136
|
- lib/agcod/request.rb
|
54
137
|
- lib/agcod/tasks.rb
|
55
138
|
- lib/agcod/tasks/certification.rake
|
139
|
+
- lib/agcod/version.rb
|
56
140
|
- lib/agcod/void_gift_card_creation.rb
|
57
141
|
- manual_features/cancel_claimed_giftcard.feature
|
58
142
|
- manual_features/insufficient_funds.feature
|
59
143
|
- manual_features/retry_and_http.feature
|
60
144
|
- tasks/agcod.rake
|
61
145
|
- test/agcod/configuration_test.rb
|
146
|
+
- test/agcod/request_test.rb
|
62
147
|
- test/app_root/config/agcod.yml
|
148
|
+
- test/fixtures/create_gift_card/non-error-failure.xml
|
149
|
+
- test/fixtures/create_gift_card/retry.xml
|
150
|
+
- test/fixtures/create_gift_card/success.xml
|
151
|
+
- test/fixtures/health_check/success.xml
|
63
152
|
- test/macros/configuration.rb
|
64
153
|
- test/test_helper.rb
|
65
|
-
has_rdoc: true
|
66
154
|
homepage: http://github.com/dpickett/agcod
|
67
155
|
licenses: []
|
68
|
-
|
69
156
|
post_install_message:
|
70
|
-
rdoc_options:
|
71
|
-
|
72
|
-
require_paths:
|
157
|
+
rdoc_options: []
|
158
|
+
require_paths:
|
73
159
|
- lib
|
74
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
160
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
75
161
|
none: false
|
76
|
-
requirements:
|
77
|
-
- -
|
78
|
-
- !ruby/object:Gem::Version
|
79
|
-
|
80
|
-
segments:
|
162
|
+
requirements:
|
163
|
+
- - ! '>='
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
segments:
|
81
167
|
- 0
|
82
|
-
|
83
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
|
+
hash: 2406941575318541167
|
169
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
170
|
none: false
|
85
|
-
requirements:
|
86
|
-
- -
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
|
89
|
-
segments:
|
171
|
+
requirements:
|
172
|
+
- - ! '>='
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: '0'
|
175
|
+
segments:
|
90
176
|
- 0
|
91
|
-
|
177
|
+
hash: 2406941575318541167
|
92
178
|
requirements: []
|
93
|
-
|
94
|
-
|
95
|
-
rubygems_version: 1.3.7
|
179
|
+
rubyforge_project: agcod
|
180
|
+
rubygems_version: 1.8.23
|
96
181
|
signing_key:
|
97
182
|
specification_version: 3
|
98
|
-
summary: A Wrapper for Amazon Gift
|
99
|
-
test_files:
|
183
|
+
summary: A Wrapper for Amazon Gift Codes On Demand
|
184
|
+
test_files:
|
185
|
+
- features/error_handling.feature
|
186
|
+
- features/step_definitions/agcod_steps.rb
|
187
|
+
- features/success_certification.feature
|
188
|
+
- features/support/app_root/config/agcod.example.yml
|
189
|
+
- features/support/env.rb
|
100
190
|
- test/agcod/configuration_test.rb
|
191
|
+
- test/agcod/request_test.rb
|
192
|
+
- test/app_root/config/agcod.yml
|
193
|
+
- test/fixtures/create_gift_card/non-error-failure.xml
|
194
|
+
- test/fixtures/create_gift_card/retry.xml
|
195
|
+
- test/fixtures/create_gift_card/success.xml
|
196
|
+
- test/fixtures/health_check/success.xml
|
101
197
|
- test/macros/configuration.rb
|
102
198
|
- test/test_helper.rb
|
data/.document
DELETED
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.0.4
|