Merge branch 'master' of github.com:andrewspinks/openfoodweb

Conflicts:
	app/models/spree/line_item_decorator.rb
	db/migrate/20120919013335_add_shipping_method_to_line_items.rb
This commit is contained in:
Rob H
2012-10-03 10:27:19 +10:00
24 changed files with 393 additions and 159 deletions

View File

@@ -4,9 +4,9 @@ ruby "1.9.3"
gem 'rails', '3.2.8'
gem 'pg'
gem 'spree', '1.1.3'
gem 'spree', :git => 'git://github.com/spree/spree.git', :branch => '1-1-stable'
gem 'spree_i18n', :git => 'git://github.com/spree/spree_i18n.git'
gem 'spree_paypal_express', :git => 'git://github.com/spree/spree_paypal_express.git'
gem 'spree_paypal_express', :git => 'git://github.com/spree/spree_paypal_express.git', :branch => '1-1-stable'
gem 'spree_last_address', :git => 'git://github.com/dancinglightning/spree-last-address.git'
@@ -47,7 +47,7 @@ group :test, :development do
gem 'capybara'
gem 'database_cleaner', '0.7.1', :require => false
gem 'spork', '~> 1.0rc'
gem 'pry'
gem 'pry-debugger'
gem 'awesome_print'
end

View File

@@ -21,6 +21,54 @@ GIT
aws-sdk (~> 1.3.4)
spree_core (>= 0.70.0)
GIT
remote: git://github.com/spree/spree.git
revision: d66ffac9088d0d5d0b0d146f305044ce619f0464
branch: 1-1-stable
specs:
spree (1.1.3)
spree_api (= 1.1.3)
spree_auth (= 1.1.3)
spree_cmd (= 1.1.3)
spree_core (= 1.1.3)
spree_dash (= 1.1.3)
spree_promo (= 1.1.3)
spree_sample (= 1.1.3)
spree_api (1.1.3)
rabl (= 0.6.5)
spree_auth (= 1.1.3)
spree_core (= 1.1.3)
spree_auth (1.1.3)
cancan (= 1.6.7)
devise (~> 2.0.0)
spree_core (= 1.1.3)
spree_cmd (1.1.3)
thor (>= 0.14.6)
spree_core (1.1.3)
activemerchant (= 1.28.0)
acts_as_list (= 0.1.4)
aws-sdk (~> 1.3.4)
deface (>= 0.9.0)
ffaker (~> 1.12.0)
highline (= 1.6.11)
jquery-rails (~> 2.0)
kaminari (= 0.13.0)
nested_set (= 1.7.0)
paperclip (~> 2.7)
rails (~> 3.2.8)
ransack (~> 0.6.0)
state_machine (= 1.1.2)
stringex (~> 1.3.2)
spree_dash (1.1.3)
httparty (~> 0.8.1)
spree_auth (= 1.1.3)
spree_core (= 1.1.3)
spree_promo (1.1.3)
spree_auth (= 1.1.3)
spree_core (= 1.1.3)
spree_sample (1.1.3)
spree_core (= 1.1.3)
GIT
remote: git://github.com/spree/spree_i18n.git
revision: a96bee02340e008e60549295a4f09e047fd2e628
@@ -31,9 +79,11 @@ GIT
GIT
remote: git://github.com/spree/spree_paypal_express.git
revision: d48f4649506e876b88244dcb4e5a86250e4ef8f0
revision: 2c61f1700ef853e3d4f39739793dc3308422e94b
branch: 1-1-stable
specs:
spree_paypal_express (1.1.0)
spree_auth (>= 1.0.0)
spree_core (>= 1.0.0)
GEM
@@ -55,14 +105,14 @@ GEM
active_utils (1.0.5)
activesupport (>= 2.3.11)
i18n
activemerchant (1.20.4)
activemerchant (1.28.0)
active_utils (>= 1.0.2)
activesupport (>= 2.3.11)
braintree (>= 2.0.0)
builder (>= 2.0.0)
i18n
json (>= 1.5.1)
money (<= 3.7.1)
money
nokogiri
activemodel (3.2.8)
activesupport (= 3.2.8)
builder (~> 3.0.0)
@@ -93,8 +143,6 @@ GEM
nokogiri (>= 1.4.4)
uuidtools (~> 2.1)
bcrypt-ruby (3.0.1)
braintree (2.16.0)
builder (>= 2.0.0)
bugsnag (1.1.2)
httparty (~> 0.8.3)
multi_json (~> 1.3.4)
@@ -110,7 +158,7 @@ GEM
childprocess (0.3.2)
ffi (~> 1.0.6)
cocaine (0.3.0)
coderay (1.0.6)
coderay (1.0.7)
coffee-rails (3.2.2)
coffee-script (>= 2.2.0)
railties (~> 3.2.0)
@@ -118,7 +166,15 @@ GEM
coffee-script-source
execjs
coffee-script-source (1.3.3)
columnize (0.3.6)
database_cleaner (0.7.1)
debugger (1.1.4)
columnize (>= 0.3.1)
debugger-linecache (~> 1.1.1)
debugger-ruby_core_source (~> 1.1.3)
debugger-linecache (1.1.2)
debugger-ruby_core_source (>= 1.1.1)
debugger-ruby_core_source (1.1.3)
deface (0.9.1)
nokogiri (~> 1.5.0)
rails (~> 3.1)
@@ -148,13 +204,14 @@ GEM
multi_xml
i18n (0.6.1)
journey (1.0.4)
jquery-rails (2.0.3)
jquery-rails (2.1.2)
railties (>= 3.1.0, < 5.0)
thor (~> 0.14)
json (1.7.5)
kaminari (0.14.1)
kaminari (0.13.0)
actionpack (>= 3.0.0)
activesupport (>= 3.0.0)
railties (>= 3.0.0)
kgio (2.7.4)
libv8 (3.3.10.4)
libwebsocket (0.1.3)
@@ -163,10 +220,11 @@ GEM
i18n (>= 0.4.0)
mime-types (~> 1.16)
treetop (~> 1.4.8)
method_source (0.7.1)
method_source (0.8)
mime-types (1.19)
money (3.7.1)
money (5.0.0)
i18n (~> 0.4)
json
multi_json (1.3.6)
multi_xml (0.5.1)
nested_set (1.7.0)
@@ -183,10 +241,13 @@ GEM
polyamorous (0.5.0)
activerecord (~> 3.0)
polyglot (0.3.3)
pry (0.9.9.6)
pry (0.9.10)
coderay (~> 1.0.5)
method_source (~> 0.7.1)
slop (>= 2.4.4, < 3)
method_source (~> 0.8)
slop (~> 3.3.1)
pry-debugger (0.2.0)
debugger (~> 1.1.3)
pry (~> 0.9.9)
rabl (0.6.5)
activesupport (>= 2.3.14)
multi_json (~> 1.0)
@@ -247,50 +308,8 @@ GEM
rubyzip
shoulda-matchers (1.1.0)
activesupport (>= 3.0.0)
slop (2.4.4)
slop (3.3.3)
spork (1.0.0rc3)
spree (1.1.3)
spree_api (= 1.1.3)
spree_auth (= 1.1.3)
spree_cmd (= 1.1.3)
spree_core (= 1.1.3)
spree_dash (= 1.1.3)
spree_promo (= 1.1.3)
spree_sample (= 1.1.3)
spree_api (1.1.3)
rabl (= 0.6.5)
spree_auth (= 1.1.3)
spree_core (= 1.1.3)
spree_auth (1.1.3)
cancan (= 1.6.7)
devise (~> 2.0.0)
spree_core (= 1.1.3)
spree_cmd (1.1.3)
thor (>= 0.14.6)
spree_core (1.1.3)
activemerchant (= 1.20.4)
acts_as_list (= 0.1.4)
aws-sdk (~> 1.3.4)
deface (>= 0.9.0)
ffaker (~> 1.12.0)
highline (= 1.6.11)
jquery-rails (~> 2.0.0)
kaminari (>= 0.13.0)
nested_set (= 1.7.0)
paperclip (~> 2.7)
rails (~> 3.2.6)
ransack (~> 0.6.0)
state_machine (= 1.1.2)
stringex (~> 1.3.2)
spree_dash (1.1.3)
httparty (~> 0.8.1)
spree_auth (= 1.1.3)
spree_core (= 1.1.3)
spree_promo (1.1.3)
spree_auth (= 1.1.3)
spree_core (= 1.1.3)
spree_sample (1.1.3)
spree_core (= 1.1.3)
sprockets (2.1.3)
hike (~> 1.2)
rack (~> 1.0)
@@ -338,14 +357,14 @@ DEPENDENCIES
haml
jquery-rails
pg
pry
pry-debugger
rails (= 3.2.8)
rspec-rails
sass-rails (~> 3.2.3)
shoulda-matchers
simple_form!
spork (~> 1.0rc)
spree (= 1.1.3)
spree!
spree_heroku!
spree_i18n!
spree_last_address!

View File

@@ -5,6 +5,8 @@
// the compiled file.
//
//= require jquery
//= require jquery_ujs
//= require admin/spree_core
//= require admin/spree_auth
//= require admin/spree_promo

View File

@@ -28,7 +28,7 @@ function products_update_price_without_variant() {
if(master_price == null) {
// Store off the master price
master_price = $("#product-price span.price").html();
master_price = master_price.substr(1, master_price.length-2);
master_price = master_price.substring(1);
$("#product-price span.price").data('master-price', master_price);
}

View File

@@ -0,0 +1,28 @@
module Spree
module Admin
ShippingMethodsController.class_eval do
before_filter :do_not_destroy_referenced_shipping_methods, :only => :destroy
def do_not_destroy_referenced_shipping_methods
order = Order.where(:shipping_method_id => @object).first
if order
flash[:error] = "That shipping method cannot be deleted as it is referenced by an order: #{order.number}."
redirect_to collection_url and return
end
product_distribution = ProductDistribution.where(:shipping_method_id => @object).first
if product_distribution
p = product_distribution.product
flash[:error] = "That shipping method cannot be deleted as it is referenced by a product distribution: #{p.id} - #{p.name}."
redirect_to collection_url and return
end
line_item = LineItem.where(:shipping_method_id => @object).first
if line_item
flash[:error] = "That shipping method cannot be deleted as it is referenced by a line item in order: #{line_item.order.number}."
redirect_to collection_url and return
end
end
end
end
end

View File

@@ -0,0 +1,20 @@
module Spree
BaseController.class_eval do
# Override definition in spree/auth/app/controllers/spree/base_controller_decorator.rb
# Do not attempt to merge incomplete and current orders when they have differing distributors
def set_current_order
if current_user
if current_user.respond_to?(:last_incomplete_order)
last_incomplete_order = current_user.last_incomplete_order
if session[:order_id].nil? && last_incomplete_order
session[:order_id] = last_incomplete_order.id
elsif current_order && last_incomplete_order && current_order != last_incomplete_order &&
(current_order.distributor.nil? || current_order.distributor == last_incomplete_order.distributor)
current_order.merge!(last_incomplete_order)
end
end
end
end
end
end

View File

@@ -1,6 +1,6 @@
Spree::OrdersController.class_eval do
before_filter :populate_order_distributor, :only => :populate
after_filter :populate_variant_attributes, :only => :populate
before_filter :populate_order_distributor, :only => :populate
after_filter :populate_variant_attributes, :only => :populate
def populate_order_distributor
@distributor = params[:distributor_id].present? ? Spree::Distributor.find(params[:distributor_id]) : nil

View File

@@ -1,5 +1,7 @@
module Spree
class SuppliersController < BaseController
helper 'spree/products'
def show
options = {:supplier_id => params[:id]}
options.merge(params.reject { |k,v| k == :id })

View File

@@ -3,8 +3,17 @@ Spree::LineItem.class_eval do
attr_accessible :max_quantity
before_create :set_itemwise_shipping_method
def itemwise_shipping_cost
order = OpenStruct.new :line_items => [self]
shipping_method.compute_amount(order)
end
private
def set_itemwise_shipping_method
self.shipping_method = self.product.shipping_method_for_distributor(self.order.distributor)
end
end

View File

@@ -47,6 +47,8 @@ Spree::Order.class_eval do
if self.shipping_method
self.save!
self.create_shipment!
else
raise 'No default shipping method found'
end
end

View File

@@ -6,15 +6,15 @@
%h5
Item total
\:
%span.order-total= order_subtotal(@order)
%span.order-total.item-total= number_to_currency @order.item_total
%h5
Shipping total
\:
%span.order-total= order_delivery_fee_subtotal(@order)
%span.order-total.shipping-total= order_delivery_fee_subtotal(@order)
%h4
Total
\:
%span.order-total= number_to_currency(order_subtotal(@order, :format_as_currency => false) + order_delivery_fee_subtotal(@order, :format_as_currency => false))
%span.order-total.grand-total= order_subtotal(@order)
.links{'data-hook' => "cart_buttons"}
= button_tag :class => 'primary', :id => 'update-button' do

View File

@@ -7,9 +7,10 @@ class AddShippingMethodToLineItems < ActiveRecord::Migration
shipping_method = li.product.shipping_method_for_distributor(li.order.distributor)
rescue ArgumentError
shipping_method = Spree::ShippingMethod.find_by_name 'Producer Delivery'
say "Line item #{li.id} does not have a valid shipping method, setting to '#{shipping_method.name}'"
end
li.update_attribute(:shipping_method_id, shipping_method.id)
Spree::LineItem.update_all("shipping_method_id = #{shipping_method.id}", "id = #{li.id}")
end
end

View File

@@ -22,7 +22,7 @@ module OpenFoodWeb
order.bill_address.full_name, order.email, order.bill_address.phone, order.bill_address.city,
line_item.product.sku, line_item.product.name, line_item.variant.options_text, line_item.quantity, line_item.max_quantity, line_item.price * line_item.quantity, line_item.itemwise_shipping_cost,
order.payments.first.payment_method.andand.name,
order.distributor.name, order.distributor.pickup_address.address1, order.distributor.pickup_address.city, order.distributor.pickup_address.zipcode, order.special_instructions ]
order.distributor.andand.name, order.distributor.pickup_address.address1, order.distributor.pickup_address.city, order.distributor.pickup_address.zipcode, order.special_instructions ]
end
end
order_and_distributor_details

View File

@@ -4,9 +4,11 @@ require 'spree/core/current_order'
describe Spree::DistributorsController do
include Spree::Core::CurrentOrder
before do
before :each do
stub!(:before_save_new_order)
stub!(:after_save_new_order)
create(:itemwise_shipping_method)
end

View File

@@ -25,4 +25,22 @@ describe Spree::HomeController do
assigns(:products_local).should == [p1]
assigns(:products_remote).should == [p2]
end
context "BaseController: merging incomplete orders" do
it "does not attempt to merge incomplete and current orders when they have differing distributors" do
incomplete_order = double(:order, distributor: 1)
current_order = double(:order, distributor: 2)
user = double(:user, last_incomplete_order: incomplete_order)
controller.stub(:current_user).and_return(user)
controller.stub(:current_order).and_return(current_order)
incomplete_order.should_receive(:merge!).never
current_order.should_receive(:merge!).never
session[:order_id] = 123
spree_get :index
end
end
end

View File

@@ -24,7 +24,7 @@ FactoryGirl.define do
factory :product_distribution, :class => Spree::ProductDistribution do
product { |pd| Spree::Product.first || FactoryGirl.create(:product) }
distributor { |pd| Spree::Distributor.first || FactoryGirl.create(:distributor) }
shipping_method { |pd| Spree::ShippingMethod.first || FactoryGirl.create(:shipping_method) }
shipping_method { |pd| Spree::ShippingMethod.where("name != 'Delivery'").first || FactoryGirl.create(:shipping_method) }
end
factory :itemwise_shipping_method, :parent => :shipping_method do
@@ -50,6 +50,23 @@ FactoryGirl.modify do
# before(:create) do |product, evaluator|
# product.product_distributions = [FactoryGirl.create(:product_distribution, :product => product)]
# end
# Do not create products distributed via the 'Delivery' shipping method
after(:create) do |product, evaluator|
pd = product.product_distributions.first
if pd.andand.shipping_method.andand.name == 'Delivery'
pd.shipping_method = Spree::ShippingMethod.where("name != 'Delivery'").first || FactoryGirl.create(:shipping_method)
pd.save!
end
end
end
factory :line_item do
shipping_method { |li| li.product.shipping_method_for_distributor(li.order.distributor) }
end
factory :shipping_method do
display_on ''
end
factory :address do

View File

@@ -7,12 +7,9 @@ module Spree
shipping_method = create(:shipping_method)
shipping_method.calculator.set_preference :amount, 10
product = double(:product)
product.should_receive(:shipping_method_for_distributor).and_return(shipping_method)
order = double(:order, :distributor => nil)
subject.stub(:product).and_return(product)
subject.stub(:shipping_method).and_return(shipping_method)
subject.stub(:order).and_return(order)
subject.itemwise_shipping_cost.should == 10

View File

@@ -15,8 +15,11 @@ describe Spree::Order do
end
it "reveals permission for changing distributor" do
d = create(:distributor)
p = create(:product, :distributors => [d])
subject.distributor = d
subject.save!
p = create(:product)
subject.can_change_distributor?.should be_true
subject.add_variant(p.master, 1)
@@ -64,11 +67,12 @@ describe Spree::Order do
end
it "sets attributes on line items for variants" do
subject.save!
d = create(:distributor)
p = create(:product, :distributors => [d])
subject.distributor = d
subject.save!
subject.add_variant(p.master, 1)
subject.set_variant_attributes(p.master, {'max_quantity' => '3'})

View File

@@ -0,0 +1,58 @@
require 'spec_helper'
feature 'shipping methods' do
include AuthenticationWorkflow
include WebHelper
before :each do
login_to_admin_section
@sm = create(:shipping_method)
end
scenario "deleting a shipping method" do
visit_delete spree.admin_shipping_method_path(@sm)
page.should have_content "Shipping method \"#{@sm.name}\" has been successfully removed!"
Spree::ShippingMethod.where(:id => @sm.id).should be_empty
end
scenario "deleting a shipping method referenced by an order" do
o = create(:order, shipping_method: @sm)
visit_delete spree.admin_shipping_method_path(@sm)
page.should have_content "That shipping method cannot be deleted as it is referenced by an order: #{o.number}."
Spree::ShippingMethod.find(@sm.id).should_not be_nil
end
scenario "deleting a shipping method referenced by a product distribution" do
p = create(:product)
d = create(:distributor)
create(:product_distribution, product: p, distributor: d, shipping_method: @sm)
visit_delete spree.admin_shipping_method_path(@sm)
page.should have_content "That shipping method cannot be deleted as it is referenced by a product distribution: #{p.id} - #{p.name}."
Spree::ShippingMethod.find(@sm.id).should_not be_nil
end
scenario "deleting a shipping method referenced by a line item" do
sm2 = create(:shipping_method)
d = create(:distributor)
p = create(:product)
create(:product_distribution, product: p, distributor: d, shipping_method: sm2)
o = create(:order, distributor: d)
o.shipping_method = sm2
o.save!
li = create(:line_item, order: o, product: p)
li.shipping_method = @sm
li.save!
visit_delete spree.admin_shipping_method_path(@sm)
page.should have_content "That shipping method cannot be deleted as it is referenced by a line item in order: #{o.number}."
Spree::ShippingMethod.find(@sm.id).should_not be_nil
end
end

View File

@@ -24,29 +24,42 @@ feature %q{
# And the product should not have been added to my cart
Spree::Order.last.should be_nil
#order.line_items.should be_empty
end
scenario "adding the first product to the cart" do
# Given a product and some distributors
create(:itemwise_shipping_method)
# Given a product, some distributors and a defined shipping cost
d1 = create(:distributor)
d2 = create(:distributor)
p = create(:product, :distributors => [d1])
create(:product, :distributors => [d2])
p = create(:product, :price => 12.34)
create(:product_distribution, :product => p, :distributor => d1, :shipping_method => create(:shipping_method))
# ... with a flat rate shipping method of cost $1.23
sm = p.product_distributions.first.shipping_method
sm.calculator.preferred_amount = 1.23
sm.calculator.save!
# When I choose a distributor
visit spree.root_path
click_link d2.name
# When I add an item to my cart from a different distributor
# And I add an item to my cart from a different distributor
visit spree.product_path p
select d1.name, :from => 'distributor_id'
click_button 'Add To Cart'
# Then the item should be in my cart
# Then the correct totals should be displayed
page.should have_selector 'span.item-total', :text => '$12.34'
page.should have_selector 'span.shipping-total', :text => '$1.23'
page.should have_selector 'span.grand-total', :text => '$13.57'
# And the item should be in my cart, with shipping method set for the line item
order = Spree::Order.last
order.line_items.first.product.should == p
line_item = order.line_items.first
line_item.product.should == p
line_item.shipping_method.should == p.product_distributions.first.shipping_method
# And my order should have its distributor set to the chosen distributor
order.distributor.should == d1
@@ -130,76 +143,77 @@ feature %q{
end
end
scenario "adding a product to the cart for a group buy" do
# Given a group buy product and a distributor
d = create(:distributor)
p = create(:product, :distributors => [d], :group_buy => true)
context "group buys" do
scenario "adding a product to the cart for a group buy" do
# Given a group buy product and a distributor
d = create(:distributor)
p = create(:product, :distributors => [d], :group_buy => true)
# When I add the item to my cart
visit spree.product_path p
select d.name, :from => 'distributor_id'
fill_in "variants_#{p.master.id}", :with => 2
fill_in "variant_attributes_#{p.master.id}_max_quantity", :with => 3
click_button 'Add To Cart'
# When I add the item to my cart
visit spree.product_path p
select d.name, :from => 'distributor_id'
fill_in "variants_#{p.master.id}", :with => 2
fill_in "variant_attributes_#{p.master.id}_max_quantity", :with => 3
click_button 'Add To Cart'
# Then the item should be in my cart with correct quantities
order = Spree::Order.last
li = order.line_items.first
li.product.should == p
li.quantity.should == 2
li.max_quantity.should == 3
# Then the item should be in my cart with correct quantities
order = Spree::Order.last
li = order.line_items.first
li.product.should == p
li.quantity.should == 2
li.max_quantity.should == 3
end
scenario "adding a product with variants to the cart for a group buy" do
# Given a group buy product with variants and a distributor
d = create(:distributor)
p = create(:product, :distributors => [d], :group_buy => true)
create(:variant, :product => p)
# When I add the item to my cart
visit spree.product_path p
select d.name, :from => 'distributor_id'
fill_in "quantity", :with => 2
fill_in "max_quantity", :with => 3
click_button 'Add To Cart'
# Then the item should be in my cart with correct quantities
order = Spree::Order.last
li = order.line_items.first
li.product.should == p
li.quantity.should == 2
li.max_quantity.should == 3
end
scenario "adding a product to cart that is not a group buy does not show max quantity field" do
# Given a group buy product and a distributor
d = create(:distributor)
p = create(:product, :distributors => [d], :group_buy => false)
# When I view the add to cart form, there should not be a max quantity field
visit spree.product_path p
page.should_not have_selector "#variant_attributes_#{p.master.id}_max_quantity"
end
scenario "adding a product with a max quantity less than quantity results in max_quantity==quantity" do
# Given a group buy product and a distributor
d = create(:distributor)
p = create(:product, :distributors => [d], :group_buy => true)
# When I add the item to my cart
visit spree.product_path p
select d.name, :from => 'distributor_id'
fill_in "variants_#{p.master.id}", :with => 2
fill_in "variant_attributes_#{p.master.id}_max_quantity", :with => 1
click_button 'Add To Cart'
# Then the item should be in my cart with correct quantities
order = Spree::Order.last
li = order.line_items.first
li.product.should == p
li.quantity.should == 2
li.max_quantity.should == 2
end
end
scenario "adding a product with variants to the cart for a group buy" do
# Given a group buy product with variants and a distributor
d = create(:distributor)
p = create(:product, :distributors => [d], :group_buy => true)
create(:variant, :product => p)
# When I add the item to my cart
visit spree.product_path p
select d.name, :from => 'distributor_id'
fill_in "quantity", :with => 2
fill_in "max_quantity", :with => 3
click_button 'Add To Cart'
# Then the item should be in my cart with correct quantities
order = Spree::Order.last
li = order.line_items.first
li.product.should == p
li.quantity.should == 2
li.max_quantity.should == 3
end
scenario "adding a product to cart that is not a group buy does not show max quantity field" do
# Given a group buy product and a distributor
d = create(:distributor)
p = create(:product, :distributors => [d], :group_buy => false)
# When I view the add to cart form, there should not be a max quantity field
visit spree.product_path p
page.should_not have_selector "#variant_attributes_#{p.master.id}_max_quantity"
end
scenario "adding a product with a max quantity less than quantity results in max_quantity==quantity" do
# Given a group buy product and a distributor
d = create(:distributor)
p = create(:product, :distributors => [d], :group_buy => true)
# When I add the item to my cart
visit spree.product_path p
select d.name, :from => 'distributor_id'
fill_in "variants_#{p.master.id}", :with => 2
fill_in "variant_attributes_#{p.master.id}_max_quantity", :with => 1
click_button 'Add To Cart'
# Then the item should be in my cart with correct quantities
order = Spree::Order.last
li = order.line_items.first
li.product.should == p
li.quantity.should == 2
li.max_quantity.should == 2
end
end

View File

@@ -0,0 +1,36 @@
require 'spec_helper'
feature %q{
As a consumer
I want to see a list of products from a supplier
So that I can connect with them (and maybe buy stuff too)
} do
include AuthenticationWorkflow
include WebHelper
scenario "viewing a list of suppliers" do
# Given some suppliers
s1 = create(:supplier)
s2 = create(:supplier)
s3 = create(:supplier)
# When I go to the home page
visit spree.root_path
# Then I should see a list containing all the suppliers
[s1, s2, s3].each { |s| page.should have_selector 'a', :text => s.name }
end
scenario "viewing products provided by a supplier" do
# Given a supplier with a product
s = create(:supplier, :name => 'Murrnong')
p = create(:product, :supplier => s)
# When I select the supplier
visit spree.root_path
click_link s.name
# Then I should see the product
page.should have_content p.name
end
end

View File

@@ -76,6 +76,11 @@ module WebHelper
page.find(:xpath, "//div[@class=\"ui-dialog-buttonset\"]//span[contains(text(),\"#{button_content}\")]").click
end
def visit_delete(url)
response = Capybara.current_session.driver.delete url
click_link 'redirected' if response.status == 302
end
def trigger_manual_event(field_selector, event = 'change')
page.execute_script("$('#{field_selector}').trigger('#{event}');")
end

View File

@@ -1,5 +1,5 @@
{
"command": "ruby -rzeus/rails -eZeus.go",
"command": "ruby -rubygems -rzeus/rails -eZeus.go",
"plan": {
"boot": {
@@ -9,12 +9,12 @@
"runner": ["r"],
"console": ["c"],
"server": ["s"],
"generate": ["g"]
"generate": ["g"],
"dbconsole": []
},
"test_environment": {
"testtask": [],
"test_helper": {"testrb": []},
"spec_helper": {"rspec": []}
"cucumber_environment": {"cucumber": []},
"test_helper": {"test": ["rspec", "testrb"]}
}
}
}