solidus_act_as_tenant 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.circleci/config.yml +62 -0
- data/.gem_release.yml +5 -0
- data/.github/stale.yml +1 -0
- data/.github_changelog_generator +2 -0
- data/.gitignore +21 -0
- data/.rspec +2 -0
- data/.rubocop.yml +5 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +47 -0
- data/LICENSE +26 -0
- data/README.md +100 -0
- data/Rakefile +7 -0
- data/app/decorators/spree/store_credit_decorator.rb +16 -0
- data/app/decorators/spree/variant_decorator.rb +22 -0
- data/app/models/spree/products_taxon.rb +9 -0
- data/app/models/spree/reimbursement_credit.rb +9 -0
- data/app/models/spree/tenant.rb +9 -0
- data/bin/console +17 -0
- data/bin/rails +7 -0
- data/bin/rails-engine +13 -0
- data/bin/rails-sandbox +16 -0
- data/bin/rake +7 -0
- data/bin/sandbox +76 -0
- data/bin/setup +8 -0
- data/config/locales/en.yml +4 -0
- data/config/routes.rb +5 -0
- data/db/migrate/20241204043609_add_tenant_id_to_solidus_tables.rb +100 -0
- data/db/migrate/20241204055845_update_spree_unique_indexes_with_tenant_scope.rb +17 -0
- data/db/migrate/20241204105318_create_spree_tenants.rb +15 -0
- data/lib/generators/solidus_act_as_tenant/install/install_generator.rb +38 -0
- data/lib/generators/solidus_act_as_tenant/install/templates/initializer.rb +8 -0
- data/lib/generators/solidus_act_as_tenant/install/templates/tenant_aware_models.yml +95 -0
- data/lib/solidus_act_as_tenant/configuration.rb +19 -0
- data/lib/solidus_act_as_tenant/engine.rb +23 -0
- data/lib/solidus_act_as_tenant/factories/preference_factory.rb +7 -0
- data/lib/solidus_act_as_tenant/factories/tenant_factory.rb +9 -0
- data/lib/solidus_act_as_tenant/tenant_aware.rb +50 -0
- data/lib/solidus_act_as_tenant/testing_support/factories.rb +5 -0
- data/lib/solidus_act_as_tenant/utils/tenant_selector.rb +74 -0
- data/lib/solidus_act_as_tenant/version.rb +5 -0
- data/lib/solidus_act_as_tenant.rb +8 -0
- data/solidus_act_as_tenant.gemspec +38 -0
- data/spec/lib/solidus_act_as_tenant/tenant_aware_spec.rb +48 -0
- data/spec/models/spree/store_credit_spec.rb +15 -0
- data/spec/models/spree/variant_spec.rb +37 -0
- data/spec/spec_helper.rb +32 -0
- data/spec/support/config.rb +21 -0
- metadata +177 -0
@@ -0,0 +1,15 @@
|
|
1
|
+
class CreateSpreeTenants < ActiveRecord::Migration[7.0]
|
2
|
+
def change
|
3
|
+
create_table :spree_tenants do |t|
|
4
|
+
t.string :name
|
5
|
+
t.string :subdomain # Only used if setting tenant by subdomain
|
6
|
+
t.string :domain # Only used if setting tenant by domain
|
7
|
+
|
8
|
+
t.timestamps
|
9
|
+
end
|
10
|
+
|
11
|
+
add_index :spree_tenants, :name, unique: true
|
12
|
+
add_index :spree_tenants, :subdomain, unique: true
|
13
|
+
add_index :spree_tenants, :domain, unique: true
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SolidusActAsTenant
|
4
|
+
module Generators
|
5
|
+
class InstallGenerator < Rails::Generators::Base
|
6
|
+
class_option :auto_run_migrations, type: :boolean, default: false
|
7
|
+
source_root File.expand_path('templates', __dir__)
|
8
|
+
|
9
|
+
def self.exit_on_failure?
|
10
|
+
true
|
11
|
+
end
|
12
|
+
|
13
|
+
def copy_initializer
|
14
|
+
template 'initializer.rb', 'config/initializers/solidus_act_as_tenant.rb'
|
15
|
+
end
|
16
|
+
|
17
|
+
def copy_config
|
18
|
+
template 'tenant_aware_models.yml', 'config/tenant_aware_models.yml'
|
19
|
+
end
|
20
|
+
|
21
|
+
def add_migrations
|
22
|
+
run 'bin/rails railties:install:migrations FROM=solidus_act_as_tenant'
|
23
|
+
end
|
24
|
+
|
25
|
+
def run_migrations
|
26
|
+
puts 'Remember to inspect and adapt the migration files before migrating!' # rubocop:disable Rails/Output
|
27
|
+
run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(
|
28
|
+
ask('Would you like to run the migrations now? [Y/n]')
|
29
|
+
)
|
30
|
+
if run_migrations
|
31
|
+
run 'bin/rails db:migrate'
|
32
|
+
else
|
33
|
+
puts 'Skipping bin/rails db:migrate, don\'t forget to run it!' # rubocop:disable Rails/Output
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
SolidusActAsTenant.configure do |config|
|
4
|
+
# This configuration is used to dynamically prepend existing models with the acts_as_tenant concern.
|
5
|
+
# See the tenant_aware_classes.yml file for inormation on how to configure this file.
|
6
|
+
config.tenant_aware_models =
|
7
|
+
YAML.safe_load(ERB.new(File.read(Rails.root.join('config/tenant_aware_models.yml'))).result)
|
8
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# Any model that is already defined and has an a tenant_id column can be added to this list.
|
2
|
+
# It is not restricted to the Solidus models so it can be used for any model that is inherited from a gem.
|
3
|
+
|
4
|
+
# It is importnant to also note that any unique indexes on the database will need to replaced with a unique index on scoped to the tenant_id column.
|
5
|
+
|
6
|
+
# Format:
|
7
|
+
# - [Class name, [uniqueness attributes to update with tenant scope]]
|
8
|
+
# The uniqueness attributes array are optional for cases where there is already a uniqueness validation on the model that are not scoped to the tenant_id column.
|
9
|
+
|
10
|
+
# Notes regarding Solidus models:
|
11
|
+
# These are are classes that are created in this extention because they are not defined in Solidus:
|
12
|
+
# [Spree::ProductTaxon, []],
|
13
|
+
# [Spree::ReimbursementCredit, []],
|
14
|
+
|
15
|
+
# These are classes that don't need a tenancy but may be desired:
|
16
|
+
# [Spree::Country, []],
|
17
|
+
# [Spree::State, []],
|
18
|
+
# [Spree::PermissionSet, []],
|
19
|
+
# [Spree::Role, [:name]],
|
20
|
+
# [Spree::RolePermission, []],
|
21
|
+
|
22
|
+
# These are not needed at all as they are internal to Solidus (and may cause issues):
|
23
|
+
# [Spree::OrderMutex, []],
|
24
|
+
|
25
|
+
|
26
|
+
---
|
27
|
+
- [<%= ::Spree.user_class.to_s %>, [email]]
|
28
|
+
- [Spree::Address, []]
|
29
|
+
- [Spree::AdjustmentReason, [name, code]]
|
30
|
+
- [Spree::Adjustment, []]
|
31
|
+
- [Spree::Asset, []]
|
32
|
+
- [Spree::Calculator, []]
|
33
|
+
- [Spree::Carton, []]
|
34
|
+
- [Spree::CreditCard, []]
|
35
|
+
- [Spree::CustomerReturn, []]
|
36
|
+
- [Spree::InventoryUnit, []]
|
37
|
+
- [Spree::LineItemAction, []]
|
38
|
+
- [Spree::LineItem, []]
|
39
|
+
- [Spree::LogEntry, []]
|
40
|
+
- [Spree::OptionType, [name]]
|
41
|
+
- [Spree::OptionValue, [name]]
|
42
|
+
- [Spree::OptionValuesVariant, []]
|
43
|
+
- [Spree::Order, []]
|
44
|
+
- [Spree::PaymentCaptureEvent, []]
|
45
|
+
- [Spree::PaymentMethod, []]
|
46
|
+
- [Spree::Payment, []]
|
47
|
+
- [Spree::Preference, [key]]
|
48
|
+
- [Spree::Price, []]
|
49
|
+
- [Spree::ProductOptionType, []]
|
50
|
+
- [Spree::ProductProperty, []]
|
51
|
+
- [Spree::Product, [slug]]
|
52
|
+
- [Spree::Property, []]
|
53
|
+
- [Spree::RefundReason, [name]]
|
54
|
+
- [Spree::Refund, []]
|
55
|
+
- [Spree::ReimbursementType, [name]]
|
56
|
+
- [Spree::Reimbursement, []]
|
57
|
+
- [Spree::ReturnAuthorization, []]
|
58
|
+
- [Spree::ReturnItem, []]
|
59
|
+
- [Spree::ReturnReason, []]
|
60
|
+
- [Spree::RoleUser, []]
|
61
|
+
- [Spree::Shipment, []]
|
62
|
+
- [Spree::ShippingCategory, []]
|
63
|
+
- [Spree::ShippingMethodCategory, []]
|
64
|
+
- [Spree::ShippingMethodStockLocation, []]
|
65
|
+
- [Spree::ShippingMethodZone, []]
|
66
|
+
- [Spree::ShippingMethod, []]
|
67
|
+
- [Spree::ShippingRateTax, []]
|
68
|
+
- [Spree::StateChange, []]
|
69
|
+
- [Spree::ShippingRate, []]
|
70
|
+
- [Spree::StockItem, []]
|
71
|
+
- [Spree::StockLocation, [code]]
|
72
|
+
- [Spree::StockMovement, []]
|
73
|
+
- [Spree::StoreCreditCategory, []]
|
74
|
+
- [Spree::StoreCreditEvent, []]
|
75
|
+
- [Spree::StoreCreditType, []]
|
76
|
+
- [Spree::StoreCredit, []]
|
77
|
+
- [Spree::StorePaymentMethod, []]
|
78
|
+
- [Spree::Store, [code]]
|
79
|
+
- [Spree::StoreShippingMethod, []]
|
80
|
+
- [Spree::StoreCreditReason, [name]]
|
81
|
+
- [Spree::TaxCategory, [name]]
|
82
|
+
- [Spree::Taxonomy, [name]]
|
83
|
+
- [Spree::Taxon, []]
|
84
|
+
- [Spree::TaxRate, []]
|
85
|
+
- [Spree::TaxRateTaxCategory, []]
|
86
|
+
- [Spree::UnitCancel, []]
|
87
|
+
- [Spree::UserAddress, []]
|
88
|
+
- [Spree::UserStockLocation, []]
|
89
|
+
- [Spree::VariantPropertyRuleCondition, []]
|
90
|
+
- [Spree::VariantPropertyRuleValue, []]
|
91
|
+
- [Spree::VariantPropertyRule, []]
|
92
|
+
- [Spree::Variant, [sku]]
|
93
|
+
- [Spree::WalletPaymentSource, []]
|
94
|
+
- [Spree::ZoneMember, []]
|
95
|
+
- [Spree::Zone, [name]]
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SolidusActAsTenant
|
4
|
+
class Configuration
|
5
|
+
attr_accessor :tenant_aware_models
|
6
|
+
end
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def configuration
|
10
|
+
@configuration ||= Configuration.new
|
11
|
+
end
|
12
|
+
|
13
|
+
alias config configuration
|
14
|
+
|
15
|
+
def configure
|
16
|
+
yield configuration
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'solidus_core'
|
4
|
+
require 'solidus_support'
|
5
|
+
|
6
|
+
module SolidusActAsTenant
|
7
|
+
class Engine < Rails::Engine
|
8
|
+
include SolidusSupport::EngineExtensions
|
9
|
+
|
10
|
+
isolate_namespace ::Spree
|
11
|
+
|
12
|
+
engine_name 'solidus_act_as_tenant'
|
13
|
+
|
14
|
+
# use rspec for tests
|
15
|
+
config.generators do |g|
|
16
|
+
g.test_framework :rspec
|
17
|
+
end
|
18
|
+
|
19
|
+
config.after_initialize do
|
20
|
+
SolidusActAsTenant::TenantAware.setup_tenant_aware_models
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SolidusActAsTenant
|
4
|
+
# TenantAware automatically adds multi-tenant support to models
|
5
|
+
# by adding tenant scoping and updating uniqueness validations to be tenant-aware.
|
6
|
+
module TenantAware
|
7
|
+
class << self
|
8
|
+
def setup_tenant_aware_models
|
9
|
+
tenant_aware_models = SolidusActAsTenant.config.tenant_aware_models || []
|
10
|
+
|
11
|
+
tenant_aware_models.each do |klass, validator_attributes|
|
12
|
+
Module.new do
|
13
|
+
@validator_attributes = validator_attributes
|
14
|
+
define_singleton_method(:prepended) do |base|
|
15
|
+
base.acts_as_tenant :tenant, class_name: 'Spree::Tenant'
|
16
|
+
|
17
|
+
@validator_attributes&.each do |attribute|
|
18
|
+
TenantAware.update_uniqueness_validation(base, attribute)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
klass.constantize.prepend(self)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def update_uniqueness_validation(base, attribute)
|
28
|
+
attribute = attribute.to_sym
|
29
|
+
validator = base._validators[attribute].find { _1.kind == :uniqueness }
|
30
|
+
raise "No uniqueness validator found for #{attribute} on #{base}" unless validator
|
31
|
+
|
32
|
+
new_options = validator.options.dup
|
33
|
+
new_options[:scope] = Array(new_options[:scope]).push(:tenant_id)
|
34
|
+
|
35
|
+
remove_existing_validation(base, attribute)
|
36
|
+
base.validates_uniqueness_of attribute, **new_options
|
37
|
+
end
|
38
|
+
|
39
|
+
def remove_existing_validation(base, attribute)
|
40
|
+
base._validators[attribute].reject! { _1.kind == :uniqueness }
|
41
|
+
base._validate_callbacks.each do |callback|
|
42
|
+
next unless callback.filter.try(:attributes)&.include?(attribute) &&
|
43
|
+
callback.filter.kind == :uniqueness
|
44
|
+
|
45
|
+
callback.filter.attributes.delete(attribute)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SolidusActAsTenant
|
4
|
+
module Utils
|
5
|
+
class TenantSelector
|
6
|
+
MESSAGES = {
|
7
|
+
available: "Available tenants: %<tenants>s",
|
8
|
+
prompt: "Select tenant: ",
|
9
|
+
not_found: "Tenant not found in list '%<tenants>s'",
|
10
|
+
current: "You are now Tenant '%<name>s'"
|
11
|
+
}.freeze
|
12
|
+
|
13
|
+
def ask
|
14
|
+
return if tenants.empty?
|
15
|
+
|
16
|
+
puts format(MESSAGES[:available], tenants: tenants) # rubocop:disable Rails/Output
|
17
|
+
print MESSAGES[:prompt] # rubocop:disable Rails/Output
|
18
|
+
|
19
|
+
tenant_name = ENV["DEFAULT_TENANT"] || gets.strip
|
20
|
+
switch_tenant!(tenant_name) unless tenant_name.empty?
|
21
|
+
end
|
22
|
+
|
23
|
+
def tenants
|
24
|
+
@tenants ||= fetch_tenants
|
25
|
+
end
|
26
|
+
|
27
|
+
def switch_tenant!(tenant_name)
|
28
|
+
if exists?(tenant_name)
|
29
|
+
switch(tenant_name)
|
30
|
+
elsif numeric_tenant?(tenant_name)
|
31
|
+
switch(tenants[tenant_name.to_i])
|
32
|
+
else
|
33
|
+
puts format(MESSAGES[:not_found], tenants: tenants) # rubocop:disable Rails/Output
|
34
|
+
return false
|
35
|
+
end
|
36
|
+
|
37
|
+
puts format(MESSAGES[:current], name: current) # rubocop:disable Rails/Output
|
38
|
+
true
|
39
|
+
end
|
40
|
+
|
41
|
+
def current
|
42
|
+
ActsAsTenant.current_tenant&.name
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def fetch_tenants
|
48
|
+
[*tenant_names].uniq
|
49
|
+
.each_with_index
|
50
|
+
.to_h { |name, index| [index, name] }
|
51
|
+
end
|
52
|
+
|
53
|
+
def tenant_names
|
54
|
+
@tenant_names ||= ::Spree::Tenant.pluck(:name).sort
|
55
|
+
end
|
56
|
+
|
57
|
+
def switch(tenant_name)
|
58
|
+
return false unless tenants.value?(tenant_name)
|
59
|
+
|
60
|
+
tenant = ::Spree::Tenant.find_by(name: tenant_name)
|
61
|
+
ActsAsTenant.current_tenant = tenant
|
62
|
+
true
|
63
|
+
end
|
64
|
+
|
65
|
+
def exists?(tenant_name)
|
66
|
+
tenant_names.include?(tenant_name)
|
67
|
+
end
|
68
|
+
|
69
|
+
def numeric_tenant?(tenant_name)
|
70
|
+
tenant_name =~ /^\d+$/ && tenants.key?(tenant_name.to_i)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'acts_as_tenant'
|
4
|
+
require 'solidus_act_as_tenant/tenant_aware'
|
5
|
+
require 'solidus_act_as_tenant/utils/tenant_selector'
|
6
|
+
require 'solidus_act_as_tenant/configuration'
|
7
|
+
require 'solidus_act_as_tenant/version'
|
8
|
+
require 'solidus_act_as_tenant/engine'
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'lib/solidus_act_as_tenant/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'solidus_act_as_tenant'
|
7
|
+
spec.version = SolidusActAsTenant::VERSION
|
8
|
+
spec.authors = ['Ikraam Ghoor']
|
9
|
+
spec.email = 'consult.ikraam@gmail.com'
|
10
|
+
|
11
|
+
spec.summary = 'Adds tenant functionality to solidus using the row level acts_as_tenant gem'
|
12
|
+
spec.description = 'Adds tenant functionality to solidus using the row level acts_as_tenant gem'
|
13
|
+
spec.homepage = 'https://github.com/solidusio-contrib/solidus_act_as_tenant#readme'
|
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_act_as_tenant'
|
18
|
+
spec.metadata['changelog_uri'] = 'https://github.com/solidusio-contrib/solidus_act_as_tenant/blob/main/CHANGELOG.md'
|
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_dependency 'acts_as_tenant', '~> 1.0.1'
|
33
|
+
spec.add_dependency 'solidus_core', ['>= 2.0.0', '< 5']
|
34
|
+
spec.add_dependency 'solidus_support', '~> 0.5'
|
35
|
+
|
36
|
+
spec.add_development_dependency 'pry'
|
37
|
+
spec.add_development_dependency 'solidus_dev_support', '~> 2.9'
|
38
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
describe SolidusActAsTenant::TenantAware do
|
2
|
+
describe '#setup_tenant_aware_models' do
|
3
|
+
let!(:tenant) { Spree::Tenant.find_or_create_by!(name: 'Test') }
|
4
|
+
let!(:tenant2) { create(:tenant, name: 'Test2') }
|
5
|
+
|
6
|
+
SolidusActAsTenant.config.tenant_aware_models.each do |klass, validator_attributes|
|
7
|
+
describe "for #{klass}" do
|
8
|
+
it 'has a tenant accessor and the current tenant is already set', set_tenant: true do
|
9
|
+
expect(klass.constantize.new.tenant).to eq tenant
|
10
|
+
end
|
11
|
+
|
12
|
+
validator_attributes.each do |attribute|
|
13
|
+
it "validates uniqueness of #{attribute}", set_tenant: true do
|
14
|
+
entry = create(klass.demodulize.underscore.downcase.to_sym, attribute => 'test@test.com')
|
15
|
+
duplicate = entry.dup
|
16
|
+
|
17
|
+
if klass == 'Spree::Product'
|
18
|
+
duplicate.master = entry.master
|
19
|
+
duplicate.slug = entry.slug
|
20
|
+
end
|
21
|
+
|
22
|
+
duplicate.valid?
|
23
|
+
|
24
|
+
expect(duplicate.errors[attribute]).to include('has already been taken')
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'allows duplicate values across different tenants' do
|
28
|
+
::ActsAsTenant.current_tenant = tenant
|
29
|
+
entry = create(klass.demodulize.underscore.downcase.to_sym, attribute => 'test@test.com',
|
30
|
+
tenant: tenant)
|
31
|
+
duplicate = entry.dup
|
32
|
+
|
33
|
+
if klass == 'Spree::Product'
|
34
|
+
duplicate.master = entry.master
|
35
|
+
duplicate.slug = entry.slug
|
36
|
+
end
|
37
|
+
|
38
|
+
::ActsAsTenant.current_tenant = tenant2
|
39
|
+
duplicate.tenant = tenant2
|
40
|
+
duplicate.valid?
|
41
|
+
|
42
|
+
expect(duplicate.errors[attribute]).to be_empty
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe Spree::StoreCredit, set_tenant: true do
|
4
|
+
describe '#shipping_category' do
|
5
|
+
let(:store_credit) { described_class.new }
|
6
|
+
|
7
|
+
it 'does not raise an error when #payment_method_id is called' do
|
8
|
+
expect { store_credit.payment_method_id }.not_to raise_error
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'returns nil for #payment_method_id' do
|
12
|
+
expect(store_credit.payment_method_id).to be_nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe Spree::Variant, set_tenant: true do
|
4
|
+
describe '#shipping_category' do
|
5
|
+
let(:variant) { described_class.new }
|
6
|
+
let(:shipping_category) { create(:shipping_category) }
|
7
|
+
let(:product) { create(:product, shipping_category: shipping_category) }
|
8
|
+
|
9
|
+
it 'returns nil for shipping_category when not set' do
|
10
|
+
expect(variant.shipping_category).to be_nil
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'returns nil for shipping_category_id when not set' do
|
14
|
+
expect(variant.shipping_category_id).to be_nil
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'returns the product shipping category when the variant shipping category is nil' do
|
18
|
+
variant.product = product
|
19
|
+
expect(variant.shipping_category).to eq(product.shipping_category)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'returns the product shipping category id when the variant shipping category is nil' do
|
23
|
+
variant.product = product
|
24
|
+
expect(variant.shipping_category_id).to eq(product.shipping_category_id)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'returns the correct shipping category id when the variant shipping category is set' do
|
28
|
+
variant.shipping_category = shipping_category
|
29
|
+
expect(variant.shipping_category_id).to eq(shipping_category.id)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'returns the correct shipping category when the variant shipping category is set' do
|
33
|
+
variant.shipping_category = shipping_category
|
34
|
+
expect(variant.shipping_category).to eq(shipping_category)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Configure Rails Environment
|
4
|
+
ENV['RAILS_ENV'] = 'test'
|
5
|
+
|
6
|
+
# Run Coverage report
|
7
|
+
require 'solidus_dev_support/rspec/coverage'
|
8
|
+
|
9
|
+
# Create the dummy app if it's still missing.
|
10
|
+
dummy_env = "#{__dir__}/dummy/config/environment.rb"
|
11
|
+
system 'bin/rake extension:test_app' unless File.exist? dummy_env
|
12
|
+
require dummy_env
|
13
|
+
|
14
|
+
# Requires factories and other useful helpers defined in spree_core.
|
15
|
+
require 'solidus_dev_support/rspec/feature_helper'
|
16
|
+
|
17
|
+
# Requires supporting ruby files with custom matchers and macros, etc,
|
18
|
+
# in spec/support/ and its subdirectories.
|
19
|
+
Dir["#{__dir__}/support/**/*.rb"].sort.each { |f| require f }
|
20
|
+
|
21
|
+
# Requires factories defined in Solidus core and this extension.
|
22
|
+
# See: lib/solidus_act_as_tenant/testing_support/factories.rb
|
23
|
+
SolidusDevSupport::TestingSupport::Factories.load_for(SolidusActAsTenant::Engine)
|
24
|
+
|
25
|
+
RSpec.configure do |config|
|
26
|
+
config.infer_spec_type_from_file_location!
|
27
|
+
config.use_transactional_fixtures = false
|
28
|
+
|
29
|
+
if Spree.solidus_gem_version < Gem::Version.new('2.11')
|
30
|
+
config.extend Spree::TestingSupport::AuthorizationHelpers::Request, type: :system
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'pry'
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
config.before(:each, set_tenant: true) do
|
7
|
+
unless ::ActsAsTenant.current_tenant
|
8
|
+
::ActsAsTenant.current_tenant = Spree::Tenant.find_or_create_by!(name: 'Test')
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
config.before(:suite, set_tenant: true) do
|
13
|
+
unless ::ActsAsTenant.current_tenant
|
14
|
+
::ActsAsTenant.current_tenant = Spree::Tenant.find_or_create_by!(name: 'Test')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
config.after do
|
19
|
+
::ActsAsTenant.current_tenant = nil
|
20
|
+
end
|
21
|
+
end
|