Created
June 22, 2015 14:13
-
-
Save MisinformedDNA/aeee685ec5b74ae90ff7 to your computer and use it in GitHub Desktop.
Spree/PayPal API Test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require_relative '../base' | |
module Examples | |
module Checkout | |
class Walkthrough | |
def self.run(client) | |
# Create the order step by step: | |
# You may also choose to start it off with some line items | |
# See checkout/creating_with_line_items.rb | |
response = client.post('/api/orders') | |
if response.status == 201 | |
order = JSON.parse(response.body) | |
client.succeeded "Created new checkout." + order["number"] | |
if order['email'] == '[email protected]' | |
# Email addresses are necessary for orders to transition to address. | |
# This just makes really sure that the email is already set. | |
# You will not have to do this in your own API unless you've customized it. | |
client.succeeded 'Email set automatically on order successfully.' | |
else | |
client.failed %Q{ | |
Email address was not automatically set on order.' | |
-> This may lead to problems transitioning to the address step. | |
} | |
end | |
else | |
client.failed 'Failed to create a new blank checkout.' | |
end | |
# Assign a line item to the order we just created. | |
response = client.post("/api/orders/#{order['number']}/line_items", | |
{ | |
line_item: { | |
variant_id: 1, | |
quantity: 1 | |
} | |
} | |
) | |
if response.status == 201 | |
client.succeeded "Added a line item." | |
else | |
client.failed "Failed to add a line item." | |
end | |
# Transition the order to the 'address' state | |
response = client.put("/api/checkouts/#{order['number']}/next") | |
if response.status == 200 | |
order = JSON.parse(response.body) | |
client.succeeded "Transitioned order into address state." | |
else | |
client.failed "Could not transition order to address state." | |
end | |
# Add address information to the order | |
# Before you make this request, you may need to make a request to one or both of: | |
# - /api/countries | |
# - /api/states | |
# This will give you the correct country_id and state_id params to use for address information. | |
# First, get the country: | |
response = client.get('/api/countries?q[name_cont]=United States') | |
if response.status == 200 | |
client.succeeded "Retrieved a list of countries." | |
countries = JSON.parse(response.body)['countries'] | |
usa = countries.first | |
if usa['name'] != 'United States' | |
client.failed "Expected first country to be 'United States', but it wasn't." | |
end | |
else | |
client.failed "Failed to retrieve a list of countries." | |
end | |
# Then, get the state we want from the states of that country: | |
response = client.get("/api/countries/#{usa['id']}/states?q[name_cont]=Maryland") | |
if response.status == 200 | |
client.succeeded "Retrieved a list of states." | |
states = JSON.parse(response.body)['states'] | |
maryland = states.first | |
if maryland['name'] != 'Maryland' | |
client.failed "Expected first state to be 'Maryland', but it wasn't." | |
end | |
else | |
client.failed "Failed to retrieve a list of states." | |
end | |
# We can finally submit some address information now that we have it all: | |
address = { | |
first_name: 'Test', | |
last_name: 'User', | |
address1: 'Unit 1', | |
address2: '1 Test Lane', | |
country_id: usa['id'], | |
state_id: maryland['id'], | |
city: 'Bethesda', | |
zipcode: '20814', | |
phone: '(555) 555-5555' | |
} | |
response = client.put("/api/checkouts/#{order['number']}", | |
{ | |
order: { | |
bill_address_attributes: address, | |
ship_address_attributes: address | |
} | |
} | |
) | |
if response.status == 200 | |
client.succeeded "Address details added." | |
order = JSON.parse(response.body) | |
if order['state'] == 'delivery' | |
client.succeeded "Order automatically transitioned to 'delivery'." | |
else | |
client.failed "Order failed to automatically transition to 'delivery'." | |
end | |
else | |
client.failed "Could not add address details to order." | |
end | |
# Next step: delivery! | |
first_shipment = order['shipments'].first | |
response = client.put("/api/checkouts/#{order['number']}", | |
{ | |
order: { | |
shipments_attributes: [ | |
id: first_shipment['id'], | |
selected_shipping_rate_id: first_shipment['shipping_rates'].first['id'] | |
] | |
} | |
} | |
) | |
if response.status == 200 | |
client.succeeded "Delivery options selected." | |
order = JSON.parse(response.body) | |
if order['state'] == 'payment' | |
client.succeeded "Order automatically transitioned to 'payment'." | |
else | |
client.failed "Order failed to automatically transition to 'payment'." | |
end | |
else | |
client.failed "The store was not happy with the selected delivery options." | |
end | |
# Next step: payment! | |
payment_method = order['payment_methods'].detect { |pm| pm['name'] == "PayPal" } | |
if !payment_method | |
client.failed "PayPal payment method not found." | |
end | |
response = client.post("/api/paypal", { | |
"order_id": order['number'], | |
"payment_method_id": payment_method["id"], | |
"confirm_url": "http://localhost:3001", | |
"cancel_url": "http://localhost:3001/checkout/payment" | |
}) | |
if response.status == 200 | |
order = JSON.parse(response.body) | |
client.succeeded "Payment details provided for the order." | |
# Order will transition to the confirm state only if the selected payment | |
# method allows for payment profiles. | |
# The dummy Credit Card gateway in Spree does, so confirm is shown for this order. | |
if order['state'] == 'confirm' | |
client.succeeded "Order automatically transitioned to 'confirm'." | |
else | |
client.failed "Order did not transition automatically to 'confirm'." | |
end | |
else | |
client.failed "Payment details were not accepted for the order." | |
end | |
# This is the final point where the user gets to view their order's final information. | |
# All that's required at this point is that we complete the order, which is as easy as: | |
response = client.put("/api/checkouts/#{order['number']}/next") | |
order = JSON.parse(response.body) | |
puts JSON.pretty_generate(order) | |
if response.status == 200 | |
if order['state'] == 'complete' | |
client.succeeded "Order complete!" | |
else | |
client.failed "Order did not complete." | |
end | |
else | |
client.failed "Order could not transition to 'complete'." | |
end | |
end | |
end | |
end | |
end | |
Examples.run(Examples::Checkout::Walkthrough) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment