spree_multi_vendor 2.0.1 → 2.3.0

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 (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'