solidus_api 2.10.0.beta1 → 2.10.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of solidus_api might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/README.md +30 -11
- data/app/controllers/spree/api/base_controller.rb +10 -10
- data/app/controllers/spree/api/checkouts_controller.rb +4 -4
- data/app/controllers/spree/api/orders_controller.rb +10 -5
- data/app/controllers/spree/api/taxonomies_controller.rb +3 -1
- data/app/helpers/spree/api/api_helpers.rb +1 -1
- data/app/views/spree/api/images/_image.json.jbuilder +2 -2
- data/app/views/spree/api/orders/_order.json.jbuilder +1 -1
- data/lib/spree/api/responders.rb +2 -2
- data/lib/spree/api/responders/{rabl_template.rb → jbuilder_template.rb} +3 -1
- data/openapi/api.oas2.yml +11 -13
- data/solidus_api.gemspec +1 -1
- data/spec/controllers/spree/api/resource_controller_spec.rb +4 -4
- data/spec/lib/spree_api_responders_spec.rb +10 -0
- data/spec/requests/api/address_books_spec.rb +2 -2
- data/spec/requests/{rabl_cache_spec.rb → jbuilder_cache_spec.rb} +2 -2
- data/spec/requests/spree/api/checkouts_controller_spec.rb +2 -2
- data/spec/requests/spree/api/option_types_controller_spec.rb +2 -2
- data/spec/requests/spree/api/option_values_controller_spec.rb +2 -2
- data/spec/requests/spree/api/orders_controller_spec.rb +12 -12
- data/spec/requests/spree/api/products_controller_spec.rb +6 -6
- data/spec/requests/spree/api/taxons_controller_spec.rb +2 -2
- metadata +11 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 52356cf1d1f31ef45efb1c26bcb53d2a16242caa83a4d2cd470306091cbc7cc2
|
4
|
+
data.tar.gz: de67c0bae8ab9426ab9e85c3f5b76bf88a762afd04517ec7130cbcdb3690247e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a10fbcebaa7d767adc2a3339d7d8d125fad76d19706da8bd523582a61c96e3391cc7cc9408f42e63f66552ce1a51c6604d76dd5d4679994faf37dca4fd3c3af6
|
7
|
+
data.tar.gz: 3a36ab01bbbecdbfb8a43329fcacea21fa6eb11b4dbdecb18af92f70d001f6ea6ba8ca5b67fb29987f6bfd66dd2c0997c0c5e72a44bd3a090c8d5c13effc0c6a
|
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
#
|
1
|
+
# solidus_api
|
2
2
|
|
3
|
-
API contains the controllers and
|
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]
|
16
|
-
|
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]
|
20
|
-
|
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
|
-
|
24
|
-
|
25
|
-
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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
|
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 =>
|
168
|
-
render plain:
|
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:
|
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 =>
|
27
|
-
logger.error("invalid_transition #{
|
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 =>
|
46
|
-
logger.error("invalid_transition #{
|
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
|
|
@@ -55,10 +55,9 @@ module Spree
|
|
55
55
|
def index
|
56
56
|
authorize! :index, Order
|
57
57
|
orders_includes = [
|
58
|
-
:
|
59
|
-
:
|
60
|
-
:
|
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
|
@@ -168,7 +167,13 @@ module Spree
|
|
168
167
|
end
|
169
168
|
|
170
169
|
def find_order(_lock = false)
|
171
|
-
@order = Spree::Order.
|
170
|
+
@order = Spree::Order.
|
171
|
+
includes(line_items: [:adjustments, { variant: :images }],
|
172
|
+
payments: :payment_method,
|
173
|
+
shipments: {
|
174
|
+
shipping_rates: { shipping_method: :zones, taxes: :tax_rate }
|
175
|
+
}).
|
176
|
+
find_by!(number: params[:id])
|
172
177
|
end
|
173
178
|
|
174
179
|
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).
|
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? { |
|
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 |
|
6
|
-
json.set! "#{
|
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(
|
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)
|
data/lib/spree/api/responders.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'responders'
|
4
|
-
require 'spree/api/responders/
|
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
|
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
|
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:
|
53
|
+
description: Creates a product.
|
54
54
|
operationId: create-product
|
55
55
|
tags:
|
56
56
|
- Products
|
@@ -4353,12 +4353,7 @@ paths:
|
|
4353
4353
|
- in: body
|
4354
4354
|
name: body
|
4355
4355
|
schema:
|
4356
|
-
|
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
|
-
|
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: []
|
@@ -5638,8 +5628,16 @@ definitions:
|
|
5638
5628
|
properties:
|
5639
5629
|
quantity:
|
5640
5630
|
type: integer
|
5631
|
+
description: 'Passing `0`, the line item will be removed.'
|
5641
5632
|
options:
|
5642
5633
|
type: object
|
5634
|
+
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.'
|
5635
|
+
id:
|
5636
|
+
type: integer
|
5637
|
+
description: Required for existing line items only.
|
5638
|
+
variant_id:
|
5639
|
+
type: integer
|
5640
|
+
description: Required for new line items only.
|
5643
5641
|
option-type-input:
|
5644
5642
|
type: object
|
5645
5643
|
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.
|
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 |
|
29
|
-
|
30
|
-
|
31
|
-
|
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 { |
|
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 { |
|
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 "
|
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
|
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 { |
|
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 { |
|
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
|
@@ -34,9 +34,9 @@ module Spree
|
|
34
34
|
end
|
35
35
|
|
36
36
|
it "can retrieve a list of specific option types" do
|
37
|
-
|
37
|
+
option_type_one = create(:option_type)
|
38
38
|
create(:option_type)
|
39
|
-
get spree.api_option_types_path, params: { ids: "#{option_type.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
|
-
|
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,
|
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
|
|
@@ -246,12 +246,12 @@ module Spree
|
|
246
246
|
it "returns orders in reverse chronological order by completed_at" do
|
247
247
|
order.update_columns completed_at: Time.current, created_at: 3.days.ago
|
248
248
|
|
249
|
-
|
250
|
-
expect(
|
251
|
-
|
252
|
-
expect(
|
253
|
-
|
254
|
-
expect(
|
249
|
+
order_two = Order.create user: order.user, completed_at: Time.current - 1.day, created_at: 2.days.ago, store: store
|
250
|
+
expect(order_two.created_at).to be > order.created_at
|
251
|
+
order_three = Order.create user: order.user, completed_at: nil, created_at: 1.day.ago, store: store
|
252
|
+
expect(order_three.created_at).to be > order_two.created_at
|
253
|
+
order_four = Order.create user: order.user, completed_at: nil, created_at: 0.days.ago, store: store
|
254
|
+
expect(order_four.created_at).to be > order_three.created_at
|
255
255
|
|
256
256
|
get spree.api_my_orders_path, headers: { 'SERVER_NAME' => store.url }
|
257
257
|
expect(response.status).to eq(200)
|
@@ -259,8 +259,8 @@ module Spree
|
|
259
259
|
orders = json_response["orders"]
|
260
260
|
expect(orders.length).to eq(4)
|
261
261
|
expect(orders[0]["number"]).to eq(order.number)
|
262
|
-
expect(orders[1]["number"]).to eq(
|
263
|
-
expect([orders[2]["number"], orders[3]["number"]]).to match_array([
|
262
|
+
expect(orders[1]["number"]).to eq(order_two.number)
|
263
|
+
expect([orders[2]["number"], orders[3]["number"]]).to match_array([order_three.number, order_four.number])
|
264
264
|
end
|
265
265
|
end
|
266
266
|
|
@@ -502,18 +502,18 @@ module Spree
|
|
502
502
|
end
|
503
503
|
|
504
504
|
it "adds an extra line item" do
|
505
|
-
|
505
|
+
variant_two = create(:variant)
|
506
506
|
put spree.api_order_path(order), params: { order: {
|
507
507
|
line_items: {
|
508
508
|
"0" => { id: line_item.id, quantity: 10 },
|
509
|
-
"1" => { variant_id:
|
509
|
+
"1" => { variant_id: variant_two.id, quantity: 1 }
|
510
510
|
}
|
511
511
|
} }
|
512
512
|
|
513
513
|
expect(response.status).to eq(200)
|
514
514
|
expect(json_response['line_items'].count).to eq(2)
|
515
515
|
expect(json_response['line_items'][0]['quantity']).to eq(10)
|
516
|
-
expect(json_response['line_items'][1]['variant_id']).to eq(
|
516
|
+
expect(json_response['line_items'][1]['variant_id']).to eq(variant_two.id)
|
517
517
|
expect(json_response['line_items'][1]['quantity']).to eq(1)
|
518
518
|
end
|
519
519
|
|
@@ -727,7 +727,7 @@ module Spree
|
|
727
727
|
|
728
728
|
orders = json_response[:orders]
|
729
729
|
expect(orders.count).to be >= 3
|
730
|
-
expect(orders.map { |
|
730
|
+
expect(orders.map { |order| order[:id] }).to match_array Order.pluck(:id)
|
731
731
|
end
|
732
732
|
|
733
733
|
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
|
-
|
21
|
-
|
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 { |
|
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 { |
|
365
|
-
size_option_value = variants.last['option_values'].detect{ |
|
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 { |
|
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
|
-
|
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,
|
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
|
4
|
+
version: 2.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Solidus Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-01-15 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
|
61
|
+
version: 2.10.0
|
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
|
68
|
+
version: 2.10.0
|
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/
|
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/
|
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
|
@@ -312,14 +313,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
312
313
|
requirements:
|
313
314
|
- - ">="
|
314
315
|
- !ruby/object:Gem::Version
|
315
|
-
version: 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.
|
323
|
+
rubygems_version: 3.0.3
|
323
324
|
signing_key:
|
324
325
|
specification_version: 4
|
325
326
|
summary: REST API for the Solidus e-commerce framework.
|
@@ -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/
|
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
|