spree_drop_ship 3.1.0.1

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.
Files changed (96) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/Gemfile +9 -0
  4. data/LICENSE +21 -0
  5. data/README.md +116 -0
  6. data/Rakefile +15 -0
  7. data/Versionfile +6 -0
  8. data/app/assets/javascripts/spree/backend/spree_drop_ship.js +2 -0
  9. data/app/assets/javascripts/spree/frontend/spree_drop_ship.js +1 -0
  10. data/app/assets/stylesheets/spree/backend/spree_drop_ship.scss +22 -0
  11. data/app/assets/stylesheets/spree/frontend/spree_drop_ship.css +3 -0
  12. data/app/controllers/ckeditor/attachment_files_controller_decorator.rb +20 -0
  13. data/app/controllers/ckeditor/pictures_controller_decorator.rb +17 -0
  14. data/app/controllers/spree/admin/drop_ship_settings_controller.rb +19 -0
  15. data/app/controllers/spree/admin/products_controller_decorator.rb +19 -0
  16. data/app/controllers/spree/admin/shipments_controller.rb +47 -0
  17. data/app/controllers/spree/admin/stock_locations_controller_decorator.rb +14 -0
  18. data/app/controllers/spree/admin/suppliers_controller.rb +32 -0
  19. data/app/controllers/spree/api/v1/stock_locations_controller_decorator.rb +18 -0
  20. data/app/controllers/spree/base_controller_decorator.rb +23 -0
  21. data/app/mailers/spree/drop_ship_order_mailer.rb +13 -0
  22. data/app/mailers/spree/supplier_mailer.rb +12 -0
  23. data/app/models/ckeditor/asset_decorator.rb +5 -0
  24. data/app/models/spree/drop_ship_configuration.rb +17 -0
  25. data/app/models/spree/order_decorator.rb +27 -0
  26. data/app/models/spree/payment_decorator.rb +7 -0
  27. data/app/models/spree/product_decorator.rb +32 -0
  28. data/app/models/spree/shipment_decorator.rb +39 -0
  29. data/app/models/spree/stock/splitter/drop_ship.rb +42 -0
  30. data/app/models/spree/stock_location_decorator.rb +18 -0
  31. data/app/models/spree/supplier.rb +117 -0
  32. data/app/models/spree/supplier_ability.rb +28 -0
  33. data/app/models/spree/supplier_variant.rb +6 -0
  34. data/app/models/spree/user_decorator.rb +11 -0
  35. data/app/models/spree/variant_decorator.rb +24 -0
  36. data/app/models/spree.rb +5 -0
  37. data/app/overrides/spree/admin/products/_form/converted_admin_product_form_right.html.erb.deface +5 -0
  38. data/app/overrides/spree/admin/products/index/override_rows.html.erb.deface +22 -0
  39. data/app/overrides/spree/admin/shared/sub_menu/_configuration/add_drop_ship_settings.html.erb.deface +3 -0
  40. data/app/overrides/spree/admin/stock_locations/_form/add_supplier.html.erb.deface +12 -0
  41. data/app/overrides/spree/admin/stock_movements/_form/fix_bootstrap_form.html.erb.deface +11 -0
  42. data/app/overrides/spree/layouts/admin/add_profile_admin_tabs.html.erb.deface +8 -0
  43. data/app/overrides/spree/layouts/admin/converted_admin_tabs.html.erb.deface +18 -0
  44. data/app/views/spree/admin/drop_ship_settings/edit.html.erb +21 -0
  45. data/app/views/spree/admin/shared/_header.html.erb +24 -0
  46. data/app/views/spree/admin/shipments/edit.html.erb +24 -0
  47. data/app/views/spree/admin/shipments/index.html.erb +95 -0
  48. data/app/views/spree/admin/suppliers/_form.html.erb +69 -0
  49. data/app/views/spree/admin/suppliers/edit.html.erb +22 -0
  50. data/app/views/spree/admin/suppliers/index.html.erb +71 -0
  51. data/app/views/spree/admin/suppliers/new.html.erb +17 -0
  52. data/app/views/spree/drop_ship_order_mailer/supplier_order.html.erb +119 -0
  53. data/app/views/spree/shared/unauthorized.erb +1 -0
  54. data/app/views/spree/supplier_mailer/welcome.html.erb +53 -0
  55. data/config/locales/en.yml +89 -0
  56. data/config/locales/es.yml +133 -0
  57. data/config/routes.rb +9 -0
  58. data/db/migrate/20121006073854_create_suppliers.rb +20 -0
  59. data/db/migrate/20130216070944_product_belongs_to_supplier.rb +6 -0
  60. data/db/migrate/20130405005502_stock_locations_belongs_to_supplier.rb +6 -0
  61. data/db/migrate/20130405011127_user_belongs_to_supplier.rb +6 -0
  62. data/db/migrate/20130428063053_add_balanced_token_to_suppliers.rb +7 -0
  63. data/db/migrate/20130510181443_add_supplier_id_to_ckeditor_assets.rb +8 -0
  64. data/db/migrate/20130606220913_add_permalink_to_suppliers.rb +6 -0
  65. data/db/migrate/20140323170638_add_supplier_commission_to_shipments.rb +5 -0
  66. data/db/migrate/20140416184616_migrate_payment_and_commission.rb +7 -0
  67. data/db/migrate/20140529041325_create_spree_supplier_variants.rb +15 -0
  68. data/lib/generators/spree_drop_ship/install/install_generator.rb +30 -0
  69. data/lib/spree_drop_ship/engine.rb +31 -0
  70. data/lib/spree_drop_ship/factories.rb +93 -0
  71. data/lib/spree_drop_ship.rb +6 -0
  72. data/lib/tasks/spree_sample.rake +72 -0
  73. data/script/rails +7 -0
  74. data/spec/features/admin/orders_spec.rb +12 -0
  75. data/spec/features/admin/products_spec.rb +25 -0
  76. data/spec/features/admin/return_authorizations_spec.rb +7 -0
  77. data/spec/features/admin/settings_spec.rb +33 -0
  78. data/spec/features/admin/shipments_spec.rb +80 -0
  79. data/spec/features/admin/stock_management_spec.rb +153 -0
  80. data/spec/features/admin/stock_spec.rb +98 -0
  81. data/spec/features/admin/suppliers_spec.rb +126 -0
  82. data/spec/models/spree/order_decorator_spec.rb +54 -0
  83. data/spec/models/spree/payment_decorator_spec.rb +7 -0
  84. data/spec/models/spree/product_decorator_spec.rb +13 -0
  85. data/spec/models/spree/shipment_decorator_spec.rb +47 -0
  86. data/spec/models/spree/stock/splitter/drop_ship_spec.rb +62 -0
  87. data/spec/models/spree/stock_location_decorator_spec.rb +33 -0
  88. data/spec/models/spree/supplier_ability_spec.rb +172 -0
  89. data/spec/models/spree/supplier_spec.rb +123 -0
  90. data/spec/models/spree/supplier_variant_spec.rb +5 -0
  91. data/spec/models/spree/user_decorator_spec.rb +17 -0
  92. data/spec/models/spree/variant_decorator_spec.rb +7 -0
  93. data/spec/spec_helper.rb +79 -0
  94. data/spec/support/integration_helpers.rb +15 -0
  95. data/spree_drop_ship.gemspec +42 -0
  96. metadata +411 -0
@@ -0,0 +1,126 @@
1
+ require 'spec_helper'
2
+
3
+ feature 'Admin - Suppliers', js: true do
4
+
5
+ before do
6
+ country = create(:country, name: "United States")
7
+ create(:state, name: "Vermont", country: country)
8
+ @supplier = create :supplier
9
+ end
10
+
11
+ context 'as an Admin' do
12
+
13
+ before do
14
+ login_user create(:admin_user)
15
+ visit spree.admin_path
16
+ within '[data-hook=admin_tabs]' do
17
+ click_link 'Suppliers'
18
+ end
19
+ page.should have_content('Listing Suppliers')
20
+ end
21
+
22
+ scenario 'should be able to create new supplier' do
23
+ click_link 'New Supplier'
24
+ check 'supplier_active'
25
+ fill_in 'supplier[name]', with: 'Test Supplier'
26
+ fill_in 'supplier[email]', with: 'spree@example.com'
27
+ fill_in 'supplier[url]', with: 'http://www.test.com'
28
+ fill_in 'supplier[commission_flat_rate]', with: '0'
29
+ fill_in 'supplier[commission_percentage]', with: '0'
30
+ fill_in 'supplier[address_attributes][firstname]', with: 'First'
31
+ fill_in 'supplier[address_attributes][lastname]', with: 'Last'
32
+ fill_in 'supplier[address_attributes][address1]', with: '1 Test Drive'
33
+ fill_in 'supplier[address_attributes][city]', with: 'Test City'
34
+ fill_in 'supplier[address_attributes][zipcode]', with: '55555'
35
+ select2 'United States', from: 'Country'
36
+ select2 'Vermont', from: 'State'
37
+ fill_in 'supplier[address_attributes][phone]', with: '555-555-5555'
38
+ click_button 'Create'
39
+ page.should have_content('Supplier "Test Supplier" has been successfully created!')
40
+ end
41
+
42
+ scenario 'should be able to delete supplier' do
43
+ click_icon 'delete'
44
+ page.driver.browser.switch_to.alert.accept
45
+ within 'table' do
46
+ page.should_not have_content(@supplier.name)
47
+ end
48
+ end
49
+
50
+ scenario 'should be able to edit supplier' do
51
+ click_icon 'edit'
52
+ check 'supplier_active'
53
+ fill_in 'supplier[name]', with: 'Test Supplier'
54
+ fill_in 'supplier[email]', with: 'spree@example.com'
55
+ fill_in 'supplier[url]', with: 'http://www.test.com'
56
+ fill_in 'supplier[commission_flat_rate]', with: '0'
57
+ fill_in 'supplier[commission_percentage]', with: '0'
58
+ fill_in 'supplier[address_attributes][firstname]', with: 'First'
59
+ fill_in 'supplier[address_attributes][lastname]', with: 'Last'
60
+ fill_in 'supplier[address_attributes][address1]', with: '1 Test Drive'
61
+ fill_in 'supplier[address_attributes][city]', with: 'Test City'
62
+ fill_in 'supplier[address_attributes][zipcode]', with: '55555'
63
+ select2 'United States', from: 'Country'
64
+ select2 'Vermont', from: 'State'
65
+ fill_in 'supplier[address_attributes][phone]', with: '555-555-5555'
66
+ click_button 'Update'
67
+ page.should have_content('Supplier "Test Supplier" has been successfully updated!')
68
+ end
69
+
70
+ end
71
+
72
+ context 'as a Supplier' do
73
+ before do
74
+ @user = create(:supplier_user)
75
+ login_user @user
76
+ visit spree.edit_admin_supplier_path(@user.supplier)
77
+ end
78
+
79
+ scenario 'should only see tabs they have access to' do
80
+ within '[data-hook=admin_tabs]' do
81
+ page.should_not have_link('Overview')
82
+ page.should have_link('Products')
83
+ page.should_not have_link('Reports')
84
+ page.should_not have_link('Configuration')
85
+ page.should_not have_link('Promotions')
86
+ page.should_not have_link('Suppliers')
87
+ page.should have_link('Shipments')
88
+ end
89
+ end
90
+
91
+ scenario 'should be able to update supplier' do
92
+ fill_in 'supplier[name]', with: 'Test Supplier'
93
+ fill_in 'supplier[email]', with: @user.email
94
+ fill_in 'supplier[url]', with: 'http://www.test.com'
95
+ fill_in 'supplier[address_attributes][firstname]', with: 'First'
96
+ fill_in 'supplier[address_attributes][lastname]', with: 'Last'
97
+ fill_in 'supplier[address_attributes][address1]', with: '1 Test Drive'
98
+ fill_in 'supplier[address_attributes][city]', with: 'Test City'
99
+ fill_in 'supplier[address_attributes][zipcode]', with: '55555'
100
+ select2 'United States', from: 'Country'
101
+ select2 'Vermont', from: 'State'
102
+ fill_in 'supplier[address_attributes][phone]', with: '555-555-5555'
103
+ page.should_not have_css('#supplier_active') # cannot edit active
104
+ page.should_not have_css('#supplier_featured') # cannot edit featured
105
+ page.should_not have_css('#s2id_supplier_user_ids') # cannot edit assigned users
106
+ page.should_not have_css('#supplier_commission_flat_rate') # cannot edit flat rate commission
107
+ page.should_not have_css('#supplier_commission_percentage') # cannot edit comission percentage
108
+ click_button 'Update'
109
+ page.should have_content('Supplier "Test Supplier" has been successfully updated!')
110
+ page.current_path.should eql(spree.edit_admin_supplier_path(@user.reload.supplier))
111
+ end
112
+
113
+ end
114
+
115
+ context 'as a User other than the suppliers' do
116
+
117
+ scenario 'should be unauthorized' do
118
+ supplier = create(:supplier)
119
+ login_user create(:user)
120
+ visit spree.edit_admin_supplier_path(supplier)
121
+ page.should have_content('Authorization Failure')
122
+ end
123
+
124
+ end
125
+
126
+ end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Order do
4
+
5
+ context '#finalize_with_drop_ship!' do
6
+
7
+ after do
8
+ SpreeDropShip::Config[:send_supplier_email] = true
9
+ end
10
+
11
+ it 'should deliver drop ship orders when Spree::DropShipConfig[:send_supplier_email] == true' do
12
+ order = create(:order_with_totals, ship_address: create(:address))
13
+ order.line_items = [create(:line_item, variant: create(:variant_with_supplier)), create(:line_item, variant: create(:variant_with_supplier))]
14
+ order.create_proposed_shipments
15
+
16
+ order.shipments.each do |shipment|
17
+ Spree::DropShipOrderMailer.should_receive(:supplier_order).with(shipment.id).and_return(double(Mail, :deliver! => true))
18
+ end
19
+
20
+ order.finalize!
21
+ order.reload
22
+
23
+ # Check orders are properly split.
24
+ order.shipments.size.should eql(2)
25
+ order.shipments.each do |shipment|
26
+ shipment.line_items.size.should eql(1)
27
+ shipment.line_items.first.variant.suppliers.first.should eql(shipment.supplier)
28
+ end
29
+ end
30
+
31
+ it 'should NOT deliver drop ship orders when Spree::DropShipConfig[:send_supplier_email] == false' do
32
+ SpreeDropShip::Config[:send_supplier_email] = false
33
+ order = create(:order_with_totals, ship_address: create(:address))
34
+ order.line_items = [create(:line_item, variant: create(:variant_with_supplier)), create(:line_item, variant: create(:variant_with_supplier))]
35
+ order.create_proposed_shipments
36
+
37
+ order.shipments.each do |shipment|
38
+ Spree::DropShipOrderMailer.should_not_receive(:supplier_order).with(shipment.id)
39
+ end
40
+
41
+ order.finalize!
42
+ order.reload
43
+
44
+ # Check orders are properly split.
45
+ order.shipments.size.should eql(2)
46
+ order.shipments.each do |shipment|
47
+ shipment.line_items.size.should eql(1)
48
+ shipment.line_items.first.variant.suppliers.first.should eql(shipment.supplier)
49
+ end
50
+ end
51
+
52
+ end
53
+
54
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Payment do
4
+
5
+ it { should belong_to(:payable) }
6
+
7
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Product do
4
+
5
+ let(:product) { create :product }
6
+
7
+ it '#supplier?' do
8
+ product.supplier?.should eq false
9
+ product.add_supplier! create(:supplier)
10
+ product.reload.supplier?.should eq true
11
+ end
12
+
13
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Shipment do
4
+
5
+ describe 'Scopes' do
6
+
7
+ it '#by_supplier' do
8
+ supplier = create(:supplier)
9
+ stock_location_1 = supplier.stock_locations.first
10
+ stock_location_2 = create(:stock_location, supplier: supplier)
11
+ shipment_1 = create(:shipment)
12
+ shipment_2 = create(:shipment, stock_location: stock_location_1)
13
+ shipment_3 = create(:shipment)
14
+ shipment_4 = create(:shipment, stock_location: stock_location_2)
15
+ shipment_5 = create(:shipment)
16
+ shipment_6 = create(:shipment, stock_location: stock_location_1)
17
+
18
+ expect(subject.class.by_supplier(supplier.id)).to match_array([shipment_2, shipment_4, shipment_6])
19
+ end
20
+
21
+ end
22
+
23
+ describe '#after_ship' do
24
+
25
+ it 'should capture payment if balance due' do
26
+ skip 'TODO make it so!'
27
+ end
28
+
29
+ it 'should track commission for shipment' do
30
+ supplier = create(:supplier_with_commission)
31
+ shipment = create(:shipment, stock_location: supplier.stock_locations.first)
32
+
33
+ expect(shipment.supplier_commission.to_f).to eql(0.0)
34
+ shipment.stub final_price_with_items: 10.0
35
+ shipment.send(:after_ship)
36
+ expect(shipment.reload.supplier_commission.to_f).to eql(1.5)
37
+ end
38
+
39
+ end
40
+
41
+ it '#final_price_with_items' do
42
+ shipment = build :shipment
43
+ shipment.stub item_cost: 50.0, final_price: 5.5
44
+ expect(shipment.final_price_with_items.to_f).to eql(55.5)
45
+ end
46
+
47
+ end
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ module Stock
5
+ module Splitter
6
+ describe DropShip do
7
+
8
+ let(:supplier_1) { create(:supplier) }
9
+ let(:supplier_2) { create(:supplier) }
10
+
11
+ let(:variant_1) {
12
+ v = create(:variant)
13
+ v.product.add_supplier! supplier_1
14
+ v.reload.supplier_variants.find_by_supplier_id(supplier_1.id).update_column(:cost, 5)
15
+ v.product.add_supplier! supplier_2
16
+ v.reload.supplier_variants.find_by_supplier_id(supplier_2.id).update_column(:cost, 6)
17
+ v
18
+ }
19
+ let(:variant_2) {
20
+ v = create(:variant)
21
+ v.product.add_supplier! supplier_1
22
+ v.reload.supplier_variants.find_by_supplier_id(supplier_1.id).update_column(:cost, 5)
23
+ v.product.add_supplier! supplier_2
24
+ v.reload.supplier_variants.find_by_supplier_id(supplier_2.id).update_column(:cost, 4)
25
+ v
26
+ }
27
+ let(:variant_3) {
28
+ v = create(:variant)
29
+ v.product.add_supplier! supplier_1
30
+ v.product.add_supplier! supplier_2
31
+ v.reload
32
+ }
33
+ let(:variant_4) { create(:variant) }
34
+
35
+ let(:variants){
36
+ [variant_1, variant_2, variant_3, variant_4]
37
+ }
38
+
39
+ let(:packer) { build(:stock_packer) }
40
+
41
+ subject { DropShip.new(packer) }
42
+
43
+ it 'splits packages for drop ship' do
44
+ package = Package.new(packer.stock_location)
45
+ package = Package.new(packer.stock_location)
46
+ 4.times { |i| package.add build(:inventory_unit, variant: variants[i]) }
47
+
48
+ packages = subject.split([package])
49
+ packages.count.should eq 3
50
+
51
+ expect(packages[0].stock_location).to eq(packer.stock_location)
52
+ expect(packages[0].contents.count).to eq(1)
53
+ expect(packages[1].stock_location).to eq(supplier_1.stock_locations.first)
54
+ expect(packages[1].contents.count).to eq(2)
55
+ expect(packages[2].stock_location).to eq(supplier_2.stock_locations.first)
56
+ expect(packages[2].contents.count).to eq(1)
57
+ end
58
+
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::StockLocation do
4
+
5
+ it { should belong_to(:supplier) }
6
+
7
+ subject { create(:stock_location, backorderable_default: true) }
8
+
9
+ context "propagate variants" do
10
+
11
+ let(:variant) { build(:variant) }
12
+ let(:stock_item) { subject.propagate_variant(variant) }
13
+
14
+ context "passes backorderable default config" do
15
+ context "true" do
16
+ before { subject.backorderable_default = true }
17
+ it { stock_item.backorderable.should be true }
18
+ end
19
+
20
+ context "false" do
21
+ before { subject.backorderable_default = false }
22
+ it { stock_item.backorderable.should be false }
23
+ end
24
+ end
25
+
26
+ context 'does not propagate for non supplier variants' do
27
+ before { subject.supplier_id = create(:supplier).id }
28
+ it { stock_item.should be_nil }
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -0,0 +1,172 @@
1
+ require 'spec_helper'
2
+ require 'cancan/matchers'
3
+ require 'spree/testing_support/ability_helpers'
4
+
5
+ describe Spree::SupplierAbility do
6
+
7
+ let(:user) { create(:user, supplier: create(:supplier)) }
8
+ let(:ability) { Spree::SupplierAbility.new(user) }
9
+ let(:token) { nil }
10
+
11
+ context 'for Dash' do
12
+ let(:resource) { Spree::Admin::RootController }
13
+
14
+ context 'requested by supplier' do
15
+ it_should_behave_like 'access denied'
16
+ it_should_behave_like 'no index allowed'
17
+ it_should_behave_like 'admin denied'
18
+ end
19
+ end
20
+
21
+ context 'for Product' do
22
+ let(:resource) { create(:product) }
23
+
24
+ it_should_behave_like 'index allowed'
25
+ it_should_behave_like 'admin granted'
26
+
27
+ context 'requested by another suppliers user' do
28
+ let(:resource) {
29
+ product = create(:product)
30
+ product.add_supplier!(create(:supplier))
31
+ product
32
+ }
33
+ it_should_behave_like 'access denied'
34
+ end
35
+
36
+ context 'requested by suppliers user' do
37
+ let(:resource) {
38
+ product = create(:product)
39
+ product.add_supplier!(user.supplier)
40
+ product.reload
41
+ }
42
+ # it_should_behave_like 'access granted'
43
+ it { ability.should be_able_to :read, resource }
44
+ it { ability.should be_able_to :stock, resource }
45
+ end
46
+ end
47
+
48
+ context 'for Shipment' do
49
+ context 'requested by another suppliers user' do
50
+ let(:resource) { Spree::Shipment.new({stock_location: create(:stock_location, supplier: create(:supplier))}, without_protection: true) }
51
+ it_should_behave_like 'access denied'
52
+ it_should_behave_like 'no index allowed'
53
+ it_should_behave_like 'admin denied'
54
+ it { ability.should_not be_able_to :ready, resource }
55
+ it { ability.should_not be_able_to :ship, resource }
56
+ end
57
+
58
+ context 'requested by suppliers user' do
59
+ context 'when order is complete' do
60
+ let(:resource) {
61
+ order = create(:completed_order_for_drop_ship_with_totals)
62
+ order.stock_locations.first.update_attribute :supplier, user.supplier
63
+ Spree::Shipment.new({order: order, stock_location: order.stock_locations.first }, without_protection: true)
64
+ }
65
+ it_should_behave_like 'access granted'
66
+ it_should_behave_like 'index allowed'
67
+ it_should_behave_like 'admin granted'
68
+ it { ability.should be_able_to :ready, resource }
69
+ it { ability.should be_able_to :ship, resource }
70
+ end
71
+
72
+ context 'when order is incomplete' do
73
+ let(:resource) { Spree::Shipment.new({stock_location: create(:stock_location, supplier: user.supplier)}, without_protection: true) }
74
+ it_should_behave_like 'access denied'
75
+ it { ability.should_not be_able_to :ready, resource }
76
+ it { ability.should_not be_able_to :ship, resource }
77
+ end
78
+ end
79
+ end
80
+
81
+ context 'for StockItem' do
82
+ let(:resource) { Spree::StockItem }
83
+
84
+ it_should_behave_like 'index allowed'
85
+ it_should_behave_like 'admin granted'
86
+
87
+ context 'requested by another suppliers user' do
88
+ let(:resource) {
89
+ supplier = create(:supplier)
90
+ variant = create(:product).master
91
+ variant.product.add_supplier! supplier
92
+ supplier.stock_locations.first.stock_items.first
93
+ }
94
+ it_should_behave_like 'access denied'
95
+ end
96
+
97
+ context 'requested by suppliers user' do
98
+ let(:resource) {
99
+ variant = create(:product).master
100
+ variant.product.add_supplier! user.supplier
101
+ user.supplier.stock_locations.first.stock_items.first
102
+ }
103
+ it_should_behave_like 'access granted'
104
+ end
105
+ end
106
+
107
+ context 'for StockLocation' do
108
+ context 'requsted by another suppliers user' do
109
+ let(:resource) {
110
+ supplier = create(:supplier)
111
+ variant = create(:product).master
112
+ variant.product.add_supplier! supplier
113
+ supplier.stock_locations.first
114
+ }
115
+ it_should_behave_like 'create only'
116
+ end
117
+
118
+ context 'requested by suppliers user' do
119
+ let(:resource) {
120
+ variant = create(:product).master
121
+ variant.product.add_supplier! user.supplier
122
+ user.supplier.stock_locations.first
123
+ }
124
+ it_should_behave_like 'access granted'
125
+ it_should_behave_like 'admin granted'
126
+ it_should_behave_like 'index allowed'
127
+ end
128
+ end
129
+
130
+ context 'for StockMovement' do
131
+ let(:resource) { Spree::StockMovement }
132
+
133
+ it_should_behave_like 'index allowed'
134
+ it_should_behave_like 'admin granted'
135
+
136
+ context 'requested by another suppliers user' do
137
+ let(:resource) {
138
+ supplier = create(:supplier)
139
+ variant = create(:product).master
140
+ variant.product.add_supplier! supplier
141
+ Spree::StockMovement.new({ stock_item: supplier.stock_locations.first.stock_items.first }, without_protection: true)
142
+ }
143
+ it_should_behave_like 'create only'
144
+ end
145
+
146
+ context 'requested by suppliers user' do
147
+ let(:resource) {
148
+ variant = create(:product).master
149
+ variant.product.add_supplier! user.supplier
150
+ Spree::StockMovement.new({ stock_item: user.supplier.stock_locations.first.stock_items.first }, without_protection: true)
151
+ }
152
+ it_should_behave_like 'access granted'
153
+ end
154
+ end
155
+
156
+ context 'for Supplier' do
157
+ context 'requested by any user' do
158
+ let(:ability) { Spree::SupplierAbility.new(create(:user)) }
159
+ let(:resource) { Spree::Supplier }
160
+
161
+ it_should_behave_like 'admin denied'
162
+ it_should_behave_like 'access denied'
163
+ end
164
+
165
+ context 'requested by suppliers user' do
166
+ let(:resource) { user.supplier }
167
+ it_should_behave_like 'admin granted'
168
+ it_should_behave_like 'update only'
169
+ end
170
+ end
171
+
172
+ end
@@ -0,0 +1,123 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Supplier do
4
+
5
+ it { should belong_to(:address) }
6
+
7
+ it { should have_many(:products).through(:variants) }
8
+ it { should have_many(:stock_locations) }
9
+ it { should have_many(:users) }
10
+ it { should have_many(:variants).through(:supplier_variants) }
11
+
12
+ it { should validate_presence_of(:email) }
13
+ it { should validate_presence_of(:name) }
14
+
15
+ it '#deleted?' do
16
+ subject.deleted_at = nil
17
+ subject.deleted_at?.should eql(false)
18
+ subject.deleted_at = Time.now
19
+ subject.deleted_at?.should eql(true)
20
+ end
21
+
22
+ context '#assign_user' do
23
+
24
+ before do
25
+ @instance = build(:supplier)
26
+ end
27
+
28
+ it 'with user' do
29
+ Spree.user_class.should_not_receive :find_by_email
30
+ @instance.email = 'test@test.com'
31
+ @instance.users << create(:user)
32
+ @instance.save
33
+ end
34
+
35
+ it 'with existing user email' do
36
+ user = create(:user, email: 'test@test.com')
37
+ Spree.user_class.should_receive(:find_by_email).with(user.email).and_return(user)
38
+ @instance.email = user.email
39
+ @instance.save
40
+ @instance.reload.users.first.should eql(user)
41
+ end
42
+
43
+ end
44
+
45
+ it '#create_stock_location' do
46
+ Spree::StockLocation.count.should eql(0)
47
+ supplier = create :supplier
48
+ Spree::StockLocation.first.active.should be true
49
+ Spree::StockLocation.first.country.should eql(supplier.address.country)
50
+ Spree::StockLocation.first.supplier.should eql(supplier)
51
+ end
52
+
53
+ context '#send_welcome' do
54
+
55
+ after do
56
+ SpreeDropShip::Config[:send_supplier_email] = true
57
+ end
58
+
59
+ before do
60
+ @instance = build(:supplier)
61
+ @mail_message = double('Mail::Message')
62
+ end
63
+
64
+ context 'with Spree::DropShipConfig[:send_supplier_email] == false' do
65
+
66
+ it 'should not send' do
67
+ SpreeDropShip::Config[:send_supplier_email] = false
68
+ expect {
69
+ Spree::SupplierMailer.should_not_receive(:welcome).with(an_instance_of(Integer))
70
+ }
71
+ @instance.save
72
+ end
73
+
74
+ end
75
+
76
+ context 'with Spree::DropShipConfig[:send_supplier_email] == true' do
77
+
78
+ it 'should send welcome email' do
79
+ expect {
80
+ Spree::SupplierMailer.should_receive(:welcome).with(an_instance_of(Integer))
81
+ }
82
+ @instance.save
83
+ end
84
+
85
+ end
86
+
87
+ end
88
+
89
+ it '#set_commission' do
90
+ SpreeDropShip::Config.set default_commission_flat_rate: 1
91
+ SpreeDropShip::Config.set default_commission_percentage: 1
92
+ supplier = create :supplier
93
+ SpreeDropShip::Config.set default_commission_flat_rate: 0
94
+ SpreeDropShip::Config.set default_commission_percentage: 0
95
+ # Default configuration is 0.0 for each.
96
+ supplier.commission_flat_rate.to_f.should eql(1.0)
97
+ supplier.commission_percentage.to_f.should eql(1.0)
98
+ # With custom commission applied.
99
+ supplier = create :supplier, commission_flat_rate: 123, commission_percentage: 25
100
+ supplier.commission_flat_rate.should eql(123.0)
101
+ supplier.commission_percentage.should eql(25.0)
102
+ end
103
+
104
+ describe '#shipments' do
105
+
106
+ let!(:supplier) { create(:supplier) }
107
+
108
+ it 'should return shipments for suppliers stock locations' do
109
+ stock_location_1 = supplier.stock_locations.first
110
+ stock_location_2 = create(:stock_location, supplier: supplier)
111
+ shipment_1 = create(:shipment)
112
+ shipment_2 = create(:shipment, stock_location: stock_location_1)
113
+ shipment_3 = create(:shipment)
114
+ shipment_4 = create(:shipment, stock_location: stock_location_2)
115
+ shipment_5 = create(:shipment)
116
+ shipment_6 = create(:shipment, stock_location: stock_location_1)
117
+
118
+ expect(supplier.shipments).to match_array([shipment_2, shipment_4, shipment_6])
119
+ end
120
+
121
+ end
122
+
123
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::SupplierVariant do
4
+ skip "add some examples to (or delete) #{__FILE__}"
5
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree.user_class do
4
+
5
+ it { should belong_to(:supplier) }
6
+
7
+ it { should have_many(:variants).through(:supplier) }
8
+
9
+ let(:user) { build :user }
10
+
11
+ it '#supplier?' do
12
+ user.supplier?.should be false
13
+ user.supplier = build :supplier
14
+ user.supplier?.should be true
15
+ end
16
+
17
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Variant do
4
+ it 'should populate stock item for each of the master variant suppliers' do
5
+ skip 'todo'
6
+ end
7
+ end