spree_multi_vendor 2.0.1 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +7 -0
  3. data/.travis.yml +1 -8
  4. data/Gemfile +5 -2
  5. data/README.md +12 -1
  6. data/app/controllers/spree/admin/vendor_settings_controller.rb +1 -1
  7. data/app/controllers/spree/admin/vendors_controller.rb +10 -2
  8. data/app/controllers/spree/api/v1/vendors_controller.rb +61 -0
  9. data/app/controllers/spree/api/v2/storefront/vendors_controller.rb +6 -1
  10. data/app/controllers/spree_multi_vendor/spree/api/base_controller_decorator.rb +17 -0
  11. data/app/controllers/spree_multi_vendor/spree/api/v1/products_controller_decorator.rb +9 -0
  12. data/app/controllers/spree_multi_vendor/spree/api/v1/users_controller_decorator.rb +13 -0
  13. data/app/finders/spree_multi_vendor/products_finder_decorator.rb +1 -1
  14. data/app/helpers/spree/api/vendor_helper.rb +11 -0
  15. data/app/helpers/spree_multi_vendor/spree/api/api_helpers_decorator.rb +19 -0
  16. data/app/models/spree/vendor_ability.rb +24 -9
  17. data/app/models/spree/vendor_user.rb +1 -1
  18. data/app/models/spree_multi_vendor/configuration.rb +1 -1
  19. data/app/models/spree_multi_vendor/spree/order_decorator.rb +5 -3
  20. data/app/overrides/spree/admin/shared/_main_menu.rb +1 -1
  21. data/app/serializers/spree/v2/storefront/vendor_order_totals_serializer.rb +2 -0
  22. data/app/views/spree/admin/vendor_settings/edit.html.erb +1 -1
  23. data/app/views/spree/admin/vendors/_form.html.erb +1 -1
  24. data/app/views/spree/api/v1/vendors/index.rabl +3 -0
  25. data/app/views/spree/api/v1/vendors/show.rabl +2 -0
  26. data/config/initializers/spree_permitted_attributes.rb +2 -0
  27. data/config/locales/es.yml +3 -0
  28. data/config/routes.rb +4 -1
  29. data/db/migrate/20210728120649_change_vendorized_models_vendor_id_type.rb +10 -0
  30. data/db/migrate/20210728120910_change_vendor_id_and_user_id_type_for_spree_vendor_users.rb +8 -0
  31. data/db/migrate/20210728121024_change_vendor_id_and_order_id_type_for_spree_order_commissions.rb +8 -0
  32. data/lib/spree_multi_vendor/factories.rb +1 -1
  33. data/lib/spree_multi_vendor/version.rb +1 -1
  34. data/lib/spree_multi_vendor.rb +2 -1
  35. data/spec/factories/spree/vendor_factory.rb +6 -0
  36. data/spec/features/spree/admin/orders_spec.rb +62 -12
  37. data/spec/features/spree/admin/vendor_settings_spec.rb +6 -8
  38. data/spec/models/spree/order_spec.rb +16 -2
  39. data/spec/requests/spree/api/v1/products_spec.rb +221 -0
  40. data/spec/requests/spree/api/v1/users_spec.rb +31 -0
  41. data/spec/requests/spree/api/v1/vendors_spec.rb +210 -0
  42. data/spec/requests/spree/api/v2/storefront/cart_spec.rb +19 -1
  43. data/spec/requests/spree/api/v2/storefront/products_spec.rb +4 -1
  44. data/spec/requests/spree/api/v2/storefront/vendors_spec.rb +66 -0
  45. data/spec/serializers/spree/v2/storefront/vendor_order_totals_serializer_spec.rb +2 -2
  46. data/spec/spec_helper.rb +3 -1
  47. data/spree_multi_vendor.gemspec +5 -4
  48. metadata +32 -38
  49. data/Appraisals +0 -11
  50. data/app/controllers/spree_multi_vendor/spree/admin/option_types_controller_decorator.rb +0 -7
  51. data/app/controllers/spree_multi_vendor/spree/admin/properties_controller_decorator.rb +0 -7
  52. data/app/controllers/spree_multi_vendor/spree/api/v1/variants_controller_decorator.rb +0 -22
  53. data/gemfiles/spree_4_2.gemfile +0 -9
  54. data/gemfiles/spree_master.gemfile +0 -9
@@ -1,25 +1,75 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.feature 'Admin Orders', :js do
4
+ let(:store) { Spree::Store.default }
4
5
  let(:vendor) { create(:active_vendor, name: 'Vendor') }
5
6
  let(:vendor_2) { create(:active_vendor, name: 'Other vendor') }
6
- let(:order) do
7
- create(:order,
8
- line_items: [
9
- create(:line_item, product: product),
10
- create(:line_item, product: product_2)
11
- ])
12
- end
7
+ let(:order) { create(:order, ship_address: create(:address), bill_address: create(:address), store: store) }
8
+ let(:order_2) { create(:order, store: store) }
13
9
  let!(:user) { create(:user, vendors: [vendor]) }
14
- let(:product) { create(:product_in_stock, vendor: vendor) }
15
- let(:product_2) { create(:product_in_stock, vendor: vendor_2) }
10
+ let(:product) { create(:product_in_stock, vendor: vendor, stores:[store]) }
11
+ let(:product_2) { create(:product_in_stock, vendor: vendor_2,stores:[store]) }
12
+
13
+ before do
14
+ create(:line_item, order: order, product: product)
15
+ create(:line_item, order: order, product: product_2)
16
+ order.create_proposed_shipments
17
+ order.update(state: :complete, completed_at: Time.current)
18
+ login_as(user, scope: :spree_user)
19
+ end
20
+
21
+ shared_examples 'shows order data' do
22
+ it { expect(page).to have_text(order.number) }
23
+ it { expect(page).to have_content(order.display_vendor_total(vendor).to_html) }
24
+ end
25
+
26
+ context 'index' do
27
+ background do
28
+ visit spree.admin_orders_path
29
+ end
30
+
31
+ it_behaves_like 'shows order data'
32
+
33
+ it 'does not show non-vendor orders' do
34
+ expect(page).not_to have_text(order_2.number)
35
+ end
36
+ end
37
+
38
+ context 'cart' do
39
+ background do
40
+ visit spree.cart_admin_order_path(id: order.number)
41
+ end
42
+
43
+ it_behaves_like 'shows order data'
44
+ end
45
+
46
+ context 'customer info' do
47
+ background do
48
+ visit spree.admin_order_customer_path(order_id: order.number)
49
+ end
50
+
51
+ it_behaves_like 'shows order data'
52
+
53
+ it 'shows customer information' do
54
+ expect(page).to have_text(order.ship_address.full_name)
55
+ expect(page).to have_text(order.ship_address.address1)
56
+ expect(page).to have_text(order.ship_address.city)
57
+
58
+ expect(page).to have_text(order.bill_address.full_name)
59
+ expect(page).to have_text(order.bill_address.address1)
60
+ expect(page).to have_text(order.bill_address.city)
61
+
62
+ expect(page).not_to have_selector('input[type=text]')
63
+ end
64
+ end
16
65
 
17
66
  context 'edit' do
18
67
  background do
19
- login_as(user, scope: :spree_user)
20
68
  visit spree.edit_admin_order_path(id: order.number)
21
69
  end
22
70
 
71
+ it_behaves_like 'shows order data'
72
+
23
73
  scenario 'vendor can add his product' do
24
74
  select2_open label: 'Name or SKU'
25
75
  select2_search product.name, from: 'Name or SKU'
@@ -29,8 +79,8 @@ RSpec.feature 'Admin Orders', :js do
29
79
 
30
80
  scenario 'vendor cannot add other vendors product' do
31
81
  select2_open label: 'Name or SKU'
32
- select2_search product.name, from: 'Name or SKU'
33
- expect(page).not_to have_text(product.name)
82
+ select2_search product_2.name, from: 'Name or SKU'
83
+ expect(page).not_to have_text(product_2.name)
34
84
  end
35
85
  end
36
86
  end
@@ -42,13 +42,11 @@ RSpec.feature 'Admin Vendor Settings', :js do
42
42
  expect(page).not_to have_text 'contact_us can\'t be blank'
43
43
  end
44
44
 
45
- if Spree.version.to_f >= 3.6
46
- scenario 'can update an existing vendor image' do
47
- create(:vendor, name: 'New vendor')
48
- page.attach_file("vendor_image", Spree::Core::Engine.root + 'spec/fixtures' + 'thinking-cat.jpg')
49
- click_button 'Update'
50
- expect(page).to have_css("img[src*='thinking-cat.jpg']")
51
- end
45
+ scenario 'can update an existing vendor image' do
46
+ create(:vendor, name: 'New vendor')
47
+ page.attach_file("vendor_image", Spree::Core::Engine.root + 'spec/fixtures' + 'thinking-cat.jpg')
48
+ click_button 'Update'
49
+ expect(page).to have_css("img[src*='thinking-cat.jpg']")
52
50
  end
53
51
  end
54
52
 
@@ -70,7 +68,7 @@ RSpec.feature 'Admin Vendor Settings', :js do
70
68
 
71
69
  it 'renders forbidden page' do
72
70
  visit spree.admin_vendor_settings_path
73
- expect(current_path).to eq spree.forbidden_path
71
+ expect(current_path).to eq spree.admin_forbidden_path
74
72
  end
75
73
  end
76
74
  end
@@ -34,6 +34,20 @@ describe Spree::Order do
34
34
  expect(v.commissions.sum(:amount)).to eq(commission_ammount)
35
35
  end
36
36
  end
37
+
38
+ it 'sends mails only once per vendor' do
39
+ mail_double_1 = double(:mail_double_1)
40
+ mail_double_2 = double(:mail_double_1)
41
+
42
+ expect(Spree::VendorMailer).to receive(:vendor_notification_email)
43
+ .with(be_an(Integer), vendor.id) { mail_double_1 }
44
+ expect(mail_double_1).to receive(:deliver_later)
45
+ expect(Spree::VendorMailer).to receive(:vendor_notification_email)
46
+ .with(be_an(Integer), vendor_2.id) { mail_double_2 }
47
+ expect(mail_double_2).to receive(:deliver_later)
48
+
49
+ order.next!
50
+ end
37
51
  end
38
52
 
39
53
  context 'vendor methods' do
@@ -57,11 +71,11 @@ describe Spree::Order do
57
71
  end
58
72
 
59
73
  describe '#vendor_subtotal' do
60
- it { expect(order.vendor_subtotal(vendor)).to eq(270) }
74
+ it { expect(order.vendor_subtotal(vendor)).to eq(320) }
61
75
  end
62
76
 
63
77
  describe '#display_subtotal' do
64
- it { expect(order.display_vendor_subtotal(vendor).to_s).to eq('$270.00') }
78
+ it { expect(order.display_vendor_subtotal(vendor).to_s).to eq('$320.00') }
65
79
  end
66
80
 
67
81
  describe '#vendor_pre_tax_item_amount' do
@@ -0,0 +1,221 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe 'API V1 Products Spec', type: :request do
5
+ let(:vendor) { create(:vendor, state: :active) }
6
+ let(:other_vendor) { create(:vendor) }
7
+ let(:shipping_category) { create(:shipping_category) }
8
+ let(:selected_product) { product_without_vendor }
9
+ let(:params) { {} }
10
+
11
+ let!(:product_without_vendor) { create(:product) }
12
+ let!(:product_with_vendor_vendor) { create(:product, vendor: vendor) }
13
+ let!(:product_with_other_vendor) { create(:product, vendor: other_vendor) }
14
+
15
+ before { stub_authentication! }
16
+
17
+ describe 'products#index' do
18
+ before { get '/api/v1/products', params: params }
19
+
20
+ context 'as a regular user' do
21
+ it 'gets a list of all products' do
22
+ expect(response.status).to eq(200)
23
+ expect(json_response[:products].size).to eq(3)
24
+ end
25
+ end
26
+
27
+ context 'as an admin' do
28
+ sign_in_as_admin!
29
+
30
+ it 'gets a list of all products' do
31
+ expect(response.status).to eq(200)
32
+ expect(json_response[:products].size).to eq(3)
33
+ end
34
+ end
35
+
36
+ context 'as a vendor' do
37
+ let!(:current_api_user) do
38
+ user = create(:user, vendors: [vendor])
39
+ user
40
+ end
41
+
42
+ it 'gets a list of products assigned to that vendor' do
43
+ expect(response.status).to eq(200)
44
+ expect(json_response[:products].size).to eq(1)
45
+ expect(json_response[:products][0][:id]).to eq(vendor.products.first.id)
46
+ end
47
+ end
48
+ end
49
+
50
+ describe 'products#show' do
51
+ before { get "/api/v1/products/#{selected_product.id}" }
52
+
53
+ it 'gets a product' do
54
+ expect(response.status).to eq(200)
55
+ end
56
+
57
+ context 'as a vendor' do
58
+ let!(:current_api_user) do
59
+ user = create(:user, vendors: [vendor])
60
+ user
61
+ end
62
+
63
+ describe 'cannot view product of another vendor' do
64
+ let(:selected_product) { product_with_other_vendor }
65
+
66
+ it do
67
+ expect(response.status).to eq(404)
68
+ end
69
+ end
70
+
71
+ describe 'can view product assigned to that vendor' do
72
+ let(:selected_product) { product_with_vendor_vendor }
73
+
74
+ it do
75
+ expect(response.status).to eq(200)
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ describe 'products#create' do
82
+ let(:params) do
83
+ {
84
+ product: {
85
+ name: 'Product',
86
+ shipping_category_id: shipping_category.id,
87
+ price: 12.34
88
+ }
89
+ }
90
+ end
91
+
92
+ before { post '/api/v1/products', params: params }
93
+
94
+ context 'as regular user' do
95
+ it 'cannot create a new product' do
96
+ expect(response.status).to eq(401)
97
+ end
98
+ end
99
+
100
+ context 'as an admin' do
101
+ sign_in_as_admin!
102
+
103
+ it 'can create a new product' do
104
+ expect(response.status).to eq(201)
105
+ expect(json_response['name']).to eq(params[:product][:name])
106
+ expect(json_response['price']).to eq(params[:product][:price].to_s)
107
+ expect(json_response['shipping_category_id']).to eq(params[:product][:shipping_category_id])
108
+ end
109
+ end
110
+
111
+ context 'as a vendor' do
112
+ let!(:current_api_user) do
113
+ user = create(:user, vendors: [vendor])
114
+ user
115
+ end
116
+
117
+ it 'can create a new product assigned to vendor' do
118
+ expect(response.status).to eq(201)
119
+ product = Spree::Product.find(json_response[:id])
120
+ expect(product.vendor).to eq(vendor)
121
+ end
122
+ end
123
+ end
124
+
125
+ describe 'products#update' do
126
+ let(:params) do
127
+ {
128
+ product: {
129
+ name: 'Updated Prodouct',
130
+ shipping_category_id: shipping_category.id,
131
+ price: 12.34
132
+ }
133
+ }
134
+ end
135
+
136
+ before { put "/api/v1/products/#{selected_product.id}", params: params }
137
+
138
+ context 'as regular user' do
139
+ it 'cannot update product' do
140
+ expect(response.status).to eq(401)
141
+ end
142
+ end
143
+
144
+ context 'as an admin' do
145
+ sign_in_as_admin!
146
+
147
+ it 'can update product' do
148
+ expect(response.status).to eq(200)
149
+ expect(json_response['name']).to eq(params[:product][:name])
150
+ expect(json_response['price']).to eq(params[:product][:price].to_s)
151
+ expect(json_response['shipping_category_id']).to eq(params[:product][:shipping_category_id])
152
+ end
153
+ end
154
+
155
+ context 'as a vendor' do
156
+ let!(:current_api_user) do
157
+ user = create(:user, vendors: [vendor])
158
+ user
159
+ end
160
+
161
+ describe 'cannot update product of another vendor' do
162
+ let(:selected_product) { product_with_other_vendor }
163
+
164
+ it do
165
+ expect(response.status).to eq(404)
166
+ end
167
+ end
168
+
169
+ describe 'can update product assigned to that vendor' do
170
+ let(:selected_product) { product_with_vendor_vendor }
171
+
172
+ it do
173
+ expect(response.status).to eq(200)
174
+ end
175
+ end
176
+ end
177
+ end
178
+
179
+ describe 'products#destroy' do
180
+ before { delete "/api/v1/products/#{selected_product.id}" }
181
+
182
+ context 'as regular user' do
183
+ it 'cannot delete product' do
184
+ expect(response.status).to eq(401)
185
+ end
186
+ end
187
+
188
+ context 'as an admin' do
189
+ sign_in_as_admin!
190
+
191
+ it 'can delete product' do
192
+ expect(response.status).to eq(204)
193
+ expect(product_without_vendor.reload.deleted_at).to_not eq(nil)
194
+ end
195
+ end
196
+
197
+ context 'as a vendor' do
198
+ let!(:current_api_user) do
199
+ user = create(:user, vendors: [vendor])
200
+ user
201
+ end
202
+
203
+ describe 'cannot delete product of another vendor' do
204
+ let(:selected_product) { product_with_other_vendor }
205
+
206
+ it do
207
+ expect(response.status).to eq(404)
208
+ end
209
+ end
210
+
211
+ describe 'can delete product assigned to that vendor' do
212
+ let(:selected_product) { product_with_vendor_vendor }
213
+
214
+ it do
215
+ expect(response.status).to eq(204)
216
+ end
217
+ end
218
+ end
219
+ end
220
+ end
221
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe 'API V1 Users Spec', type: :request do
5
+ let(:user) { create(:user) }
6
+ let(:vendor) { create(:vendor, state: :active) }
7
+
8
+ before { stub_authentication! }
9
+
10
+ describe 'users#update' do
11
+ let(:params) do
12
+ {
13
+ user: {
14
+ vendor_ids: [vendor.id]
15
+ }
16
+ }
17
+ end
18
+
19
+ before { put "/api/v1/users/#{user.id}", params: params }
20
+
21
+ context 'as an admin' do
22
+ sign_in_as_admin!
23
+
24
+ it 'can update user' do
25
+ expect(response.status).to eq(200)
26
+ expect(json_response['vendor_ids']).to eq([vendor.id])
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,210 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe 'API V1 Vendors Spec', type: :request do
5
+ let(:params) { {} }
6
+ let(:selected_vendor) { vendor }
7
+
8
+ let!(:vendor) { create(:vendor, state: :active) }
9
+ let!(:another_vendor) { create(:vendor, state: :active) }
10
+
11
+ before { stub_authentication! }
12
+
13
+ describe 'vendors#index' do
14
+ before { get '/api/v1/vendors', params: params }
15
+
16
+ context 'as a regular user' do
17
+ it 'gets an empty list' do
18
+ expect(response.status).to eq(200)
19
+ expect(json_response.size).to eq(0)
20
+ end
21
+ end
22
+
23
+ context 'as an admin' do
24
+ sign_in_as_admin!
25
+
26
+ it 'gets a list of all vendors' do
27
+ expect(response.status).to eq(200)
28
+ expect(json_response.size).to eq(2)
29
+ end
30
+ end
31
+
32
+ context 'as a vendor' do
33
+ let!(:current_api_user) do
34
+ user = create(:user, vendors: [vendor])
35
+ user
36
+ end
37
+
38
+ it 'gets a list of assigned vendors' do
39
+ expect(response.status).to eq(200)
40
+ expect(json_response.size).to eq(1)
41
+ expect(json_response[0]['id']).to eq(vendor.id)
42
+ end
43
+ end
44
+ end
45
+
46
+ describe 'vendors#show' do
47
+ before { get "/api/v1/vendors/#{selected_vendor.id}" }
48
+
49
+ context 'as a regular user' do
50
+ it 'cannot view a vendor' do
51
+ expect(response.status).to eq(404)
52
+ end
53
+ end
54
+
55
+ context 'as an admin' do
56
+ sign_in_as_admin!
57
+ it 'can view a vendor' do
58
+ expect(response.status).to eq(200)
59
+ end
60
+ end
61
+
62
+ context 'as a vendor' do
63
+ let!(:current_api_user) do
64
+ user = create(:user, vendors: [vendor])
65
+ user
66
+ end
67
+
68
+ describe 'can view a assigned vendor' do
69
+ it do
70
+ expect(response.status).to eq(200)
71
+ end
72
+ end
73
+
74
+ describe 'cannot view an another vendor' do
75
+ let(:selected_vendor) { another_vendor }
76
+
77
+ it do
78
+ expect(response.status).to eq(404)
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+ describe 'vendors#create' do
85
+ let(:params) do
86
+ {
87
+ vendor: {
88
+ name: 'name'
89
+ }
90
+ }
91
+ end
92
+
93
+ before { post '/api/v1/vendors', params: params }
94
+
95
+ context 'as regular user' do
96
+ it 'cannot create a new vendor' do
97
+ expect(response.status).to eq(401)
98
+ end
99
+ end
100
+
101
+ context 'as an admin' do
102
+ sign_in_as_admin!
103
+
104
+ it 'can create a new vendor' do
105
+ expect(response.status).to eq(201)
106
+ expect(json_response['name']).to eq(params[:vendor][:name])
107
+ end
108
+ end
109
+
110
+ context 'as a vendor' do
111
+ let!(:current_api_user) do
112
+ user = create(:user, vendors: [vendor], email: FFaker::Internet.email)
113
+ user
114
+ end
115
+
116
+ it 'cannot create a new vendor' do
117
+ expect(response.status).to eq(401)
118
+ end
119
+ end
120
+ end
121
+
122
+ describe 'vendors#update' do
123
+ let(:params) do
124
+ {
125
+ vendor: {
126
+ name: 'updated name'
127
+ }
128
+ }
129
+ end
130
+
131
+ before { put "/api/v1/vendors/#{selected_vendor.id}", params: params }
132
+
133
+ context 'as regular user' do
134
+ it 'cannot update vendor' do
135
+ expect(response.status).to eq(404)
136
+ end
137
+ end
138
+
139
+ context 'as an admin' do
140
+ sign_in_as_admin!
141
+
142
+ it 'can update vendor' do
143
+ expect(response.status).to eq(200)
144
+ expect(json_response['name']).to eq(params[:vendor][:name])
145
+ end
146
+ end
147
+
148
+ context 'as a vendor' do
149
+ let!(:current_api_user) do
150
+ user = create(:user, vendors: [vendor])
151
+ user
152
+ end
153
+
154
+ describe 'can update as assigned vendor' do
155
+ it do
156
+ expect(response.status).to eq(200)
157
+ end
158
+ end
159
+
160
+ describe 'cannot update an another vendor' do
161
+ let(:selected_vendor) { another_vendor }
162
+
163
+ it do
164
+ expect(response.status).to eq(404)
165
+ end
166
+ end
167
+ end
168
+ end
169
+
170
+ describe 'vendors#destroy' do
171
+ before { delete "/api/v1/vendors/#{selected_vendor.id}" }
172
+
173
+ context 'as regular user' do
174
+ it 'cannot delete vendor' do
175
+ expect(response.status).to eq(404)
176
+ end
177
+ end
178
+
179
+ context 'as an admin' do
180
+ sign_in_as_admin!
181
+
182
+ it 'can delete vendor' do
183
+ expect(response.status).to eq(204)
184
+ expect(vendor.reload.deleted_at).to_not eq(nil)
185
+ end
186
+ end
187
+
188
+ context 'as a vendor' do
189
+ let!(:current_api_user) do
190
+ user = create(:user, vendors: [vendor])
191
+ user
192
+ end
193
+
194
+ describe 'can delete an assigned vendor' do
195
+ it do
196
+ expect(response.status).to eq(204)
197
+ end
198
+ end
199
+
200
+ describe 'cannot delete an another vendor' do
201
+ let(:selected_vendor) { another_vendor }
202
+
203
+ it do
204
+ expect(response.status).to eq(404)
205
+ end
206
+ end
207
+ end
208
+ end
209
+ end
210
+ end
@@ -26,7 +26,7 @@ describe 'API V2 Storefront Cart Spec', type: :request do
26
26
  it_behaves_like 'returns valid cart JSON'
27
27
  end
28
28
 
29
- context 'includes vendor and totals data' do
29
+ context 'with one vendor' do
30
30
  let(:params) { { include: 'vendors,vendor_totals' } }
31
31
 
32
32
  it_behaves_like 'showing the cart'
@@ -42,6 +42,24 @@ describe 'API V2 Storefront Cart Spec', type: :request do
42
42
  end
43
43
  end
44
44
 
45
+ context 'with many vendors' do
46
+ let!(:line_item_2) { create(:line_item, order: order, product: product_2, variant: product_2.default_variant) }
47
+ let(:params) { { include: 'vendors,vendor_totals' } }
48
+
49
+ it_behaves_like 'showing the cart'
50
+
51
+ it 'includes many vendors and vendor totals' do
52
+ get '/api/v2/storefront/cart', headers: headers_bearer, params: params
53
+
54
+ [vendor, vendor_2].each do |vendor|
55
+ expect(json_response['included']).to include(have_type('vendor').and have_id(vendor.id.to_s))
56
+ expect(json_response['included']).to include(have_type('vendor_totals').and have_id(vendor.id.to_s))
57
+ expect(json_response['included']).to include(have_type('vendor').and have_attribute(:name).with_value(vendor.name))
58
+ expect(json_response['included']).to include(have_type('vendor_totals').and have_attribute(:name).with_value(vendor.name))
59
+ end
60
+ end
61
+ end
62
+
45
63
  context 'includes line item vendor data' do
46
64
  it_behaves_like 'showing the cart'
47
65
 
@@ -1,7 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'API V2 Storefront Products Spec', type: :request do
4
- let!(:products) { create_list(:product, 5) }
4
+ let(:store) { Spree::Store.default }
5
+ let!(:products) { create_list(:product, 5, stores: [store]) }
5
6
  let!(:vendor) { create(:vendor) }
6
7
  let!(:vendor_2) { create(:vendor) }
7
8
 
@@ -26,6 +27,8 @@ describe 'API V2 Storefront Products Spec', type: :request do
26
27
  end
27
28
 
28
29
  context 'with specified vendor ids' do
30
+ before { vendor.products << create(:product) }
31
+ before { vendor_2.products << create(:product) }
29
32
  before { get "/api/v2/storefront/products?filter[vendor_ids]=#{vendor.id}&include=vendor" }
30
33
 
31
34
  it_behaves_like 'returns 200 HTTP status'