mlins-google-checkout 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +14 -0
- data/MIT-LICENSE.txt +23 -0
- data/README.txt +143 -0
- data/Rakefile +34 -0
- data/VERSION.yml +4 -0
- data/examples/google_notifications_controller.rb +159 -0
- data/lib/duck_punches/hpricot.rb +24 -0
- data/lib/google-checkout.rb +65 -0
- data/lib/google-checkout/cart.rb +302 -0
- data/lib/google-checkout/command.rb +191 -0
- data/lib/google-checkout/geography.rb +7 -0
- data/lib/google-checkout/geography/area.rb +11 -0
- data/lib/google-checkout/geography/postal.rb +26 -0
- data/lib/google-checkout/geography/us_country.rb +24 -0
- data/lib/google-checkout/geography/us_state.rb +22 -0
- data/lib/google-checkout/geography/us_zip.rb +22 -0
- data/lib/google-checkout/geography/world.rb +12 -0
- data/lib/google-checkout/merchant_calculation.rb +30 -0
- data/lib/google-checkout/notification.rb +212 -0
- data/lib/google-checkout/shipping.rb +8 -0
- data/lib/google-checkout/shipping/filters.rb +32 -0
- data/lib/google-checkout/shipping/flat_rate.rb +26 -0
- data/lib/google-checkout/shipping/merchant_calculated.rb +29 -0
- data/lib/google-checkout/shipping/method.rb +11 -0
- data/lib/google-checkout/shipping/pickup.rb +22 -0
- data/lib/google-checkout/shipping/restrictions.rb +32 -0
- data/spec/fixtures/google/checkout-shopping-cart.xml +22 -0
- data/spec/fixtures/google/commands/add-merchant-order-number.xml +5 -0
- data/spec/fixtures/google/commands/add-tracking-data.xml +8 -0
- data/spec/fixtures/google/commands/archive-order.xml +3 -0
- data/spec/fixtures/google/commands/authorize-order.xml +2 -0
- data/spec/fixtures/google/commands/cancel-order.xml +5 -0
- data/spec/fixtures/google/commands/charge-order.xml +4 -0
- data/spec/fixtures/google/commands/deliver-order.xml +9 -0
- data/spec/fixtures/google/commands/process-order.xml +2 -0
- data/spec/fixtures/google/commands/refund-order.xml +6 -0
- data/spec/fixtures/google/commands/send-buyer-message.xml +7 -0
- data/spec/fixtures/google/commands/unarchive-order.xml +2 -0
- data/spec/fixtures/google/merchant_calculations/shipping.xml +40 -0
- data/spec/fixtures/google/notifications/authorization-amount-notification.xml +10 -0
- data/spec/fixtures/google/notifications/charge-amount-notification.xml +8 -0
- data/spec/fixtures/google/notifications/chargeback-amount-notification.xml +8 -0
- data/spec/fixtures/google/notifications/new-order-notification.xml +85 -0
- data/spec/fixtures/google/notifications/order-state-change-notification.xml +11 -0
- data/spec/fixtures/google/notifications/refund-amount-notification.xml +8 -0
- data/spec/fixtures/google/notifications/risk-information-notification.xml +23 -0
- data/spec/fixtures/google/responses/checkout-redirect.xml +5 -0
- data/spec/fixtures/google/responses/error.xml +5 -0
- data/spec/fixtures/google/responses/request-received.xml +3 -0
- data/spec/google-checkout/cart_spec.rb +110 -0
- data/spec/google-checkout/command_spec.rb +131 -0
- data/spec/google-checkout/geography/postal_spec.rb +26 -0
- data/spec/google-checkout/geography/us_country_spec.rb +26 -0
- data/spec/google-checkout/geography/us_state_spec.rb +11 -0
- data/spec/google-checkout/geography/us_zip_spec.rb +11 -0
- data/spec/google-checkout/geography/world_spec.rb +12 -0
- data/spec/google-checkout/merchant_calculation_spec.rb +17 -0
- data/spec/google-checkout/notification_spec.rb +175 -0
- data/spec/google-checkout/response_spec.rb +49 -0
- data/spec/google-checkout/shipping/flat_rate_spec.rb +46 -0
- data/spec/google-checkout/shipping/merchant_calculated_spec.rb +70 -0
- data/spec/google-checkout/shipping/pickup_spec.rb +22 -0
- data/spec/google-checkout_spec.rb +15 -0
- data/spec/spec_helper.rb +47 -0
- data/support/cacert.pem +7815 -0
- metadata +140 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
module GoogleCheckout
|
2
|
+
module Shipping
|
3
|
+
class MerchantCalculated < Method
|
4
|
+
|
5
|
+
include Restrictions
|
6
|
+
include Filters
|
7
|
+
|
8
|
+
attr_accessor :name, :price, :currency
|
9
|
+
|
10
|
+
def initialize(name, price, currency = 'USD')
|
11
|
+
@name = name
|
12
|
+
@price = price
|
13
|
+
@currency = currency
|
14
|
+
@shipping_restrictions = {:allowed => [], :excluded => [], :allow_us_po_box => true}
|
15
|
+
@address_filters = {:allowed => [], :excluded => [], :allow_us_po_box => true}
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_xml
|
19
|
+
xml = Builder::XmlMarkup.new
|
20
|
+
xml.tag!('merchant-calculated-shipping', :name => name) do
|
21
|
+
xml.tag!('price', price, :currency => currency)
|
22
|
+
xml << shipping_restrictions_xml if shipping_restrictions?
|
23
|
+
xml << address_filters_xml if address_filters?
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module GoogleCheckout
|
2
|
+
module Shipping
|
3
|
+
class Pickup < Method
|
4
|
+
|
5
|
+
attr_accessor :name, :price, :currency
|
6
|
+
|
7
|
+
def initialize(name, price = '0.00', currency = 'USD')
|
8
|
+
@name = name
|
9
|
+
@price = price
|
10
|
+
@currency = currency
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_xml
|
14
|
+
xml = Builder::XmlMarkup.new
|
15
|
+
xml.tag!('pickup', :name => name) do
|
16
|
+
xml.tag!('price', price, :currency => currency)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module GoogleCheckout
|
2
|
+
module Shipping
|
3
|
+
module Restrictions
|
4
|
+
|
5
|
+
attr_accessor :shipping_restrictions
|
6
|
+
|
7
|
+
def shipping_restrictions?
|
8
|
+
@shipping_restrictions != {:allowed => [], :excluded => [], :allow_us_po_box => true}
|
9
|
+
end
|
10
|
+
|
11
|
+
def shipping_restrictions_xml
|
12
|
+
xml = Builder::XmlMarkup.new
|
13
|
+
xml.tag!('shipping-restrictions') do
|
14
|
+
xml.tag!('allowed-areas') do
|
15
|
+
@shipping_restrictions[:allowed].each do |area|
|
16
|
+
xml << area.to_xml
|
17
|
+
end
|
18
|
+
end unless @shipping_restrictions[:allowed].empty?
|
19
|
+
xml.tag!('excluded-areas') do
|
20
|
+
@shipping_restrictions[:excluded].each do |area|
|
21
|
+
xml << area.to_xml
|
22
|
+
end
|
23
|
+
end unless @shipping_restrictions[:excluded].empty?
|
24
|
+
xml.tag!('allow-us-po-box') do
|
25
|
+
xml.text! 'false'
|
26
|
+
end unless @shipping_restrictions[:allow_us_po_box]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<checkout-shopping-cart xmlns="http://checkout.google.com/schema/2">
|
3
|
+
<shopping-cart>
|
4
|
+
<items>
|
5
|
+
<item>
|
6
|
+
<item-name>HelloWorld 2GB MP3 Player</item-name>
|
7
|
+
<item-description>HelloWorld, the simple MP3 player</item-description>
|
8
|
+
<unit-price currency="USD">159.99</unit-price>
|
9
|
+
<quantity>1</quantity>
|
10
|
+
</item>
|
11
|
+
</items>
|
12
|
+
</shopping-cart>
|
13
|
+
<checkout-flow-support>
|
14
|
+
<merchant-checkout-flow-support>
|
15
|
+
<shipping-methods>
|
16
|
+
<flat-rate-shipping name="SuperShip Ground">
|
17
|
+
<price currency="USD">9.99</price>
|
18
|
+
</flat-rate-shipping>
|
19
|
+
</shipping-methods>
|
20
|
+
</merchant-checkout-flow-support>
|
21
|
+
</checkout-flow-support>
|
22
|
+
</checkout-shopping-cart>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<add-tracking-data xmlns="http://checkout.google.com/schema/2"
|
3
|
+
google-order-number="841171949013218">
|
4
|
+
<tracking-data>
|
5
|
+
<carrier>UPS</carrier>
|
6
|
+
<tracking-number>Z9842W69871281267</tracking-number>
|
7
|
+
</tracking-data>
|
8
|
+
</add-tracking-data>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<deliver-order xmlns="http://checkout.google.com/schema/2"
|
3
|
+
google-order-number="841171949013218">
|
4
|
+
<tracking-data>
|
5
|
+
<carrier>UPS</carrier>
|
6
|
+
<tracking-number>Z5498W45987123684</tracking-number>
|
7
|
+
</tracking-data>
|
8
|
+
<send-email>false</send-email>
|
9
|
+
</deliver-order>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<refund-order xmlns="http://checkout.google.com/schema/2" google-order-number="6014423719">
|
3
|
+
<amount currency="USD">15.00</amount>
|
4
|
+
<comment>Discount for inconvenience; ship replacement item</comment>
|
5
|
+
<reason>Damaged Merchandise</reason>
|
6
|
+
</refund-order>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<send-buyer-message xmlns="http://checkout.google.com/schema/2"
|
3
|
+
google-order-number="841171949013218">
|
4
|
+
<message>Due to high volume, your order will ship
|
5
|
+
next week. Thank you for your patience.</message>
|
6
|
+
<send-email>true</send-email>
|
7
|
+
</send-buyer-message>
|
@@ -0,0 +1,40 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<merchant-calculation-callback xmlns="http://checkout.google.com/schema/2">
|
3
|
+
<shopping-cart>
|
4
|
+
<cart-expiration>
|
5
|
+
<good-until-date>2007-12-31T23:59:59-05:00</good-until-date>
|
6
|
+
</cart-expiration>
|
7
|
+
<items>
|
8
|
+
<item>
|
9
|
+
<merchant-item-id>GGLAA1453</merchant-item-id>
|
10
|
+
<item-name>Dry Food Pack</item-name>
|
11
|
+
<item-description>One pack of nutritious dried food for emergencies.</item-description>
|
12
|
+
<quantity>1</quantity>
|
13
|
+
<unit-price currency="USD">4.99</unit-price>
|
14
|
+
</item>
|
15
|
+
<item>
|
16
|
+
<merchant-item-id>MGS2GBMP3</merchant-item-id>
|
17
|
+
<item-name>Megasound 2GB MP3 Player</item-name>
|
18
|
+
<item-description>This portable MP3 player stores 500 songs.</item-description>
|
19
|
+
<quantity>1</quantity>
|
20
|
+
<unit-price currency="USD">179.99</unit-price>
|
21
|
+
</item>
|
22
|
+
</items>
|
23
|
+
</shopping-cart>
|
24
|
+
|
25
|
+
<buyer-language>en_US</buyer-language>
|
26
|
+
<calculate>
|
27
|
+
<addresses>
|
28
|
+
<anonymous-address id="739030698069958">
|
29
|
+
<country-code>US</country-code>
|
30
|
+
<city>Anchorage</city>
|
31
|
+
<region>AK</region>
|
32
|
+
<postal-code>99501</postal-code>
|
33
|
+
</anonymous-address>
|
34
|
+
</addresses>
|
35
|
+
<shipping>
|
36
|
+
<method name="UPS 2nd Day Air"/>
|
37
|
+
<method name="UPS Ground"/>
|
38
|
+
</shipping>
|
39
|
+
</calculate>
|
40
|
+
</merchant-calculation-callback>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<authorization-amount-notification xmlns="http://checkout.google.com/schema/2"
|
3
|
+
serial-number="bea6bc1b-e1e2-44fe-80ff-0180e33a2614">
|
4
|
+
<google-order-number>841171949013218</google-order-number>
|
5
|
+
<authorization-amount currency="USD">226.06</authorization-amount>
|
6
|
+
<authorization-expiration-date>2006-03-18T20:25:31</authorization-expiration-date>
|
7
|
+
<avs-response>Y</avs-response>
|
8
|
+
<cvn-response>Y</cvn-response>
|
9
|
+
<timestamp>2006-03-18T20:25:31</timestamp>
|
10
|
+
</authorization-amount-notification>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<charge-amount-notification xmlns="http://checkout.google.com/schema/2"
|
3
|
+
serial-number="bea6bc1b-e1e2-44fe-80ff-0180e33a2614">
|
4
|
+
<google-order-number>841171949013218</google-order-number>
|
5
|
+
<latest-charge-amount currency="USD">226.06</latest-charge-amount>
|
6
|
+
<total-charge-amount currency="USD">226.06</total-charge-amount>
|
7
|
+
<timestamp>2006-03-18T18:25:31</timestamp>
|
8
|
+
</charge-amount-notification>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<chargeback-amount-notification xmlns="http://checkout.google.com/schema/2"
|
3
|
+
serial-number="bea6bc1b-e1e2-44fe-80ff-0180e33a2614">
|
4
|
+
<google-order-number>841171949013218</google-order-number>
|
5
|
+
<latest-chargeback-amount currency="USD">226.06</latest-chargeback-amount>
|
6
|
+
<total-chargeback-amount currency="USD">226.06</total-chargeback-amount>
|
7
|
+
<timestamp>2006-03-18T20:25:31</timestamp>
|
8
|
+
</chargeback-amount-notification>
|
@@ -0,0 +1,85 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<new-order-notification xmlns="http://checkout.google.com/schema/2"
|
3
|
+
serial-number="bea6bc1b-e1e2-44fe-80ff-0180e33a2614">
|
4
|
+
<google-order-number>841171949013218</google-order-number>
|
5
|
+
<buyer-shipping-address>
|
6
|
+
|
7
|
+
<contact-name>John Smith</contact-name>
|
8
|
+
<email>johnsmith@example.com</email>
|
9
|
+
<address1>10 Example Road</address1>
|
10
|
+
<city>Sampleville</city>
|
11
|
+
<region>CA</region>
|
12
|
+
<postal-code>94141</postal-code>
|
13
|
+
<country-code>US</country-code>
|
14
|
+
</buyer-shipping-address>
|
15
|
+
<buyer-billing-address>
|
16
|
+
<contact-name>Bill Hu</contact-name>
|
17
|
+
<email>billhu@example.com</email>
|
18
|
+
<address1>99 Credit Lane</address1>
|
19
|
+
<city>Mountain View</city>
|
20
|
+
<region>CA</region>
|
21
|
+
<postal-code>94043</postal-code>
|
22
|
+
<country-code>US</country-code>
|
23
|
+
</buyer-billing-address>
|
24
|
+
<buyer-id>294873009217523</buyer-id>
|
25
|
+
<fulfillment-order-state>NEW</fulfillment-order-state>
|
26
|
+
<financial-order-state>REVIEWING</financial-order-state>
|
27
|
+
|
28
|
+
<shopping-cart>
|
29
|
+
<cart-expiration>
|
30
|
+
<good-until-date>2007-12-31T23:59:59-05:00</good-until-date>
|
31
|
+
</cart-expiration>
|
32
|
+
<items>
|
33
|
+
<item>
|
34
|
+
<merchant-item-id>GGLAA1453</merchant-item-id>
|
35
|
+
<item-name>Dry Food Pack</item-name>
|
36
|
+
<item-description>One pack of nutritious dried food for emergencies.</item-description>
|
37
|
+
<quantity>1</quantity>
|
38
|
+
<tax-table-selector>food</tax-table-selector>
|
39
|
+
<unit-price currency="USD">4.99</unit-price>
|
40
|
+
</item>
|
41
|
+
<item>
|
42
|
+
<merchant-item-id>MGS2GBMP3</merchant-item-id>
|
43
|
+
<item-name>Megasound 2GB MP3 Player</item-name>
|
44
|
+
<item-description>This portable MP3 player stores 500 songs.</item-description>
|
45
|
+
<quantity>1</quantity>
|
46
|
+
<unit-price currency="USD">179.99</unit-price>
|
47
|
+
<merchant-private-item-data>
|
48
|
+
<merchant-product-id>1234567890</merchant-product-id>
|
49
|
+
</merchant-private-item-data>
|
50
|
+
</item>
|
51
|
+
</items>
|
52
|
+
<merchant-private-data>
|
53
|
+
<peepcode-order-number>1234-5678-9012</peepcode-order-number>
|
54
|
+
</merchant-private-data>
|
55
|
+
</shopping-cart>
|
56
|
+
<order-adjustment>
|
57
|
+
<merchant-calculation-successful>true</merchant-calculation-successful>
|
58
|
+
<merchant-codes>
|
59
|
+
<coupon-adjustment>
|
60
|
+
<applied-amount currency="USD">5.00</applied-amount>
|
61
|
+
<code>FirstVisitCoupon</code>
|
62
|
+
<calculated-amount currency="USD">5.00</calculated-amount>
|
63
|
+
<message>You saved $5.00 for your first visit!</message>
|
64
|
+
</coupon-adjustment>
|
65
|
+
<gift-certificate-adjustment>
|
66
|
+
<applied-amount currency="USD">10.00</applied-amount>
|
67
|
+
<code>GiftCert12345</code>
|
68
|
+
<calculated-amount currency="USD">10.00</calculated-amount>
|
69
|
+
<message>You saved $10.00 with this gift certificate!</message>
|
70
|
+
</gift-certificate-adjustment>
|
71
|
+
</merchant-codes>
|
72
|
+
<total-tax currency="USD">0.0</total-tax>
|
73
|
+
<shipping>
|
74
|
+
<merchant-calculated-shipping-adjustment>
|
75
|
+
<shipping-name>SuperShip</shipping-name>
|
76
|
+
<shipping-cost currency="USD">9.95</shipping-cost>
|
77
|
+
</merchant-calculated-shipping-adjustment>
|
78
|
+
</shipping>
|
79
|
+
</order-adjustment>
|
80
|
+
<order-total currency="USD">190.98</order-total>
|
81
|
+
<buyer-marketing-preferences>
|
82
|
+
<email-allowed>false</email-allowed>
|
83
|
+
</buyer-marketing-preferences>
|
84
|
+
<timestamp>2006-05-03T17:32:11</timestamp>
|
85
|
+
</new-order-notification>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<order-state-change-notification xmlns="http://checkout.google.com/schema/2"
|
3
|
+
serial-number="bea6bc1b-e1e2-44fe-80ff-0180e33a2614">
|
4
|
+
<google-order-number>841171949013218</google-order-number>
|
5
|
+
<new-financial-order-state>CHARGING</new-financial-order-state>
|
6
|
+
<new-fulfillment-order-state>NEW</new-fulfillment-order-state>
|
7
|
+
<previous-financial-order-state>CHARGEABLE</previous-financial-order-state>
|
8
|
+
<previous-fulfillment-order-state>NEW</previous-fulfillment-order-state>
|
9
|
+
<reason>The reason goes here, if there is one.</reason>
|
10
|
+
<timestamp>2006-05-03T17:32:11</timestamp>
|
11
|
+
</order-state-change-notification>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<refund-amount-notification xmlns="http://checkout.google.com/schema/2"
|
3
|
+
serial-number="bea6bc1b-e1e2-44fe-80ff-0180e33a2614">
|
4
|
+
<google-order-number>841171949013218</google-order-number>
|
5
|
+
<latest-refund-amount currency="USD">226.06</latest-refund-amount>
|
6
|
+
<total-refund-amount currency="USD">226.06</total-refund-amount>
|
7
|
+
<timestamp>2006-03-18T20:25:31</timestamp>
|
8
|
+
</refund-amount-notification>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<risk-information-notification xmlns="http://checkout.google.com/schema/2"
|
3
|
+
serial-number="bea6bc1b-e1e2-44fe-80ff-0180e33a2614">
|
4
|
+
<google-order-number>841171949013218</google-order-number>
|
5
|
+
<risk-information>
|
6
|
+
<eligible-for-protection>true</eligible-for-protection>
|
7
|
+
<billing-address id="BuyerBillingAddress">
|
8
|
+
<contact-name>John Smith</contact-name>
|
9
|
+
<email>johnsmith@example.com</email>
|
10
|
+
<address1>10 Example Road</address1>
|
11
|
+
<city>Sampleville</city>
|
12
|
+
<region>CA</region>
|
13
|
+
<postal-code>94141</postal-code>
|
14
|
+
<country-code>US</country-code>
|
15
|
+
</billing-address>
|
16
|
+
<avs-response>Y</avs-response>
|
17
|
+
<cvn-response>M</cvn-response>
|
18
|
+
<partial-cc-number>3719</partial-cc-number>
|
19
|
+
<ip-address>10.11.12.13</ip-address>
|
20
|
+
<buyer-account-age>6</buyer-account-age>
|
21
|
+
</risk-information>
|
22
|
+
<timestamp>2006-01-15T10:44:06</timestamp>
|
23
|
+
</risk-information-notification>
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
2
|
+
|
3
|
+
describe GoogleCheckout, "Cart (generic)" do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@cart = GoogleCheckout::Cart.new("my_id", "my_key", {
|
7
|
+
:name => "PeepCode Screencast",
|
8
|
+
:description => "A few screencasts",
|
9
|
+
:price => 9.00
|
10
|
+
})
|
11
|
+
GoogleCheckout.use_sandbox
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should generate proper live buy button_url" do
|
15
|
+
GoogleCheckout.use_production
|
16
|
+
@cart.button_url.should match(%r{http://checkout\.google\.com/buttons/buy\.gif})
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should generate proper live checkout button_url" do
|
20
|
+
GoogleCheckout.use_production
|
21
|
+
@cart.button_url(:buy_or_checkout => :checkout).should match(%r{http://checkout\.google\.com/buttons/checkout\.gif})
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should generate proper sandbox buy button_url" do
|
25
|
+
@cart.button_url.should match(%r{http://sandbox\.google\.com/buttons/buy\.gif})
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should generate proper sandbox checkout button_url" do
|
29
|
+
@cart.button_url(:buy_or_checkout => :checkout).should match(%r{http://sandbox\.google\.com/checkout/buttons/checkout\.gif})
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should generate checkout button" do
|
33
|
+
@cart.checkout_button.should match(/buy\.gif/)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
describe GoogleCheckout, "Cart Post" do
|
39
|
+
|
40
|
+
before(:each) do
|
41
|
+
@cart = GoogleCheckout::Cart.new("my_id", "my_key", {
|
42
|
+
:name => "PeepCode Screencast",
|
43
|
+
:description => "One screencast",
|
44
|
+
:price => 9.00
|
45
|
+
})
|
46
|
+
GoogleCheckout.use_sandbox
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should get merchant_id" do
|
50
|
+
@cart.merchant_id.should == 'my_id'
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should get merchant_key" do
|
54
|
+
@cart.merchant_key.should == 'my_key'
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should post request to Google" do
|
58
|
+
# :null_object means eat all other methods and return self
|
59
|
+
net_http = mock("net_http", { :null_object => true })
|
60
|
+
Net::HTTP.should_receive(:new).and_return(net_http)
|
61
|
+
|
62
|
+
success_response = Net::HTTPSuccess.new(Net::HTTP.version_1_2, 200, "OK")
|
63
|
+
success_response.should_receive(:body).and_return(read_xml_fixture('responses/checkout-redirect'))
|
64
|
+
net_http.should_receive(:request).and_return(success_response)
|
65
|
+
|
66
|
+
response = @cart.post
|
67
|
+
response.should be_kind_of(GoogleCheckout::CheckoutRedirect)
|
68
|
+
response.serial_number.should == 'bea6bc1b-e1e2-44fe-80ff-0180e33a2614'
|
69
|
+
response.redirect_url.should == 'https://checkout.google.com/buy?foo=bar&id=8572098456'
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should set merchant private data" do
|
73
|
+
@cart.merchant_private_data = { "merchant-order-number" => "1234-5678-9012" }
|
74
|
+
@cart.merchant_private_data["merchant-order-number"].should == "1234-5678-9012"
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should include merchant private in the generated xml" do
|
78
|
+
@cart.merchant_private_data = { "merchant-order-number" => "1234-5678-9012" }
|
79
|
+
@cart.to_xml.should match(/<merchant-order-number>1234-5678-9012<\/merchant-order-number>/)
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should not include merchant private data if none is set" do
|
83
|
+
@cart.to_xml.should_not match(/<merchant-private-data>/)
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should include merchant-item-id in XML if :item_id was passed with the item" do
|
87
|
+
@cart.add_item({
|
88
|
+
:name => "Item",
|
89
|
+
:description => "Item description",
|
90
|
+
:price => "1.00",
|
91
|
+
:quantity => 1,
|
92
|
+
:item_id => "ITEM-007"
|
93
|
+
})
|
94
|
+
@cart.to_xml.should match(%r{<merchant-item-id>ITEM-007</merchant-item-id>})
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should include the merchant calculations url in the generated xml" do
|
98
|
+
@cart.merchant_calculations_url = 'http://my.calculations.com'
|
99
|
+
@cart.to_xml.should match(%r{<merchant-calculations-url>http://my.calculations.com</merchant-calculations-url>})
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should not include the merchant calculations url if it's not set" do
|
103
|
+
@cart.to_xml.should_not match(%r{<merchant-calculations-url>})
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should generate XML"
|
107
|
+
|
108
|
+
it "should receive error when placing false request"
|
109
|
+
|
110
|
+
end
|