solidus_volume_pricing 1.0.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +50 -12
  3. data/.gem_release.yml +5 -0
  4. data/.github/dependabot.yml +7 -0
  5. data/.github/stale.yml +1 -0
  6. data/.github_changelog_generator +2 -0
  7. data/.gitignore +15 -7
  8. data/.rspec +1 -2
  9. data/.rubocop.yml +2 -7
  10. data/.rubocop_todo.yml +18 -76
  11. data/CHANGELOG.md +1 -55
  12. data/Gemfile +26 -12
  13. data/{LICENSE.md → LICENSE} +2 -2
  14. data/OLD_CHANGELOG.md +86 -0
  15. data/README.md +5 -5
  16. data/Rakefile +4 -19
  17. data/app/controllers/spree/admin/volume_price_models_controller.rb +1 -1
  18. data/app/decorators/models/solidus_volume_pricing/spree/variant_decorator.rb +6 -4
  19. data/app/models/spree/volume_price.rb +41 -41
  20. data/app/models/spree/volume_price_model.rb +9 -7
  21. data/app/views/spree/admin/volume_prices/_volume_price_fields.html.erb +5 -3
  22. data/bin/console +17 -0
  23. data/bin/rails +5 -6
  24. data/bin/rails-engine +13 -0
  25. data/bin/rails-sandbox +16 -0
  26. data/bin/rake +7 -0
  27. data/bin/sandbox +78 -0
  28. data/bin/setup +8 -0
  29. data/db/migrate/20150603143015_create_spree_volume_price_models.rb +1 -0
  30. data/lib/generators/solidus_volume_pricing/install/install_generator.rb +8 -4
  31. data/lib/solidus_volume_pricing/engine.rb +13 -3
  32. data/{spec/factories/volume_price_factory.rb → lib/solidus_volume_pricing/testing_support/factories.rb} +2 -2
  33. data/lib/solidus_volume_pricing/version.rb +1 -16
  34. data/lib/solidus_volume_pricing.rb +1 -0
  35. data/solidus_volume_pricing.gemspec +38 -29
  36. data/spec/controllers/spree/admin/variants_controller_spec.rb +1 -1
  37. data/spec/features/manage_volume_price_models_feature_spec.rb +3 -7
  38. data/spec/features/manage_volume_prices_feature_spec.rb +6 -7
  39. data/spec/lib/solidus_volume_pricing/range_from_string_spec.rb +2 -2
  40. data/spec/models/solidus_volume_pricing/pricer_spec.rb +0 -4
  41. data/spec/models/spree/line_item_spec.rb +0 -1
  42. data/spec/models/spree/volume_price_spec.rb +1 -10
  43. data/spec/spec_helper.rb +26 -5
  44. metadata +98 -30
  45. data/app/decorators/models/solidus_volume_pricing/spree/user_decorator.rb +0 -17
@@ -1,52 +1,52 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Spree::VolumePrice < ApplicationRecord
4
- belongs_to :variant, touch: true, optional: true
5
- belongs_to :volume_price_model, touch: true, optional: true
6
- belongs_to :spree_role, class_name: 'Spree::Role', foreign_key: 'role_id', optional: true
7
- acts_as_list scope: [:variant_id, :volume_price_model_id]
8
-
9
- validates :amount, presence: true
10
- validates :discount_type,
11
- presence: true,
12
- inclusion: {
13
- in: %w(price dollar percent)
14
- }
15
-
16
- validate :range_format
17
-
18
- def self.for_variant(variant, user: nil)
19
- roles = [nil]
20
- if user
21
- roles << user.resolve_role&.id
3
+ module Spree
4
+ class VolumePrice < ApplicationRecord
5
+ belongs_to :variant, touch: true, optional: true
6
+ belongs_to :volume_price_model, touch: true, optional: true
7
+ belongs_to :spree_role, class_name: 'Spree::Role', foreign_key: 'role_id', optional: true
8
+ acts_as_list scope: [:variant_id, :volume_price_model_id]
9
+
10
+ validates :amount, presence: true
11
+ validates :discount_type,
12
+ presence: true,
13
+ inclusion: {
14
+ in: %w(price dollar percent)
15
+ }
16
+
17
+ validate :range_format
18
+
19
+ def self.for_variant(variant, user: nil)
20
+ roles = [nil]
21
+ user&.spree_roles&.each { |r| roles << r.id }
22
+
23
+ where(
24
+ arel_table[:variant_id].eq(variant.id).
25
+ or(
26
+ arel_table[:volume_price_model_id].in(variant.volume_price_model_ids)
27
+ )
28
+ ).
29
+ where(role_id: roles).
30
+ order(position: :asc, amount: :asc)
22
31
  end
23
32
 
24
- where(
25
- arel_table[:variant_id].eq(variant.id).
26
- or(
27
- arel_table[:volume_price_model_id].in(variant.volume_price_model_ids)
28
- )
29
- ).
30
- where(role_id: roles).
31
- order(position: :asc, amount: :asc)
32
- end
33
-
34
- delegate :include?, to: :range_from_string
33
+ delegate :include?, to: :range_from_string
35
34
 
36
- def display_range
37
- range.gsub(/\.+/, "-").gsub(/\(|\)/, '')
38
- end
35
+ def display_range
36
+ range.gsub(/\.+/, "-").gsub(/\(|\)/, '')
37
+ end
39
38
 
40
- private
39
+ private
41
40
 
42
- def range_format
43
- if !(SolidusVolumePricing::RangeFromString::RANGE_FORMAT =~ range ||
44
- SolidusVolumePricing::RangeFromString::OPEN_ENDED =~ range)
45
- errors.add(:range, :must_be_in_format)
41
+ def range_format
42
+ if !(SolidusVolumePricing::RangeFromString::RANGE_FORMAT =~ range ||
43
+ SolidusVolumePricing::RangeFromString::OPEN_ENDED =~ range)
44
+ errors.add(:range, :must_be_in_format)
45
+ end
46
46
  end
47
- end
48
47
 
49
- def range_from_string
50
- SolidusVolumePricing::RangeFromString.new(range).to_range
48
+ def range_from_string
49
+ SolidusVolumePricing::RangeFromString.new(range).to_range
50
+ end
51
51
  end
52
52
  end
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Spree::VolumePriceModel < ApplicationRecord
4
- has_many :variants
5
- has_many :volume_prices, -> { order(position: :asc) }, dependent: :destroy
6
- accepts_nested_attributes_for :volume_prices, allow_destroy: true,
7
- reject_if: proc { |volume_price|
8
- volume_price[:amount].blank? && volume_price[:range].blank?
9
- }
3
+ module Spree
4
+ class VolumePriceModel < ApplicationRecord
5
+ has_many :variants, dependent: :nullify
6
+ has_many :volume_prices, -> { order(position: :asc) }, dependent: :destroy
7
+ accepts_nested_attributes_for :volume_prices, allow_destroy: true,
8
+ reject_if: proc { |volume_price|
9
+ volume_price[:amount].blank? && volume_price[:range].blank?
10
+ }
11
+ end
10
12
  end
@@ -27,7 +27,9 @@
27
27
  <%= error_message_on(f.object, :role_id) %>
28
28
  <%= f.collection_select(:role_id, Spree::Role.all, :id, :name, { include_blank: t('spree.match_choices.none') }, { class: 'custom-select' }) %>
29
29
  </td>
30
- <td class="actions">
31
- <%= link_to_remove_fields t('spree.remove'), f, no_text: true %>
32
- </td>
30
+ <% if f.object.persisted? %>
31
+ <td class="actions">
32
+ <%= link_to_delete f.object, url: admin_volume_price_url(f.object.id), no_text: true %>
33
+ </td>
34
+ <% end %>
33
35
  </tr>
data/bin/console ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # frozen_string_literal: true
4
+
5
+ require "bundler/setup"
6
+ require "solidus_volume_pricing"
7
+
8
+ # You can add fixtures and/or initialization code here to make experimenting
9
+ # with your gem easier. You can also use a different console, if you like.
10
+ $LOAD_PATH.unshift(*Dir["#{__dir__}/../app/*"])
11
+
12
+ # (If you use this, don't forget to add pry to your Gemfile!)
13
+ # require "pry"
14
+ # Pry.start
15
+
16
+ require "irb"
17
+ IRB.start(__FILE__)
data/bin/rails CHANGED
@@ -1,8 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
2
 
4
- ENGINE_ROOT = File.expand_path('..', __dir__)
5
- ENGINE_PATH = File.expand_path('../lib/solidus_volume_pricing/engine', __dir__)
6
-
7
- require 'rails/all'
8
- require 'rails/engine/commands'
3
+ if %w[g generate].include? ARGV.first
4
+ exec "#{__dir__}/rails-engine", *ARGV
5
+ else
6
+ exec "#{__dir__}/rails-sandbox", *ARGV
7
+ end
data/bin/rails-engine ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails gems
3
+ # installed from the root of your application.
4
+
5
+ ENGINE_ROOT = File.expand_path('..', __dir__)
6
+ ENGINE_PATH = File.expand_path('../lib/solidus_volume_pricing/engine', __dir__)
7
+
8
+ # Set up gems listed in the Gemfile.
9
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
10
+ require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
11
+
12
+ require 'rails/all'
13
+ require 'rails/engine/commands'
data/bin/rails-sandbox ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ app_root = 'sandbox'
4
+
5
+ unless File.exist? "#{app_root}/bin/rails"
6
+ warn 'Creating the sandbox app...'
7
+ Dir.chdir "#{__dir__}/.." do
8
+ system "#{__dir__}/sandbox" or begin
9
+ warn 'Automatic creation of the sandbox app failed'
10
+ exit 1
11
+ end
12
+ end
13
+ end
14
+
15
+ Dir.chdir app_root
16
+ exec 'bin/rails', *ARGV
data/bin/rake ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "rubygems"
5
+ require "bundler/setup"
6
+
7
+ load Gem.bin_path("rake", "rake")
data/bin/sandbox ADDED
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -e
4
+ test -z "${DEBUG+empty_string}" || set -x
5
+
6
+ test "$DB" = "sqlite" && export DB="sqlite3"
7
+
8
+ if [ -z "$SOLIDUS_BRANCH" ]
9
+ then
10
+ echo "~~> Use 'export SOLIDUS_BRANCH=[master|v3.2|...]' to control the Solidus branch"
11
+ SOLIDUS_BRANCH="master"
12
+ fi
13
+ echo "~~> Using branch $SOLIDUS_BRANCH of solidus"
14
+
15
+ if [ -z "$SOLIDUS_FRONTEND" ]
16
+ then
17
+ echo "~~> Use 'export SOLIDUS_FRONTEND=[solidus_frontend|solidus_starter_frontend]' to control the Solidus frontend"
18
+ SOLIDUS_FRONTEND="solidus_frontend"
19
+ fi
20
+ echo "~~> Using branch $SOLIDUS_FRONTEND as the solidus frontend"
21
+
22
+ extension_name="solidus_volume_pricing"
23
+
24
+ # Stay away from the bundler env of the containing extension.
25
+ function unbundled {
26
+ ruby -rbundler -e'b = proc {system *ARGV}; Bundler.respond_to?(:with_unbundled_env) ? Bundler.with_unbundled_env(&b) : Bundler.with_clean_env(&b)' -- $@
27
+ }
28
+
29
+ rm -rf ./sandbox
30
+ unbundled bundle exec rails new sandbox \
31
+ --database="${DB:-sqlite3}" \
32
+ --skip-bundle \
33
+ --skip-git \
34
+ --skip-keeps \
35
+ --skip-rc \
36
+ --skip-spring \
37
+ --skip-test \
38
+ --skip-javascript
39
+
40
+ if [ ! -d "sandbox" ]; then
41
+ echo 'sandbox rails application failed'
42
+ exit 1
43
+ fi
44
+
45
+ cd ./sandbox
46
+ cat <<RUBY >> Gemfile
47
+ gem 'solidus', github: 'solidusio/solidus', branch: '$SOLIDUS_BRANCH'
48
+ gem 'rails-i18n'
49
+ gem 'solidus_i18n'
50
+
51
+ gem '$extension_name', path: '..'
52
+
53
+ group :test, :development do
54
+ platforms :mri do
55
+ gem 'pry-byebug'
56
+ end
57
+ end
58
+ RUBY
59
+
60
+ unbundled bundle install --gemfile Gemfile
61
+
62
+ unbundled bundle exec rake db:drop db:create
63
+
64
+ unbundled bundle exec rails generate solidus:install \
65
+ --auto-accept \
66
+ --user_class=Spree::User \
67
+ --enforce_available_locales=true \
68
+ --with-authentication=true \
69
+ --payment-method=none \
70
+ --frontend=${SOLIDUS_FRONTEND} \
71
+ $@
72
+
73
+ unbundled bundle exec rails generate solidus:auth:install --auto-run-migrations
74
+ unbundled bundle exec rails generate ${extension_name}:install --auto-run-migrations
75
+
76
+ echo
77
+ echo "🚀 Sandbox app successfully created for $extension_name!"
78
+ echo "🧪 This app is intended for test purposes."
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ gem install bundler --conservative
7
+ bundle update
8
+ bin/rake clobber
@@ -10,6 +10,7 @@ class CreateSpreeVolumePriceModels < ActiveRecord::Migration[4.2]
10
10
  create_table :spree_variants_volume_price_models do |t|
11
11
  t.belongs_to :volume_price_model
12
12
  t.belongs_to :variant
13
+ t.timestamps
13
14
  end
14
15
 
15
16
  add_reference :spree_volume_prices, :volume_price_model
@@ -5,16 +5,20 @@ module SolidusVolumePricing
5
5
  class InstallGenerator < Rails::Generators::Base
6
6
  class_option :auto_run_migrations, type: :boolean, default: false
7
7
 
8
+ def self.exit_on_failure?
9
+ true
10
+ end
11
+
8
12
  def add_migrations
9
- run 'bundle exec rake railties:install:migrations FROM=solidus_volume_pricing'
13
+ run 'bin/rails railties:install:migrations FROM=solidus_volume_pricing'
10
14
  end
11
15
 
12
16
  def run_migrations
13
- run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask('Would you like to run the migrations now? [Y/n]'))
17
+ run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask('Would you like to run the migrations now? [Y/n]')) # rubocop:disable Layout/LineLength
14
18
  if run_migrations
15
- run 'bundle exec rake db:migrate'
19
+ run 'bin/rails db:migrate'
16
20
  else
17
- puts 'Skipping rake db:migrate, don\'t forget to run it!'
21
+ puts 'Skipping bin/rails db:migrate, don\'t forget to run it!' # rubocop:disable Rails/Output
18
22
  end
19
23
  end
20
24
  end
@@ -1,25 +1,35 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'spree/core'
4
+ require 'solidus_support'
5
+
3
6
  module SolidusVolumePricing
4
7
  class Engine < Rails::Engine
8
+ include SolidusSupport::EngineExtensions
9
+
5
10
  isolate_namespace ::Spree
11
+
6
12
  engine_name 'solidus_volume_pricing'
7
13
 
8
14
  initializer 'solidus_volume_pricing.preferences', before: 'spree.environment' do
9
15
  ::Spree::AppConfiguration.class_eval do
10
16
  preference :use_master_variant_volume_pricing, :boolean, default: false
11
- preference :volume_pricing_role, :string, default: 'wholesale'
12
17
  end
13
18
  end
14
19
 
15
20
  def self.activate
16
- Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
21
+ Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')).sort.each do |c|
17
22
  Rails.configuration.cache_classes ? require(c) : load(c)
23
+ Rails.autoloaders.main.ignore(c) if Rails.autoloaders.zeitwerk_enabled?
18
24
  end
19
25
  ::Spree::BackendConfiguration::CONFIGURATION_TABS << :volume_price_models
20
26
  end
21
27
 
22
- config.autoload_paths += %W(#{config.root}/lib)
23
28
  config.to_prepare(&method(:activate).to_proc)
29
+
30
+ # use rspec for tests
31
+ config.generators do |g|
32
+ g.test_framework :rspec
33
+ end
24
34
  end
25
35
  end
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  FactoryBot.define do
4
- factory :volume_price, class: Spree::VolumePrice do
4
+ factory :volume_price, class: 'Spree::VolumePrice' do
5
5
  amount { 10 }
6
6
  discount_type { 'price' }
7
7
  range { '(1..5)' }
8
8
  association :variant
9
9
  end
10
10
 
11
- factory :volume_price_model, class: Spree::VolumePriceModel do
11
+ factory :volume_price_model, class: 'Spree::VolumePriceModel' do
12
12
  name { 'name' }
13
13
  end
14
14
  end
@@ -1,20 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusVolumePricing
4
- module_function
5
-
6
- # Returns the version of the currently loaded SolidusVolumePricing as a
7
- # <tt>Gem::Version</tt>.
8
- def version
9
- Gem::Version.new VERSION::STRING
10
- end
11
-
12
- module VERSION
13
- MAJOR = 1
14
- MINOR = 0
15
- TINY = 0
16
- PRE = nil
17
-
18
- STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
19
- end
4
+ VERSION = '1.1.1'
20
5
  end
@@ -4,6 +4,7 @@ require 'active_support/deprecation'
4
4
  require 'sassc/rails'
5
5
  require 'deface'
6
6
  require 'solidus_core'
7
+ require 'solidus_support'
7
8
  require 'solidus_volume_pricing/engine'
8
9
  require 'solidus_volume_pricing/version'
9
10
  require 'solidus_volume_pricing/range_from_string'
@@ -1,32 +1,41 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- lib = File.expand_path('lib', __dir__)
4
- $LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
5
-
6
- require 'solidus_volume_pricing/version'
7
-
8
- Gem::Specification.new do |s|
9
- s.platform = Gem::Platform::RUBY
10
- s.name = 'solidus_volume_pricing'
11
- s.version = SolidusVolumePricing.version
12
- s.summary = 'Allow prices to be configured in quantity ranges for each variant'
13
- s.description = s.summary
14
- s.required_ruby_version = '>= 2.2.3'
15
-
16
- s.author = 'Sean Schofield'
17
- s.email = 'sean@railsdog.com'
18
- s.homepage = 'https://github.com/solidusio-contrib/solidus_volume_pricing'
19
- s.license = 'BSD-3'
20
-
21
- s.files = `git ls-files`.split("\n")
22
- s.test_files = `git ls-files -- spec/*`.split("\n")
23
- s.require_path = 'lib'
24
- s.requirements << 'none'
25
-
26
- s.add_runtime_dependency 'deface', '~> 1.0'
27
- s.add_runtime_dependency 'solidus_backend', '>= 2.0'
28
- s.add_runtime_dependency 'solidus_core', '>= 2.0'
29
-
30
- s.add_development_dependency 'shoulda-matchers'
31
- s.add_development_dependency 'solidus_extension_dev_tools'
3
+ require_relative 'lib/solidus_volume_pricing/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'solidus_volume_pricing'
7
+ spec.version = SolidusVolumePricing::VERSION
8
+ spec.authors = ['Sean Schofield']
9
+ spec.email = 'sean@railsdog.com'
10
+
11
+ spec.summary = 'Allow prices to be configured in quantity ranges for each variant'
12
+ spec.description = 'Allow prices to be configured in quantity ranges for each variant'
13
+ spec.homepage = 'https://github.com/solidusio-contrib/solidus_volume_pricing'
14
+ spec.license = 'BSD-3-Clause'
15
+
16
+ spec.metadata['homepage_uri'] = spec.homepage
17
+ spec.metadata['source_code_uri'] = 'https://github.com/solidusio-contrib/solidus_volume_pricing'
18
+ spec.metadata['changelog_uri'] = 'https://github.com/solidusio-contrib/solidus_volume_pricing/releases'
19
+
20
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.5', '< 4')
21
+
22
+ # Specify which files should be added to the gem when it is released.
23
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
24
+ files = Dir.chdir(__dir__) { `git ls-files -z`.split("\x0") }
25
+
26
+ spec.files = files.grep_v(%r{^(test|spec|features)/})
27
+ spec.test_files = files.grep(%r{^(test|spec|features)/})
28
+ spec.bindir = "exe"
29
+ spec.executables = files.grep(%r{^exe/}) { |f| File.basename(f) }
30
+ spec.require_paths = ["lib"]
31
+
32
+ spec.add_runtime_dependency 'solidus_backend', ['>= 2.4.0', '< 5']
33
+ spec.add_dependency 'coffee-rails'
34
+ spec.add_dependency 'deface'
35
+ spec.add_dependency 'sassc-rails'
36
+ spec.add_dependency 'solidus_core', ['>= 2.0.0', '< 5']
37
+ spec.add_dependency 'solidus_support', '~> 0.8'
38
+
39
+ spec.add_development_dependency 'shoulda-matchers'
40
+ spec.add_development_dependency 'solidus_dev_support', '~> 2.6'
32
41
  end
@@ -3,7 +3,7 @@
3
3
  RSpec.describe Spree::Admin::VariantsController, type: :controller do
4
4
  stub_authorization!
5
5
 
6
- context 'PUT #update' do
6
+ describe 'PUT #update' do
7
7
  it 'creates a volume price' do
8
8
  variant = create :variant
9
9
 
@@ -2,10 +2,10 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- RSpec.describe 'Managing volume price models' do
5
+ RSpec.describe 'Managing volume price models', type: :system do
6
6
  stub_authorization!
7
7
 
8
- it 'a admin can create and remove volume price models', :js do
8
+ it 'an admin can create and remove volume price models', :js do
9
9
  visit spree.admin_volume_price_models_path
10
10
  expect(page).to have_content('Volume Price Models')
11
11
 
@@ -19,10 +19,6 @@ RSpec.describe 'Managing volume price models' do
19
19
  end
20
20
  click_on 'Create'
21
21
 
22
- within 'tr.volume_price.fields' do
23
- expect(page).to have_field('volume_price_model_volume_prices_attributes_0_name', with: '5 pieces discount')
24
- page.find('a[data-action="remove"]').click
25
- expect(page).not_to have_field('volume_price_model_volume_prices_attributes_0_name', with: '5 pieces discount')
26
- end
22
+ expect(page).to have_content('Discount')
27
23
  end
28
24
  end
@@ -7,7 +7,7 @@ RSpec.describe 'Managing volume prices' do
7
7
 
8
8
  let(:variant) { create(:variant) }
9
9
 
10
- it 'a admin can create and remove volume prices', :js do
10
+ it 'an admin can create and remove volume prices', :js do
11
11
  visit spree.edit_admin_product_path(variant.product)
12
12
  click_on 'Volume Pricing'
13
13
  expect(page).to have_content('Volume Prices')
@@ -18,14 +18,13 @@ RSpec.describe 'Managing volume prices' do
18
18
  fill_in 'variant_volume_prices_attributes_0_amount', with: '1'
19
19
  click_on 'Update'
20
20
 
21
- within 'tr.volume_price.fields' do
22
- expect(page).to have_field('variant_volume_prices_attributes_0_name', with: '5 pieces discount')
23
- page.find('a[data-action="remove"]').click
24
- expect(page).not_to have_field('variant_volume_prices_attributes_0_name', with: '5 pieces discount')
25
- end
21
+ expect(page).to have_field('variant_volume_prices_attributes_0_name', with: '5 pieces discount')
22
+ accept_confirm { page.find('a[data-action="remove"]').click }
23
+
24
+ expect(page).not_to have_field('variant_volume_prices_attributes_0_name', with: '5 pieces discount')
26
25
  end
27
26
 
28
- it 'a admin editing a variant has a new volume price already built for her' do
27
+ it 'an admin editing a variant has a new volume price already built for her' do
29
28
  visit spree.edit_admin_product_variant_path(product_id: variant.product, id: variant)
30
29
  within '#volume_prices' do
31
30
  expect(page).to have_field('variant_volume_prices_attributes_0_name')
@@ -30,13 +30,13 @@ RSpec.describe SolidusVolumePricing::RangeFromString do
30
30
  it { is_expected.to eq(1...2) }
31
31
  end
32
32
 
33
- context 'with an open-ended string like #{x}+' do
33
+ context 'with an open-ended string like x+' do
34
34
  let(:argument) { '10+' }
35
35
 
36
36
  it { is_expected.to eq(10..Float::INFINITY) }
37
37
  end
38
38
 
39
- context 'with an open-ended string like #{x}+ and parens' do
39
+ context 'with an open-ended string like x+" and parens' do
40
40
  let(:argument) { '(10+)' }
41
41
 
42
42
  it { is_expected.to eq(10..Float::INFINITY) }
@@ -14,10 +14,6 @@ RSpec.describe SolidusVolumePricing::Pricer do
14
14
  let(:user) { create(:user) }
15
15
  let(:variant) { create(:variant, price: 10) }
16
16
 
17
- before do
18
- stub_spree_preferences(volume_pricing_role: role.name)
19
- end
20
-
21
17
  it 'inherits from default variant pricer' do
22
18
  expect(described_class < Spree::Variant::PriceSelector).to be(true)
23
19
  end
@@ -19,7 +19,6 @@ RSpec.describe Spree::LineItem, type: :model do
19
19
 
20
20
  it 'updates the line item price when the quantity changes to match a range and role matches' do
21
21
  order.user.spree_roles << role
22
- stub_spree_preferences(volume_pricing_role: role.name)
23
22
  expect(order.user.has_spree_role?(role.name.to_sym)).to be(true)
24
23
  variant.volume_prices.first.update(role_id: role.id)
25
24
  expect(line_item.price.to_f).to be(10.00)
@@ -11,12 +11,7 @@ RSpec.describe Spree::VolumePrice, type: :model do
11
11
  it { is_expected.to validate_presence_of(:discount_type) }
12
12
  it { is_expected.to validate_presence_of(:amount) }
13
13
 
14
- it do
15
- expect(subject).to \
16
- validate_inclusion_of(:discount_type).
17
- in_array(%w(price dollar percent)).
18
- with_message('shoulda-matchers test string is not a valid Volume Price Type')
19
- end
14
+ it { is_expected.to validate_inclusion_of(:discount_type).in_array(%w[price dollar percent]) }
20
15
 
21
16
  describe '.for_variant' do
22
17
  subject { described_class.for_variant(variant, user: user) }
@@ -44,10 +39,6 @@ RSpec.describe Spree::VolumePrice, type: :model do
44
39
  create_list(:volume_price, 2, variant: variant, role_id: role.id)
45
40
  end
46
41
 
47
- before do
48
- stub_spree_preferences(volume_pricing_role: role.name)
49
- end
50
-
51
42
  context 'whose role matches' do
52
43
  before do
53
44
  user.spree_roles = [role]