solidus_api 2.10.0.beta1 → 2.10.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6a9540c2c04dd060a437f426c70d637fd6bc681a625f66ab535f6f6940299071
4
- data.tar.gz: 3ae3c6861ffb7a0d95bb3ebe3f3e01c7cfee7efe2b1b10b7ddb1bff09387230d
3
+ metadata.gz: 7558124aed1cd9856a3b948cebe6ce41d2c279d2beafb8546ad309766954d45e
4
+ data.tar.gz: eb5c240b130fd09e20d950ebce3ebbe83d7b3197fffdaa2903935d1b59e2104c
5
5
  SHA512:
6
- metadata.gz: f08e8ffc5e36133c43d57082f717817b78c462cafbd2ba87019835d156d92df88c7c875b6739808744d9c0dca86939f38ac7792802ecf72e53831271d7d8830d
7
- data.tar.gz: d74356f3fd6de4f1d540ed6232e0bc91f9b1ec5999ed278e4f107357ca26411d4a0bfdca28b5585d856205fe96db1ce631b73f5bc46e2747f537bf596363e2ce
6
+ metadata.gz: 37233aac3ded8ed602509f052e79e4c07781d4e826697df09088291deba177d5ff5f66691f604765fbdd0bf4e6e8bd44fa32475f926a5cc946e182c6c73be23c
7
+ data.tar.gz: 76c2977bd07b8276d34d132d9107808e0587423b699d472d1a3016bf19bf16f60c45513d8c75f274280e52ae135b469526e291998dc16d5ef90e81775ceeac0c
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
- # solidus\_api
1
+ # solidus_api
2
2
 
3
- API contains the controllers and rabl views implementing the REST API of Solidus.
3
+ API contains the controllers and Jbuilder views implementing the REST API of
4
+ Solidus.
4
5
 
5
6
  ## Testing
6
7
 
@@ -12,14 +13,32 @@ bundle exec rspec
12
13
 
13
14
  ## Documentation
14
15
 
15
- The API documentation is in the [openapi](https://github.com/solidusio/solidus/tree/master/api/openapi)
16
- directory. It follows the OpenAPI specification and it is hosted on
17
- [Stoplight](https://solidus.docs.stoplight.io/).
16
+ The API documentation is in the [openapi][docs-dir] directory. It follows the
17
+ OpenAPI specification and it is hosted on [Stoplight Docs][live-docs].
18
18
 
19
- If you want to contribute, you can use [Stoplight Studio](https://stoplight.io/p/studio),
20
- an OpenAPI editor, to edit the files visually, and copy-paste the
21
- resulting code into the `openapi` directory.
19
+ If you want to contribute, you can use [Stoplight Studio][studio]. Simply
20
+ follow these steps:
22
21
 
23
- CircleCI automatically syncs our Git repo with Stoplight when a PR is
24
- merged, and automatically publishes a new version on Stoplight when
25
- a new Solidus version is released.
22
+ 1. Create a new Stoplight Studio project
23
+ 2. Copy-paste the content of `openapi/api.oas2.yml` into your project
24
+ 3. Edit the endpoints and models as needed
25
+ 4. Copy-paste the result back into `openapi/api.oas2.yml`
26
+ 5. Open a PR!
27
+
28
+ **Note: Only use embedded models in Stoplight Studio, as Stoplight Docs is
29
+ not compatible with externally-defined models!**
30
+
31
+ CircleCI automatically syncs our Git repo with Stoplight Docs when a PR is
32
+ merged, and automatically publishes a new version on Docs when a new Solidus
33
+ version is released.
34
+
35
+ ## Related projects
36
+
37
+ - [solidus-sdk](https://gitlab.com/deseretbook/packages/solidus-sdk): created
38
+ by Joel Saupe at [Deseret Book](https://deseretbook.com/), this is a JS SDK
39
+ that allows you to use the Solidus API. It even supports plug-ins, so you can
40
+ easily extend it with the endpoints provided by your Solidus extensions!
41
+
42
+ [docs-dir]: https://github.com/solidusio/solidus/tree/master/api/openapi
43
+ [live-docs]: https://solidus.docs.stoplight.io
44
+ [studio]: https://stoplight.io/p/studio
@@ -49,9 +49,9 @@ module Spree
49
49
  def authenticate_user
50
50
  unless @current_api_user
51
51
  if requires_authentication? && api_key.blank? && order_token.blank?
52
- render "spree/api/errors/must_specify_api_key", status: 401
52
+ render "spree/api/errors/must_specify_api_key", status: :unauthorized
53
53
  elsif order_token.blank? && (requires_authentication? || api_key.present?)
54
- render "spree/api/errors/invalid_api_key", status: 401
54
+ render "spree/api/errors/invalid_api_key", status: :unauthorized
55
55
  end
56
56
  end
57
57
  end
@@ -65,7 +65,7 @@ module Spree
65
65
  end
66
66
 
67
67
  def unauthorized
68
- render "spree/api/errors/unauthorized", status: 401
68
+ render "spree/api/errors/unauthorized", status: :unauthorized
69
69
  end
70
70
 
71
71
  def gateway_error(exception)
@@ -78,7 +78,7 @@ module Spree
78
78
  exception: exception.message,
79
79
  error: exception.message,
80
80
  missing_param: exception.param
81
- }, status: 422
81
+ }, status: :unprocessable_entity
82
82
  end
83
83
 
84
84
  def requires_authentication?
@@ -86,7 +86,7 @@ module Spree
86
86
  end
87
87
 
88
88
  def not_found
89
- render "spree/api/errors/not_found", status: 404
89
+ render "spree/api/errors/not_found", status: :not_found
90
90
  end
91
91
 
92
92
  def current_ability
@@ -96,7 +96,7 @@ module Spree
96
96
  def invalid_resource!(resource)
97
97
  Rails.logger.error "invalid_resouce_errors=#{resource.errors.full_messages}"
98
98
  @resource = resource
99
- render "spree/api/errors/invalid_resource", status: 422
99
+ render "spree/api/errors/invalid_resource", status: :unprocessable_entity
100
100
  end
101
101
 
102
102
  def api_key
@@ -112,7 +112,7 @@ module Spree
112
112
 
113
113
  def spree_token
114
114
  token = request.headers["X-Spree-Token"]
115
- return unless token.present?
115
+ return if token.blank?
116
116
 
117
117
  Spree::Deprecation.warn(
118
118
  'The custom X-Spree-Token request header is deprecated and will be removed in the next release.' \
@@ -164,8 +164,8 @@ module Spree
164
164
 
165
165
  def lock_order
166
166
  OrderMutex.with_lock!(@order) { yield }
167
- rescue Spree::OrderMutex::LockFailed => e
168
- render plain: e.message, status: 409
167
+ rescue Spree::OrderMutex::LockFailed => error
168
+ render plain: error.message, status: :conflict
169
169
  end
170
170
 
171
171
  def insufficient_stock_error(exception)
@@ -175,7 +175,7 @@ module Spree
175
175
  errors: [I18n.t(:quantity_is_not_available, scope: "spree.api.order")],
176
176
  type: 'insufficient_stock'
177
177
  },
178
- status: 422
178
+ status: :unprocessable_entity
179
179
  )
180
180
  end
181
181
 
@@ -23,8 +23,8 @@ module Spree
23
23
  authorize! :update, @order, order_token
24
24
  @order.next!
25
25
  respond_with(@order, default_template: 'spree/api/orders/show', status: 200)
26
- rescue StateMachines::InvalidTransition => e
27
- logger.error("invalid_transition #{e.event} from #{e.from} for #{e.object.class.name}. Error: #{e.inspect}")
26
+ rescue StateMachines::InvalidTransition => error
27
+ logger.error("invalid_transition #{error.event} from #{error.from} for #{error.object.class.name}. Error: #{error.inspect}")
28
28
  respond_with(@order, default_template: 'spree/api/orders/could_not_transition', status: 422)
29
29
  end
30
30
 
@@ -42,8 +42,8 @@ module Spree
42
42
  @order.complete!
43
43
  respond_with(@order, default_template: 'spree/api/orders/show', status: 200)
44
44
  end
45
- rescue StateMachines::InvalidTransition => e
46
- logger.error("invalid_transition #{e.event} from #{e.from} for #{e.object.class.name}. Error: #{e.inspect}")
45
+ rescue StateMachines::InvalidTransition => error
46
+ logger.error("invalid_transition #{error.event} from #{error.from} for #{error.object.class.name}. Error: #{error.inspect}")
47
47
  respond_with(@order, default_template: 'spree/api/orders/could_not_transition', status: 422)
48
48
  end
49
49
 
@@ -76,11 +76,24 @@ module Spree
76
76
  end
77
77
 
78
78
  def update_params
79
- if update_params = massaged_params[:order]
80
- update_params.permit(permitted_checkout_attributes)
79
+ state = @order.state
80
+ case state.to_sym
81
+ when :cart, :address
82
+ massaged_params.fetch(:order, {}).permit(
83
+ permitted_checkout_address_attributes
84
+ )
85
+ when :delivery
86
+ massaged_params.require(:order).permit(
87
+ permitted_checkout_delivery_attributes
88
+ )
89
+ when :payment
90
+ massaged_params.require(:order).permit(
91
+ permitted_checkout_payment_attributes
92
+ )
81
93
  else
82
- # We current allow update requests without any parameters in them.
83
- {}
94
+ massaged_params.fetch(:order, {}).permit(
95
+ permitted_checkout_confirm_attributes
96
+ )
84
97
  end
85
98
  end
86
99
 
@@ -55,10 +55,9 @@ module Spree
55
55
  def index
56
56
  authorize! :index, Order
57
57
  orders_includes = [
58
- :user,
59
- :payments,
60
- :adjustments,
61
- :line_items
58
+ { user: :store_credits },
59
+ :line_items,
60
+ :valid_store_credit_payments
62
61
  ]
63
62
  @orders = paginate(
64
63
  Spree::Order
@@ -131,7 +130,13 @@ module Spree
131
130
  end
132
131
 
133
132
  def normalize_params
134
- params[:order][:payments_attributes] = params[:order].delete(:payments) if params[:order][:payments]
133
+ if params[:order][:payments]
134
+ payments_params = params[:order].delete(:payments)
135
+ params[:order][:payments_attributes] = payments_params.map do |payment_params|
136
+ payment_params[:source_attributes] = payment_params.delete(:source) if payment_params[:source].present?
137
+ payment_params
138
+ end
139
+ end
135
140
  params[:order][:shipments_attributes] = params[:order].delete(:shipments) if params[:order][:shipments]
136
141
  params[:order][:line_items_attributes] = params[:order].delete(:line_items) if params[:order][:line_items]
137
142
  params[:order][:ship_address_attributes] = params[:order].delete(:ship_address) if params[:order][:ship_address].present?
@@ -168,7 +173,13 @@ module Spree
168
173
  end
169
174
 
170
175
  def find_order(_lock = false)
171
- @order = Spree::Order.find_by!(number: params[:id])
176
+ @order = Spree::Order.
177
+ includes(line_items: [:adjustments, { variant: :images }],
178
+ payments: :payment_method,
179
+ shipments: {
180
+ shipping_rates: { shipping_method: :zones, taxes: :tax_rate }
181
+ }).
182
+ find_by!(number: params[:id])
172
183
  end
173
184
 
174
185
  def order_id
@@ -58,7 +58,9 @@ module Spree
58
58
  end
59
59
 
60
60
  def taxonomy
61
- @taxonomy ||= Spree::Taxonomy.accessible_by(current_ability, :read).find(params[:id])
61
+ @taxonomy ||= Spree::Taxonomy.accessible_by(current_ability, :read).
62
+ includes(root: :children).
63
+ find(params[:id])
62
64
  end
63
65
 
64
66
  def taxonomy_params
@@ -40,7 +40,7 @@ module Spree
40
40
 
41
41
  def required_fields_for(model)
42
42
  required_fields = model._validators.select do |_field, validations|
43
- validations.any? { |v| v.is_a?(ActiveModel::Validations::PresenceValidator) }
43
+ validations.any? { |validation| validation.is_a?(ActiveModel::Validations::PresenceValidator) }
44
44
  end.map(&:first) # get fields that are invalid
45
45
  # Permalinks presence is validated, but are really automatically generated
46
46
  # Therefore we shouldn't tell API clients that they MUST send one through
@@ -2,6 +2,6 @@
2
2
 
3
3
  json.(image, *image_attributes)
4
4
  json.(image, :viewable_type, :viewable_id)
5
- Spree::Image.attachment_definitions[:attachment][:styles].each do |k, _v|
6
- json.set! "#{k}_url", image.attachment.url(k)
5
+ Spree::Image.attachment_definitions[:attachment][:styles].each do |key, _value|
6
+ json.set! "#{key}_url", image.attachment.url(key)
7
7
  end
@@ -3,7 +3,7 @@
3
3
  json.cache! [I18n.locale, order] do
4
4
  json.(order, *order_attributes)
5
5
  json.display_item_total(order.display_item_total.to_s)
6
- json.total_quantity(order.line_items.sum(:quantity))
6
+ json.total_quantity(order.line_items.to_a.sum(&:quantity))
7
7
  json.display_total(order.display_total.to_s)
8
8
  json.display_ship_total(order.display_ship_total)
9
9
  json.display_tax_total(order.display_tax_total)
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'responders'
4
- require 'spree/api/responders/rabl_template'
4
+ require 'spree/api/responders/jbuilder_template'
5
5
 
6
6
  module Spree
7
7
  module Api
8
8
  module Responders
9
9
  class AppResponder < ActionController::Responder
10
- include RablTemplate
10
+ include JbuilderTemplate
11
11
  end
12
12
  end
13
13
  end
@@ -3,7 +3,7 @@
3
3
  module Spree
4
4
  module Api
5
5
  module Responders
6
- module RablTemplate
6
+ module JbuilderTemplate
7
7
  def to_format
8
8
  if template
9
9
  render template, status: options[:status] || 200
@@ -16,6 +16,8 @@ module Spree
16
16
  options[:default_template]
17
17
  end
18
18
  end
19
+
20
+ RablTemplate = ActiveSupport::Deprecation::DeprecatedConstantProxy.new('RablTemplate', 'JbuilderTemplate')
19
21
  end
20
22
  end
21
23
  end
data/openapi/api.oas2.yml CHANGED
@@ -50,7 +50,7 @@ paths:
50
50
  '422':
51
51
  $ref: '#/responses/unprocessable-entity'
52
52
  summary: Create product
53
- description: Creaets a product.
53
+ description: Creates a product.
54
54
  operationId: create-product
55
55
  tags:
56
56
  - Products
@@ -545,7 +545,7 @@ paths:
545
545
  - Variants
546
546
  security:
547
547
  - api-key: []
548
- post:
548
+ put:
549
549
  responses:
550
550
  '200':
551
551
  description: ''
@@ -4264,7 +4264,7 @@ paths:
4264
4264
  type: string
4265
4265
  required: true
4266
4266
  '/shipments/{shipment_number}/select_shipping_method':
4267
- get:
4267
+ put:
4268
4268
  responses:
4269
4269
  '200':
4270
4270
  description: ''
@@ -4353,12 +4353,7 @@ paths:
4353
4353
  - in: body
4354
4354
  name: body
4355
4355
  schema:
4356
- allOf:
4357
- - $ref: '#/definitions/line-item-input'
4358
- - type: object
4359
- properties:
4360
- variant_id:
4361
- type: integer
4356
+ $ref: '#/definitions/line-item-input'
4362
4357
  security:
4363
4358
  - api-key: []
4364
4359
  - order-token: []
@@ -4420,12 +4415,7 @@ paths:
4420
4415
  - in: body
4421
4416
  name: body
4422
4417
  schema:
4423
- allOf:
4424
- - type: object
4425
- properties:
4426
- variant_id:
4427
- type: integer
4428
- - $ref: '#/definitions/line-item-input'
4418
+ $ref: '#/definitions/line-item-input'
4429
4419
  security:
4430
4420
  - api-key: []
4431
4421
  - order-token: []
@@ -4563,10 +4553,13 @@ paths:
4563
4553
  - Products
4564
4554
  parameters:
4565
4555
  - in: query
4566
- name: taxon_id
4556
+ name: id
4567
4557
  type: integer
4568
4558
  - $ref: '#/parameters/page'
4569
4559
  - $ref: '#/parameters/per_page'
4560
+ - type: boolean
4561
+ in: query
4562
+ name: simple
4570
4563
  security:
4571
4564
  - api-key: []
4572
4565
  schemes:
@@ -5638,8 +5631,16 @@ definitions:
5638
5631
  properties:
5639
5632
  quantity:
5640
5633
  type: integer
5634
+ description: 'Passing `0`, the line item will be removed.'
5641
5635
  options:
5642
5636
  type: object
5637
+ description: 'This field can be used to pass custom line item attributes. When used, it will force a new price calculation, unless `price` is one of the options.'
5638
+ id:
5639
+ type: integer
5640
+ description: Required for existing line items only.
5641
+ variant_id:
5642
+ type: integer
5643
+ description: Required for new line items only.
5643
5644
  option-type-input:
5644
5645
  type: object
5645
5646
  title: Option type input
data/solidus_api.gemspec CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |gem|
18
18
  gem.require_paths = ["lib"]
19
19
  gem.version = Spree.solidus_version
20
20
 
21
- gem.required_ruby_version = '>= 2.2.2'
21
+ gem.required_ruby_version = '>= 2.4.0'
22
22
  gem.required_rubygems_version = '>= 1.8.23'
23
23
 
24
24
  gem.add_dependency 'jbuilder', '~> 2.8'
@@ -25,10 +25,10 @@ module Spree
25
25
  end
26
26
 
27
27
  with_model 'Widget', scope: :all do
28
- table do |t|
29
- t.string :name
30
- t.integer :position
31
- t.timestamps null: false
28
+ table do |widget|
29
+ widget.string :name
30
+ widget.integer :position
31
+ widget.timestamps null: false
32
32
  end
33
33
 
34
34
  model do
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe "Spree Api Responders" do
6
+ it "RablTemplate is deprecated Use JbuilderTemplate" do
7
+ warning_message = /DEPRECATION WARNING: RablTemplate is deprecated! Use JbuilderTemplate instead/
8
+ expect{ Spree::Api::Responders::RablTemplate.methods }.to output(warning_message).to_stderr
9
+ end
10
+ end
@@ -80,7 +80,7 @@ module Spree
80
80
  user_address = UserAddress.last
81
81
 
82
82
  expect(response.status).to eq(200)
83
- update_target_ids = JSON.parse(response.body).select { |a| a['update_target'] }.map { |a| a['id'] }
83
+ update_target_ids = JSON.parse(response.body).select { |target| target['update_target'] }.map { |location| location['id'] }
84
84
  expect(update_target_ids).to eq([user_address.address_id])
85
85
  end
86
86
  end
@@ -97,7 +97,7 @@ module Spree
97
97
  }.to_not change { UserAddress.count }
98
98
 
99
99
  expect(response.status).to eq(200)
100
- update_target_ids = JSON.parse(response.body).select { |a| a['update_target'] }.map { |a| a['id'] }
100
+ update_target_ids = JSON.parse(response.body).select { |target| target['update_target'] }.map { |location| location['id'] }
101
101
  expect(update_target_ids).to eq([address.id])
102
102
  end
103
103
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe "Rabl Cache", type: :request, caching: true do
5
+ describe "Jbuilder Cache", type: :request, caching: true do
6
6
  let!(:user) { create(:admin_user) }
7
7
 
8
8
  before do
@@ -11,7 +11,7 @@ describe "Rabl Cache", type: :request, caching: true do
11
11
  expect(Spree::Product.count).to eq(1)
12
12
  end
13
13
 
14
- it "doesn't create a cache key collision for models with different rabl templates" do
14
+ it "doesn't create a cache key collision for models with different jbuilder templates" do
15
15
  get "/api/variants", params: { token: user.spree_api_key }
16
16
  expect(response.status).to eq(200)
17
17
 
@@ -132,9 +132,9 @@ module Spree
132
132
  put spree.api_checkout_path(order.to_param), params: { order_token: order.guest_token, order: { shipments_attributes: { "0" => { selected_shipping_rate_id: shipping_rate.id, id: shipment.id } } } }
133
133
  expect(response.status).to eq(200)
134
134
  # Find the correct shipment...
135
- json_shipment = json_response['shipments'].detect { |s| s["id"] == shipment.id }
135
+ json_shipment = json_response['shipments'].detect { |value| value["id"] == shipment.id }
136
136
  # Find the correct shipping rate for that shipment...
137
- json_shipping_rate = json_shipment['shipping_rates'].detect { |sr| sr["id"] == shipping_rate.id }
137
+ json_shipping_rate = json_shipment['shipping_rates'].detect { |value| value["id"] == shipping_rate.id }
138
138
  # ... And finally ensure that it's selected
139
139
  expect(json_shipping_rate['selected']).to be true
140
140
  # Order should automatically transfer to payment because all criteria are met
@@ -172,6 +172,7 @@ module Spree
172
172
  end
173
173
 
174
174
  describe 'setting the payment amount' do
175
+ let(:order) { create(:order_with_line_items, state: :payment) }
175
176
  let(:params) do
176
177
  {
177
178
  order_token: order.guest_token,
@@ -322,17 +323,44 @@ module Spree
322
323
  end
323
324
  end
324
325
 
326
+ it "cannot update attributes of another step" do
327
+ order.update_column(:state, "payment")
328
+
329
+ params = {
330
+ order_token: order.guest_token,
331
+ order: {
332
+ payments_attributes: [
333
+ {
334
+ payment_method_id: @payment_method.id.to_s,
335
+ source_attributes: attributes_for(:credit_card)
336
+ }
337
+ ],
338
+ ship_address_attributes: {
339
+ zipcode: 'MALICIOUS ZIPCODE'
340
+ }
341
+ }
342
+ }
343
+ expect do
344
+ put spree.api_checkout_path(order), params: params
345
+ end.not_to change { order.reload.ship_address.zipcode }
346
+ expect(response.status).to eq(200)
347
+ end
348
+
325
349
  it "returns the order if the order is already complete" do
326
350
  order.update_columns(completed_at: Time.current, state: 'complete')
327
351
  put spree.api_checkout_path(order.to_param), params: { order_token: order.guest_token }
328
352
  assert_unauthorized!
329
353
  end
330
354
 
331
- # Regression test for https://github.com/spree/spree/issues/3784
332
- it "can update the special instructions for an order" do
333
- instructions = "Don't drop it. (Please)"
334
- put spree.api_checkout_path(order.to_param), params: { order_token: order.guest_token, order: { special_instructions: instructions } }
335
- expect(json_response['special_instructions']).to eql(instructions)
355
+ context "in delivery state" do
356
+ let(:order) { create(:order_with_line_items, state: :delivery) }
357
+
358
+ # Regression test for https://github.com/spree/spree/issues/3784
359
+ it "can update the special instructions for an order" do
360
+ instructions = "Don't drop it. (Please)"
361
+ put spree.api_checkout_path(order.to_param), params: { order_token: order.guest_token, order: { special_instructions: instructions } }
362
+ expect(json_response['special_instructions']).to eql(instructions)
363
+ end
336
364
  end
337
365
 
338
366
  context "as an admin" do
@@ -34,9 +34,9 @@ module Spree
34
34
  end
35
35
 
36
36
  it "can retrieve a list of specific option types" do
37
- option_type_1 = create(:option_type)
37
+ option_type_one = create(:option_type)
38
38
  create(:option_type)
39
- get spree.api_option_types_path, params: { ids: "#{option_type.id},#{option_type_1.id}" }
39
+ get spree.api_option_types_path, params: { ids: "#{option_type.id},#{option_type_one.id}" }
40
40
  expect(json_response.count).to eq(2)
41
41
 
42
42
  check_option_values(json_response.first["option_values"])
@@ -48,9 +48,9 @@ module Spree
48
48
  end
49
49
 
50
50
  it "can retrieve a list of option types" do
51
- option_value_1 = create(:option_value, option_type: option_type)
51
+ option_value_one = create(:option_value, option_type: option_type)
52
52
  create(:option_value, option_type: option_type)
53
- get spree.api_option_values_path, params: { ids: [option_value.id, option_value_1.id] }
53
+ get spree.api_option_values_path, params: { ids: [option_value.id, option_value_one.id] }
54
54
  expect(json_response.count).to eq(2)
55
55
  end
56
56
 
@@ -156,6 +156,7 @@ module Spree
156
156
  end
157
157
 
158
158
  context 'creating payment' do
159
+ let!(:order) { create(:order_with_line_items) }
159
160
  let(:order_params) { super().merge(payments_attributes: [{ payment_method_id: payment_method.id }]) }
160
161
 
161
162
  context "with allowed payment method" do
@@ -166,6 +167,28 @@ module Spree
166
167
  subject
167
168
  }.to change { Spree::Payment.count }.by(1)
168
169
  end
170
+
171
+ context 'trying to change the address' do
172
+ let(:order_params) do
173
+ super().merge(
174
+ ship_address_attributes: {
175
+ zipcode: '90100'
176
+ }
177
+ )
178
+ end
179
+
180
+ it 'changes the address' do
181
+ expect {
182
+ subject
183
+ }.to change { order.reload.ship_address.zipcode }
184
+ end
185
+
186
+ it 'invalidates the shipments' do
187
+ expect {
188
+ subject
189
+ }.to change { order.reload.shipments }.to([])
190
+ end
191
+ end
169
192
  end
170
193
 
171
194
  context "with disallowed payment method" do
@@ -246,12 +269,12 @@ module Spree
246
269
  it "returns orders in reverse chronological order by completed_at" do
247
270
  order.update_columns completed_at: Time.current, created_at: 3.days.ago
248
271
 
249
- order2 = Order.create user: order.user, completed_at: Time.current - 1.day, created_at: 2.day.ago, store: store
250
- expect(order2.created_at).to be > order.created_at
251
- order3 = Order.create user: order.user, completed_at: nil, created_at: 1.day.ago, store: store
252
- expect(order3.created_at).to be > order2.created_at
253
- order4 = Order.create user: order.user, completed_at: nil, created_at: 0.days.ago, store: store
254
- expect(order4.created_at).to be > order3.created_at
272
+ order_two = Order.create user: order.user, completed_at: Time.current - 1.day, created_at: 2.days.ago, store: store
273
+ expect(order_two.created_at).to be > order.created_at
274
+ order_three = Order.create user: order.user, completed_at: nil, created_at: 1.day.ago, store: store
275
+ expect(order_three.created_at).to be > order_two.created_at
276
+ order_four = Order.create user: order.user, completed_at: nil, created_at: 0.days.ago, store: store
277
+ expect(order_four.created_at).to be > order_three.created_at
255
278
 
256
279
  get spree.api_my_orders_path, headers: { 'SERVER_NAME' => store.url }
257
280
  expect(response.status).to eq(200)
@@ -259,8 +282,8 @@ module Spree
259
282
  orders = json_response["orders"]
260
283
  expect(orders.length).to eq(4)
261
284
  expect(orders[0]["number"]).to eq(order.number)
262
- expect(orders[1]["number"]).to eq(order2.number)
263
- expect([orders[2]["number"], orders[3]["number"]]).to match_array([order3.number, order4.number])
285
+ expect(orders[1]["number"]).to eq(order_two.number)
286
+ expect([orders[2]["number"], orders[3]["number"]]).to match_array([order_three.number, order_four.number])
264
287
  end
265
288
  end
266
289
 
@@ -502,18 +525,18 @@ module Spree
502
525
  end
503
526
 
504
527
  it "adds an extra line item" do
505
- variant2 = create(:variant)
528
+ variant_two = create(:variant)
506
529
  put spree.api_order_path(order), params: { order: {
507
530
  line_items: {
508
531
  "0" => { id: line_item.id, quantity: 10 },
509
- "1" => { variant_id: variant2.id, quantity: 1 }
532
+ "1" => { variant_id: variant_two.id, quantity: 1 }
510
533
  }
511
534
  } }
512
535
 
513
536
  expect(response.status).to eq(200)
514
537
  expect(json_response['line_items'].count).to eq(2)
515
538
  expect(json_response['line_items'][0]['quantity']).to eq(10)
516
- expect(json_response['line_items'][1]['variant_id']).to eq(variant2.id)
539
+ expect(json_response['line_items'][1]['variant_id']).to eq(variant_two.id)
517
540
  expect(json_response['line_items'][1]['quantity']).to eq(1)
518
541
  end
519
542
 
@@ -727,7 +750,7 @@ module Spree
727
750
 
728
751
  orders = json_response[:orders]
729
752
  expect(orders.count).to be >= 3
730
- expect(orders.map { |o| o[:id] }).to match_array Order.pluck(:id)
753
+ expect(orders.map { |order| order[:id] }).to match_array Order.pluck(:id)
731
754
  end
732
755
 
733
756
  after { ActionController::Base.perform_caching = false }
@@ -17,8 +17,8 @@ module Spree
17
17
  shipping_category_id: create(:shipping_category).id }
18
18
  end
19
19
  let(:attributes_for_variant) do
20
- h = attributes_for(:variant).except(:option_values, :product)
21
- h.merge({
20
+ attributes = attributes_for(:variant).except(:option_values, :product)
21
+ attributes.merge({
22
22
  options: [
23
23
  { name: "size", value: "small" },
24
24
  { name: "color", value: "black" }
@@ -40,7 +40,7 @@ module Spree
40
40
 
41
41
  it "returns unique products" do
42
42
  get spree.api_products_path
43
- product_ids = json_response["products"].map { |p| p["id"] }
43
+ product_ids = json_response["products"].map { |product| product["id"] }
44
44
  expect(product_ids.uniq.count).to eq(product_ids.count)
45
45
  end
46
46
 
@@ -361,8 +361,8 @@ module Spree
361
361
  expect(response.status).to eq 200
362
362
  expect(json_response['variants'].count).to eq(2) # 2 variants
363
363
 
364
- variants = json_response['variants'].reject { |v| v['is_master'] }
365
- size_option_value = variants.last['option_values'].detect{ |x| x['option_type_name'] == 'size' }
364
+ variants = json_response['variants'].reject { |variant| variant['is_master'] }
365
+ size_option_value = variants.last['option_values'].detect{ |value| value['option_type_name'] == 'size' }
366
366
  expect(size_option_value['name']).to eq('small')
367
367
 
368
368
  expect(json_response['option_types'].count).to eq(2) # size, color
@@ -385,7 +385,7 @@ module Spree
385
385
  } }
386
386
 
387
387
  expect(json_response['variants'].count).to eq(1)
388
- variants = json_response['variants'].reject { |v| v['is_master'] }
388
+ variants = json_response['variants'].reject { |variant| variant['is_master'] }
389
389
  expect(variants.last['option_values'][0]['name']).to eq('large')
390
390
  expect(variants.last['sku']).to eq('456')
391
391
  expect(variants.count).to eq(1)
@@ -93,9 +93,9 @@ module Spree
93
93
  it 'returns only requested ids' do
94
94
  # We need a completly new branch to avoid having parent that can be preloaded from the rails ancestors
95
95
  python = create(:taxon, name: "Python", parent: taxonomy.root, taxonomy: taxonomy)
96
- python_3 = create(:taxon, name: "3.0", parent: python, taxonomy: taxonomy)
96
+ python_three = create(:taxon, name: "3.0", parent: python, taxonomy: taxonomy)
97
97
 
98
- get spree.api_taxons_path, params: { ids: [rails_v3_2_2.id, python_3.id] }
98
+ get spree.api_taxons_path, params: { ids: [rails_v3_2_2.id, python_three.id] }
99
99
 
100
100
  expect(json_response['taxons'].size).to eq 2
101
101
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solidus_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.10.0.beta1
4
+ version: 2.10.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Solidus Team
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-19 00:00:00.000000000 Z
11
+ date: 2021-05-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jbuilder
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 2.10.0.beta1
61
+ version: 2.10.5
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: 2.10.0.beta1
68
+ version: 2.10.5
69
69
  description: REST API for the Solidus e-commerce framework.
70
70
  email: contact@solidus.io
71
71
  executables: []
@@ -232,7 +232,7 @@ files:
232
232
  - lib/spree/api/config.rb
233
233
  - lib/spree/api/engine.rb
234
234
  - lib/spree/api/responders.rb
235
- - lib/spree/api/responders/rabl_template.rb
235
+ - lib/spree/api/responders/jbuilder_template.rb
236
236
  - lib/spree/api/testing_support/caching.rb
237
237
  - lib/spree/api/testing_support/helpers.rb
238
238
  - lib/spree/api/testing_support/setup.rb
@@ -253,9 +253,10 @@ files:
253
253
  - spec/controllers/spree/api/resource_controller_spec.rb
254
254
  - spec/features/checkout_spec.rb
255
255
  - spec/fixtures/thinking-cat.jpg
256
+ - spec/lib/spree_api_responders_spec.rb
256
257
  - spec/models/spree/legacy_user_spec.rb
257
258
  - spec/requests/api/address_books_spec.rb
258
- - spec/requests/rabl_cache_spec.rb
259
+ - spec/requests/jbuilder_cache_spec.rb
259
260
  - spec/requests/ransackable_attributes_spec.rb
260
261
  - spec/requests/spree/api/addresses_controller_spec.rb
261
262
  - spec/requests/spree/api/checkouts_controller_spec.rb
@@ -304,7 +305,7 @@ homepage: http://solidus.io/
304
305
  licenses:
305
306
  - BSD-3-Clause
306
307
  metadata: {}
307
- post_install_message:
308
+ post_install_message:
308
309
  rdoc_options: []
309
310
  require_paths:
310
311
  - lib
@@ -312,15 +313,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
312
313
  requirements:
313
314
  - - ">="
314
315
  - !ruby/object:Gem::Version
315
- version: 2.2.2
316
+ version: 2.4.0
316
317
  required_rubygems_version: !ruby/object:Gem::Requirement
317
318
  requirements:
318
319
  - - ">="
319
320
  - !ruby/object:Gem::Version
320
321
  version: 1.8.23
321
322
  requirements: []
322
- rubygems_version: 3.0.6
323
- signing_key:
323
+ rubygems_version: 3.1.4
324
+ signing_key:
324
325
  specification_version: 4
325
326
  summary: REST API for the Solidus e-commerce framework.
326
327
  test_files:
@@ -328,9 +329,10 @@ test_files:
328
329
  - spec/controllers/spree/api/resource_controller_spec.rb
329
330
  - spec/features/checkout_spec.rb
330
331
  - spec/fixtures/thinking-cat.jpg
332
+ - spec/lib/spree_api_responders_spec.rb
331
333
  - spec/models/spree/legacy_user_spec.rb
332
334
  - spec/requests/api/address_books_spec.rb
333
- - spec/requests/rabl_cache_spec.rb
335
+ - spec/requests/jbuilder_cache_spec.rb
334
336
  - spec/requests/ransackable_attributes_spec.rb
335
337
  - spec/requests/spree/api/addresses_controller_spec.rb
336
338
  - spec/requests/spree/api/checkouts_controller_spec.rb