spree_drop_ship 3.1.0.1

Sign up to get free protection for your applications and to get access to all the features.
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