vizjerai-google-checkout 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +2 -0
- data/Gemfile +4 -0
- data/Rakefile +2 -37
- data/lib/duck_punches/{hpricot.rb → nokogiri.rb} +0 -0
- data/lib/google-checkout.rb +3 -6
- data/lib/google-checkout/cart.rb +4 -3
- data/lib/google-checkout/command.rb +4 -8
- data/lib/google-checkout/merchant_calculation.rb +5 -3
- data/lib/google-checkout/notification.rb +43 -38
- data/lib/google-checkout/version.rb +5 -0
- data/spec/google-checkout/cart_spec.rb +2 -2
- data/spec/google-checkout/command_spec.rb +50 -13
- data/spec/google-checkout/geography/postal_spec.rb +2 -2
- data/spec/google-checkout/geography/us_country_spec.rb +2 -2
- data/spec/google-checkout/geography/us_state_spec.rb +2 -2
- data/spec/google-checkout/geography/us_zip_spec.rb +2 -2
- data/spec/google-checkout/geography/world_spec.rb +2 -2
- data/spec/google-checkout/merchant_calculation_spec.rb +2 -2
- data/spec/google-checkout/notification_spec.rb +21 -17
- data/spec/google-checkout/response_spec.rb +1 -1
- data/spec/google-checkout/shipping/flat_rate_spec.rb +2 -2
- data/spec/google-checkout/shipping/merchant_calculated_spec.rb +2 -2
- data/spec/google-checkout/shipping/pickup_spec.rb +2 -2
- data/spec/google-checkout_spec.rb +1 -1
- data/spec/spec_helper.rb +20 -42
- data/spec/support/shared_example_groups/basic_command.rb +5 -0
- data/spec/support/shared_example_groups/basic_notification.rb +15 -0
- data/vizjerai-google-checkout.gemspec +26 -0
- metadata +94 -21
- data/VERSION +0 -1
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
CHANGED
@@ -1,37 +1,2 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
require 'spec/rake/spectask'
|
4
|
-
|
5
|
-
desc 'Run the specs'
|
6
|
-
Spec::Rake::SpecTask.new(:spec) do |t|
|
7
|
-
t.spec_opts = ['--colour --format progress --loadby mtime --reverse']
|
8
|
-
t.spec_files = FileList['spec/**/*_spec.rb']
|
9
|
-
end
|
10
|
-
|
11
|
-
Rake::RDocTask.new do |t|
|
12
|
-
t.rdoc_dir = 'doc'
|
13
|
-
t.rdoc_files.include('README')
|
14
|
-
t.rdoc_files.include('lib/**/*.rb')
|
15
|
-
t.options << '--inline-source'
|
16
|
-
t.options << '--all'
|
17
|
-
t.options << '--line-numbers'
|
18
|
-
end
|
19
|
-
|
20
|
-
begin
|
21
|
-
require 'jeweler'
|
22
|
-
Jeweler::Tasks.new do |s|
|
23
|
-
s.name = "vizjerai-google-checkout"
|
24
|
-
s.summary = "An experimental library for sending payment requests to Google Checkout."
|
25
|
-
s.email = "assarata@gmail.com"
|
26
|
-
s.homepage = "http://github.com/vizjerai/google-checkout/"
|
27
|
-
s.description = "An experimental library for sending payment requests to Google Checkout."
|
28
|
-
s.authors = ["Peter Elmore", "Geoffrey Grosenbach", "Matt Lins", "Steel Fu", "Andrew Assarattanakul"]
|
29
|
-
s.files = FileList["[A-Z]*", "{lib,spec,support,examples}/**/*"]
|
30
|
-
s.add_dependency(%q<activesupport>, [">= 2.3.0"])
|
31
|
-
s.add_dependency(%q<money>, [">= 2.3.0"])
|
32
|
-
s.add_dependency(%q<nokogiri>, [">=0"])
|
33
|
-
s.add_development_dependency(%q<rspec>, ["~> 1.3.0"])
|
34
|
-
end
|
35
|
-
rescue LoadError
|
36
|
-
puts "Jeweler not available. Install it with: sudo gem install jeweler"
|
37
|
-
end
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require "bundler/gem_tasks"
|
File without changes
|
data/lib/google-checkout.rb
CHANGED
@@ -7,7 +7,8 @@
|
|
7
7
|
$: << File.dirname(__FILE__)
|
8
8
|
$: << File.dirname(__FILE__) + "/vendor/ruby-hmac/lib"
|
9
9
|
|
10
|
-
require '
|
10
|
+
require 'google-checkout/version'
|
11
|
+
|
11
12
|
require 'active_support'
|
12
13
|
|
13
14
|
require 'openssl'
|
@@ -17,7 +18,7 @@ require 'nokogiri'
|
|
17
18
|
require 'money'
|
18
19
|
require 'net/https'
|
19
20
|
|
20
|
-
require 'duck_punches/
|
21
|
+
require 'duck_punches/nokogiri'
|
21
22
|
require 'duck_punches/inflector'
|
22
23
|
require 'google-checkout/notification'
|
23
24
|
require 'google-checkout/merchant_calculation'
|
@@ -35,8 +36,6 @@ require 'google-checkout/geography'
|
|
35
36
|
|
36
37
|
module GoogleCheckout
|
37
38
|
|
38
|
-
#VERSION = '0.2.0'
|
39
|
-
|
40
39
|
@@live_system = true
|
41
40
|
|
42
41
|
##
|
@@ -61,6 +60,4 @@ module GoogleCheckout
|
|
61
60
|
@@live_system
|
62
61
|
end
|
63
62
|
|
64
|
-
class APIError < Exception; end
|
65
|
-
|
66
63
|
end
|
data/lib/google-checkout/cart.rb
CHANGED
@@ -268,7 +268,7 @@ module GoogleCheckout
|
|
268
268
|
}
|
269
269
|
}
|
270
270
|
}
|
271
|
-
unless @merchant_private_data.
|
271
|
+
unless @merchant_private_data.nil? || @merchant_private_data.empty?
|
272
272
|
xml.tag!("merchant-private-data") {
|
273
273
|
xml << @merchant_private_data
|
274
274
|
}
|
@@ -290,7 +290,8 @@ module GoogleCheckout
|
|
290
290
|
xml.tag!('parameterized-urls') {
|
291
291
|
@parameterized_urls.each do |param_url|
|
292
292
|
xml.tag!('parameterized-url', :url => param_url[:url]) {
|
293
|
-
next if param_url[:parameters].
|
293
|
+
next if param_url[:parameters].nil?
|
294
|
+
next if param_url[:parameters].empty?
|
294
295
|
xml.tag!('parameters') {
|
295
296
|
param_url[:parameters].each do |parameter|
|
296
297
|
xml.tag!('url-parameter', :name => parameter[:name], :type => parameter[:type]) {}
|
@@ -298,7 +299,7 @@ module GoogleCheckout
|
|
298
299
|
}
|
299
300
|
}
|
300
301
|
end
|
301
|
-
} unless @parameterized_urls.
|
302
|
+
} unless @parameterized_urls.nil? || @parameterized_urls.empty?
|
302
303
|
|
303
304
|
xml.tag!('shipping-methods') {
|
304
305
|
@shipping_methods.each do |shipping_method|
|
@@ -59,15 +59,11 @@ module GoogleCheckout
|
|
59
59
|
# is from the server.
|
60
60
|
case response
|
61
61
|
when Net::HTTPSuccess, Net::HTTPClientError
|
62
|
-
|
63
|
-
if notification.error? && !notification.message.eql?('You cannot charge an order that is already completely charged')
|
64
|
-
raise APIError, "#{notification.message} [in #{GoogleCheckout.production? ? 'production' : 'sandbox' }]"
|
65
|
-
end
|
66
|
-
return notification
|
62
|
+
Notification.parse(response.body)
|
67
63
|
when Net::HTTPRedirection, Net::HTTPServerError, Net::HTTPInformation
|
68
|
-
|
64
|
+
Error.new(nil, :message => "Unexpected response code (#{response.class}): #{response.code} - #{response.message}")
|
69
65
|
else
|
70
|
-
|
66
|
+
Error.new(nil, :message => "Unknown response code: #{response.code} - #{response.message}")
|
71
67
|
end
|
72
68
|
end
|
73
69
|
|
@@ -222,7 +218,7 @@ module GoogleCheckout
|
|
222
218
|
}) do
|
223
219
|
xml.tag!("amount", @amount, {:currency => @currency})
|
224
220
|
xml.tag!("reason", @reason)
|
225
|
-
xml.tag!("comment", @comment) unless @comment.
|
221
|
+
xml.tag!("comment", @comment) unless @comment.nil? || @comment.empty?
|
226
222
|
end
|
227
223
|
@xml
|
228
224
|
end
|
@@ -1,7 +1,9 @@
|
|
1
1
|
module GoogleCheckout
|
2
2
|
class MerchantCalculation
|
3
3
|
|
4
|
-
|
4
|
+
def doc
|
5
|
+
@doc ||= Nokogiri::XML::Builder.new
|
6
|
+
end
|
5
7
|
|
6
8
|
def self.parse(raw_xml)
|
7
9
|
doc = Nokogiri::XML(raw_xml)
|
@@ -13,12 +15,12 @@ module GoogleCheckout
|
|
13
15
|
end
|
14
16
|
|
15
17
|
def address_id
|
16
|
-
(
|
18
|
+
(doc/"anonymous-address").attr('id').value
|
17
19
|
end
|
18
20
|
|
19
21
|
def method_missing(method_name, *args)
|
20
22
|
element_name = method_name.to_s.gsub(/_/, '-')
|
21
|
-
if element = (
|
23
|
+
if element = (doc.at element_name)
|
22
24
|
if element.respond_to?(:inner_html)
|
23
25
|
return element.inner_html
|
24
26
|
end
|
@@ -20,7 +20,9 @@ module GoogleCheckout
|
|
20
20
|
class Notification
|
21
21
|
|
22
22
|
# The Nokogiri XML document received from Google.
|
23
|
-
|
23
|
+
def doc
|
24
|
+
@doc ||= Nokogiri::XML::Builder.new
|
25
|
+
end
|
24
26
|
|
25
27
|
##
|
26
28
|
# The entry point for notifications.
|
@@ -78,10 +80,10 @@ module GoogleCheckout
|
|
78
80
|
# Please see the Order States section for more information about these states.
|
79
81
|
|
80
82
|
def state
|
81
|
-
if (
|
82
|
-
return (
|
83
|
-
elsif (
|
84
|
-
return (
|
83
|
+
if (doc.at 'financial-order-state')
|
84
|
+
return (doc/'financial-order-state').inner_html
|
85
|
+
elsif (doc.at 'new-financial-order-state')
|
86
|
+
return (doc/'new-financial-order-state').inner_html
|
85
87
|
end
|
86
88
|
end
|
87
89
|
|
@@ -129,7 +131,7 @@ module GoogleCheckout
|
|
129
131
|
|
130
132
|
def method_missing(method_name, *args)
|
131
133
|
element_name = method_name.to_s.gsub(/_/, '-')
|
132
|
-
if element = (
|
134
|
+
if element = (doc.at element_name)
|
133
135
|
if element.respond_to?(:inner_html)
|
134
136
|
return element.inner_html
|
135
137
|
end
|
@@ -144,11 +146,11 @@ module GoogleCheckout
|
|
144
146
|
class ChargeAmountNotification < Notification
|
145
147
|
|
146
148
|
def latest_charge_amount
|
147
|
-
(
|
149
|
+
(doc/"latest-charge-amount").to_money
|
148
150
|
end
|
149
151
|
|
150
152
|
def total_charge_amount
|
151
|
-
(
|
153
|
+
(doc/"total-charge-amount").to_money
|
152
154
|
end
|
153
155
|
|
154
156
|
end
|
@@ -156,11 +158,11 @@ module GoogleCheckout
|
|
156
158
|
class ChargebackAmountNotification < Notification
|
157
159
|
|
158
160
|
def latest_chargeback_amount
|
159
|
-
(
|
161
|
+
(doc/"latest-chargeback-amount").to_money
|
160
162
|
end
|
161
163
|
|
162
164
|
def total_chargeback_amount
|
163
|
-
(
|
165
|
+
(doc/"total-chargeback-amount").to_money
|
164
166
|
end
|
165
167
|
|
166
168
|
end
|
@@ -171,161 +173,161 @@ module GoogleCheckout
|
|
171
173
|
# Returns a Money object representing the total price of the order.
|
172
174
|
|
173
175
|
def order_total
|
174
|
-
(
|
176
|
+
(doc/"order-total").to_money
|
175
177
|
end
|
176
178
|
|
177
179
|
##
|
178
180
|
# Returns a Money object representing the total tax added.
|
179
181
|
|
180
182
|
def total_tax
|
181
|
-
(
|
183
|
+
(doc/"total-tax").to_money
|
182
184
|
end
|
183
185
|
|
184
186
|
##
|
185
187
|
# Returns true if the buyer wants to received marketing emails.
|
186
188
|
|
187
189
|
def email_allowed
|
188
|
-
(
|
190
|
+
(doc/"buyer-marketing-preferences"/"email-allowed").to_boolean
|
189
191
|
end
|
190
192
|
|
191
193
|
##
|
192
194
|
# Returns billing name.
|
193
195
|
|
194
196
|
def billing_name
|
195
|
-
(
|
197
|
+
(doc/"buyer-billing-address"/"contact-name").inner_html
|
196
198
|
end
|
197
199
|
|
198
200
|
##
|
199
201
|
# Returns billing email
|
200
202
|
|
201
203
|
def billing_email
|
202
|
-
(
|
204
|
+
(doc/"buyer-billing-address"/"email").inner_html
|
203
205
|
end
|
204
206
|
|
205
207
|
##
|
206
208
|
# Returns billing address1
|
207
209
|
|
208
210
|
def billing_address1
|
209
|
-
(
|
211
|
+
(doc/"buyer-billing-address"/"address1").inner_html
|
210
212
|
end
|
211
213
|
|
212
214
|
##
|
213
215
|
# Returns billing city
|
214
216
|
|
215
217
|
def billing_city
|
216
|
-
(
|
218
|
+
(doc/"buyer-billing-address"/"city").inner_html
|
217
219
|
end
|
218
220
|
|
219
221
|
##
|
220
222
|
# Returns billing region
|
221
223
|
|
222
224
|
def billing_region
|
223
|
-
(
|
225
|
+
(doc/"buyer-billing-address"/"region").inner_html
|
224
226
|
end
|
225
227
|
|
226
228
|
##
|
227
229
|
# Returns billing postal code
|
228
230
|
|
229
231
|
def billing_postal_code
|
230
|
-
(
|
232
|
+
(doc/"buyer-billing-address"/"postal-code").inner_html
|
231
233
|
end
|
232
234
|
|
233
235
|
##
|
234
236
|
# Returns billing country code
|
235
237
|
|
236
238
|
def billing_country_code
|
237
|
-
(
|
239
|
+
(doc/"buyer-billing-address"/"country-code").inner_html
|
238
240
|
end
|
239
241
|
|
240
242
|
##
|
241
243
|
# Returns billing phone
|
242
244
|
|
243
245
|
def billing_phone
|
244
|
-
(
|
246
|
+
(doc/"buyer-billing-address"/"phone").inner_html
|
245
247
|
end
|
246
248
|
|
247
249
|
##
|
248
250
|
# Returns billing first name
|
249
251
|
|
250
252
|
def billing_first_name
|
251
|
-
(
|
253
|
+
(doc/"buyer-billing-address"/"structured-name"/"first-name").inner_html
|
252
254
|
end
|
253
255
|
|
254
256
|
##
|
255
257
|
# Returns billing last name
|
256
258
|
|
257
259
|
def billing_last_name
|
258
|
-
(
|
260
|
+
(doc/"buyer-billing-address"/"structured-name"/"last-name").inner_html
|
259
261
|
end
|
260
262
|
|
261
263
|
##
|
262
264
|
# Returns shipping contact name
|
263
265
|
|
264
266
|
def shipping_name
|
265
|
-
(
|
267
|
+
(doc/"buyer-shipping-address"/"contact-name").inner_html
|
266
268
|
end
|
267
269
|
|
268
270
|
##
|
269
271
|
# Returns shipping email
|
270
272
|
|
271
273
|
def shipping_email
|
272
|
-
(
|
274
|
+
(doc/"buyer-shipping-address"/"email").inner_html
|
273
275
|
end
|
274
276
|
|
275
277
|
##
|
276
278
|
# Returns shipping address1
|
277
279
|
|
278
280
|
def shipping_address1
|
279
|
-
(
|
281
|
+
(doc/"buyer-shipping-address"/"address1").inner_html
|
280
282
|
end
|
281
283
|
|
282
284
|
##
|
283
285
|
# Returns shipping city
|
284
286
|
|
285
287
|
def shipping_city
|
286
|
-
(
|
288
|
+
(doc/"buyer-shipping-address"/"city").inner_html
|
287
289
|
end
|
288
290
|
|
289
291
|
##
|
290
292
|
# Returns shipping region
|
291
293
|
|
292
294
|
def shipping_region
|
293
|
-
(
|
295
|
+
(doc/"buyer-shipping-address"/"region").inner_html
|
294
296
|
end
|
295
297
|
|
296
298
|
##
|
297
299
|
# Returns shipping postal code
|
298
300
|
|
299
301
|
def shipping_postal_code
|
300
|
-
(
|
302
|
+
(doc/"buyer-shipping-address"/"postal-code").inner_html
|
301
303
|
end
|
302
304
|
|
303
305
|
##
|
304
306
|
# Returns shipping country code
|
305
307
|
|
306
308
|
def shipping_country_code
|
307
|
-
(
|
309
|
+
(doc/"buyer-shipping-address"/"country-code").inner_html
|
308
310
|
end
|
309
311
|
|
310
312
|
##
|
311
313
|
# Returns shipping phone
|
312
314
|
|
313
315
|
def shipping_phone
|
314
|
-
(
|
316
|
+
(doc/"buyer-shipping-address"/"phone").inner_html
|
315
317
|
end
|
316
318
|
|
317
319
|
##
|
318
320
|
# Returns shipping first name
|
319
321
|
|
320
322
|
def shipping_first_name
|
321
|
-
(
|
323
|
+
(doc/"buyer-shipping-address"/"structured-name"/"first-name").inner_html
|
322
324
|
end
|
323
325
|
|
324
326
|
##
|
325
327
|
# Returns shipping last name
|
326
328
|
|
327
329
|
def shipping_last_name
|
328
|
-
(
|
330
|
+
(doc/"buyer-shipping-address"/"structured-name"/"last-name").inner_html
|
329
331
|
end
|
330
332
|
|
331
333
|
end
|
@@ -344,19 +346,22 @@ module GoogleCheckout
|
|
344
346
|
# Returns redirect-url with ampersands escaped, as specified by Google API docs.
|
345
347
|
|
346
348
|
def redirect_url
|
347
|
-
(
|
349
|
+
(doc/"redirect-url").inner_html.gsub(/&/, '&')
|
348
350
|
end
|
349
351
|
|
350
352
|
end
|
351
353
|
|
352
354
|
class Error < Notification
|
353
355
|
|
354
|
-
|
355
|
-
|
356
|
+
def initialize(doc, options={})
|
357
|
+
@error_message = options[:message]
|
358
|
+
super(doc)
|
359
|
+
end
|
356
360
|
|
357
|
-
def
|
358
|
-
(
|
361
|
+
def error_message
|
362
|
+
@error_message || (doc/'error-message').inner_html
|
359
363
|
end
|
364
|
+
alias :message :error_message
|
360
365
|
|
361
366
|
end
|
362
367
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe GoogleCheckout, "Cart (generic)" do
|
4
4
|
|
@@ -56,7 +56,7 @@ describe GoogleCheckout, "Cart Post" do
|
|
56
56
|
|
57
57
|
it "should post request to Google" do
|
58
58
|
# :null_object means eat all other methods and return self
|
59
|
-
net_http =
|
59
|
+
net_http = double("net_http").as_null_object
|
60
60
|
Net::HTTP.should_receive(:new).and_return(net_http)
|
61
61
|
|
62
62
|
success_response = Net::HTTPSuccess.new(Net::HTTP.version_1_2, 200, "OK")
|
@@ -1,12 +1,4 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
describe "basic command", :shared => true do
|
4
|
-
|
5
|
-
it "should include XML header" do
|
6
|
-
@order.to_xml.should match(/^<\?xml version=\"1\.0\" encoding=\"UTF-8\"\?>/)
|
7
|
-
end
|
8
|
-
|
9
|
-
end
|
1
|
+
require "spec_helper"
|
10
2
|
|
11
3
|
describe GoogleCheckout, "Command class" do
|
12
4
|
|
@@ -63,7 +55,7 @@ describe GoogleCheckout, "Charge Order" do
|
|
63
55
|
|
64
56
|
it "should post request to Google successfully" do
|
65
57
|
# :null_object means eat all other methods and return self
|
66
|
-
net_http =
|
58
|
+
net_http = double("net_http").as_null_object
|
67
59
|
Net::HTTP.should_receive(:new).and_return(net_http)
|
68
60
|
|
69
61
|
success_response = Net::HTTPSuccess.new(Net::HTTP.version_1_2, 200, "OK")
|
@@ -78,7 +70,7 @@ describe GoogleCheckout, "Charge Order" do
|
|
78
70
|
|
79
71
|
it "should post request to Google and return error" do
|
80
72
|
# :null_object means eat all other methods and return self
|
81
|
-
net_http =
|
73
|
+
net_http = double("net_http").as_null_object
|
82
74
|
Net::HTTP.should_receive(:new).and_return(net_http)
|
83
75
|
|
84
76
|
# NOTE HTTP response code is irrelevant here.
|
@@ -86,11 +78,16 @@ describe GoogleCheckout, "Charge Order" do
|
|
86
78
|
error_response.should_receive(:body).and_return(read_xml_fixture('responses/error'))
|
87
79
|
net_http.should_receive(:request).and_return(error_response)
|
88
80
|
|
89
|
-
|
81
|
+
response = @order.post
|
82
|
+
response.should be_kind_of(GoogleCheckout::Error)
|
83
|
+
response.should be_error
|
84
|
+
response.serial_number.should == 'bea6bc1b-e1e2-44fe-80ff-0180e33a2614'
|
85
|
+
response.error_message.should == 'Bad username and/or password for API Access.'
|
86
|
+
response.message.should == 'Bad username and/or password for API Access.'
|
90
87
|
end
|
91
88
|
|
92
89
|
it "should post request to Google and return error charged already" do
|
93
|
-
net_http =
|
90
|
+
net_http = double("net_http").as_null_object
|
94
91
|
Net::HTTP.should_receive(:new).and_return(net_http)
|
95
92
|
|
96
93
|
# NOTE HTTP response code is irrelevant here.
|
@@ -99,9 +96,49 @@ describe GoogleCheckout, "Charge Order" do
|
|
99
96
|
net_http.should_receive(:request).and_return(error_response)
|
100
97
|
|
101
98
|
response = @order.post
|
99
|
+
response.should be_kind_of(GoogleCheckout::Error)
|
100
|
+
response.should be_error
|
101
|
+
response.serial_number.should == 'bea6bc1b-e1e2-44fe-80ff-0180e33a2614'
|
102
|
+
response.error_message.should == 'You cannot charge an order that is already completely charged'
|
102
103
|
response.message.should == 'You cannot charge an order that is already completely charged'
|
103
104
|
end
|
104
105
|
|
106
|
+
context 'with Net::HTTPRedirection response' do
|
107
|
+
before do
|
108
|
+
net_http = double('net_http').as_null_object
|
109
|
+
Net::HTTP.should_receive(:new).and_return(net_http)
|
110
|
+
|
111
|
+
response = Net::HTTPRedirection.new(Net::HTTP.version_1_2, 301, "Redirect")
|
112
|
+
net_http.should_receive(:request).and_return(response)
|
113
|
+
end
|
114
|
+
|
115
|
+
it "return error" do
|
116
|
+
response = @order.post
|
117
|
+
response.should be_kind_of(GoogleCheckout::Error)
|
118
|
+
response.should be_error
|
119
|
+
response.serial_number.should be_nil
|
120
|
+
response.message.should == 'Unexpected response code (Net::HTTPRedirection): 301 - Redirect'
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
context 'with HTTPUnknownResponse response' do
|
125
|
+
before do
|
126
|
+
net_http = double('net_http').as_null_object
|
127
|
+
Net::HTTP.should_receive(:new).and_return(net_http)
|
128
|
+
|
129
|
+
response = Net::HTTPUnknownResponse.new(Net::HTTP.version_1_2, 600, "Unknown Response")
|
130
|
+
net_http.should_receive(:request).and_return(response)
|
131
|
+
end
|
132
|
+
|
133
|
+
it "return error" do
|
134
|
+
response = @order.post
|
135
|
+
response.should be_kind_of(GoogleCheckout::Error)
|
136
|
+
response.should be_error
|
137
|
+
response.serial_number.should be_nil
|
138
|
+
response.message.should == 'Unknown response code: 600 - Unknown Response'
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
105
142
|
end
|
106
143
|
|
107
144
|
describe GoogleCheckout, "Add Tracking Data" do
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe GoogleCheckout::Geography::Postal do
|
4
4
|
before(:each) do
|
@@ -23,4 +23,4 @@ describe GoogleCheckout::Geography::Postal do
|
|
23
23
|
@area.to_xml.should match(%r{<postal-code-pattern>53\*</postal-code-pattern>})
|
24
24
|
end
|
25
25
|
|
26
|
-
end
|
26
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe GoogleCheckout::Geography::UsCountry do
|
4
4
|
before(:each) do
|
@@ -23,4 +23,4 @@ describe GoogleCheckout::Geography::UsCountry do
|
|
23
23
|
lambda {GoogleCheckout::Geography::UsCountry.new(:my_house).to_xml}.should raise_error(ArgumentError)
|
24
24
|
end
|
25
25
|
|
26
|
-
end
|
26
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe GoogleCheckout::Geography::UsState do
|
4
4
|
before(:each) do
|
@@ -8,4 +8,4 @@ describe GoogleCheckout::Geography::UsState do
|
|
8
8
|
it 'should include the state' do
|
9
9
|
@area.to_xml.should match(%r{<us-state-area><state>WI</state></us-state-area>})
|
10
10
|
end
|
11
|
-
end
|
11
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe GoogleCheckout::Geography::UsZip do
|
4
4
|
before(:each) do
|
@@ -8,4 +8,4 @@ describe GoogleCheckout::Geography::UsZip do
|
|
8
8
|
it 'should generate the us zip area tag' do
|
9
9
|
@area.to_xml.should match(%r{<us-zip-area>.*</us-zip-area>})
|
10
10
|
end
|
11
|
-
end
|
11
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe GoogleCheckout::Geography::World do
|
4
4
|
before(:each) do
|
@@ -9,4 +9,4 @@ describe GoogleCheckout::Geography::World do
|
|
9
9
|
@area.to_xml.should eql("<world-area/>")
|
10
10
|
end
|
11
11
|
|
12
|
-
end
|
12
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe GoogleCheckout, "Merchant Calculation" do
|
4
4
|
|
@@ -14,4 +14,4 @@ describe GoogleCheckout, "Merchant Calculation" do
|
|
14
14
|
@calculation.address_id.should == "739030698069958"
|
15
15
|
end
|
16
16
|
|
17
|
-
end
|
17
|
+
end
|
@@ -1,20 +1,4 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
describe "basic notification", :shared => true do
|
4
|
-
|
5
|
-
it "should get serial number" do
|
6
|
-
@notification.serial_number.should == 'bea6bc1b-e1e2-44fe-80ff-0180e33a2614'
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should get google order number" do
|
10
|
-
@notification.google_order_number.should == '841171949013218'
|
11
|
-
end
|
12
|
-
|
13
|
-
it "should generate acknowledgment XML" do
|
14
|
-
@notification.acknowledgment_xml.should match(/notification-acknowledgment/)
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
1
|
+
require "spec_helper"
|
18
2
|
|
19
3
|
describe GoogleCheckout, "New Order Notification" do
|
20
4
|
|
@@ -270,3 +254,23 @@ describe GoogleCheckout, "Cancelled Order Notification" do
|
|
270
254
|
end
|
271
255
|
|
272
256
|
end
|
257
|
+
|
258
|
+
describe GoogleCheckout, "Error Notification" do
|
259
|
+
let(:notification) { GoogleCheckout::Notification.parse(read_xml_fixture('responses/error')) }
|
260
|
+
before do
|
261
|
+
@notification = notification
|
262
|
+
end
|
263
|
+
|
264
|
+
it "should identify type of notication" do
|
265
|
+
notification.should be_kind_of GoogleCheckout::Error
|
266
|
+
end
|
267
|
+
|
268
|
+
it "should have error message" do
|
269
|
+
notification.error_message.should == 'Bad username and/or password for API Access.'
|
270
|
+
end
|
271
|
+
|
272
|
+
it "should have message" do
|
273
|
+
notification.message.should == 'Bad username and/or password for API Access.'
|
274
|
+
end
|
275
|
+
|
276
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe GoogleCheckout::Shipping::FlatRate do
|
4
4
|
before(:each) do
|
@@ -43,4 +43,4 @@ describe GoogleCheckout::Shipping::FlatRate do
|
|
43
43
|
@shipping.to_xml.should match(%r{<allow-us-po-box>false</allow-us-po-box>})
|
44
44
|
end
|
45
45
|
|
46
|
-
end
|
46
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe GoogleCheckout::Shipping::FlatRate do
|
4
4
|
before(:each) do
|
@@ -67,4 +67,4 @@ describe GoogleCheckout::Shipping::FlatRate do
|
|
67
67
|
@shipping.to_xml.should match(%r{<address-filters>.*<allow-us-po-box>false</allow-us-po-box>.*</address-filters>})
|
68
68
|
end
|
69
69
|
|
70
|
-
end
|
70
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe GoogleCheckout::Shipping::Pickup do
|
4
4
|
before(:each) do
|
@@ -19,4 +19,4 @@ describe GoogleCheckout::Shipping::Pickup do
|
|
19
19
|
@shipping.to_xml.should match(%r{<price currency="CAD">})
|
20
20
|
end
|
21
21
|
|
22
|
-
end
|
22
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,47 +1,25 @@
|
|
1
|
-
require '
|
2
|
-
require 'spec'
|
3
|
-
require File.dirname(__FILE__) + "/../lib/google-checkout"
|
1
|
+
require File.expand_path('../../lib/google-checkout', __FILE__)
|
4
2
|
|
5
|
-
|
6
|
-
File.read(File.dirname(__FILE__) + "/fixtures/google/#{filename}.xml")
|
7
|
-
end
|
3
|
+
Dir[File.expand_path('../support/**/*.rb', __FILE__)].each {|f| require f}
|
8
4
|
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
# "expected to return true but got false"
|
5
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
6
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
7
|
+
# Require this file using `require "spec_helper"` to ensure that it is only
|
8
|
+
# loaded once.
|
14
9
|
#
|
15
|
-
#
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
def failure_message
|
31
|
-
"expected #{@expected} but got #{@target.class}"
|
10
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
11
|
+
RSpec.configure do |config|
|
12
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
13
|
+
config.run_all_when_everything_filtered = true
|
14
|
+
config.filter_run :focus
|
15
|
+
|
16
|
+
# Run specs in random order to surface order dependencies. If you find an
|
17
|
+
# order dependency and want to debug it, you can fix the order by providing
|
18
|
+
# the seed, which is printed after each run.
|
19
|
+
# --seed 1234
|
20
|
+
config.order = 'random'
|
21
|
+
|
22
|
+
def read_xml_fixture(filename)
|
23
|
+
File.read(File.dirname(__FILE__) + "/fixtures/google/#{filename}.xml")
|
32
24
|
end
|
33
|
-
|
34
|
-
def negative_failure_message
|
35
|
-
"expected #{@expected} to not be #{@target.class}"
|
36
|
-
end
|
37
|
-
|
38
|
-
def description
|
39
|
-
"be_kind_of #{@target}"
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
43
|
-
|
44
|
-
def be_kind_of(expected) # + args
|
45
|
-
BeKindOf.new(expected)
|
46
25
|
end
|
47
|
-
|
@@ -0,0 +1,15 @@
|
|
1
|
+
shared_examples_for "basic notification" do
|
2
|
+
|
3
|
+
it "should get serial number" do
|
4
|
+
@notification.serial_number.should == 'bea6bc1b-e1e2-44fe-80ff-0180e33a2614'
|
5
|
+
end
|
6
|
+
|
7
|
+
it "should get google order number" do
|
8
|
+
@notification.google_order_number.should == '841171949013218'
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should generate acknowledgment XML" do
|
12
|
+
@notification.acknowledgment_xml.should match(/notification-acknowledgment/)
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/google-checkout/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Peter Elmore", "Geoffrey Grosenbach", "Matt Lins", "Steel Fu", "Andrew Assarattanakul"]
|
6
|
+
gem.email = ["assarata@gmail.com"]
|
7
|
+
gem.description = %q{An experimental library for sending payment requests to Google Checkout.}
|
8
|
+
gem.summary = %q{Google Checkout}
|
9
|
+
gem.homepage = "https://github.com/vizjerai/google-checkout"
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "vizjerai-google-checkout"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = GoogleCheckout::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency 'activesupport', '>= 2.3.0'
|
19
|
+
gem.add_dependency 'money', '>= 2.3.0'
|
20
|
+
gem.add_dependency 'nokogiri'
|
21
|
+
gem.add_dependency 'builder'
|
22
|
+
|
23
|
+
gem.add_development_dependency 'bundler'
|
24
|
+
gem.add_development_dependency 'rubygems-bundler'
|
25
|
+
gem.add_development_dependency 'rspec'
|
26
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vizjerai-google-checkout
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 19
|
5
|
+
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
- 2
|
9
8
|
- 3
|
10
|
-
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Peter Elmore
|
@@ -19,7 +19,7 @@ autorequire:
|
|
19
19
|
bindir: bin
|
20
20
|
cert_chain: []
|
21
21
|
|
22
|
-
date:
|
22
|
+
date: 2012-07-27 00:00:00 -05:00
|
23
23
|
default_executable:
|
24
24
|
dependencies:
|
25
25
|
- !ruby/object:Gem::Dependency
|
@@ -69,38 +69,80 @@ dependencies:
|
|
69
69
|
type: :runtime
|
70
70
|
version_requirements: *id003
|
71
71
|
- !ruby/object:Gem::Dependency
|
72
|
-
name:
|
72
|
+
name: builder
|
73
73
|
prerelease: false
|
74
74
|
requirement: &id004 !ruby/object:Gem::Requirement
|
75
75
|
none: false
|
76
76
|
requirements:
|
77
|
-
- -
|
77
|
+
- - ">="
|
78
78
|
- !ruby/object:Gem::Version
|
79
|
-
hash:
|
79
|
+
hash: 3
|
80
80
|
segments:
|
81
|
-
- 1
|
82
|
-
- 3
|
83
81
|
- 0
|
84
|
-
version:
|
85
|
-
type: :
|
82
|
+
version: "0"
|
83
|
+
type: :runtime
|
86
84
|
version_requirements: *id004
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: bundler
|
87
|
+
prerelease: false
|
88
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
hash: 3
|
94
|
+
segments:
|
95
|
+
- 0
|
96
|
+
version: "0"
|
97
|
+
type: :development
|
98
|
+
version_requirements: *id005
|
99
|
+
- !ruby/object:Gem::Dependency
|
100
|
+
name: rubygems-bundler
|
101
|
+
prerelease: false
|
102
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
103
|
+
none: false
|
104
|
+
requirements:
|
105
|
+
- - ">="
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
hash: 3
|
108
|
+
segments:
|
109
|
+
- 0
|
110
|
+
version: "0"
|
111
|
+
type: :development
|
112
|
+
version_requirements: *id006
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: rspec
|
115
|
+
prerelease: false
|
116
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
117
|
+
none: false
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
hash: 3
|
122
|
+
segments:
|
123
|
+
- 0
|
124
|
+
version: "0"
|
125
|
+
type: :development
|
126
|
+
version_requirements: *id007
|
87
127
|
description: An experimental library for sending payment requests to Google Checkout.
|
88
|
-
email:
|
128
|
+
email:
|
129
|
+
- assarata@gmail.com
|
89
130
|
executables: []
|
90
131
|
|
91
132
|
extensions: []
|
92
133
|
|
93
|
-
extra_rdoc_files:
|
94
|
-
|
134
|
+
extra_rdoc_files: []
|
135
|
+
|
95
136
|
files:
|
137
|
+
- .gitignore
|
138
|
+
- Gemfile
|
96
139
|
- History.txt
|
97
140
|
- MIT-LICENSE.txt
|
98
141
|
- README.txt
|
99
142
|
- Rakefile
|
100
|
-
- VERSION
|
101
143
|
- examples/google_notifications_controller.rb
|
102
|
-
- lib/duck_punches/hpricot.rb
|
103
144
|
- lib/duck_punches/inflector.rb
|
145
|
+
- lib/duck_punches/nokogiri.rb
|
104
146
|
- lib/google-checkout.rb
|
105
147
|
- lib/google-checkout/cart.rb
|
106
148
|
- lib/google-checkout/command.rb
|
@@ -120,6 +162,7 @@ files:
|
|
120
162
|
- lib/google-checkout/shipping/method.rb
|
121
163
|
- lib/google-checkout/shipping/pickup.rb
|
122
164
|
- lib/google-checkout/shipping/restrictions.rb
|
165
|
+
- lib/google-checkout/version.rb
|
123
166
|
- spec/fixtures/google/checkout-shopping-cart.xml
|
124
167
|
- spec/fixtures/google/commands/add-merchant-order-number.xml
|
125
168
|
- spec/fixtures/google/commands/add-tracking-data.xml
|
@@ -161,9 +204,12 @@ files:
|
|
161
204
|
- spec/google-checkout/shipping/pickup_spec.rb
|
162
205
|
- spec/google-checkout_spec.rb
|
163
206
|
- spec/spec_helper.rb
|
207
|
+
- spec/support/shared_example_groups/basic_command.rb
|
208
|
+
- spec/support/shared_example_groups/basic_notification.rb
|
164
209
|
- support/cacert.pem
|
210
|
+
- vizjerai-google-checkout.gemspec
|
165
211
|
has_rdoc: true
|
166
|
-
homepage:
|
212
|
+
homepage: https://github.com/vizjerai/google-checkout
|
167
213
|
licenses: []
|
168
214
|
|
169
215
|
post_install_message:
|
@@ -192,12 +238,37 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
192
238
|
requirements: []
|
193
239
|
|
194
240
|
rubyforge_project:
|
195
|
-
rubygems_version: 1.
|
241
|
+
rubygems_version: 1.3.7
|
196
242
|
signing_key:
|
197
243
|
specification_version: 3
|
198
|
-
summary:
|
244
|
+
summary: Google Checkout
|
199
245
|
test_files:
|
200
|
-
-
|
246
|
+
- spec/fixtures/google/checkout-shopping-cart.xml
|
247
|
+
- spec/fixtures/google/commands/add-merchant-order-number.xml
|
248
|
+
- spec/fixtures/google/commands/add-tracking-data.xml
|
249
|
+
- spec/fixtures/google/commands/archive-order.xml
|
250
|
+
- spec/fixtures/google/commands/authorize-order.xml
|
251
|
+
- spec/fixtures/google/commands/cancel-order.xml
|
252
|
+
- spec/fixtures/google/commands/charge-order.xml
|
253
|
+
- spec/fixtures/google/commands/deliver-order.xml
|
254
|
+
- spec/fixtures/google/commands/process-order.xml
|
255
|
+
- spec/fixtures/google/commands/refund-order.xml
|
256
|
+
- spec/fixtures/google/commands/send-buyer-message.xml
|
257
|
+
- spec/fixtures/google/commands/unarchive-order.xml
|
258
|
+
- spec/fixtures/google/merchant_calculations/shipping.xml
|
259
|
+
- spec/fixtures/google/notifications/authorization-amount-notification.xml
|
260
|
+
- spec/fixtures/google/notifications/cancelled-subscription-notification.xml
|
261
|
+
- spec/fixtures/google/notifications/charge-amount-notification.xml
|
262
|
+
- spec/fixtures/google/notifications/chargeback-amount-notification.xml
|
263
|
+
- spec/fixtures/google/notifications/new-order-notification.xml
|
264
|
+
- spec/fixtures/google/notifications/order-state-change-notification-missing.xml
|
265
|
+
- spec/fixtures/google/notifications/order-state-change-notification.xml
|
266
|
+
- spec/fixtures/google/notifications/refund-amount-notification.xml
|
267
|
+
- spec/fixtures/google/notifications/risk-information-notification.xml
|
268
|
+
- spec/fixtures/google/responses/checkout-redirect.xml
|
269
|
+
- spec/fixtures/google/responses/error-charged.xml
|
270
|
+
- spec/fixtures/google/responses/error.xml
|
271
|
+
- spec/fixtures/google/responses/request-received.xml
|
201
272
|
- spec/google-checkout/cart_spec.rb
|
202
273
|
- spec/google-checkout/command_spec.rb
|
203
274
|
- spec/google-checkout/geography/postal_spec.rb
|
@@ -213,3 +284,5 @@ test_files:
|
|
213
284
|
- spec/google-checkout/shipping/pickup_spec.rb
|
214
285
|
- spec/google-checkout_spec.rb
|
215
286
|
- spec/spec_helper.rb
|
287
|
+
- spec/support/shared_example_groups/basic_command.rb
|
288
|
+
- spec/support/shared_example_groups/basic_notification.rb
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.2.3
|