-
Notifications
You must be signed in to change notification settings - Fork 134
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 9bcf784
Showing
10 changed files
with
417 additions
and
0 deletions.
There are no files selected for viewing
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
= Volume Pricing | ||
|
||
Description goes here |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
# I think this is the one that should be moved to the extension Rakefile template | ||
|
||
# In rails 1.2, plugins aren't available in the path until they're loaded. | ||
# Check to see if the rspec plugin is installed first and require | ||
# it if it is. If not, use the gem version. | ||
|
||
# Determine where the RSpec plugin is by loading the boot | ||
unless defined? SPREE_ROOT | ||
ENV["RAILS_ENV"] = "test" | ||
case | ||
when ENV["SPREE_ENV_FILE"] | ||
require File.dirname(ENV["SPREE_ENV_FILE"]) + "/boot" | ||
when File.dirname(__FILE__) =~ %r{vendor/SPREE/vendor/extensions} | ||
require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../")}/config/boot" | ||
else | ||
require "#{File.expand_path(File.dirname(__FILE__) + "/../../../")}/config/boot" | ||
end | ||
end | ||
|
||
require 'rake' | ||
require 'rake/rdoctask' | ||
require 'rake/testtask' | ||
|
||
rspec_base = File.expand_path(SPREE_ROOT + '/vendor/plugins/rspec/lib') | ||
$LOAD_PATH.unshift(rspec_base) if File.exist?(rspec_base) | ||
require 'spec/rake/spectask' | ||
# require 'spec/translator' | ||
|
||
# Cleanup the SPREE_ROOT constant so specs will load the environment | ||
Object.send(:remove_const, :SPREE_ROOT) | ||
|
||
extension_root = File.expand_path(File.dirname(__FILE__)) | ||
|
||
task :default => :spec | ||
task :stats => "spec:statsetup" | ||
|
||
desc "Run all specs in spec directory" | ||
Spec::Rake::SpecTask.new(:spec) do |t| | ||
t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""] | ||
t.spec_files = FileList['spec/**/*_spec.rb'] | ||
end | ||
|
||
namespace :spec do | ||
desc "Run all specs in spec directory with RCov" | ||
Spec::Rake::SpecTask.new(:rcov) do |t| | ||
t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""] | ||
t.spec_files = FileList['spec/**/*_spec.rb'] | ||
t.rcov = true | ||
t.rcov_opts = ['--exclude', 'spec', '--rails'] | ||
end | ||
|
||
desc "Print Specdoc for all specs" | ||
Spec::Rake::SpecTask.new(:doc) do |t| | ||
t.spec_opts = ["--format", "specdoc", "--dry-run"] | ||
t.spec_files = FileList['spec/**/*_spec.rb'] | ||
end | ||
|
||
[:models, :controllers, :views, :helpers].each do |sub| | ||
desc "Run the specs under spec/#{sub}" | ||
Spec::Rake::SpecTask.new(sub) do |t| | ||
t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""] | ||
t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"] | ||
end | ||
end | ||
|
||
# Hopefully no one has written their extensions in pre-0.9 style | ||
# desc "Translate specs from pre-0.9 to 0.9 style" | ||
# task :translate do | ||
# translator = ::Spec::Translator.new | ||
# dir = RAILS_ROOT + '/spec' | ||
# translator.translate(dir, dir) | ||
# end | ||
|
||
# Setup specs for stats | ||
task :statsetup do | ||
require 'code_statistics' | ||
::STATS_DIRECTORIES << %w(Model\ specs spec/models) | ||
::STATS_DIRECTORIES << %w(View\ specs spec/views) | ||
::STATS_DIRECTORIES << %w(Controller\ specs spec/controllers) | ||
::STATS_DIRECTORIES << %w(Helper\ specs spec/views) | ||
::CodeStatistics::TEST_TYPES << "Model specs" | ||
::CodeStatistics::TEST_TYPES << "View specs" | ||
::CodeStatistics::TEST_TYPES << "Controller specs" | ||
::CodeStatistics::TEST_TYPES << "Helper specs" | ||
::STATS_DIRECTORIES.delete_if {|a| a[0] =~ /test/} | ||
end | ||
|
||
namespace :db do | ||
namespace :fixtures do | ||
desc "Load fixtures (from spec/fixtures) into the current environment's database. Load specific fixtures using FIXTURES=x,y" | ||
task :load => :environment do | ||
require 'active_record/fixtures' | ||
ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym) | ||
(ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir.glob(File.join(RAILS_ROOT, 'spec', 'fixtures', '*.{yml,csv}'))).each do |fixture_file| | ||
Fixtures.create_fixtures('spec/fixtures', File.basename(fixture_file, '.*')) | ||
end | ||
end | ||
end | ||
end | ||
end | ||
|
||
desc 'Generate documentation for the volume_pricing extension.' | ||
Rake::RDocTask.new(:rdoc) do |rdoc| | ||
rdoc.rdoc_dir = 'rdoc' | ||
rdoc.title = 'VolumePricingExtension' | ||
rdoc.options << '--line-numbers' << '--inline-source' | ||
rdoc.rdoc_files.include('README') | ||
rdoc.rdoc_files.include('lib/**/*.rb') | ||
end | ||
|
||
# For extensions that are in transition | ||
desc 'Test the volume_pricing extension.' | ||
Rake::TestTask.new(:test) do |t| | ||
t.libs << 'lib' | ||
t.pattern = 'test/**/*_test.rb' | ||
t.verbose = true | ||
end | ||
|
||
# Load any custom rakefiles for extension | ||
Dir[File.dirname(__FILE__) + '/tasks/*.rake'].sort.each { |f| require f } |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
class VolumePrice < ActiveRecord::Base | ||
belongs_to :variant | ||
validates_presence_of :variant | ||
|
||
OPEN_ENDED = /\([0-9]+\+\)/ | ||
|
||
def validate | ||
return if open_ended? | ||
errors.add(:range, "must be in one of the following formats: (a..b), (a...b), (a+)") unless /\([0-9]+\.{2,3}[0-9]+\)/ =~ range | ||
end | ||
|
||
def include?(quantity) | ||
if open_ended? | ||
bound = /\d+/.match("(50+)")[0].to_i | ||
return quantity >= bound | ||
else | ||
range.to_range === quantity | ||
end | ||
end | ||
|
||
# indicates whether or not the range is a true Ruby range or an open ended range with no upper bound | ||
def open_ended? | ||
OPEN_ENDED =~ range | ||
end | ||
end |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
class CreateVolumePrices < ActiveRecord::Migration | ||
def self.up | ||
create_table :volume_prices do |t| | ||
t.references :variant | ||
t.string :display | ||
t.string :range | ||
t.decimal :amount, :precision => 8, :scale => 2 | ||
t.timestamps | ||
end | ||
end | ||
|
||
def self.down | ||
drop_table :volume_prices | ||
end | ||
end |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
namespace :db do | ||
desc "Bootstrap your database for Spree." | ||
task :bootstrap => :environment do | ||
# load initial database fixtures (in db/sample/*.yml) into the current environment's database | ||
ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym) | ||
Dir.glob(File.join(VolumePricingExtension.root, "db", 'sample', '*.{yml,csv}')).each do |fixture_file| | ||
Fixtures.create_fixtures("#{VolumePricingExtension.root}/db/sample", File.basename(fixture_file, '.*')) | ||
end | ||
|
||
end | ||
end | ||
|
||
namespace :spree do | ||
namespace :extensions do | ||
namespace :volume_pricing do | ||
desc "Copies public assets of the Volume Pricing to the instance public/ directory." | ||
task :update => :environment do | ||
is_svn_or_dir = proc {|path| path =~ /\.svn/ || File.directory?(path) } | ||
Dir[VolumePricingExtension.root + "/public/**/*"].reject(&is_svn_or_dir).each do |file| | ||
path = file.sub(VolumePricingExtension.root, '') | ||
directory = File.dirname(path) | ||
puts "Copying #{path}..." | ||
mkdir_p RAILS_ROOT + directory | ||
cp file, RAILS_ROOT + path | ||
end | ||
end | ||
end | ||
end | ||
end |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
require File.dirname(__FILE__) + '/../spec_helper' | ||
|
||
describe Order do | ||
before(:each) do | ||
@order = Order.new | ||
@variant = Variant.new(:price => 10) | ||
end | ||
|
||
describe "add_variant" do | ||
it "should use the variant price if there are no volume prices" do | ||
@order.add_variant(@variant, 100) | ||
@order.line_items.first.price.should == 10 | ||
end | ||
it "should use the volume price if quantity falls within a quantity range of a volume price" do | ||
@variant.volume_prices << mock_model(VolumePrice, :include? => true, :amount => 9) | ||
@order.add_variant(@variant) | ||
@order.line_items.first.price.should == 9 | ||
end | ||
it "should use the variant price if the quantity fails to satisfy any of the volume price ranges" do | ||
@variant.volume_prices << mock_model(VolumePrice, :include? => false) | ||
@variant.volume_prices << mock_model(VolumePrice, :include? => false) | ||
@order.add_variant(@variant) | ||
@order.line_items.first.price.should == 10 | ||
end | ||
it "should use the first matching volume price in the event of more then one matching volume prices" do | ||
@variant.volume_prices << mock_model(VolumePrice, :include? => true, :amount => 9) | ||
@variant.volume_prices << mock_model(VolumePrice, :include? => true, :amount => 8) | ||
@order.add_variant(@variant) | ||
@order.line_items.first.price.should == 9 | ||
end | ||
end | ||
end |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
require File.dirname(__FILE__) + '/../spec_helper' | ||
|
||
describe VolumePrice do | ||
before(:each) do | ||
@volume_price = VolumePrice.new(:variant => Variant.new) | ||
end | ||
|
||
it "should not interepret a Ruby range as being opend ended" do | ||
@volume_price.range = "(1..2)" | ||
@volume_price.should_not be_open_ended | ||
end | ||
|
||
it "should properly interpret an open ended range" do | ||
@volume_price.range = "(50+)" | ||
@volume_price.should be_open_ended | ||
end | ||
|
||
describe "valid?" do | ||
it "should require the presence of a variant" do | ||
@volume_price.variant = nil | ||
@volume_price.should_not be_valid | ||
end | ||
it "should consider a range of (1..2) to be valid" do | ||
@volume_price.range = "(1..2)" | ||
@volume_price.should be_valid | ||
end | ||
it "should consider a range of (1...2) to be valid" do | ||
@volume_price.range = "(1...2)" | ||
@volume_price.should be_valid | ||
end | ||
it "should not consider a range of 1..2 to be valid" do | ||
@volume_price.range = "1..2" | ||
@volume_price.should_not be_valid | ||
end | ||
it "should not consider a range of 1...2 to be valid" do | ||
@volume_price.range = "1...2" | ||
@volume_price.should_not be_valid | ||
end | ||
it "should consider a range of (10+) to be valid" do | ||
@volume_price.range = "(10+)" | ||
@volume_price.should be_valid | ||
end | ||
it "should not consider a range of 10+ to be valid" do | ||
@volume_price.range = "10+" | ||
@volume_price.should_not be_valid | ||
end | ||
it "should not consider a range of 1-2 to valid" do | ||
@volume_price.range = "1-2" | ||
@volume_price.should_not be_valid | ||
end | ||
it "should not consider a range of 1 to valid" do | ||
@volume_price.range = "1" | ||
@volume_price.should_not be_valid | ||
end | ||
it "should not consider a range of foo to valid" do | ||
@volume_price.range = "foo" | ||
@volume_price.should_not be_valid | ||
end | ||
end | ||
|
||
describe "include?" do | ||
it "should not match a quantity that fails to fall within the specified range" do | ||
@volume_price.range = "(10..20)" | ||
@volume_price.should_not include(21) | ||
end | ||
it "should match a quantity that is within the specified range" do | ||
@volume_price.range = "(10..20)" | ||
@volume_price.should include(12) | ||
end | ||
it "should match the upper bound of ranges that include the upper bound" do | ||
@volume_price.range = "(10..20)" | ||
@volume_price.should include(20) | ||
end | ||
it "should not match the upper bound for ranges that exclude the upper bound" do | ||
@volume_price.range = "(10...20)" | ||
@volume_price.should_not include(20) | ||
end | ||
it "should match a quantity that exceeds the value of an open ended range" do | ||
@volume_price.range = "(50+)" | ||
@volume_price.should include(51) | ||
end | ||
it "should match a quantity that equals the value of an open ended range" do | ||
@volume_price.range = "(50+)" | ||
@volume_price.should include(50) | ||
end | ||
it "should not match a quantity that is less then the value of an open ended range" do | ||
@volume_price.range = "(50+)" | ||
@volume_price.should_not include(40) | ||
end | ||
end | ||
end |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
--colour | ||
--format | ||
progress | ||
--loadby | ||
mtime | ||
--reverse |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
unless defined? SPREE_ROOT | ||
ENV["RAILS_ENV"] = "test" | ||
case | ||
when ENV["SPREE_ENV_FILE"] | ||
require ENV["SPREE_ENV_FILE"] | ||
when File.dirname(__FILE__) =~ %r{vendor/SPREE/vendor/extensions} | ||
require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../../")}/config/environment" | ||
else | ||
require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../")}/config/environment" | ||
end | ||
end | ||
require "#{SPREE_ROOT}/spec/spec_helper" | ||
|
||
if File.directory?(File.dirname(__FILE__) + "/scenarios") | ||
Scenario.load_paths.unshift File.dirname(__FILE__) + "/scenarios" | ||
end | ||
if File.directory?(File.dirname(__FILE__) + "/matchers") | ||
Dir[File.dirname(__FILE__) + "/matchers/*.rb"].each {|file| require file } | ||
end | ||
|
||
Spec::Runner.configure do |config| | ||
# config.use_transactional_fixtures = true | ||
# config.use_instantiated_fixtures = false | ||
# config.fixture_path = RAILS_ROOT + '/spec/fixtures' | ||
|
||
# You can declare fixtures for each behaviour like this: | ||
# describe "...." do | ||
# fixtures :table_a, :table_b | ||
# | ||
# Alternatively, if you prefer to declare them only once, you can | ||
# do so here, like so ... | ||
# | ||
# config.global_fixtures = :table_a, :table_b | ||
# | ||
# If you declare global fixtures, be aware that they will be declared | ||
# for all of your examples, even those that don't use them. | ||
end |
Oops, something went wrong.