Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save MisinformedDNA/e6788a79b78f457b7a7b to your computer and use it in GitHub Desktop.
Save MisinformedDNA/e6788a79b78f457b7a7b to your computer and use it in GitHub Desktop.
verify-totals
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
client.succeeded "Created new checkout."
order = JSON.parse(response.body)
if order['email'] == 'spree@example.com'
# 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
if TotalsMatch(order)
client.succeeded "Totals add up correctly: " + GetTotalsString(order)
else
client.failed "Totals did not add up correctly: " + GetTotalsString(order)
end
# Add another line item
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
response = client.get("/api/orders/#{order['number']}")
order = JSON.parse(response.body)
if TotalsMatch(order)
client.succeeded "Totals add up correctly: " + GetTotalsString(order)
else
client.failed "Totals did not add up correctly: " + GetTotalsString(order)
end
end
def self.TotalsMatch(order)
return (order['item_total'].to_f + order['ship_total'].to_f + order['tax_total'].to_f).round(2) == order['total'].to_f
end
def self.GetTotalsString(order)
return "Item Total: " + order['item_total'] + ", Ship Total: " + order['ship_total'] + ", Tax Total: " + order['tax_total'] + ", Total: " + order['total']
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