spree_marketplace 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.rspec +1 -0
- data/.travis.yml +13 -0
- data/Gemfile +14 -0
- data/LICENSE +21 -0
- data/README.md +87 -0
- data/Rakefile +15 -0
- data/Versionfile +12 -0
- data/app/assets/javascripts/spree/backend/spree_marketplace.js.coffee +24 -0
- data/app/assets/javascripts/spree/frontend/spree_marketplace.js +2 -0
- data/app/assets/javascripts/spree/frontend/supplier_address.js.coffee +56 -0
- data/app/assets/stylesheets/spree/backend/spree_marketplace.css +3 -0
- data/app/assets/stylesheets/spree/frontend/spree_marketplace.css +10 -0
- data/app/controllers/spree/admin/marketplace_settings_controller.rb +19 -0
- data/app/controllers/spree/admin/supplier_bank_accounts_controller.rb +24 -0
- data/app/controllers/spree/suppliers_controller.rb +67 -0
- data/app/models/spree/marketplace_ability.rb +14 -0
- data/app/models/spree/marketplace_configuration.rb +27 -0
- data/app/models/spree/supplier_ability.rb +76 -0
- data/app/models/spree/supplier_bank_account.rb +15 -0
- data/app/models/spree/supplier_decorator.rb +55 -0
- data/app/overrides/spree/admin/shared/_configuration_menu/add_marketplace_settings.html.erb.deface +3 -0
- data/app/overrides/spree/admin/suppliers/edit/add_bank_accounts.html.erb.deface +14 -0
- data/app/overrides/spree/layouts/admin/add_stripe_js_to_head.html.erb.deface +6 -0
- data/app/overrides/spree/users/show/add_supplier_info.html.erb.deface +17 -0
- data/app/views/spree/admin/marketplace_settings/edit.html.erb +23 -0
- data/app/views/spree/admin/supplier_bank_accounts/new.html.erb +28 -0
- data/app/views/spree/suppliers/new.html.erb +29 -0
- data/config/locales/en.yml +14 -0
- data/config/locales/es.yml +30 -0
- data/config/routes.rb +9 -0
- data/db/migrate/20130424201333_create_supplier_bank_accounts.rb +12 -0
- data/db/migrate/20131209022116_convert_to_stripe.rb +6 -0
- data/lib/generators/spree_marketplace/install/install_generator.rb +31 -0
- data/lib/spree_marketplace.rb +4 -0
- data/lib/spree_marketplace/engine.rb +47 -0
- data/lib/spree_marketplace/factories.rb +29 -0
- data/script/rails +7 -0
- data/spec/features/admin/bank_accounts_spec.rb +50 -0
- data/spec/features/admin/products_spec.rb +225 -0
- data/spec/features/admin/properties_spec.rb +91 -0
- data/spec/features/admin/relations_spec.rb +31 -0
- data/spec/features/admin/return_authorizations_spec.rb +7 -0
- data/spec/features/admin/settings_spec.rb +29 -0
- data/spec/features/admin/suppliers_controller_spec.rb +43 -0
- data/spec/features/supplier_signup_spec.rb +134 -0
- data/spec/models/spree/marketplace_ability_spec.rb +32 -0
- data/spec/models/spree/supplier_ability_spec.rb +337 -0
- data/spec/models/spree/supplier_bank_account_spec.rb +13 -0
- data/spec/models/spree/supplier_spec.rb +7 -0
- data/spec/spec_helper.rb +85 -0
- data/spec/support/integration_helpers.rb +15 -0
- data/spree_marketplace.gemspec +90 -0
- metadata +391 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spree_drop_ship/factories'
|
2
|
+
|
3
|
+
FactoryGirl.modify do
|
4
|
+
factory :supplier, :class => Spree::Supplier do
|
5
|
+
sequence(:name) { |i| "Big Store #{i}" }
|
6
|
+
email { Faker::Internet.email }
|
7
|
+
first_name 'First'
|
8
|
+
last_name 'Last'
|
9
|
+
url "http://example.com"
|
10
|
+
address
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
FactoryGirl.define do
|
15
|
+
# Define your Spree extensions Factories within this file to enable applications, and other extensions to use and override them.
|
16
|
+
#
|
17
|
+
# Example adding this to your spec_helper will load these Factories for use:
|
18
|
+
# require 'spree_marketplace/factories'
|
19
|
+
|
20
|
+
factory :supplier_bank_account, class: Spree::SupplierBankAccount do
|
21
|
+
supplier
|
22
|
+
# Details sent to Balanced.
|
23
|
+
name 'John Doe'
|
24
|
+
account_number '9900000001'
|
25
|
+
routing_number '121000358'
|
26
|
+
type 'checking'
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
data/script/rails
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
2
|
+
|
3
|
+
ENGINE_ROOT = File.expand_path('../..', __FILE__)
|
4
|
+
ENGINE_PATH = File.expand_path('../../lib/spree_marketplace/engine', __FILE__)
|
5
|
+
|
6
|
+
require 'rails/all'
|
7
|
+
require 'rails/engine/commands'
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'Admin - Supplier Bank Accounts', js: true do
|
4
|
+
|
5
|
+
before do
|
6
|
+
country = create(:country, name: "United States")
|
7
|
+
create(:state, name: "Vermont", country: country)
|
8
|
+
end
|
9
|
+
|
10
|
+
context 'w/Stripe' do
|
11
|
+
|
12
|
+
before do
|
13
|
+
SpreeMarketplace::Config[:stripe_publishable_key] = 'pk_test_DIeu8D1IIjLId2xA02TEJthB'
|
14
|
+
SpreeMarketplace::Config[:stripe_secret_key] = 'sk_test_2K6AkjxetfMFks2xBoGKB6wy'
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'as a Supplier' do
|
18
|
+
|
19
|
+
before do
|
20
|
+
login_user create(:supplier_user)
|
21
|
+
visit spree.account_path
|
22
|
+
within 'dd.supplier-info' do
|
23
|
+
click_link 'Edit'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
scenario 'adding bank accounts should work' do
|
28
|
+
click_link 'Add Bank Account'
|
29
|
+
fill_in 'supplier_bank_account[account_number]', with: '000123456789'
|
30
|
+
fill_in 'supplier_bank_account[routing_number]', with: '110000000'
|
31
|
+
select2 'United States', from: 'Country'
|
32
|
+
click_button 'Save'
|
33
|
+
page.should have_content('xxxxxx6789')
|
34
|
+
page.should have_content('Supplier bank account "STRIPE TEST BANK" has been successfully created!')
|
35
|
+
end
|
36
|
+
|
37
|
+
scenario 'adding invalid bank accounts should display error' do
|
38
|
+
click_link 'Add Bank Account'
|
39
|
+
fill_in 'supplier_bank_account[account_number]', with: '111111111111'
|
40
|
+
fill_in 'supplier_bank_account[routing_number]', with: '110000000'
|
41
|
+
select2 'United States', from: 'Country'
|
42
|
+
click_button 'Save'
|
43
|
+
page.should have_content('Must only use a test bank account number when making transfers in test mode')
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,225 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Admin - Products', js: true do
|
4
|
+
|
5
|
+
context 'as Admin' do
|
6
|
+
|
7
|
+
xit 'should be able to change supplier' do
|
8
|
+
s1 = create(:supplier)
|
9
|
+
s2 = create(:supplier)
|
10
|
+
product = create :product
|
11
|
+
product.add_supplier! s1
|
12
|
+
|
13
|
+
login_user create(:admin_user)
|
14
|
+
visit spree.admin_product_path(product)
|
15
|
+
|
16
|
+
select2 s2.name, from: 'Supplier'
|
17
|
+
click_button 'Update'
|
18
|
+
|
19
|
+
expect(page).to have_content("Product \"#{product.name}\" has been successfully updated!")
|
20
|
+
expect(product.reload.suppliers.first.id).to eql(s2.id)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should display all products' do
|
24
|
+
product1 = create :product
|
25
|
+
product2 = create :product
|
26
|
+
product2.add_supplier! create(:supplier)
|
27
|
+
product2.reload
|
28
|
+
product3 = create :product
|
29
|
+
product3.add_supplier! create(:supplier)
|
30
|
+
product3.reload
|
31
|
+
|
32
|
+
login_user create(:admin_user)
|
33
|
+
visit spree.admin_products_path
|
34
|
+
|
35
|
+
page.should have_content(product1.name)
|
36
|
+
page.should have_content(product2.name)
|
37
|
+
page.should have_content(product3.name)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'as Supplier' do
|
43
|
+
|
44
|
+
before do
|
45
|
+
@supplier_user = create(:supplier_user)
|
46
|
+
@supplier = @supplier_user.supplier
|
47
|
+
login_user @supplier_user
|
48
|
+
end
|
49
|
+
|
50
|
+
context "searching products works with only suppliers in results" do
|
51
|
+
it "should be able to search deleted products", :js => true do
|
52
|
+
p1 = create(:product, :name => 'apache baseball cap', :deleted_at => "2011-01-06 18:21:13")
|
53
|
+
p1.add_supplier! @supplier
|
54
|
+
p2 = create(:product, :name => 'zomg shirt')
|
55
|
+
p2.add_supplier! @supplier
|
56
|
+
create(:product, :name => 'apache baseball bat', :deleted_at => "2011-01-06 18:21:13")
|
57
|
+
create(:product, :name => 'zomg bat')
|
58
|
+
|
59
|
+
visit spree.admin_products_path
|
60
|
+
page.should have_content("zomg shirt")
|
61
|
+
page.should_not have_content("apache baseball cap")
|
62
|
+
page.should_not have_content("apache baseball bat")
|
63
|
+
page.should_not have_content("zomg bat")
|
64
|
+
check "Show Deleted"
|
65
|
+
click_icon :search
|
66
|
+
page.should have_content("zomg shirt")
|
67
|
+
page.should have_content("apache baseball cap")
|
68
|
+
page.should_not have_content("apache baseball bat")
|
69
|
+
page.should_not have_content("zomg bat")
|
70
|
+
uncheck "Show Deleted"
|
71
|
+
click_icon :search
|
72
|
+
page.should have_content("zomg shirt")
|
73
|
+
page.should_not have_content("apache baseball cap")
|
74
|
+
page.should_not have_content("apache baseball bat")
|
75
|
+
page.should_not have_content("zomg bat")
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should be able to search products by their properties with only suppliers in results" do
|
79
|
+
p1 = create(:product, :name => 'apache baseball cap', :sku => "A100")
|
80
|
+
p1.add_supplier! @supplier
|
81
|
+
create(:product, :name => 'apache baseball cap2', :sku => "B100")
|
82
|
+
create(:product, :name => 'zomg shirt')
|
83
|
+
p2 = create(:product, :name => 'zomg skirt')
|
84
|
+
p2.add_supplier! @supplier
|
85
|
+
|
86
|
+
|
87
|
+
visit spree.admin_products_path
|
88
|
+
fill_in "q_name_cont", :with => "ap"
|
89
|
+
click_icon :search
|
90
|
+
page.should have_content("apache baseball cap")
|
91
|
+
page.should_not have_content("apache baseball cap2")
|
92
|
+
page.should_not have_content("zomg shirt")
|
93
|
+
page.should_not have_content("zomg skirt")
|
94
|
+
|
95
|
+
fill_in "q_variants_including_master_sku_cont", :with => "A1"
|
96
|
+
click_icon :search
|
97
|
+
page.should have_content("apache baseball cap")
|
98
|
+
page.should_not have_content("apache baseball cap2")
|
99
|
+
page.should_not have_content("zomg shirt")
|
100
|
+
page.should_not have_content("zomg skirt")
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context "creating a new product from a prototype" do
|
105
|
+
def build_option_type_with_values(name, values)
|
106
|
+
ot = FactoryGirl.create(:option_type, :name => name)
|
107
|
+
values.each do |val|
|
108
|
+
ot.option_values.create(:name => val.downcase, :presentation => val)
|
109
|
+
end
|
110
|
+
ot
|
111
|
+
end
|
112
|
+
|
113
|
+
let(:prototype) do
|
114
|
+
size = build_option_type_with_values("size", %w(Small Medium Large))
|
115
|
+
create(:prototype, :name => "Size", :option_types => [ size ])
|
116
|
+
end
|
117
|
+
|
118
|
+
before do
|
119
|
+
@option_type_prototype = prototype
|
120
|
+
@property_prototype = create(:prototype, :name => "Random")
|
121
|
+
@shipping_category = create(:shipping_category)
|
122
|
+
visit spree.admin_products_path
|
123
|
+
click_link "admin_new_product"
|
124
|
+
within('#new_product') do
|
125
|
+
page.should have_content("SKU")
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
it "should allow an supplier to create a new product and variants from a prototype" do
|
130
|
+
fill_in "product_name", :with => "Baseball Cap"
|
131
|
+
fill_in "product_sku", :with => "B100"
|
132
|
+
fill_in "product_price", :with => "100"
|
133
|
+
fill_in "product_available_on", :with => "2012/01/24"
|
134
|
+
select "Size", :from => "Prototype"
|
135
|
+
check "Large"
|
136
|
+
select @shipping_category.name, from: "product_shipping_category_id"
|
137
|
+
click_button "Create"
|
138
|
+
page.should have_content("successfully created!")
|
139
|
+
Spree::Product.last.variants.length.should == 1
|
140
|
+
# Check suppliers assigned properly
|
141
|
+
expect(Spree::Product.last.supplier_ids).to include(@supplier.id)
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|
145
|
+
|
146
|
+
context "creating a new product" do
|
147
|
+
|
148
|
+
before do
|
149
|
+
@shipping_category = create(:shipping_category)
|
150
|
+
end
|
151
|
+
|
152
|
+
it "should allow an supplier to create a new product" do
|
153
|
+
visit spree.admin_products_path
|
154
|
+
click_link "admin_new_product"
|
155
|
+
within('#new_product') do
|
156
|
+
page.should have_content("SKU")
|
157
|
+
end
|
158
|
+
fill_in "product_name", :with => "Baseball Cap"
|
159
|
+
fill_in "product_sku", :with => "B100"
|
160
|
+
fill_in "product_price", :with => "100"
|
161
|
+
fill_in "product_available_on", :with => "2012/01/24"
|
162
|
+
select @shipping_category.name, from: "product_shipping_category_id"
|
163
|
+
click_button "Create"
|
164
|
+
page.should have_content("successfully created!")
|
165
|
+
click_button "Update"
|
166
|
+
page.should have_content("successfully updated!")
|
167
|
+
# Check suppliers assigned properly
|
168
|
+
expect(Spree::Product.last.supplier_ids).to include(@supplier.id)
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
172
|
+
|
173
|
+
context "cloning a product" do
|
174
|
+
it "should allow an supplier to clone a product" do
|
175
|
+
p = create(:product)
|
176
|
+
p.add_supplier! @supplier
|
177
|
+
|
178
|
+
visit spree.admin_products_path
|
179
|
+
within_row(1) do
|
180
|
+
click_icon :copy
|
181
|
+
end
|
182
|
+
|
183
|
+
page.should have_content("Product has been cloned")
|
184
|
+
# Check suppliers assigned properly
|
185
|
+
expect(Spree::Product.last.supplier_ids).to include(@supplier.id)
|
186
|
+
end
|
187
|
+
|
188
|
+
context "cloning a deleted product" do
|
189
|
+
it "should allow an supplier to clone a deleted product" do
|
190
|
+
p = create(:product, name: "apache baseball cap")
|
191
|
+
p.add_supplier! @supplier
|
192
|
+
|
193
|
+
visit spree.admin_products_path
|
194
|
+
check "Show Deleted"
|
195
|
+
click_button "Search"
|
196
|
+
|
197
|
+
page.should have_content("apache baseball cap")
|
198
|
+
|
199
|
+
within_row(1) do
|
200
|
+
click_icon :copy
|
201
|
+
end
|
202
|
+
|
203
|
+
page.should have_content("Product has been cloned")
|
204
|
+
# Check suppliers assigned properly
|
205
|
+
expect(Spree::Product.last.supplier_ids).to include(@supplier.id)
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
context 'updating a product' do
|
211
|
+
let(:product) {
|
212
|
+
p = create(:product)
|
213
|
+
p.add_supplier! @supplier
|
214
|
+
p.reload
|
215
|
+
}
|
216
|
+
|
217
|
+
it 'should not display supplier selection' do
|
218
|
+
visit spree.admin_product_path(product)
|
219
|
+
page.should_not have_css('#product_supplier_id')
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
end
|
224
|
+
|
225
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Admin - Properties" do
|
4
|
+
|
5
|
+
context 'as Supplier' do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@supplier_user = create(:supplier_user)
|
9
|
+
@supplier = @supplier_user.supplier
|
10
|
+
login_user @supplier_user
|
11
|
+
visit spree.admin_products_path
|
12
|
+
end
|
13
|
+
|
14
|
+
context "listing product properties" do
|
15
|
+
it "should list the existing product properties" do
|
16
|
+
create(:property, name: 'shirt size', presentation: 'size')
|
17
|
+
create(:property, name: 'shirt fit', presentation: 'fit')
|
18
|
+
|
19
|
+
click_link "Properties"
|
20
|
+
within_row(1) do
|
21
|
+
column_text(1).should == "shirt size"
|
22
|
+
column_text(2).should == "size"
|
23
|
+
end
|
24
|
+
skip 'used to work not sure why not anymore'
|
25
|
+
within_row(2) do
|
26
|
+
column_text(1).should == "shirt fit"
|
27
|
+
column_text(2).should == "fit"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "creating a property" do
|
33
|
+
it "should allow an admin to create a new product property", :js => true do
|
34
|
+
skip 'Not sure if we want to allow this yet.'
|
35
|
+
# click_link "Properties"
|
36
|
+
# click_link "new_property_link"
|
37
|
+
# within('#new_property') { page.should have_content("New Property") }
|
38
|
+
#
|
39
|
+
# fill_in "property_name", :with => "color of band"
|
40
|
+
# fill_in "property_presentation", :with => "color"
|
41
|
+
# click_button "Create"
|
42
|
+
# page.should have_content("successfully created!")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# TODO 'Not sure if we want to allow this yet.'
|
47
|
+
# context "editing a property" do
|
48
|
+
# before(:each) do
|
49
|
+
# create(:property)
|
50
|
+
# click_link "Properties"
|
51
|
+
# within_row(1) { click_icon :edit }
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
# it "should allow an admin to edit an existing product property" do
|
55
|
+
# fill_in "property_name", :with => "model 99"
|
56
|
+
# click_button "Update"
|
57
|
+
# page.should have_content("successfully updated!")
|
58
|
+
# page.should have_content("model 99")
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
# it "should show validation errors" do
|
62
|
+
# fill_in "property_name", :with => ""
|
63
|
+
# click_button "Update"
|
64
|
+
# page.should have_content("Name can't be blank")
|
65
|
+
# end
|
66
|
+
# end
|
67
|
+
|
68
|
+
context "linking a property to a product", js: true do
|
69
|
+
before do
|
70
|
+
skip 'Still need to add proper support for managing products'
|
71
|
+
p = create(:product)
|
72
|
+
p.add_supplier! @supplier
|
73
|
+
|
74
|
+
visit spree.admin_products_path
|
75
|
+
click_icon :edit
|
76
|
+
click_link "Product Properties"
|
77
|
+
end
|
78
|
+
|
79
|
+
# Regression test for #2279
|
80
|
+
it 'should be successful' do
|
81
|
+
expect(page).to have_content('Editing Product')
|
82
|
+
fill_in "product_product_properties_attributes_0_property_name", with: "A Property"
|
83
|
+
fill_in "product_product_properties_attributes_0_value", with: "A Value"
|
84
|
+
click_button "Update"
|
85
|
+
click_link "Product Properties"
|
86
|
+
expect(page).to have_css("tbody#product_properties")
|
87
|
+
expect(all("tbody#product_properties tr").count).to eq 2
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'Admin - Product Relation Management', js: true do
|
4
|
+
|
5
|
+
before do
|
6
|
+
Spree::RelationType.create(:name => "Related Products", :applies_to => "Spree::Product")
|
7
|
+
@user = create(:supplier_user)
|
8
|
+
@supplier1 = @user.supplier
|
9
|
+
@supplier2 = create(:supplier)
|
10
|
+
@product1 = create :product
|
11
|
+
@product1.add_supplier! @supplier1
|
12
|
+
# TODO shoudl we allow them to relate to anyones product or only their own?
|
13
|
+
@product2 = create :product
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'as Supplier' do
|
17
|
+
scenario 'should be able to add relations' do
|
18
|
+
skip 'for some reason targetted_select2_search is not working properly'
|
19
|
+
login_user @user
|
20
|
+
visit spree.related_admin_product_path(@product1)
|
21
|
+
targetted_select2_search @product2.name, from: 'Name or SKU'
|
22
|
+
select2 @product2.name, from: 'Name or SKU'
|
23
|
+
click_link 'Add'
|
24
|
+
wait_for_ajax
|
25
|
+
within '#products-table-wrapper' do
|
26
|
+
page.should have_content(@product2.name)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|