solidus_api 2.10.5 → 2.11.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 (99) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/app/controllers/spree/api/addresses_controller.rb +1 -1
  4. data/app/controllers/spree/api/base_controller.rb +11 -3
  5. data/app/controllers/spree/api/checkouts_controller.rb +1 -11
  6. data/app/controllers/spree/api/countries_controller.rb +2 -2
  7. data/app/controllers/spree/api/credit_cards_controller.rb +2 -2
  8. data/app/controllers/spree/api/customer_returns_controller.rb +67 -0
  9. data/app/controllers/spree/api/images_controller.rb +4 -4
  10. data/app/controllers/spree/api/inventory_units_controller.rb +1 -1
  11. data/app/controllers/spree/api/option_types_controller.rb +3 -3
  12. data/app/controllers/spree/api/option_values_controller.rb +2 -2
  13. data/app/controllers/spree/api/orders_controller.rb +1 -1
  14. data/app/controllers/spree/api/payments_controller.rb +1 -1
  15. data/app/controllers/spree/api/product_properties_controller.rb +9 -14
  16. data/app/controllers/spree/api/promotions_controller.rb +3 -12
  17. data/app/controllers/spree/api/properties_controller.rb +3 -3
  18. data/app/controllers/spree/api/resource_controller.rb +2 -2
  19. data/app/controllers/spree/api/return_authorizations_controller.rb +3 -3
  20. data/app/controllers/spree/api/shipments_controller.rb +1 -1
  21. data/app/controllers/spree/api/states_controller.rb +3 -3
  22. data/app/controllers/spree/api/stock_items_controller.rb +2 -2
  23. data/app/controllers/spree/api/stock_locations_controller.rb +3 -3
  24. data/app/controllers/spree/api/stock_movements_controller.rb +3 -3
  25. data/app/controllers/spree/api/stores_controller.rb +3 -3
  26. data/app/controllers/spree/api/taxonomies_controller.rb +2 -2
  27. data/app/controllers/spree/api/taxons_controller.rb +4 -4
  28. data/app/controllers/spree/api/users_controller.rb +13 -0
  29. data/app/controllers/spree/api/variants_controller.rb +3 -3
  30. data/app/controllers/spree/api/zones_controller.rb +2 -2
  31. data/app/helpers/spree/api/api_helpers.rb +18 -5
  32. data/app/views/spree/api/customer_returns/index.json.jbuilder +6 -0
  33. data/app/views/spree/api/customer_returns/new.json.jbuilder +4 -0
  34. data/app/views/spree/api/customer_returns/show.json.jbuilder +3 -0
  35. data/app/views/spree/api/errors/could_not_transition.json.jbuilder +4 -0
  36. data/app/views/spree/api/orders/could_not_transition.json.jbuilder +5 -0
  37. data/config/locales/en.yml +2 -0
  38. data/config/routes.rb +6 -3
  39. data/lib/spree/api/testing_support/helpers.rb +1 -1
  40. data/openapi/authentication.md +9 -1
  41. data/openapi/checkout-flow.md +17 -4
  42. data/openapi/main.hub.yml +1 -1
  43. data/openapi/solidus-api.oas.yml +6753 -0
  44. data/solidus_api.gemspec +19 -19
  45. metadata +14 -114
  46. data/openapi/api.oas2.yml +0 -6108
  47. data/script/rails +0 -10
  48. data/spec/controllers/spree/api/base_controller_spec.rb +0 -118
  49. data/spec/controllers/spree/api/resource_controller_spec.rb +0 -190
  50. data/spec/features/checkout_spec.rb +0 -192
  51. data/spec/fixtures/thinking-cat.jpg +0 -0
  52. data/spec/lib/spree_api_responders_spec.rb +0 -10
  53. data/spec/models/spree/legacy_user_spec.rb +0 -103
  54. data/spec/requests/api/address_books_spec.rb +0 -240
  55. data/spec/requests/jbuilder_cache_spec.rb +0 -34
  56. data/spec/requests/ransackable_attributes_spec.rb +0 -79
  57. data/spec/requests/spree/api/addresses_controller_spec.rb +0 -57
  58. data/spec/requests/spree/api/checkouts_controller_spec.rb +0 -484
  59. data/spec/requests/spree/api/classifications_controller_spec.rb +0 -50
  60. data/spec/requests/spree/api/config_controller_spec.rb +0 -26
  61. data/spec/requests/spree/api/countries_controller_spec.rb +0 -48
  62. data/spec/requests/spree/api/coupon_codes_controller_spec.rb +0 -105
  63. data/spec/requests/spree/api/credit_cards_controller_spec.rb +0 -105
  64. data/spec/requests/spree/api/images_controller_spec.rb +0 -99
  65. data/spec/requests/spree/api/inventory_units_controller_spec.rb +0 -55
  66. data/spec/requests/spree/api/line_items_controller_spec.rb +0 -213
  67. data/spec/requests/spree/api/option_types_controller_spec.rb +0 -116
  68. data/spec/requests/spree/api/option_values_controller_spec.rb +0 -138
  69. data/spec/requests/spree/api/orders_controller_spec.rb +0 -954
  70. data/spec/requests/spree/api/payments_controller_spec.rb +0 -259
  71. data/spec/requests/spree/api/product_properties_controller_spec.rb +0 -114
  72. data/spec/requests/spree/api/products_controller_spec.rb +0 -422
  73. data/spec/requests/spree/api/promotion_application_spec.rb +0 -50
  74. data/spec/requests/spree/api/promotions_controller_spec.rb +0 -67
  75. data/spec/requests/spree/api/properties_controller_spec.rb +0 -102
  76. data/spec/requests/spree/api/return_authorizations_controller_spec.rb +0 -180
  77. data/spec/requests/spree/api/shipments_controller_spec.rb +0 -532
  78. data/spec/requests/spree/api/states_controller_spec.rb +0 -69
  79. data/spec/requests/spree/api/stock_items_controller_spec.rb +0 -311
  80. data/spec/requests/spree/api/stock_locations_controller_spec.rb +0 -170
  81. data/spec/requests/spree/api/stock_movements_controller_spec.rb +0 -81
  82. data/spec/requests/spree/api/store_credit_events_controller_spec.rb +0 -59
  83. data/spec/requests/spree/api/stores_controller_spec.rb +0 -134
  84. data/spec/requests/spree/api/taxonomies_controller_spec.rb +0 -114
  85. data/spec/requests/spree/api/taxons_controller_spec.rb +0 -217
  86. data/spec/requests/spree/api/unauthenticated_products_controller_spec.rb +0 -27
  87. data/spec/requests/spree/api/users_controller_spec.rb +0 -151
  88. data/spec/requests/spree/api/variants_controller_spec.rb +0 -340
  89. data/spec/requests/spree/api/zones_controller_spec.rb +0 -89
  90. data/spec/shared_examples/protect_product_actions.rb +0 -18
  91. data/spec/spec_helper.rb +0 -73
  92. data/spec/support/be_paginated_matcher.rb +0 -9
  93. data/spec/support/controller_hacks.rb +0 -43
  94. data/spec/support/database_cleaner.rb +0 -16
  95. data/spec/support/have_attributes_matcher.rb +0 -11
  96. data/spec/test_views/spree/api/widgets/_widget.json.jbuilder +0 -3
  97. data/spec/test_views/spree/api/widgets/index.json.jbuilder +0 -9
  98. data/spec/test_views/spree/api/widgets/new.json.jbuilder +0 -3
  99. data/spec/test_views/spree/api/widgets/show.json.jbuilder +0 -3
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- module Spree
6
- describe Api::ClassificationsController, type: :request do
7
- let(:taxon) do
8
- taxon = create(:taxon)
9
-
10
- 3.times do
11
- product = create(:product)
12
- product.taxons << taxon
13
- end
14
- taxon
15
- end
16
-
17
- before do
18
- stub_authentication!
19
- end
20
-
21
- context "as a user" do
22
- it "cannot change the order of a product" do
23
- put spree.api_classifications_path, params: { taxon_id: taxon, product_id: taxon.products.first, position: 1 }
24
- expect(response.status).to eq(401)
25
- end
26
- end
27
-
28
- context "as an admin" do
29
- sign_in_as_admin!
30
-
31
- let(:last_product) { taxon.products.last }
32
-
33
- it "can change the order a product" do
34
- classification = taxon.classifications.find_by(product_id: last_product.id)
35
- expect(classification.position).to eq(3)
36
- put spree.api_classifications_path, params: { taxon_id: taxon.id, product_id: last_product.id, position: 0 }
37
- expect(response.status).to eq(200)
38
- expect(classification.reload.position).to eq(1)
39
- end
40
-
41
- it "should touch the taxon" do
42
- taxon.update(updated_at: Time.current - 10.seconds)
43
- taxon_last_updated_at = taxon.updated_at
44
- put spree.api_classifications_path, params: { taxon_id: taxon.id, product_id: last_product.id, position: 0 }
45
- taxon.reload
46
- expect(taxon_last_updated_at.to_i).to_not eq(taxon.updated_at.to_i)
47
- end
48
- end
49
- end
50
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- module Spree
6
- describe Api::ConfigController, type: :request do
7
- let!(:default_country) { create :country, iso: "US" }
8
-
9
- before do
10
- stub_authentication!
11
- end
12
-
13
- it "returns Spree::Money settings" do
14
- get '/api/config/money'
15
- expect(response).to be_successful
16
- expect(json_response["symbol"]).to eq("$")
17
- end
18
-
19
- it "returns some configuration settings" do
20
- get '/api/config'
21
- expect(response).to be_successful
22
- expect(json_response["default_country_iso"]).to eq("US")
23
- expect(json_response["default_country_id"]).to eq(default_country.id)
24
- end
25
- end
26
- end
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- module Spree
6
- describe Api::CountriesController, type: :request do
7
- before do
8
- stub_authentication!
9
- @state = create(:state)
10
- @country = @state.country
11
- end
12
-
13
- it "gets all countries" do
14
- get spree.api_countries_path
15
- expect(json_response['countries'].first['iso3']).to eq @country.iso3
16
- end
17
-
18
- context "with two countries" do
19
- before { @zambia = create(:country, name: "Zambia") }
20
-
21
- it "can view all countries" do
22
- get spree.api_countries_path
23
- expect(json_response['count']).to eq(2)
24
- expect(json_response['current_page']).to eq(1)
25
- expect(json_response['pages']).to eq(1)
26
- end
27
-
28
- it 'can query the results through a paramter' do
29
- get spree.api_countries_path, params: { q: { name_cont: 'zam' } }
30
- expect(json_response['count']).to eq(1)
31
- expect(json_response['countries'].first['name']).to eq @zambia.name
32
- end
33
-
34
- it 'can control the page size through a parameter' do
35
- get spree.api_countries_path, params: { per_page: 1 }
36
- expect(json_response['count']).to eq(1)
37
- expect(json_response['current_page']).to eq(1)
38
- expect(json_response['pages']).to eq(2)
39
- end
40
- end
41
-
42
- it "includes states" do
43
- get spree.api_country_path(@country.id)
44
- states = json_response['states']
45
- expect(states.first['name']).to eq @state.name
46
- end
47
- end
48
- end
@@ -1,105 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- module Spree
6
- describe Api::CouponCodesController, type: :request do
7
- let(:current_api_user) do
8
- user = Spree.user_class.new(email: "spree@example.com")
9
- user.generate_spree_api_key!
10
- user
11
- end
12
-
13
- before do
14
- stub_authentication!
15
- end
16
-
17
- describe '#create' do
18
- let(:promo) { create(:promotion_with_item_adjustment, code: 'night_melody') }
19
- let(:promo_code) { promo.codes.first }
20
-
21
- before do
22
- allow_any_instance_of(Order).to receive_messages user: current_api_user
23
- end
24
-
25
- context 'when successful' do
26
- let(:order) { create(:order_with_line_items) }
27
-
28
- it 'applies the coupon' do
29
- post spree.api_order_coupon_codes_path(order), params: { coupon_code: promo_code.value }
30
-
31
- expect(response.status).to eq(200)
32
- expect(order.reload.promotions).to eq([promo])
33
- expect(json_response).to eq({
34
- "success" => I18n.t('spree.coupon_code_applied'),
35
- "error" => nil,
36
- "successful" => true,
37
- "status_code" => "coupon_code_applied"
38
- })
39
- end
40
- end
41
-
42
- context 'when unsuccessful' do
43
- let(:order) { create(:order) }
44
-
45
- it 'returns an error' do
46
- post spree.api_order_coupon_codes_path(order), params: { coupon_code: promo_code.value }
47
-
48
- expect(response.status).to eq(422)
49
- expect(order.reload.promotions).to eq([])
50
- expect(json_response).to eq({
51
- "success" => nil,
52
- "error" => I18n.t('spree.coupon_code_unknown_error'),
53
- "successful" => false,
54
- "status_code" => "coupon_code_unknown_error"
55
- })
56
- end
57
- end
58
- end
59
-
60
- describe '#destroy' do
61
- let(:promo) {
62
- create(:promotion_with_item_adjustment,
63
- code: 'tenoff',
64
- per_code_usage_limit: 5,
65
- adjustment_rate: 10)
66
- }
67
-
68
- let(:promo_code) { promo.codes.first }
69
- let(:order) { create(:order_with_line_items, user: current_api_user) }
70
-
71
- before do
72
- post spree.api_order_coupon_codes_path(order), params: { coupon_code: promo_code.value }
73
- delete spree.api_order_coupon_code_path(order, promo_code.value)
74
- end
75
-
76
- context 'when successful' do
77
- it 'removes the coupon' do
78
- expect(response.status).to eq(200)
79
- expect(order.reload.promotions).to eq([])
80
- expect(json_response).to eq({
81
- "success" => I18n.t('spree.coupon_code_removed'),
82
- "error" => nil,
83
- "successful" => true,
84
- "status_code" => "coupon_code_removed"
85
- })
86
- end
87
- end
88
-
89
- context 'when unsuccessful' do
90
- it 'returns an error' do
91
- delete spree.api_order_coupon_code_path(order, promo_code.value)
92
-
93
- expect(response.status).to eq(422)
94
- expect(order.reload.promotions).to eq([])
95
- expect(json_response).to eq({
96
- "success" => nil,
97
- "error" => I18n.t('spree.coupon_code_not_present'),
98
- "successful" => false,
99
- "status_code" => "coupon_code_not_present"
100
- })
101
- end
102
- end
103
- end
104
- end
105
- end
@@ -1,105 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- module Spree
6
- describe Api::CreditCardsController, type: :request do
7
- describe '#index' do
8
- let!(:admin_user) do
9
- create(:admin_user)
10
- end
11
-
12
- let!(:normal_user) do
13
- create(:user, :with_api_key)
14
- end
15
-
16
- let!(:card) { create(:credit_card, user_id: admin_user.id, gateway_customer_profile_id: "random") }
17
-
18
- before do
19
- stub_authentication!
20
- end
21
-
22
- it "the user id doesn't exist" do
23
- get spree.api_user_credit_cards_path(1000)
24
- expect(response.status).to eq(404)
25
- end
26
-
27
- context "calling user is in admin role" do
28
- let(:current_api_user) do
29
- admin_user
30
- end
31
-
32
- it "no credit cards exist for user" do
33
- get spree.api_user_credit_cards_path(normal_user)
34
-
35
- expect(response.status).to eq(200)
36
- expect(json_response["pages"]).to eq(0)
37
- end
38
-
39
- it "can view all credit cards for user" do
40
- get spree.api_user_credit_cards_path(current_api_user.id)
41
-
42
- expect(response.status).to eq(200)
43
- expect(json_response["pages"]).to eq(1)
44
- expect(json_response["current_page"]).to eq(1)
45
- expect(json_response["credit_cards"].length).to eq(1)
46
- expect(json_response["credit_cards"].first["id"]).to eq(card.id)
47
- end
48
- end
49
-
50
- context "calling user is not in admin role" do
51
- let(:current_api_user) do
52
- normal_user
53
- end
54
-
55
- let!(:card) { create(:credit_card, user_id: normal_user.id, gateway_customer_profile_id: "random") }
56
-
57
- it "can not view user" do
58
- get spree.api_user_credit_cards_path(admin_user.id)
59
-
60
- expect(response.status).to eq(404)
61
- end
62
-
63
- it "can view own credit cards" do
64
- get spree.api_user_credit_cards_path(normal_user.id)
65
-
66
- expect(response.status).to eq(200)
67
- expect(json_response["pages"]).to eq(1)
68
- expect(json_response["current_page"]).to eq(1)
69
- expect(json_response["credit_cards"].length).to eq(1)
70
- expect(json_response["credit_cards"].first["id"]).to eq(card.id)
71
- end
72
- end
73
- end
74
-
75
- describe '#update' do
76
- let(:credit_card) { create(:credit_card, name: 'Joe Shmoe', user: credit_card_user) }
77
- let(:credit_card_user) { create(:user) }
78
-
79
- before do
80
- stub_authentication!
81
- end
82
-
83
- context 'when the user is authorized' do
84
- let(:current_api_user) { credit_card_user }
85
-
86
- it 'updates the credit card' do
87
- expect {
88
- put spree.api_credit_card_path(credit_card.to_param), params: { credit_card: { name: 'Jordan Brough' } }
89
- }.to change {
90
- credit_card.reload.name
91
- }.from('Joe Shmoe').to('Jordan Brough')
92
- end
93
- end
94
-
95
- context 'when the user is not authorized' do
96
- let(:current_api_user) { create(:user) }
97
-
98
- it 'rejects the request' do
99
- put spree.api_credit_card_path(credit_card.to_param), params: { credit_card: { name: 'Jordan Brough' } }
100
- expect(response.status).to eq(401)
101
- end
102
- end
103
- end
104
- end
105
- end
@@ -1,99 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- module Spree
6
- describe Spree::Api::ImagesController, type: :request do
7
- let!(:product) { create(:product) }
8
- let!(:attributes) {
9
- [:id, :position, :attachment_content_type,
10
- :attachment_file_name, :type, :attachment_updated_at, :attachment_width,
11
- :attachment_height, :alt]
12
- }
13
-
14
- before do
15
- stub_authentication!
16
- end
17
-
18
- context "as an admin" do
19
- sign_in_as_admin!
20
-
21
- it "can upload a new image for a variant" do
22
- expect do
23
- post spree.api_product_images_path(product.id), params: {
24
- image: {
25
- attachment: upload_image('thinking-cat.jpg'),
26
- viewable_type: 'Spree::Variant',
27
- viewable_id: product.master.to_param
28
- },
29
- }
30
- expect(response.status).to eq(201)
31
- expect(json_response).to have_attributes(attributes)
32
- end.to change(Image, :count).by(1)
33
- end
34
-
35
- context "working with an existing image" do
36
- let!(:product_image) { product.master.images.create!(attachment: image('thinking-cat.jpg')) }
37
-
38
- it "can get a single product image" do
39
- get spree.api_product_image_path(product.id, product_image)
40
- expect(response.status).to eq(200)
41
- expect(json_response).to have_attributes(attributes)
42
- end
43
-
44
- it "can get a single variant image" do
45
- get spree.api_variant_image_path(product.master.id, product_image)
46
- expect(response.status).to eq(200)
47
- expect(json_response).to have_attributes(attributes)
48
- end
49
-
50
- it "can get a list of product images" do
51
- get spree.api_product_images_path(product.id)
52
- expect(response.status).to eq(200)
53
- expect(json_response).to have_key("images")
54
- expect(json_response["images"].first).to have_attributes(attributes)
55
- end
56
-
57
- it "can get a list of variant images" do
58
- get spree.api_variant_images_path(product.master.id)
59
- expect(response.status).to eq(200)
60
- expect(json_response).to have_key("images")
61
- expect(json_response["images"].first).to have_attributes(attributes)
62
- end
63
-
64
- it "can update image data" do
65
- expect(product_image.position).to eq(1)
66
- put spree.api_variant_image_path(product.id, product_image), params: { image: { position: 2 } }
67
- expect(response.status).to eq(200)
68
- expect(json_response).to have_attributes(attributes)
69
- expect(product_image.reload.position).to eq(2)
70
- end
71
-
72
- it "can delete an image" do
73
- delete spree.api_variant_image_path(product.id, product_image)
74
- expect(response.status).to eq(204)
75
- expect { product_image.reload }.to raise_error(ActiveRecord::RecordNotFound)
76
- end
77
- end
78
- end
79
-
80
- context "as a non-admin" do
81
- let(:product_image) { product.master.images.create!(attachment: image('thinking-cat.jpg')) }
82
-
83
- it "cannot create an image" do
84
- post spree.api_product_images_path(product.id)
85
- assert_unauthorized!
86
- end
87
-
88
- it "cannot update an image" do
89
- put spree.api_product_image_path(product.id, product_image)
90
- assert_not_found!
91
- end
92
-
93
- it "cannot delete an image" do
94
- delete spree.api_product_image_path(product.id, product_image)
95
- assert_not_found!
96
- end
97
- end
98
- end
99
- end
@@ -1,55 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- module Spree
6
- describe Api::InventoryUnitsController, type: :request do
7
- let!(:inventory_unit) { create(:inventory_unit) }
8
-
9
- before do
10
- stub_authentication!
11
- end
12
-
13
- context "as an admin" do
14
- sign_in_as_admin!
15
- let(:variant) { create(:variant) }
16
-
17
- it "gets an inventory unit" do
18
- get spree.api_inventory_unit_path(inventory_unit)
19
- expect(json_response['state']).to eq inventory_unit.state
20
- end
21
-
22
- it "updates an inventory unit" do
23
- put spree.api_inventory_unit_path(inventory_unit), params: {
24
- inventory_unit: { variant_id: variant.id }
25
- }
26
- expect(json_response['variant_id']).to eq variant.id
27
- end
28
-
29
- context 'fires state event' do
30
- it 'if supplied with :fire param' do
31
- put spree.api_inventory_unit_path(inventory_unit), params: {
32
- fire: 'ship',
33
- inventory_unit: { variant_id: variant.id }
34
- }
35
-
36
- expect(json_response['state']).to eq 'shipped'
37
- end
38
-
39
- it 'and returns exception if cannot fire' do
40
- put spree.api_inventory_unit_path(inventory_unit), params: {
41
- fire: 'return'
42
- }
43
- expect(json_response['exception']).to match /cannot transition to return/
44
- end
45
-
46
- it 'and returns exception bad state' do
47
- put spree.api_inventory_unit_path(inventory_unit), params: {
48
- fire: 'bad'
49
- }
50
- expect(json_response['exception']).to match /cannot transition to bad/
51
- end
52
- end
53
- end
54
- end
55
- end