diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cf77346..843e7c8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ Note: For changes to the API, see https://shopify.dev/changelog?filter=api ## Unreleased - [#1337](https://github.com/Shopify/shopify-api-ruby/pull/1337) Fix type for Shop#google_apps_login_enabled +- [#1340](https://github.com/Shopify/shopify-api-ruby/pull/1340) Add support for 2024-10 API version ## 14.5.0 diff --git a/lib/shopify_api/admin_versions.rb b/lib/shopify_api/admin_versions.rb index 5da42c4b..630cea12 100644 --- a/lib/shopify_api/admin_versions.rb +++ b/lib/shopify_api/admin_versions.rb @@ -5,6 +5,7 @@ module ShopifyAPI module AdminVersions SUPPORTED_ADMIN_VERSIONS = T.let([ "unstable", + "2024-10", "2024-07", "2024-04", "2024-01", @@ -18,7 +19,7 @@ module AdminVersions "2022-01", ], T::Array[String]) - LATEST_SUPPORTED_ADMIN_VERSION = T.let("2024-07", String) + LATEST_SUPPORTED_ADMIN_VERSION = T.let("2024-10", String) end SUPPORTED_ADMIN_VERSIONS = ShopifyAPI::AdminVersions::SUPPORTED_ADMIN_VERSIONS diff --git a/lib/shopify_api/rest/resources/2024_10/abandoned_checkout.rb b/lib/shopify_api/rest/resources/2024_10/abandoned_checkout.rb new file mode 100644 index 00000000..7f82d699 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/abandoned_checkout.rb @@ -0,0 +1,194 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class AbandonedCheckout < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @abandoned_checkout_url = T.let(nil, T.nilable(String)) + @billing_address = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @buyer_accepts_marketing = T.let(nil, T.nilable(T::Boolean)) + @buyer_accepts_sms_marketing = T.let(nil, T.nilable(T::Boolean)) + @cart_token = T.let(nil, T.nilable(String)) + @closed_at = T.let(nil, T.nilable(String)) + @completed_at = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @currency = T.let(nil, T.nilable(Currency)) + @customer = T.let(nil, T.nilable(Customer)) + @customer_locale = T.let(nil, T.nilable(String)) + @device_id = T.let(nil, T.nilable(Integer)) + @discount_codes = T.let(nil, T.nilable(T::Array[T.untyped])) + @email = T.let(nil, T.nilable(String)) + @gateway = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @landing_site = T.let(nil, T.nilable(String)) + @line_items = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @location_id = T.let(nil, T.nilable(Integer)) + @note = T.let(nil, T.nilable(String)) + @phone = T.let(nil, T.nilable(String)) + @presentment_currency = T.let(nil, T.nilable(String)) + @referring_site = T.let(nil, T.nilable(String)) + @shipping_address = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @shipping_lines = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @sms_marketing_phone = T.let(nil, T.nilable(String)) + @source_name = T.let(nil, T.nilable(String)) + @subtotal_price = T.let(nil, T.nilable(String)) + @tax_lines = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @taxes_included = T.let(nil, T.nilable(T::Boolean)) + @token = T.let(nil, T.nilable(String)) + @total_discounts = T.let(nil, T.nilable(String)) + @total_duties = T.let(nil, T.nilable(String)) + @total_line_items_price = T.let(nil, T.nilable(String)) + @total_price = T.let(nil, T.nilable(String)) + @total_tax = T.let(nil, T.nilable(String)) + @total_weight = T.let(nil, T.nilable(Integer)) + @updated_at = T.let(nil, T.nilable(String)) + @user_id = T.let(nil, T.nilable(Integer)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({ + currency: Currency, + customer: Customer + }, T::Hash[Symbol, Class]) + @has_many = T.let({ + discount_codes: DiscountCode + }, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :checkouts, ids: [], path: "checkouts.json"}, + {http_method: :get, operation: :checkouts, ids: [], path: "checkouts.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :abandoned_checkout_url + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :billing_address + sig { returns(T.nilable(T::Boolean)) } + attr_reader :buyer_accepts_marketing + sig { returns(T.nilable(T::Boolean)) } + attr_reader :buyer_accepts_sms_marketing + sig { returns(T.nilable(String)) } + attr_reader :cart_token + sig { returns(T.nilable(String)) } + attr_reader :closed_at + sig { returns(T.nilable(String)) } + attr_reader :completed_at + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(Currency)) } + attr_reader :currency + sig { returns(T.nilable(Customer)) } + attr_reader :customer + sig { returns(T.nilable(String)) } + attr_reader :customer_locale + sig { returns(T.nilable(Integer)) } + attr_reader :device_id + sig { returns(T.nilable(T::Array[DiscountCode])) } + attr_reader :discount_codes + sig { returns(T.nilable(String)) } + attr_reader :email + sig { returns(T.nilable(String)) } + attr_reader :gateway + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :landing_site + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :line_items + sig { returns(T.nilable(Integer)) } + attr_reader :location_id + sig { returns(T.nilable(String)) } + attr_reader :note + sig { returns(T.nilable(String)) } + attr_reader :phone + sig { returns(T.nilable(String)) } + attr_reader :presentment_currency + sig { returns(T.nilable(String)) } + attr_reader :referring_site + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :shipping_address + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :shipping_lines + sig { returns(T.nilable(String)) } + attr_reader :sms_marketing_phone + sig { returns(T.nilable(String)) } + attr_reader :source_name + sig { returns(T.nilable(String)) } + attr_reader :subtotal_price + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :tax_lines + sig { returns(T.nilable(T::Boolean)) } + attr_reader :taxes_included + sig { returns(T.nilable(String)) } + attr_reader :token + sig { returns(T.nilable(String)) } + attr_reader :total_discounts + sig { returns(T.nilable(String)) } + attr_reader :total_duties + sig { returns(T.nilable(String)) } + attr_reader :total_line_items_price + sig { returns(T.nilable(String)) } + attr_reader :total_price + sig { returns(T.nilable(String)) } + attr_reader :total_tax + sig { returns(T.nilable(Integer)) } + attr_reader :total_weight + sig { returns(T.nilable(String)) } + attr_reader :updated_at + sig { returns(T.nilable(Integer)) } + attr_reader :user_id + + class << self + sig do + params( + since_id: T.untyped, + created_at_min: T.untyped, + created_at_max: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + status: T.untyped, + limit: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def checkouts( + since_id: nil, + created_at_min: nil, + created_at_max: nil, + updated_at_min: nil, + updated_at_max: nil, + status: nil, + limit: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :checkouts, + session: session, + ids: {}, + params: {since_id: since_id, created_at_min: created_at_min, created_at_max: created_at_max, updated_at_min: updated_at_min, updated_at_max: updated_at_max, status: status, limit: limit}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/access_scope.rb b/lib/shopify_api/rest/resources/2024_10/access_scope.rb new file mode 100644 index 00000000..f31a30ed --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/access_scope.rb @@ -0,0 +1,62 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class AccessScope < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @handle = T.let(nil, T.nilable(String)) + @access_scopes = T.let(nil, T.nilable(T::Array[T.untyped])) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @custom_prefix = T.let("/admin/oauth", T.nilable(String)) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [], path: "access_scopes.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :handle + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :access_scopes + + class << self + sig do + params( + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[AccessScope]) + end + def all( + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[AccessScope]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/apple_pay_certificate.rb b/lib/shopify_api/rest/resources/2024_10/apple_pay_certificate.rb new file mode 100644 index 00000000..23e29b23 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/apple_pay_certificate.rb @@ -0,0 +1,109 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class ApplePayCertificate < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @id = T.let(nil, T.nilable(Integer)) + @merchant_id = T.let(nil, T.nilable(String)) + @status = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "apple_pay_certificates/.json"}, + {http_method: :get, operation: :csr, ids: [:id], path: "apple_pay_certificates//csr.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "apple_pay_certificates/.json"}, + {http_method: :post, operation: :post, ids: [], path: "apple_pay_certificates.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "apple_pay_certificates/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :merchant_id + sig { returns(T.nilable(String)) } + attr_reader :status + + class << self + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.nilable(ApplePayCertificate)) + end + def find( + id:, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {}, + ) + T.cast(result[0], T.nilable(ApplePayCertificate)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def csr( + id:, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :csr, + session: session, + ids: {id: id}, + params: {}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/application_charge.rb b/lib/shopify_api/rest/resources/2024_10/application_charge.rb new file mode 100644 index 00000000..9e9242ed --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/application_charge.rb @@ -0,0 +1,113 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class ApplicationCharge < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @confirmation_url = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @currency = T.let(nil, T.nilable(Currency)) + @id = T.let(nil, T.nilable(Integer)) + @name = T.let(nil, T.nilable(String)) + @price = T.let(nil, T.nilable(T.any(String, Float))) + @return_url = T.let(nil, T.nilable(String)) + @status = T.let(nil, T.nilable(String)) + @test = T.let(nil, T.nilable(T::Boolean)) + @updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({ + currency: Currency + }, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [], path: "application_charges.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "application_charges/.json"}, + {http_method: :post, operation: :post, ids: [], path: "application_charges.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :confirmation_url + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(Currency)) } + attr_reader :currency + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :name + sig { returns(T.nilable(T.any(String, Float))) } + attr_reader :price + sig { returns(T.nilable(String)) } + attr_reader :return_url + sig { returns(T.nilable(String)) } + attr_reader :status + sig { returns(T.nilable(T::Boolean)) } + attr_reader :test + sig { returns(T.nilable(String)) } + attr_reader :updated_at + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(ApplicationCharge)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(ApplicationCharge)) + end + + sig do + params( + since_id: T.untyped, + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[ApplicationCharge]) + end + def all( + since_id: nil, + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {since_id: since_id, fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[ApplicationCharge]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/application_credit.rb b/lib/shopify_api/rest/resources/2024_10/application_credit.rb new file mode 100644 index 00000000..e519a619 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/application_credit.rb @@ -0,0 +1,95 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class ApplicationCredit < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @amount = T.let(nil, T.nilable(String)) + @currency = T.let(nil, T.nilable(Currency)) + @description = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @test = T.let(nil, T.nilable(T::Boolean)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({ + currency: Currency + }, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [], path: "application_credits.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "application_credits/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :amount + sig { returns(T.nilable(Currency)) } + attr_reader :currency + sig { returns(T.nilable(String)) } + attr_reader :description + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(T::Boolean)) } + attr_reader :test + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(ApplicationCredit)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(ApplicationCredit)) + end + + sig do + params( + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[ApplicationCredit]) + end + def all( + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[ApplicationCredit]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/article.rb b/lib/shopify_api/rest/resources/2024_10/article.rb new file mode 100644 index 00000000..18d3c4cd --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/article.rb @@ -0,0 +1,269 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Article < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @author = T.let(nil, T.nilable(String)) + @blog_id = T.let(nil, T.nilable(Integer)) + @body_html = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @handle = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @image = T.let(nil, T.nilable(T.any(String, T::Hash[T.untyped, T.untyped]))) + @metafields = T.let(nil, T.nilable(T::Array[T.untyped])) + @published = T.let(nil, T.nilable(T::Boolean)) + @published_at = T.let(nil, T.nilable(String)) + @summary_html = T.let(nil, T.nilable(String)) + @tags = T.let(nil, T.nilable(String)) + @template_suffix = T.let(nil, T.nilable(String)) + @title = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + @user_id = T.let(nil, T.nilable(Integer)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({ + metafields: Metafield + }, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:blog_id, :id], path: "blogs//articles/.json"}, + {http_method: :get, operation: :authors, ids: [], path: "articles/authors.json"}, + {http_method: :get, operation: :count, ids: [:blog_id], path: "blogs//articles/count.json"}, + {http_method: :get, operation: :get, ids: [:blog_id], path: "blogs//articles.json"}, + {http_method: :get, operation: :get, ids: [:blog_id, :id], path: "blogs//articles/.json"}, + {http_method: :get, operation: :tags, ids: [], path: "articles/tags.json"}, + {http_method: :get, operation: :tags, ids: [:blog_id], path: "blogs//articles/tags.json"}, + {http_method: :post, operation: :post, ids: [:blog_id], path: "blogs//articles.json"}, + {http_method: :put, operation: :put, ids: [:blog_id, :id], path: "blogs//articles/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :author + sig { returns(T.nilable(Integer)) } + attr_reader :blog_id + sig { returns(T.nilable(String)) } + attr_reader :body_html + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :handle + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(T.any(String, T::Hash[T.untyped, T.untyped]))) } + attr_reader :image + sig { returns(T.nilable(T::Array[Metafield])) } + attr_reader :metafields + sig { returns(T.nilable(T::Boolean)) } + attr_reader :published + sig { returns(T.nilable(String)) } + attr_reader :published_at + sig { returns(T.nilable(String)) } + attr_reader :summary_html + sig { returns(T.nilable(String)) } + attr_reader :tags + sig { returns(T.nilable(String)) } + attr_reader :template_suffix + sig { returns(T.nilable(String)) } + attr_reader :title + sig { returns(T.nilable(String)) } + attr_reader :updated_at + sig { returns(T.nilable(Integer)) } + attr_reader :user_id + + class << self + sig do + params( + id: T.any(Integer, String), + blog_id: T.nilable(T.any(Integer, String)), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(Article)) + end + def find( + id:, + blog_id: nil, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id, blog_id: blog_id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(Article)) + end + + sig do + params( + id: T.any(Integer, String), + blog_id: T.nilable(T.any(Integer, String)), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + blog_id: nil, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id, blog_id: blog_id}, + params: {}, + ) + end + + sig do + params( + blog_id: T.nilable(T.any(Integer, String)), + limit: T.untyped, + since_id: T.untyped, + created_at_min: T.untyped, + created_at_max: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + published_at_min: T.untyped, + published_at_max: T.untyped, + published_status: T.untyped, + handle: T.untyped, + tag: T.untyped, + author: T.untyped, + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Article]) + end + def all( + blog_id: nil, + limit: nil, + since_id: nil, + created_at_min: nil, + created_at_max: nil, + updated_at_min: nil, + updated_at_max: nil, + published_at_min: nil, + published_at_max: nil, + published_status: nil, + handle: nil, + tag: nil, + author: nil, + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {blog_id: blog_id}, + params: {limit: limit, since_id: since_id, created_at_min: created_at_min, created_at_max: created_at_max, updated_at_min: updated_at_min, updated_at_max: updated_at_max, published_at_min: published_at_min, published_at_max: published_at_max, published_status: published_status, handle: handle, tag: tag, author: author, fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Article]) + end + + sig do + params( + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def authors( + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :authors, + session: session, + ids: {}, + params: {}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + sig do + params( + blog_id: T.nilable(T.any(Integer, String)), + created_at_min: T.untyped, + created_at_max: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + published_at_min: T.untyped, + published_at_max: T.untyped, + published_status: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + blog_id: nil, + created_at_min: nil, + created_at_max: nil, + updated_at_min: nil, + updated_at_max: nil, + published_at_min: nil, + published_at_max: nil, + published_status: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {blog_id: blog_id}, + params: {created_at_min: created_at_min, created_at_max: created_at_max, updated_at_min: updated_at_min, updated_at_max: updated_at_max, published_at_min: published_at_min, published_at_max: published_at_max, published_status: published_status}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + sig do + params( + blog_id: T.nilable(T.any(Integer, String)), + limit: T.untyped, + popular: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def tags( + blog_id: nil, + limit: nil, + popular: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :tags, + session: session, + ids: {blog_id: blog_id}, + params: {limit: limit, popular: popular}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/asset.rb b/lib/shopify_api/rest/resources/2024_10/asset.rb new file mode 100644 index 00000000..1b97e751 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/asset.rb @@ -0,0 +1,122 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Asset < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @attachment = T.let(nil, T.nilable(String)) + @checksum = T.let(nil, T.nilable(String)) + @content_type = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @key = T.let(nil, T.nilable(String)) + @public_url = T.let(nil, T.nilable(String)) + @size = T.let(nil, T.nilable(Integer)) + @theme_id = T.let(nil, T.nilable(Integer)) + @updated_at = T.let(nil, T.nilable(String)) + @value = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:theme_id], path: "themes//assets.json"}, + {http_method: :get, operation: :get, ids: [:theme_id], path: "themes//assets.json"}, + {http_method: :get, operation: :get, ids: [:theme_id], path: "themes//assets.json"}, + {http_method: :put, operation: :put, ids: [:theme_id], path: "themes//assets.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :attachment + sig { returns(T.nilable(String)) } + attr_reader :checksum + sig { returns(T.nilable(String)) } + attr_reader :content_type + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :key + sig { returns(T.nilable(String)) } + attr_reader :public_url + sig { returns(T.nilable(Integer)) } + attr_reader :size + sig { returns(T.nilable(Integer)) } + attr_reader :theme_id + sig { returns(T.nilable(String)) } + attr_reader :updated_at + sig { returns(T.nilable(String)) } + attr_reader :value + + class << self + sig do + returns(String) + end + def primary_key() + "key" + end + + sig do + params( + theme_id: T.nilable(T.any(Integer, String)), + asset: T.nilable(T::Hash[T.untyped, T.untyped]), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + theme_id: nil, + asset: nil, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {theme_id: theme_id}, + params: {asset: asset}, + ) + end + + sig do + params( + theme_id: T.nilable(T.any(Integer, String)), + fields: T.untyped, + asset: T.nilable(T::Hash[T.untyped, T.untyped]), + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Asset]) + end + def all( + theme_id: nil, + fields: nil, + asset: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {theme_id: theme_id}, + params: {fields: fields, asset: asset}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Asset]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/assigned_fulfillment_order.rb b/lib/shopify_api/rest/resources/2024_10/assigned_fulfillment_order.rb new file mode 100644 index 00000000..ecdc138a --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/assigned_fulfillment_order.rb @@ -0,0 +1,92 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class AssignedFulfillmentOrder < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @assigned_location_id = T.let(nil, T.nilable(Integer)) + @destination = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @id = T.let(nil, T.nilable(Integer)) + @line_items = T.let(nil, T.nilable(T::Array[T.untyped])) + @order_id = T.let(nil, T.nilable(Integer)) + @request_status = T.let(nil, T.nilable(String)) + @shop_id = T.let(nil, T.nilable(Integer)) + @status = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [], path: "assigned_fulfillment_orders.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(Integer)) } + attr_reader :assigned_location_id + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :destination + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :line_items + sig { returns(T.nilable(Integer)) } + attr_reader :order_id + sig { returns(T.nilable(String)) } + attr_reader :request_status + sig { returns(T.nilable(Integer)) } + attr_reader :shop_id + sig { returns(T.nilable(String)) } + attr_reader :status + + class << self + sig do + returns(T::Array[String]) + end + def json_response_body_names() + [ + "fulfillment_order" + ] + end + + sig do + params( + assignment_status: T.untyped, + location_ids: T.nilable(T.any(T::Array[T.untyped], Integer, String)), + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[AssignedFulfillmentOrder]) + end + def all( + assignment_status: nil, + location_ids: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {assignment_status: assignment_status, location_ids: location_ids}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[AssignedFulfillmentOrder]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/balance.rb b/lib/shopify_api/rest/resources/2024_10/balance.rb new file mode 100644 index 00000000..731c7e2a --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/balance.rb @@ -0,0 +1,58 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Balance < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @balance = T.let(nil, T.nilable(T::Array[T.untyped])) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [], path: "shopify_payments/balance.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :balance + + class << self + sig do + params( + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Balance]) + end + def all( + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Balance]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/blog.rb b/lib/shopify_api/rest/resources/2024_10/blog.rb new file mode 100644 index 00000000..1b239563 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/blog.rb @@ -0,0 +1,166 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Blog < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @admin_graphql_api_id = T.let(nil, T.nilable(String)) + @commentable = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @feedburner = T.let(nil, T.nilable(String)) + @feedburner_location = T.let(nil, T.nilable(String)) + @handle = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @metafields = T.let(nil, T.nilable(T::Array[T.untyped])) + @tags = T.let(nil, T.nilable(String)) + @template_suffix = T.let(nil, T.nilable(String)) + @title = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({ + metafields: Metafield + }, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "blogs/.json"}, + {http_method: :get, operation: :count, ids: [], path: "blogs/count.json"}, + {http_method: :get, operation: :get, ids: [], path: "blogs.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "blogs/.json"}, + {http_method: :post, operation: :post, ids: [], path: "blogs.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "blogs/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :admin_graphql_api_id + sig { returns(T.nilable(String)) } + attr_reader :commentable + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :feedburner + sig { returns(T.nilable(String)) } + attr_reader :feedburner_location + sig { returns(T.nilable(String)) } + attr_reader :handle + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(T::Array[Metafield])) } + attr_reader :metafields + sig { returns(T.nilable(String)) } + attr_reader :tags + sig { returns(T.nilable(String)) } + attr_reader :template_suffix + sig { returns(T.nilable(String)) } + attr_reader :title + sig { returns(T.nilable(String)) } + attr_reader :updated_at + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(Blog)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(Blog)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + limit: T.untyped, + since_id: T.untyped, + handle: T.untyped, + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Blog]) + end + def all( + limit: nil, + since_id: nil, + handle: nil, + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {limit: limit, since_id: since_id, handle: handle, fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Blog]) + end + + sig do + params( + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/cancellation_request.rb b/lib/shopify_api/rest/resources/2024_10/cancellation_request.rb new file mode 100644 index 00000000..becc938e --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/cancellation_request.rb @@ -0,0 +1,87 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class CancellationRequest < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @fulfillment_order_id = T.let(nil, T.nilable(Integer)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :post, operation: :accept, ids: [:fulfillment_order_id], path: "fulfillment_orders//cancellation_request/accept.json"}, + {http_method: :post, operation: :post, ids: [:fulfillment_order_id], path: "fulfillment_orders//cancellation_request.json"}, + {http_method: :post, operation: :reject, ids: [:fulfillment_order_id], path: "fulfillment_orders//cancellation_request/reject.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(Integer)) } + attr_reader :fulfillment_order_id + + class << self + end + + sig do + params( + message: T.untyped, + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def accept( + message: nil, + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :accept, + session: @session, + ids: {fulfillment_order_id: @fulfillment_order_id}, + params: {message: message}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + message: T.untyped, + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def reject( + message: nil, + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :reject, + session: @session, + ids: {fulfillment_order_id: @fulfillment_order_id}, + params: {message: message}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/carrier_service.rb b/lib/shopify_api/rest/resources/2024_10/carrier_service.rb new file mode 100644 index 00000000..234471a7 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/carrier_service.rb @@ -0,0 +1,120 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class CarrierService < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @active = T.let(nil, T.nilable(T::Boolean)) + @admin_graphql_api_id = T.let(nil, T.nilable(String)) + @callback_url = T.let(nil, T.nilable(String)) + @carrier_service_type = T.let(nil, T.nilable(String)) + @format = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @name = T.let(nil, T.nilable(String)) + @service_discovery = T.let(nil, T.nilable(T::Boolean)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "carrier_services/.json"}, + {http_method: :get, operation: :get, ids: [], path: "carrier_services.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "carrier_services/.json"}, + {http_method: :post, operation: :post, ids: [], path: "carrier_services.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "carrier_services/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(T::Boolean)) } + attr_reader :active + sig { returns(T.nilable(String)) } + attr_reader :admin_graphql_api_id + sig { returns(T.nilable(String)) } + attr_reader :callback_url + sig { returns(T.nilable(String)) } + attr_reader :carrier_service_type + sig { returns(T.nilable(String)) } + attr_reader :format + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :name + sig { returns(T.nilable(T::Boolean)) } + attr_reader :service_discovery + + class << self + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.nilable(CarrierService)) + end + def find( + id:, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {}, + ) + T.cast(result[0], T.nilable(CarrierService)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[CarrierService]) + end + def all( + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[CarrierService]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/checkout.rb b/lib/shopify_api/rest/resources/2024_10/checkout.rb new file mode 100644 index 00000000..121e7952 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/checkout.rb @@ -0,0 +1,213 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Checkout < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @billing_address = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @line_items = T.let(nil, T.nilable(T::Array[T.untyped])) + @applied_discount = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @buyer_accepts_marketing = T.let(nil, T.nilable(T::Boolean)) + @created_at = T.let(nil, T.nilable(String)) + @currency = T.let(nil, T.nilable(String)) + @customer_id = T.let(nil, T.nilable(Integer)) + @discount_code = T.let(nil, T.nilable(DiscountCode)) + @email = T.let(nil, T.nilable(String)) + @gift_cards = T.let(nil, T.nilable(T::Array[T.untyped])) + @order = T.let(nil, T.nilable(Order)) + @payment_due = T.let(nil, T.nilable(String)) + @payment_url = T.let(nil, T.nilable(String)) + @phone = T.let(nil, T.nilable(String)) + @presentment_currency = T.let(nil, T.nilable(String)) + @requires_shipping = T.let(nil, T.nilable(T::Boolean)) + @reservation_time = T.let(nil, T.nilable(String)) + @reservation_time_left = T.let(nil, T.nilable(Integer)) + @shipping_address = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @shipping_line = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @shipping_rate = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @source_identifier = T.let(nil, T.nilable(String)) + @source_name = T.let(nil, T.nilable(String)) + @source_url = T.let(nil, T.nilable(String)) + @subtotal_price = T.let(nil, T.nilable(String)) + @tax_lines = T.let(nil, T.nilable(T::Array[T.untyped])) + @taxes_included = T.let(nil, T.nilable(T::Boolean)) + @token = T.let(nil, T.nilable(String)) + @total_price = T.let(nil, T.nilable(String)) + @total_tax = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + @user_id = T.let(nil, T.nilable(Integer)) + @web_url = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({ + discount_code: DiscountCode, + order: Order + }, T::Hash[Symbol, Class]) + @has_many = T.let({ + gift_cards: GiftCard + }, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [:token], path: "checkouts/.json"}, + {http_method: :get, operation: :shipping_rates, ids: [:token], path: "checkouts//shipping_rates.json"}, + {http_method: :post, operation: :complete, ids: [:token], path: "checkouts//complete.json"}, + {http_method: :post, operation: :post, ids: [], path: "checkouts.json"}, + {http_method: :put, operation: :put, ids: [:token], path: "checkouts/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :billing_address + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :line_items + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :applied_discount + sig { returns(T.nilable(T::Boolean)) } + attr_reader :buyer_accepts_marketing + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :currency + sig { returns(T.nilable(Integer)) } + attr_reader :customer_id + sig { returns(T.nilable(DiscountCode)) } + attr_reader :discount_code + sig { returns(T.nilable(String)) } + attr_reader :email + sig { returns(T.nilable(T::Array[GiftCard])) } + attr_reader :gift_cards + sig { returns(T.nilable(Order)) } + attr_reader :order + sig { returns(T.nilable(String)) } + attr_reader :payment_due + sig { returns(T.nilable(String)) } + attr_reader :payment_url + sig { returns(T.nilable(String)) } + attr_reader :phone + sig { returns(T.nilable(String)) } + attr_reader :presentment_currency + sig { returns(T.nilable(T::Boolean)) } + attr_reader :requires_shipping + sig { returns(T.nilable(String)) } + attr_reader :reservation_time + sig { returns(T.nilable(Integer)) } + attr_reader :reservation_time_left + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :shipping_address + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :shipping_line + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :shipping_rate + sig { returns(T.nilable(String)) } + attr_reader :source_identifier + sig { returns(T.nilable(String)) } + attr_reader :source_name + sig { returns(T.nilable(String)) } + attr_reader :source_url + sig { returns(T.nilable(String)) } + attr_reader :subtotal_price + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :tax_lines + sig { returns(T.nilable(T::Boolean)) } + attr_reader :taxes_included + sig { returns(T.nilable(String)) } + attr_reader :token + sig { returns(T.nilable(String)) } + attr_reader :total_price + sig { returns(T.nilable(String)) } + attr_reader :total_tax + sig { returns(T.nilable(String)) } + attr_reader :updated_at + sig { returns(T.nilable(Integer)) } + attr_reader :user_id + sig { returns(T.nilable(String)) } + attr_reader :web_url + + class << self + sig do + returns(String) + end + def primary_key() + "token" + end + + sig do + params( + token: T.any(Integer, String), + session: Auth::Session + ).returns(T.nilable(Checkout)) + end + def find( + token:, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {token: token}, + params: {}, + ) + T.cast(result[0], T.nilable(Checkout)) + end + + sig do + params( + token: T.any(Integer, String), + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def shipping_rates( + token:, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :shipping_rates, + session: session, + ids: {token: token}, + params: {}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + sig do + params( + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def complete( + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :complete, + session: @session, + ids: {token: @token}, + params: {}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/collect.rb b/lib/shopify_api/rest/resources/2024_10/collect.rb new file mode 100644 index 00000000..0b05f131 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/collect.rb @@ -0,0 +1,146 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Collect < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @collection_id = T.let(nil, T.nilable(Integer)) + @created_at = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @position = T.let(nil, T.nilable(Integer)) + @product_id = T.let(nil, T.nilable(Integer)) + @sort_value = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "collects/.json"}, + {http_method: :get, operation: :count, ids: [], path: "collects/count.json"}, + {http_method: :get, operation: :get, ids: [], path: "collects.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "collects/.json"}, + {http_method: :post, operation: :post, ids: [], path: "collects.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(Integer)) } + attr_reader :collection_id + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(Integer)) } + attr_reader :position + sig { returns(T.nilable(Integer)) } + attr_reader :product_id + sig { returns(T.nilable(String)) } + attr_reader :sort_value + sig { returns(T.nilable(String)) } + attr_reader :updated_at + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(Collect)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(Collect)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + limit: T.untyped, + since_id: T.untyped, + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Collect]) + end + def all( + limit: nil, + since_id: nil, + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {limit: limit, since_id: since_id, fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Collect]) + end + + sig do + params( + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/collection.rb b/lib/shopify_api/rest/resources/2024_10/collection.rb new file mode 100644 index 00000000..32605b33 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/collection.rb @@ -0,0 +1,114 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Collection < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @title = T.let(nil, T.nilable(String)) + @body_html = T.let(nil, T.nilable(String)) + @handle = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @image = T.let(nil, T.nilable(Image)) + @published_at = T.let(nil, T.nilable(String)) + @published_scope = T.let(nil, T.nilable(String)) + @sort_order = T.let(nil, T.nilable(String)) + @template_suffix = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({ + image: Image + }, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [:id], path: "collections/.json"}, + {http_method: :get, operation: :products, ids: [:id], path: "collections//products.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :title + sig { returns(T.nilable(String)) } + attr_reader :body_html + sig { returns(T.nilable(String)) } + attr_reader :handle + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(Image)) } + attr_reader :image + sig { returns(T.nilable(String)) } + attr_reader :published_at + sig { returns(T.nilable(String)) } + attr_reader :published_scope + sig { returns(T.nilable(String)) } + attr_reader :sort_order + sig { returns(T.nilable(String)) } + attr_reader :template_suffix + sig { returns(T.nilable(String)) } + attr_reader :updated_at + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(Collection)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(Collection)) + end + + sig do + params( + id: T.any(Integer, String), + limit: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def products( + id:, + limit: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :products, + session: session, + ids: {id: id}, + params: {limit: limit}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/collection_listing.rb b/lib/shopify_api/rest/resources/2024_10/collection_listing.rb new file mode 100644 index 00000000..48e1c532 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/collection_listing.rb @@ -0,0 +1,159 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class CollectionListing < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @body_html = T.let(nil, T.nilable(String)) + @collection_id = T.let(nil, T.nilable(Integer)) + @default_product_image = T.let(nil, T.nilable(T::Array[T.untyped])) + @handle = T.let(nil, T.nilable(String)) + @image = T.let(nil, T.nilable(Image)) + @published_at = T.let(nil, T.nilable(String)) + @sort_order = T.let(nil, T.nilable(String)) + @title = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({ + image: Image + }, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:collection_id], path: "collection_listings/.json"}, + {http_method: :get, operation: :get, ids: [], path: "collection_listings.json"}, + {http_method: :get, operation: :get, ids: [:collection_id], path: "collection_listings/.json"}, + {http_method: :get, operation: :product_ids, ids: [:collection_id], path: "collection_listings//product_ids.json"}, + {http_method: :put, operation: :put, ids: [:collection_id], path: "collection_listings/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :body_html + sig { returns(T.nilable(Integer)) } + attr_reader :collection_id + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :default_product_image + sig { returns(T.nilable(String)) } + attr_reader :handle + sig { returns(T.nilable(Image)) } + attr_reader :image + sig { returns(T.nilable(String)) } + attr_reader :published_at + sig { returns(T.nilable(String)) } + attr_reader :sort_order + sig { returns(T.nilable(String)) } + attr_reader :title + sig { returns(T.nilable(String)) } + attr_reader :updated_at + + class << self + sig do + returns(String) + end + def primary_key() + "collection_id" + end + + sig do + params( + collection_id: T.any(Integer, String), + session: Auth::Session + ).returns(T.nilable(CollectionListing)) + end + def find( + collection_id:, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {collection_id: collection_id}, + params: {}, + ) + T.cast(result[0], T.nilable(CollectionListing)) + end + + sig do + params( + collection_id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + collection_id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {collection_id: collection_id}, + params: {}, + ) + end + + sig do + params( + limit: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[CollectionListing]) + end + def all( + limit: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {limit: limit}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[CollectionListing]) + end + + sig do + params( + collection_id: T.any(Integer, String), + limit: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def product_ids( + collection_id:, + limit: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :product_ids, + session: session, + ids: {collection_id: collection_id}, + params: {limit: limit}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/comment.rb b/lib/shopify_api/rest/resources/2024_10/comment.rb new file mode 100644 index 00000000..8c39c5ab --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/comment.rb @@ -0,0 +1,287 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Comment < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @article_id = T.let(nil, T.nilable(Integer)) + @author = T.let(nil, T.nilable(String)) + @blog_id = T.let(nil, T.nilable(Integer)) + @body = T.let(nil, T.nilable(String)) + @body_html = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @email = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @ip = T.let(nil, T.nilable(String)) + @published_at = T.let(nil, T.nilable(String)) + @status = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + @user_agent = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :count, ids: [], path: "comments/count.json"}, + {http_method: :get, operation: :get, ids: [], path: "comments.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "comments/.json"}, + {http_method: :post, operation: :approve, ids: [:id], path: "comments//approve.json"}, + {http_method: :post, operation: :not_spam, ids: [:id], path: "comments//not_spam.json"}, + {http_method: :post, operation: :post, ids: [], path: "comments.json"}, + {http_method: :post, operation: :remove, ids: [:id], path: "comments//remove.json"}, + {http_method: :post, operation: :restore, ids: [:id], path: "comments//restore.json"}, + {http_method: :post, operation: :spam, ids: [:id], path: "comments//spam.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "comments/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(Integer)) } + attr_reader :article_id + sig { returns(T.nilable(String)) } + attr_reader :author + sig { returns(T.nilable(Integer)) } + attr_reader :blog_id + sig { returns(T.nilable(String)) } + attr_reader :body + sig { returns(T.nilable(String)) } + attr_reader :body_html + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :email + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :ip + sig { returns(T.nilable(String)) } + attr_reader :published_at + sig { returns(T.nilable(String)) } + attr_reader :status + sig { returns(T.nilable(String)) } + attr_reader :updated_at + sig { returns(T.nilable(String)) } + attr_reader :user_agent + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(Comment)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(Comment)) + end + + sig do + params( + limit: T.untyped, + since_id: T.untyped, + created_at_min: T.untyped, + created_at_max: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + published_at_min: T.untyped, + published_at_max: T.untyped, + fields: T.untyped, + published_status: T.untyped, + status: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Comment]) + end + def all( + limit: nil, + since_id: nil, + created_at_min: nil, + created_at_max: nil, + updated_at_min: nil, + updated_at_max: nil, + published_at_min: nil, + published_at_max: nil, + fields: nil, + published_status: nil, + status: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {limit: limit, since_id: since_id, created_at_min: created_at_min, created_at_max: created_at_max, updated_at_min: updated_at_min, updated_at_max: updated_at_max, published_at_min: published_at_min, published_at_max: published_at_max, fields: fields, published_status: published_status, status: status}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Comment]) + end + + sig do + params( + created_at_min: T.untyped, + created_at_max: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + published_at_min: T.untyped, + published_at_max: T.untyped, + published_status: T.untyped, + status: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + created_at_min: nil, + created_at_max: nil, + updated_at_min: nil, + updated_at_max: nil, + published_at_min: nil, + published_at_max: nil, + published_status: nil, + status: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {created_at_min: created_at_min, created_at_max: created_at_max, updated_at_min: updated_at_min, updated_at_max: updated_at_max, published_at_min: published_at_min, published_at_max: published_at_max, published_status: published_status, status: status}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + sig do + params( + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def approve( + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :approve, + session: @session, + ids: {id: @id}, + params: {}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def not_spam( + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :not_spam, + session: @session, + ids: {id: @id}, + params: {}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def remove( + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :remove, + session: @session, + ids: {id: @id}, + params: {}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def restore( + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :restore, + session: @session, + ids: {id: @id}, + params: {}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def spam( + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :spam, + session: @session, + ids: {id: @id}, + params: {}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/country.rb b/lib/shopify_api/rest/resources/2024_10/country.rb new file mode 100644 index 00000000..9a03bb17 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/country.rb @@ -0,0 +1,141 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Country < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @code = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @name = T.let(nil, T.nilable(String)) + @provinces = T.let(nil, T.nilable(T::Array[T.untyped])) + @tax = T.let(nil, T.nilable(Float)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({ + provinces: Province + }, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "countries/.json"}, + {http_method: :get, operation: :count, ids: [], path: "countries/count.json"}, + {http_method: :get, operation: :get, ids: [], path: "countries.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "countries/.json"}, + {http_method: :post, operation: :post, ids: [], path: "countries.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "countries/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :code + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :name + sig { returns(T.nilable(T::Array[Province])) } + attr_reader :provinces + sig { returns(T.nilable(Float)) } + attr_reader :tax + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(Country)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(Country)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + since_id: T.untyped, + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Country]) + end + def all( + since_id: nil, + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {since_id: since_id, fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Country]) + end + + sig do + params( + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/currency.rb b/lib/shopify_api/rest/resources/2024_10/currency.rb new file mode 100644 index 00000000..963ccda8 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/currency.rb @@ -0,0 +1,61 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Currency < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @currency = T.let(nil, T.nilable(String)) + @rate_updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [], path: "currencies.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :currency + sig { returns(T.nilable(String)) } + attr_reader :rate_updated_at + + class << self + sig do + params( + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Currency]) + end + def all( + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Currency]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/custom_collection.rb b/lib/shopify_api/rest/resources/2024_10/custom_collection.rb new file mode 100644 index 00000000..6a101711 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/custom_collection.rb @@ -0,0 +1,191 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class CustomCollection < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @title = T.let(nil, T.nilable(String)) + @body_html = T.let(nil, T.nilable(String)) + @handle = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @image = T.let(nil, T.nilable(T.any(String, T::Hash[T.untyped, T.untyped]))) + @published = T.let(nil, T.nilable(T::Boolean)) + @published_at = T.let(nil, T.nilable(String)) + @published_scope = T.let(nil, T.nilable(String)) + @sort_order = T.let(nil, T.nilable(String)) + @template_suffix = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "custom_collections/.json"}, + {http_method: :get, operation: :count, ids: [], path: "custom_collections/count.json"}, + {http_method: :get, operation: :get, ids: [], path: "custom_collections.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "custom_collections/.json"}, + {http_method: :post, operation: :post, ids: [], path: "custom_collections.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "custom_collections/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :title + sig { returns(T.nilable(String)) } + attr_reader :body_html + sig { returns(T.nilable(String)) } + attr_reader :handle + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(T.any(String, T::Hash[T.untyped, T.untyped]))) } + attr_reader :image + sig { returns(T.nilable(T::Boolean)) } + attr_reader :published + sig { returns(T.nilable(String)) } + attr_reader :published_at + sig { returns(T.nilable(String)) } + attr_reader :published_scope + sig { returns(T.nilable(String)) } + attr_reader :sort_order + sig { returns(T.nilable(String)) } + attr_reader :template_suffix + sig { returns(T.nilable(String)) } + attr_reader :updated_at + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(CustomCollection)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(CustomCollection)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + limit: T.untyped, + ids: T.untyped, + since_id: T.untyped, + title: T.untyped, + product_id: T.untyped, + handle: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + published_at_min: T.untyped, + published_at_max: T.untyped, + published_status: T.untyped, + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[CustomCollection]) + end + def all( + limit: nil, + ids: nil, + since_id: nil, + title: nil, + product_id: nil, + handle: nil, + updated_at_min: nil, + updated_at_max: nil, + published_at_min: nil, + published_at_max: nil, + published_status: nil, + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {limit: limit, ids: ids, since_id: since_id, title: title, product_id: product_id, handle: handle, updated_at_min: updated_at_min, updated_at_max: updated_at_max, published_at_min: published_at_min, published_at_max: published_at_max, published_status: published_status, fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[CustomCollection]) + end + + sig do + params( + title: T.untyped, + product_id: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + published_at_min: T.untyped, + published_at_max: T.untyped, + published_status: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + title: nil, + product_id: nil, + updated_at_min: nil, + updated_at_max: nil, + published_at_min: nil, + published_at_max: nil, + published_status: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {title: title, product_id: product_id, updated_at_min: updated_at_min, updated_at_max: updated_at_max, published_at_min: published_at_min, published_at_max: published_at_max, published_status: published_status}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/customer.rb b/lib/shopify_api/rest/resources/2024_10/customer.rb new file mode 100644 index 00000000..a07b8c3b --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/customer.rb @@ -0,0 +1,335 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Customer < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @accepts_marketing = T.let(nil, T.nilable(T::Boolean)) + @accepts_marketing_updated_at = T.let(nil, T.nilable(String)) + @addresses = T.let(nil, T.nilable(T::Array[T.untyped])) + @created_at = T.let(nil, T.nilable(String)) + + @currency = T.let(nil, T.nilable(String)) + @default_address = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @email = T.let(nil, T.nilable(String)) + @email_marketing_consent = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @first_name = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @last_name = T.let(nil, T.nilable(String)) + @last_order_id = T.let(nil, T.nilable(Integer)) + @last_order_name = T.let(nil, T.nilable(String)) + @marketing_opt_in_level = T.let(nil, T.nilable(String)) + @metafield = T.let(nil, T.nilable(Metafield)) + @multipass_identifier = T.let(nil, T.nilable(String)) + @note = T.let(nil, T.nilable(String)) + @orders_count = T.let(nil, T.nilable(Integer)) + @password = T.let(nil, T.nilable(String)) + @password_confirmation = T.let(nil, T.nilable(String)) + @phone = T.let(nil, T.nilable(String)) + @sms_marketing_consent = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @state = T.let(nil, T.nilable(String)) + @tags = T.let(nil, T.nilable(String)) + @tax_exempt = T.let(nil, T.nilable(T::Boolean)) + @tax_exemptions = T.let(nil, T.nilable(T::Array[T.untyped])) + @total_spent = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + @verified_email = T.let(nil, T.nilable(T::Boolean)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({ + metafield: Metafield + }, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @atomic_hash_attributes = [:email_marketing_consent] + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "customers/.json"}, + {http_method: :get, operation: :count, ids: [], path: "customers/count.json"}, + {http_method: :get, operation: :get, ids: [], path: "customers.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "customers/.json"}, + {http_method: :get, operation: :orders, ids: [:id], path: "customers//orders.json"}, + {http_method: :get, operation: :search, ids: [], path: "customers/search.json"}, + {http_method: :post, operation: :account_activation_url, ids: [:id], path: "customers//account_activation_url.json"}, + {http_method: :post, operation: :post, ids: [], path: "customers.json"}, + {http_method: :post, operation: :send_invite, ids: [:id], path: "customers//send_invite.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "customers/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(T::Boolean)) } + attr_reader :accepts_marketing + sig { returns(T.nilable(String)) } + attr_reader :accepts_marketing_updated_at + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :addresses + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :currency + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :default_address + sig { returns(T.nilable(String)) } + attr_reader :email + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :email_marketing_consent + sig { returns(T.nilable(String)) } + attr_reader :first_name + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :last_name + sig { returns(T.nilable(Integer)) } + attr_reader :last_order_id + sig { returns(T.nilable(String)) } + attr_reader :last_order_name + sig { returns(T.nilable(String)) } + attr_reader :marketing_opt_in_level + sig { returns(T.nilable(Metafield)) } + attr_reader :metafield + sig { returns(T.nilable(String)) } + attr_reader :multipass_identifier + sig { returns(T.nilable(String)) } + attr_reader :note + sig { returns(T.nilable(Integer)) } + attr_reader :orders_count + sig { returns(T.nilable(String)) } + attr_reader :password + sig { returns(T.nilable(String)) } + attr_reader :password_confirmation + sig { returns(T.nilable(String)) } + attr_reader :phone + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :sms_marketing_consent + sig { returns(T.nilable(String)) } + attr_reader :state + sig { returns(T.nilable(String)) } + attr_reader :tags + sig { returns(T.nilable(T::Boolean)) } + attr_reader :tax_exempt + sig { returns(T.nilable(T::Array[String])) } + attr_reader :tax_exemptions + sig { returns(T.nilable(String)) } + attr_reader :total_spent + sig { returns(T.nilable(String)) } + attr_reader :updated_at + sig { returns(T.nilable(T::Boolean)) } + attr_reader :verified_email + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(Customer)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(Customer)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + ids: T.untyped, + since_id: T.untyped, + created_at_min: T.untyped, + created_at_max: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + limit: T.untyped, + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Customer]) + end + def all( + ids: nil, + since_id: nil, + created_at_min: nil, + created_at_max: nil, + updated_at_min: nil, + updated_at_max: nil, + limit: nil, + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {ids: ids, since_id: since_id, created_at_min: created_at_min, created_at_max: created_at_max, updated_at_min: updated_at_min, updated_at_max: updated_at_max, limit: limit, fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Customer]) + end + + sig do + params( + created_at_min: T.untyped, + created_at_max: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + created_at_min: nil, + created_at_max: nil, + updated_at_min: nil, + updated_at_max: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {created_at_min: created_at_min, created_at_max: created_at_max, updated_at_min: updated_at_min, updated_at_max: updated_at_max}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + sig do + params( + id: T.any(Integer, String), + status: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def orders( + id:, + status: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :orders, + session: session, + ids: {id: id}, + params: {status: status}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + sig do + params( + order: T.untyped, + query: T.untyped, + limit: T.untyped, + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def search( + order: nil, + query: nil, + limit: nil, + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :search, + session: session, + ids: {}, + params: {order: order, query: query, limit: limit, fields: fields}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + sig do + params( + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def account_activation_url( + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :account_activation_url, + session: @session, + ids: {id: @id}, + params: {}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def send_invite( + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :send_invite, + session: @session, + ids: {id: @id}, + params: {}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/customer_address.rb b/lib/shopify_api/rest/resources/2024_10/customer_address.rb new file mode 100644 index 00000000..a03ae2bd --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/customer_address.rb @@ -0,0 +1,215 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class CustomerAddress < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @address1 = T.let(nil, T.nilable(String)) + @address2 = T.let(nil, T.nilable(String)) + @city = T.let(nil, T.nilable(String)) + @company = T.let(nil, T.nilable(String)) + @country = T.let(nil, T.nilable(String)) + @country_code = T.let(nil, T.nilable(String)) + @country_name = T.let(nil, T.nilable(String)) + @customer_id = T.let(nil, T.nilable(Integer)) + @first_name = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @last_name = T.let(nil, T.nilable(String)) + @name = T.let(nil, T.nilable(String)) + @phone = T.let(nil, T.nilable(String)) + @province = T.let(nil, T.nilable(String)) + @province_code = T.let(nil, T.nilable(String)) + @zip = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:customer_id, :id], path: "customers//addresses/.json"}, + {http_method: :get, operation: :get, ids: [:customer_id], path: "customers//addresses.json"}, + {http_method: :get, operation: :get, ids: [:customer_id, :id], path: "customers//addresses/.json"}, + {http_method: :post, operation: :post, ids: [:customer_id], path: "customers//addresses.json"}, + {http_method: :put, operation: :default, ids: [:customer_id, :id], path: "customers//addresses//default.json"}, + {http_method: :put, operation: :put, ids: [:customer_id, :id], path: "customers//addresses/.json"}, + {http_method: :put, operation: :set, ids: [:customer_id], path: "customers//addresses/set.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :address1 + sig { returns(T.nilable(String)) } + attr_reader :address2 + sig { returns(T.nilable(String)) } + attr_reader :city + sig { returns(T.nilable(String)) } + attr_reader :company + sig { returns(T.nilable(String)) } + attr_reader :country + sig { returns(T.nilable(String)) } + attr_reader :country_code + sig { returns(T.nilable(String)) } + attr_reader :country_name + sig { returns(T.nilable(Integer)) } + attr_reader :customer_id + sig { returns(T.nilable(String)) } + attr_reader :first_name + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :last_name + sig { returns(T.nilable(String)) } + attr_reader :name + sig { returns(T.nilable(String)) } + attr_reader :phone + sig { returns(T.nilable(String)) } + attr_reader :province + sig { returns(T.nilable(String)) } + attr_reader :province_code + sig { returns(T.nilable(String)) } + attr_reader :zip + + class << self + sig do + returns(String) + end + def json_body_name() + "address" + end + + sig do + returns(T::Array[String]) + end + def json_response_body_names() + [ + "customer_address", + "address" + ] + end + + sig do + params( + id: T.any(Integer, String), + customer_id: T.nilable(T.any(Integer, String)), + session: Auth::Session + ).returns(T.nilable(CustomerAddress)) + end + def find( + id:, + customer_id: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id, customer_id: customer_id}, + params: {}, + ) + T.cast(result[0], T.nilable(CustomerAddress)) + end + + sig do + params( + id: T.any(Integer, String), + customer_id: T.nilable(T.any(Integer, String)), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + customer_id: nil, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id, customer_id: customer_id}, + params: {}, + ) + end + + sig do + params( + customer_id: T.nilable(T.any(Integer, String)), + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[CustomerAddress]) + end + def all( + customer_id: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {customer_id: customer_id}, + params: {}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[CustomerAddress]) + end + + end + + sig do + params( + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def default( + body: nil, + **kwargs + ) + self.class.request( + http_method: :put, + operation: :default, + session: @session, + ids: {id: @id, customer_id: @customer_id}, + params: {}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + address_ids: T.nilable(T.any(T::Array[T.untyped], Integer, String)), + operation: T.untyped, + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def set( + address_ids: nil, + operation: nil, + body: nil, + **kwargs + ) + self.class.request( + http_method: :put, + operation: :set, + session: @session, + ids: {customer_id: @customer_id}, + params: {address_ids: address_ids, operation: operation}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/deprecated_api_call.rb b/lib/shopify_api/rest/resources/2024_10/deprecated_api_call.rb new file mode 100644 index 00000000..5ec2763d --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/deprecated_api_call.rb @@ -0,0 +1,61 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class DeprecatedApiCall < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @data_updated_at = T.let(nil, T.nilable(String)) + @deprecated_api_calls = T.let(nil, T.nilable(T::Array[T.untyped])) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [], path: "deprecated_api_calls.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :data_updated_at + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :deprecated_api_calls + + class << self + sig do + params( + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[DeprecatedApiCall]) + end + def all( + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[DeprecatedApiCall]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/discount_code.rb b/lib/shopify_api/rest/resources/2024_10/discount_code.rb new file mode 100644 index 00000000..c222796f --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/discount_code.rb @@ -0,0 +1,226 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class DiscountCode < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @code = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @errors = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @id = T.let(nil, T.nilable(Integer)) + @price_rule_id = T.let(nil, T.nilable(Integer)) + @updated_at = T.let(nil, T.nilable(String)) + @usage_count = T.let(nil, T.nilable(Integer)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:price_rule_id, :id], path: "price_rules//discount_codes/.json"}, + {http_method: :get, operation: :count, ids: [], path: "discount_codes/count.json"}, + {http_method: :get, operation: :get, ids: [:price_rule_id, :batch_id], path: "price_rules//batch//discount_codes.json"}, + {http_method: :get, operation: :get, ids: [:price_rule_id], path: "price_rules//discount_codes.json"}, + {http_method: :get, operation: :get, ids: [:price_rule_id, :id], path: "price_rules//discount_codes/.json"}, + {http_method: :get, operation: :get_all, ids: [:price_rule_id, :batch_id], path: "price_rules//batch/.json"}, + {http_method: :get, operation: :lookup, ids: [], path: "discount_codes/lookup.json"}, + {http_method: :post, operation: :batch, ids: [:price_rule_id], path: "price_rules//batch.json"}, + {http_method: :post, operation: :post, ids: [:price_rule_id], path: "price_rules//discount_codes.json"}, + {http_method: :put, operation: :put, ids: [:price_rule_id, :id], path: "price_rules//discount_codes/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :code + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :errors + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(Integer)) } + attr_reader :price_rule_id + sig { returns(T.nilable(String)) } + attr_reader :updated_at + sig { returns(T.nilable(Integer)) } + attr_reader :usage_count + + class << self + sig do + params( + id: T.any(Integer, String), + price_rule_id: T.nilable(T.any(Integer, String)), + session: Auth::Session + ).returns(T.nilable(DiscountCode)) + end + def find( + id:, + price_rule_id: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id, price_rule_id: price_rule_id}, + params: {}, + ) + T.cast(result[0], T.nilable(DiscountCode)) + end + + sig do + params( + id: T.any(Integer, String), + price_rule_id: T.nilable(T.any(Integer, String)), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + price_rule_id: nil, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id, price_rule_id: price_rule_id}, + params: {}, + ) + end + + sig do + params( + price_rule_id: T.nilable(T.any(Integer, String)), + batch_id: T.nilable(T.any(Integer, String)), + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[DiscountCode]) + end + def all( + price_rule_id: nil, + batch_id: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {price_rule_id: price_rule_id, batch_id: batch_id}, + params: {}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[DiscountCode]) + end + + sig do + params( + times_used: T.untyped, + times_used_min: T.untyped, + times_used_max: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + times_used: nil, + times_used_min: nil, + times_used_max: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {times_used: times_used, times_used_min: times_used_min, times_used_max: times_used_max}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + sig do + params( + price_rule_id: T.nilable(T.any(Integer, String)), + batch_id: T.nilable(T.any(Integer, String)), + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def get_all( + price_rule_id: nil, + batch_id: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :get_all, + session: session, + ids: {price_rule_id: price_rule_id, batch_id: batch_id}, + params: {}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + sig do + params( + code: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def lookup( + code: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :lookup, + session: session, + ids: {}, + params: {code: code}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + sig do + params( + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def batch( + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :batch, + session: @session, + ids: {price_rule_id: @price_rule_id}, + params: {}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/dispute.rb b/lib/shopify_api/rest/resources/2024_10/dispute.rb new file mode 100644 index 00000000..2e12f9ae --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/dispute.rb @@ -0,0 +1,115 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Dispute < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @amount = T.let(nil, T.nilable(String)) + @currency = T.let(nil, T.nilable(String)) + @evidence_due_by = T.let(nil, T.nilable(String)) + @evidence_sent_on = T.let(nil, T.nilable(String)) + @finalized_on = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @network_reason_code = T.let(nil, T.nilable(String)) + @order_id = T.let(nil, T.nilable(Integer)) + @reason = T.let(nil, T.nilable(String)) + @status = T.let(nil, T.nilable(String)) + @type = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [], path: "shopify_payments/disputes.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "shopify_payments/disputes/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :amount + sig { returns(T.nilable(String)) } + attr_reader :currency + sig { returns(T.nilable(String)) } + attr_reader :evidence_due_by + sig { returns(T.nilable(String)) } + attr_reader :evidence_sent_on + sig { returns(T.nilable(String)) } + attr_reader :finalized_on + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :network_reason_code + sig { returns(T.nilable(Integer)) } + attr_reader :order_id + sig { returns(T.nilable(String)) } + attr_reader :reason + sig { returns(T.nilable(String)) } + attr_reader :status + sig { returns(T.nilable(String)) } + attr_reader :type + + class << self + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.nilable(Dispute)) + end + def find( + id:, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {}, + ) + T.cast(result[0], T.nilable(Dispute)) + end + + sig do + params( + since_id: T.untyped, + last_id: T.untyped, + status: T.untyped, + initiated_at: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Dispute]) + end + def all( + since_id: nil, + last_id: nil, + status: nil, + initiated_at: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {since_id: since_id, last_id: last_id, status: status, initiated_at: initiated_at}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Dispute]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/dispute_evidence.rb b/lib/shopify_api/rest/resources/2024_10/dispute_evidence.rb new file mode 100644 index 00000000..faf7ea5c --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/dispute_evidence.rb @@ -0,0 +1,121 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class DisputeEvidence < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @access_activity_log = T.let(nil, T.nilable(String)) + @billing_address = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @cancellation_policy_disclosure = T.let(nil, T.nilable(String)) + @cancellation_rebuttal = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @customer_email_address = T.let(nil, T.nilable(String)) + @customer_first_name = T.let(nil, T.nilable(String)) + @customer_last_name = T.let(nil, T.nilable(String)) + @dispute_evidence_files = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @fulfillments = T.let(nil, T.nilable(T::Array[T.untyped])) + @id = T.let(nil, T.nilable(Integer)) + @payments_dispute_id = T.let(nil, T.nilable(Integer)) + @product_description = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @refund_policy_disclosure = T.let(nil, T.nilable(String)) + @refund_refusal_explanation = T.let(nil, T.nilable(String)) + @shipping_address = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @submitted = T.let(nil, T.nilable(T::Boolean)) + @uncategorized_text = T.let(nil, T.nilable(String)) + @updated_on = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({ + fulfillments: Fulfillment + }, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [:dispute_id], path: "shopify_payments/disputes//dispute_evidences.json"}, + {http_method: :put, operation: :put, ids: [:dispute_id], path: "shopify_payments/disputes//dispute_evidences.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :access_activity_log + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :billing_address + sig { returns(T.nilable(String)) } + attr_reader :cancellation_policy_disclosure + sig { returns(T.nilable(String)) } + attr_reader :cancellation_rebuttal + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :customer_email_address + sig { returns(T.nilable(String)) } + attr_reader :customer_first_name + sig { returns(T.nilable(String)) } + attr_reader :customer_last_name + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :dispute_evidence_files + sig { returns(T.nilable(T::Array[Fulfillment])) } + attr_reader :fulfillments + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(Integer)) } + attr_reader :payments_dispute_id + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :product_description + sig { returns(T.nilable(String)) } + attr_reader :refund_policy_disclosure + sig { returns(T.nilable(String)) } + attr_reader :refund_refusal_explanation + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :shipping_address + sig { returns(T.nilable(T::Boolean)) } + attr_reader :submitted + sig { returns(T.nilable(String)) } + attr_reader :uncategorized_text + sig { returns(T.nilable(String)) } + attr_reader :updated_on + + class << self + sig do + returns(String) + end + def primary_key() + "dispute_id" + end + + sig do + params( + dispute_id: T.any(Integer, String), + session: Auth::Session + ).returns(T.nilable(DisputeEvidence)) + end + def find( + dispute_id:, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {dispute_id: dispute_id}, + params: {}, + ) + T.cast(result[0], T.nilable(DisputeEvidence)) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/dispute_file_upload.rb b/lib/shopify_api/rest/resources/2024_10/dispute_file_upload.rb new file mode 100644 index 00000000..7b23e5a8 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/dispute_file_upload.rb @@ -0,0 +1,85 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class DisputeFileUpload < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @dispute_evidence_id = T.let(nil, T.nilable(Integer)) + @dispute_evidence_type = T.let(nil, T.nilable(String)) + @file_size = T.let(nil, T.nilable(Integer)) + @file_type = T.let(nil, T.nilable(String)) + @filename = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @original_filename = T.let(nil, T.nilable(String)) + @shop_id = T.let(nil, T.nilable(Integer)) + @url = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:dispute_id, :id], path: "shopify_payments/disputes//dispute_file_uploads/.json"}, + {http_method: :post, operation: :post, ids: [:dispute_id], path: "shopify_payments/disputes//dispute_file_uploads.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(Integer)) } + attr_reader :dispute_evidence_id + sig { returns(T.nilable(String)) } + attr_reader :dispute_evidence_type + sig { returns(T.nilable(Integer)) } + attr_reader :file_size + sig { returns(T.nilable(String)) } + attr_reader :file_type + sig { returns(T.nilable(String)) } + attr_reader :filename + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :original_filename + sig { returns(T.nilable(Integer)) } + attr_reader :shop_id + sig { returns(T.nilable(String)) } + attr_reader :url + + class << self + sig do + params( + id: T.any(Integer, String), + dispute_id: T.nilable(T.any(Integer, String)), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + dispute_id: nil, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id, dispute_id: dispute_id}, + params: {}, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/draft_order.rb b/lib/shopify_api/rest/resources/2024_10/draft_order.rb new file mode 100644 index 00000000..91ce1ff7 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/draft_order.rb @@ -0,0 +1,279 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class DraftOrder < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @applied_discount = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @billing_address = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @completed_at = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @currency = T.let(nil, T.nilable(String)) + @customer = T.let(nil, T.nilable(Customer)) + @email = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @invoice_sent_at = T.let(nil, T.nilable(String)) + @invoice_url = T.let(nil, T.nilable(String)) + @line_items = T.let(nil, T.nilable(T::Array[T.untyped])) + @name = T.let(nil, T.nilable(String)) + @note = T.let(nil, T.nilable(String)) + @note_attributes = T.let(nil, T.nilable(T::Array[T.untyped])) + @order_id = T.let(nil, T.nilable(Integer)) + @payment_terms = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @shipping_address = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @shipping_line = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @source_name = T.let(nil, T.nilable(String)) + @status = T.let(nil, T.nilable(String)) + @subtotal_price = T.let(nil, T.nilable(String)) + @tags = T.let(nil, T.nilable(String)) + @tax_exempt = T.let(nil, T.nilable(T::Boolean)) + @tax_exemptions = T.let(nil, T.nilable(T::Array[T.untyped])) + @tax_lines = T.let(nil, T.nilable(T::Array[T.untyped])) + @taxes_included = T.let(nil, T.nilable(T::Boolean)) + @total_price = T.let(nil, T.nilable(String)) + @total_tax = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({ + customer: Customer + }, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "draft_orders/.json"}, + {http_method: :get, operation: :count, ids: [], path: "draft_orders/count.json"}, + {http_method: :get, operation: :get, ids: [], path: "draft_orders.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "draft_orders/.json"}, + {http_method: :post, operation: :post, ids: [], path: "draft_orders.json"}, + {http_method: :post, operation: :send_invoice, ids: [:id], path: "draft_orders//send_invoice.json"}, + {http_method: :put, operation: :complete, ids: [:id], path: "draft_orders//complete.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "draft_orders/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :applied_discount + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :billing_address + sig { returns(T.nilable(String)) } + attr_reader :completed_at + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :currency + sig { returns(T.nilable(Customer)) } + attr_reader :customer + sig { returns(T.nilable(String)) } + attr_reader :email + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :invoice_sent_at + sig { returns(T.nilable(String)) } + attr_reader :invoice_url + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :line_items + sig { returns(T.nilable(String)) } + attr_reader :name + sig { returns(T.nilable(String)) } + attr_reader :note + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :note_attributes + sig { returns(T.nilable(Integer)) } + attr_reader :order_id + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :payment_terms + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :shipping_address + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :shipping_line + sig { returns(T.nilable(String)) } + attr_reader :source_name + sig { returns(T.nilable(String)) } + attr_reader :status + sig { returns(T.nilable(String)) } + attr_reader :subtotal_price + sig { returns(T.nilable(String)) } + attr_reader :tags + sig { returns(T.nilable(T::Boolean)) } + attr_reader :tax_exempt + sig { returns(T.nilable(T::Array[String])) } + attr_reader :tax_exemptions + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :tax_lines + sig { returns(T.nilable(T::Boolean)) } + attr_reader :taxes_included + sig { returns(T.nilable(String)) } + attr_reader :total_price + sig { returns(T.nilable(String)) } + attr_reader :total_tax + sig { returns(T.nilable(String)) } + attr_reader :updated_at + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(DraftOrder)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(DraftOrder)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + fields: T.untyped, + limit: T.untyped, + since_id: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + ids: T.untyped, + status: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[DraftOrder]) + end + def all( + fields: nil, + limit: nil, + since_id: nil, + updated_at_min: nil, + updated_at_max: nil, + ids: nil, + status: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {fields: fields, limit: limit, since_id: since_id, updated_at_min: updated_at_min, updated_at_max: updated_at_max, ids: ids, status: status}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[DraftOrder]) + end + + sig do + params( + since_id: T.untyped, + status: T.untyped, + updated_at_max: T.untyped, + updated_at_min: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + since_id: nil, + status: nil, + updated_at_max: nil, + updated_at_min: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {since_id: since_id, status: status, updated_at_max: updated_at_max, updated_at_min: updated_at_min}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + sig do + params( + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def send_invoice( + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :send_invoice, + session: @session, + ids: {id: @id}, + params: {}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + payment_gateway_id: T.untyped, + payment_pending: T.untyped, + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def complete( + payment_gateway_id: nil, + payment_pending: nil, + body: nil, + **kwargs + ) + self.class.request( + http_method: :put, + operation: :complete, + session: @session, + ids: {id: @id}, + params: {payment_gateway_id: payment_gateway_id, payment_pending: payment_pending}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/event.rb b/lib/shopify_api/rest/resources/2024_10/event.rb new file mode 100644 index 00000000..48ef73b4 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/event.rb @@ -0,0 +1,152 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Event < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @arguments = T.let(nil, T.nilable(T::Array[T.untyped])) + @body = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @description = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @message = T.let(nil, T.nilable(String)) + @path = T.let(nil, T.nilable(String)) + @subject_id = T.let(nil, T.nilable(Integer)) + @subject_type = T.let(nil, T.nilable(String)) + @verb = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :count, ids: [], path: "events/count.json"}, + {http_method: :get, operation: :get, ids: [], path: "events.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "events/.json"}, + {http_method: :get, operation: :get, ids: [:order_id], path: "orders//events.json"}, + {http_method: :get, operation: :get, ids: [:product_id], path: "products//events.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(T::Array[String])) } + attr_reader :arguments + sig { returns(T.nilable(String)) } + attr_reader :body + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :description + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :message + sig { returns(T.nilable(String)) } + attr_reader :path + sig { returns(T.nilable(Integer)) } + attr_reader :subject_id + sig { returns(T.nilable(String)) } + attr_reader :subject_type + sig { returns(T.nilable(String)) } + attr_reader :verb + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(Event)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(Event)) + end + + sig do + params( + order_id: T.nilable(T.any(Integer, String)), + product_id: T.nilable(T.any(Integer, String)), + limit: T.untyped, + since_id: T.untyped, + created_at_min: T.untyped, + created_at_max: T.untyped, + filter: T.untyped, + verb: T.untyped, + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Event]) + end + def all( + order_id: nil, + product_id: nil, + limit: nil, + since_id: nil, + created_at_min: nil, + created_at_max: nil, + filter: nil, + verb: nil, + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {order_id: order_id, product_id: product_id}, + params: {limit: limit, since_id: since_id, created_at_min: created_at_min, created_at_max: created_at_max, filter: filter, verb: verb, fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Event]) + end + + sig do + params( + created_at_min: T.untyped, + created_at_max: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + created_at_min: nil, + created_at_max: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {created_at_min: created_at_min, created_at_max: created_at_max}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/fulfillment.rb b/lib/shopify_api/rest/resources/2024_10/fulfillment.rb new file mode 100644 index 00000000..a02c4b6d --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/fulfillment.rb @@ -0,0 +1,235 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Fulfillment < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @created_at = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @line_items = T.let(nil, T.nilable(T::Array[T.untyped])) + @location_id = T.let(nil, T.nilable(Integer)) + @name = T.let(nil, T.nilable(String)) + @notify_customer = T.let(nil, T.nilable(T::Boolean)) + @order_id = T.let(nil, T.nilable(Integer)) + @origin_address = T.let(nil, T.nilable(T::Array[T.untyped])) + @receipt = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @service = T.let(nil, T.nilable(String)) + @shipment_status = T.let(nil, T.nilable(String)) + @status = T.let(nil, T.nilable(String)) + @tracking_company = T.let(nil, T.nilable(String)) + @tracking_number = T.let(nil, T.nilable(String)) + @tracking_numbers = T.let(nil, T.nilable(T::Array[T.untyped])) + @tracking_url = T.let(nil, T.nilable(String)) + @tracking_urls = T.let(nil, T.nilable(T::Array[T.untyped])) + @updated_at = T.let(nil, T.nilable(String)) + @variant_inventory_management = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :count, ids: [:order_id], path: "orders//fulfillments/count.json"}, + {http_method: :get, operation: :get, ids: [:fulfillment_order_id], path: "fulfillment_orders//fulfillments.json"}, + {http_method: :get, operation: :get, ids: [:order_id], path: "orders//fulfillments.json"}, + {http_method: :get, operation: :get, ids: [:order_id, :id], path: "orders//fulfillments/.json"}, + {http_method: :post, operation: :cancel, ids: [:id], path: "fulfillments//cancel.json"}, + {http_method: :post, operation: :post, ids: [], path: "fulfillments.json"}, + {http_method: :post, operation: :update_tracking, ids: [:id], path: "fulfillments//update_tracking.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :line_items + sig { returns(T.nilable(Integer)) } + attr_reader :location_id + sig { returns(T.nilable(String)) } + attr_reader :name + sig { returns(T.nilable(T::Boolean)) } + attr_reader :notify_customer + sig { returns(T.nilable(Integer)) } + attr_reader :order_id + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :origin_address + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :receipt + sig { returns(T.nilable(String)) } + attr_reader :service + sig { returns(T.nilable(String)) } + attr_reader :shipment_status + sig { returns(T.nilable(String)) } + attr_reader :status + sig { returns(T.nilable(String)) } + attr_reader :tracking_company + sig { returns(T.nilable(String)) } + attr_reader :tracking_number + sig { returns(T.nilable(T::Array[String])) } + attr_reader :tracking_numbers + sig { returns(T.nilable(String)) } + attr_reader :tracking_url + sig { returns(T.nilable(T::Array[String])) } + attr_reader :tracking_urls + sig { returns(T.nilable(String)) } + attr_reader :updated_at + sig { returns(T.nilable(String)) } + attr_reader :variant_inventory_management + + class << self + sig do + params( + id: T.any(Integer, String), + order_id: T.nilable(T.any(Integer, String)), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(Fulfillment)) + end + def find( + id:, + order_id: nil, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id, order_id: order_id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(Fulfillment)) + end + + sig do + params( + fulfillment_order_id: T.nilable(T.any(Integer, String)), + order_id: T.nilable(T.any(Integer, String)), + created_at_max: T.untyped, + created_at_min: T.untyped, + fields: T.untyped, + limit: T.untyped, + since_id: T.untyped, + updated_at_max: T.untyped, + updated_at_min: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Fulfillment]) + end + def all( + fulfillment_order_id: nil, + order_id: nil, + created_at_max: nil, + created_at_min: nil, + fields: nil, + limit: nil, + since_id: nil, + updated_at_max: nil, + updated_at_min: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {fulfillment_order_id: fulfillment_order_id, order_id: order_id}, + params: {created_at_max: created_at_max, created_at_min: created_at_min, fields: fields, limit: limit, since_id: since_id, updated_at_max: updated_at_max, updated_at_min: updated_at_min}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Fulfillment]) + end + + sig do + params( + order_id: T.nilable(T.any(Integer, String)), + created_at_min: T.untyped, + created_at_max: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + order_id: nil, + created_at_min: nil, + created_at_max: nil, + updated_at_min: nil, + updated_at_max: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {order_id: order_id}, + params: {created_at_min: created_at_min, created_at_max: created_at_max, updated_at_min: updated_at_min, updated_at_max: updated_at_max}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + sig do + params( + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def cancel( + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :cancel, + session: @session, + ids: {id: @id}, + params: {}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + notify_customer: T.untyped, + tracking_info: T.untyped, + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def update_tracking( + notify_customer: nil, + tracking_info: nil, + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :update_tracking, + session: @session, + ids: {id: @id}, + params: {notify_customer: notify_customer, tracking_info: tracking_info}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/fulfillment_event.rb b/lib/shopify_api/rest/resources/2024_10/fulfillment_event.rb new file mode 100644 index 00000000..7ce77276 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/fulfillment_event.rb @@ -0,0 +1,167 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class FulfillmentEvent < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @address1 = T.let(nil, T.nilable(String)) + @city = T.let(nil, T.nilable(String)) + @country = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @estimated_delivery_at = T.let(nil, T.nilable(String)) + @fulfillment_id = T.let(nil, T.nilable(Integer)) + @happened_at = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @latitude = T.let(nil, T.nilable(Float)) + @longitude = T.let(nil, T.nilable(Float)) + @message = T.let(nil, T.nilable(String)) + @order_id = T.let(nil, T.nilable(Integer)) + @province = T.let(nil, T.nilable(String)) + @shop_id = T.let(nil, T.nilable(Integer)) + @status = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + @zip = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:order_id, :fulfillment_id, :id], path: "orders//fulfillments//events/.json"}, + {http_method: :get, operation: :get, ids: [:order_id, :fulfillment_id], path: "orders//fulfillments//events.json"}, + {http_method: :get, operation: :get, ids: [:order_id, :fulfillment_id, :id], path: "orders//fulfillments//events/.json"}, + {http_method: :post, operation: :post, ids: [:order_id, :fulfillment_id], path: "orders//fulfillments//events.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :address1 + sig { returns(T.nilable(String)) } + attr_reader :city + sig { returns(T.nilable(String)) } + attr_reader :country + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :estimated_delivery_at + sig { returns(T.nilable(Integer)) } + attr_reader :fulfillment_id + sig { returns(T.nilable(String)) } + attr_reader :happened_at + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(Float)) } + attr_reader :latitude + sig { returns(T.nilable(Float)) } + attr_reader :longitude + sig { returns(T.nilable(String)) } + attr_reader :message + sig { returns(T.nilable(Integer)) } + attr_reader :order_id + sig { returns(T.nilable(String)) } + attr_reader :province + sig { returns(T.nilable(Integer)) } + attr_reader :shop_id + sig { returns(T.nilable(String)) } + attr_reader :status + sig { returns(T.nilable(String)) } + attr_reader :updated_at + sig { returns(T.nilable(String)) } + attr_reader :zip + + class << self + sig do + returns(String) + end + def json_body_name() + "event" + end + + sig do + params( + id: T.any(Integer, String), + order_id: T.nilable(T.any(Integer, String)), + fulfillment_id: T.nilable(T.any(Integer, String)), + event_id: T.untyped, + session: Auth::Session + ).returns(T.nilable(FulfillmentEvent)) + end + def find( + id:, + order_id: nil, + fulfillment_id: nil, + event_id: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id, order_id: order_id, fulfillment_id: fulfillment_id}, + params: {event_id: event_id}, + ) + T.cast(result[0], T.nilable(FulfillmentEvent)) + end + + sig do + params( + id: T.any(Integer, String), + order_id: T.nilable(T.any(Integer, String)), + fulfillment_id: T.nilable(T.any(Integer, String)), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + order_id: nil, + fulfillment_id: nil, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id, order_id: order_id, fulfillment_id: fulfillment_id}, + params: {}, + ) + end + + sig do + params( + order_id: T.nilable(T.any(Integer, String)), + fulfillment_id: T.nilable(T.any(Integer, String)), + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[FulfillmentEvent]) + end + def all( + order_id: nil, + fulfillment_id: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {order_id: order_id, fulfillment_id: fulfillment_id}, + params: {}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[FulfillmentEvent]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/fulfillment_order.rb b/lib/shopify_api/rest/resources/2024_10/fulfillment_order.rb new file mode 100644 index 00000000..6ef12051 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/fulfillment_order.rb @@ -0,0 +1,326 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class FulfillmentOrder < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @assigned_location = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @assigned_location_id = T.let(nil, T.nilable(Integer)) + @created_at = T.let(nil, T.nilable(String)) + @delivery_method = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @destination = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @fulfill_at = T.let(nil, T.nilable(String)) + @fulfill_by = T.let(nil, T.nilable(String)) + @fulfillment_holds = T.let(nil, T.nilable(T::Array[T.untyped])) + @id = T.let(nil, T.nilable(Integer)) + @international_duties = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @line_items = T.let(nil, T.nilable(T::Array[T.untyped])) + @merchant_requests = T.let(nil, T.nilable(T::Array[T.untyped])) + @order_id = T.let(nil, T.nilable(Integer)) + @request_status = T.let(nil, T.nilable(String)) + @shop_id = T.let(nil, T.nilable(Integer)) + @status = T.let(nil, T.nilable(String)) + @supported_actions = T.let(nil, T.nilable(T::Array[T.untyped])) + @updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [:id], path: "fulfillment_orders/.json"}, + {http_method: :get, operation: :get, ids: [:order_id], path: "orders//fulfillment_orders.json"}, + {http_method: :post, operation: :cancel, ids: [:id], path: "fulfillment_orders//cancel.json"}, + {http_method: :post, operation: :close, ids: [:id], path: "fulfillment_orders//close.json"}, + {http_method: :post, operation: :hold, ids: [:id], path: "fulfillment_orders//hold.json"}, + {http_method: :post, operation: :move, ids: [:id], path: "fulfillment_orders//move.json"}, + {http_method: :post, operation: :open, ids: [:id], path: "fulfillment_orders//open.json"}, + {http_method: :post, operation: :release_hold, ids: [:id], path: "fulfillment_orders//release_hold.json"}, + {http_method: :post, operation: :reschedule, ids: [:id], path: "fulfillment_orders//reschedule.json"}, + {http_method: :post, operation: :set_fulfillment_orders_deadline, ids: [], path: "fulfillment_orders/set_fulfillment_orders_deadline.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :assigned_location + sig { returns(T.nilable(Integer)) } + attr_reader :assigned_location_id + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :delivery_method + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :destination + sig { returns(T.nilable(String)) } + attr_reader :fulfill_at + sig { returns(T.nilable(String)) } + attr_reader :fulfill_by + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :fulfillment_holds + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :international_duties + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :line_items + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :merchant_requests + sig { returns(T.nilable(Integer)) } + attr_reader :order_id + sig { returns(T.nilable(String)) } + attr_reader :request_status + sig { returns(T.nilable(Integer)) } + attr_reader :shop_id + sig { returns(T.nilable(String)) } + attr_reader :status + sig { returns(T.nilable(T::Array[String])) } + attr_reader :supported_actions + sig { returns(T.nilable(String)) } + attr_reader :updated_at + + class << self + sig do + params( + id: T.any(Integer, String), + include_financial_summaries: T.untyped, + include_order_reference_fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(FulfillmentOrder)) + end + def find( + id:, + include_financial_summaries: nil, + include_order_reference_fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {include_financial_summaries: include_financial_summaries, include_order_reference_fields: include_order_reference_fields}, + ) + T.cast(result[0], T.nilable(FulfillmentOrder)) + end + + sig do + params( + order_id: T.nilable(T.any(Integer, String)), + include_financial_summaries: T.untyped, + include_order_reference_fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[FulfillmentOrder]) + end + def all( + order_id: nil, + include_financial_summaries: nil, + include_order_reference_fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {order_id: order_id}, + params: {include_financial_summaries: include_financial_summaries, include_order_reference_fields: include_order_reference_fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[FulfillmentOrder]) + end + + end + + sig do + params( + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def cancel( + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :cancel, + session: @session, + ids: {id: @id}, + params: {}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + message: T.untyped, + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def close( + message: nil, + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :close, + session: @session, + ids: {id: @id}, + params: {message: message}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + fulfillment_hold: T.untyped, + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def hold( + fulfillment_hold: nil, + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :hold, + session: @session, + ids: {id: @id}, + params: {fulfillment_hold: fulfillment_hold}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + fulfillment_order: T.untyped, + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def move( + fulfillment_order: nil, + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :move, + session: @session, + ids: {id: @id}, + params: {fulfillment_order: fulfillment_order}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def open( + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :open, + session: @session, + ids: {id: @id}, + params: {}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def release_hold( + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :release_hold, + session: @session, + ids: {id: @id}, + params: {}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + new_fulfill_at: T.untyped, + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def reschedule( + new_fulfill_at: nil, + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :reschedule, + session: @session, + ids: {id: @id}, + params: {new_fulfill_at: new_fulfill_at}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + fulfillment_order_ids: T.untyped, + fulfillment_deadline: T.untyped, + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def set_fulfillment_orders_deadline( + fulfillment_order_ids: nil, + fulfillment_deadline: nil, + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :set_fulfillment_orders_deadline, + session: @session, + ids: {}, + params: {fulfillment_order_ids: fulfillment_order_ids, fulfillment_deadline: fulfillment_deadline}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/fulfillment_request.rb b/lib/shopify_api/rest/resources/2024_10/fulfillment_request.rb new file mode 100644 index 00000000..c56f12e6 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/fulfillment_request.rb @@ -0,0 +1,101 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class FulfillmentRequest < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @fulfillment_order_id = T.let(nil, T.nilable(Integer)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :post, operation: :accept, ids: [:fulfillment_order_id], path: "fulfillment_orders//fulfillment_request/accept.json"}, + {http_method: :post, operation: :post, ids: [:fulfillment_order_id], path: "fulfillment_orders//fulfillment_request.json"}, + {http_method: :post, operation: :reject, ids: [:fulfillment_order_id], path: "fulfillment_orders//fulfillment_request/reject.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(Integer)) } + attr_reader :fulfillment_order_id + + class << self + sig do + returns(T::Array[String]) + end + def json_response_body_names() + [ + "submitted_fulfillment_order", + "fulfillment_order" + ] + end + + end + + sig do + params( + message: T.untyped, + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def accept( + message: nil, + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :accept, + session: @session, + ids: {fulfillment_order_id: @fulfillment_order_id}, + params: {message: message}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + message: T.untyped, + reason: T.untyped, + line_items: T.untyped, + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def reject( + message: nil, + reason: nil, + line_items: nil, + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :reject, + session: @session, + ids: {fulfillment_order_id: @fulfillment_order_id}, + params: {message: message, reason: reason, line_items: line_items}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/fulfillment_service.rb b/lib/shopify_api/rest/resources/2024_10/fulfillment_service.rb new file mode 100644 index 00000000..19f8f759 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/fulfillment_service.rb @@ -0,0 +1,134 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class FulfillmentService < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @admin_graphql_api_id = T.let(nil, T.nilable(String)) + @callback_url = T.let(nil, T.nilable(String)) + @fulfillment_orders_opt_in = T.let(nil, T.nilable(T::Boolean)) + @handle = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @inventory_management = T.let(nil, T.nilable(T::Boolean)) + @location_id = T.let(nil, T.nilable(Integer)) + @name = T.let(nil, T.nilable(String)) + @permits_sku_sharing = T.let(nil, T.nilable(T::Boolean)) + @provider_id = T.let(nil, T.nilable(String)) + @requires_shipping_method = T.let(nil, T.nilable(T::Boolean)) + @tracking_support = T.let(nil, T.nilable(T::Boolean)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "fulfillment_services/.json"}, + {http_method: :get, operation: :get, ids: [], path: "fulfillment_services.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "fulfillment_services/.json"}, + {http_method: :post, operation: :post, ids: [], path: "fulfillment_services.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "fulfillment_services/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :admin_graphql_api_id + sig { returns(T.nilable(String)) } + attr_reader :callback_url + sig { returns(T.nilable(T::Boolean)) } + attr_reader :fulfillment_orders_opt_in + sig { returns(T.nilable(String)) } + attr_reader :handle + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(T::Boolean)) } + attr_reader :inventory_management + sig { returns(T.nilable(Integer)) } + attr_reader :location_id + sig { returns(T.nilable(String)) } + attr_reader :name + sig { returns(T.nilable(T::Boolean)) } + attr_reader :permits_sku_sharing + sig { returns(T.nilable(String)) } + attr_reader :provider_id + sig { returns(T.nilable(T::Boolean)) } + attr_reader :requires_shipping_method + sig { returns(T.nilable(T::Boolean)) } + attr_reader :tracking_support + + class << self + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.nilable(FulfillmentService)) + end + def find( + id:, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {}, + ) + T.cast(result[0], T.nilable(FulfillmentService)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + scope: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[FulfillmentService]) + end + def all( + scope: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {scope: scope}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[FulfillmentService]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/gift_card.rb b/lib/shopify_api/rest/resources/2024_10/gift_card.rb new file mode 100644 index 00000000..7f2fff50 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/gift_card.rb @@ -0,0 +1,222 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class GiftCard < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @api_client_id = T.let(nil, T.nilable(Integer)) + @balance = T.let(nil, T.nilable(Balance)) + @code = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @currency = T.let(nil, T.nilable(Currency)) + @customer_id = T.let(nil, T.nilable(Integer)) + @disabled_at = T.let(nil, T.nilable(String)) + @expires_on = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @initial_value = T.let(nil, T.nilable(String)) + @last_characters = T.let(nil, T.nilable(String)) + @line_item_id = T.let(nil, T.nilable(Integer)) + @note = T.let(nil, T.nilable(String)) + @order_id = T.let(nil, T.nilable(Integer)) + @template_suffix = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + @user_id = T.let(nil, T.nilable(Integer)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({ + balance: Balance, + currency: Currency + }, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :count, ids: [], path: "gift_cards/count.json"}, + {http_method: :get, operation: :get, ids: [], path: "gift_cards.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "gift_cards/.json"}, + {http_method: :get, operation: :search, ids: [], path: "gift_cards/search.json"}, + {http_method: :post, operation: :disable, ids: [:id], path: "gift_cards//disable.json"}, + {http_method: :post, operation: :post, ids: [], path: "gift_cards.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "gift_cards/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(Integer)) } + attr_reader :api_client_id + sig { returns(T.nilable(Balance)) } + attr_reader :balance + sig { returns(T.nilable(String)) } + attr_reader :code + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(Currency)) } + attr_reader :currency + sig { returns(T.nilable(Integer)) } + attr_reader :customer_id + sig { returns(T.nilable(String)) } + attr_reader :disabled_at + sig { returns(T.nilable(String)) } + attr_reader :expires_on + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :initial_value + sig { returns(T.nilable(String)) } + attr_reader :last_characters + sig { returns(T.nilable(Integer)) } + attr_reader :line_item_id + sig { returns(T.nilable(String)) } + attr_reader :note + sig { returns(T.nilable(Integer)) } + attr_reader :order_id + sig { returns(T.nilable(String)) } + attr_reader :template_suffix + sig { returns(T.nilable(String)) } + attr_reader :updated_at + sig { returns(T.nilable(Integer)) } + attr_reader :user_id + + class << self + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.nilable(GiftCard)) + end + def find( + id:, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {}, + ) + T.cast(result[0], T.nilable(GiftCard)) + end + + sig do + params( + status: T.untyped, + limit: T.untyped, + since_id: T.untyped, + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[GiftCard]) + end + def all( + status: nil, + limit: nil, + since_id: nil, + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {status: status, limit: limit, since_id: since_id, fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[GiftCard]) + end + + sig do + params( + status: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + status: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {status: status}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + sig do + params( + order: T.untyped, + query: T.untyped, + limit: T.untyped, + fields: T.untyped, + created_at_min: T.untyped, + created_at_max: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def search( + order: nil, + query: nil, + limit: nil, + fields: nil, + created_at_min: nil, + created_at_max: nil, + updated_at_min: nil, + updated_at_max: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :search, + session: session, + ids: {}, + params: {order: order, query: query, limit: limit, fields: fields, created_at_min: created_at_min, created_at_max: created_at_max, updated_at_min: updated_at_min, updated_at_max: updated_at_max}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + sig do + params( + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def disable( + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :disable, + session: @session, + ids: {id: @id}, + params: {}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/gift_card_adjustment.rb b/lib/shopify_api/rest/resources/2024_10/gift_card_adjustment.rb new file mode 100644 index 00000000..fd0a2d6e --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/gift_card_adjustment.rb @@ -0,0 +1,122 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class GiftCardAdjustment < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @amount = T.let(nil, T.nilable(Float)) + @api_client_id = T.let(nil, T.nilable(Integer)) + @created_at = T.let(nil, T.nilable(String)) + @gift_card_id = T.let(nil, T.nilable(Integer)) + @id = T.let(nil, T.nilable(Integer)) + @note = T.let(nil, T.nilable(String)) + @number = T.let(nil, T.nilable(Integer)) + @order_transaction_id = T.let(nil, T.nilable(Integer)) + @processed_at = T.let(nil, T.nilable(String)) + @remote_transaction_ref = T.let(nil, T.nilable(String)) + @remote_transaction_url = T.let(nil, T.nilable(String)) + @user_id = T.let(nil, T.nilable(Integer)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [:gift_card_id], path: "gift_cards//adjustments.json"}, + {http_method: :get, operation: :get, ids: [:gift_card_id, :id], path: "gift_cards//adjustments/.json"}, + {http_method: :post, operation: :post, ids: [:gift_card_id], path: "gift_cards//adjustments.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(Float)) } + attr_reader :amount + sig { returns(T.nilable(Integer)) } + attr_reader :api_client_id + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(Integer)) } + attr_reader :gift_card_id + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :note + sig { returns(T.nilable(Integer)) } + attr_reader :number + sig { returns(T.nilable(Integer)) } + attr_reader :order_transaction_id + sig { returns(T.nilable(String)) } + attr_reader :processed_at + sig { returns(T.nilable(String)) } + attr_reader :remote_transaction_ref + sig { returns(T.nilable(String)) } + attr_reader :remote_transaction_url + sig { returns(T.nilable(Integer)) } + attr_reader :user_id + + class << self + sig do + returns(String) + end + def json_body_name() + "adjustment" + end + + sig do + params( + id: T.any(Integer, String), + gift_card_id: T.nilable(T.any(Integer, String)), + session: Auth::Session + ).returns(T.nilable(GiftCardAdjustment)) + end + def find( + id:, + gift_card_id: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id, gift_card_id: gift_card_id}, + params: {}, + ) + T.cast(result[0], T.nilable(GiftCardAdjustment)) + end + + sig do + params( + gift_card_id: T.nilable(T.any(Integer, String)), + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[GiftCardAdjustment]) + end + def all( + gift_card_id: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {gift_card_id: gift_card_id}, + params: {}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[GiftCardAdjustment]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/image.rb b/lib/shopify_api/rest/resources/2024_10/image.rb new file mode 100644 index 00000000..6bc31c2d --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/image.rb @@ -0,0 +1,161 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Image < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @created_at = T.let(nil, T.nilable(String)) + @height = T.let(nil, T.nilable(Integer)) + @id = T.let(nil, T.nilable(Integer)) + @position = T.let(nil, T.nilable(Integer)) + @product_id = T.let(nil, T.nilable(Integer)) + @src = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + @variant_ids = T.let(nil, T.nilable(T::Array[T.untyped])) + @width = T.let(nil, T.nilable(Integer)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:product_id, :id], path: "products//images/.json"}, + {http_method: :get, operation: :count, ids: [:product_id], path: "products//images/count.json"}, + {http_method: :get, operation: :get, ids: [:product_id], path: "products//images.json"}, + {http_method: :get, operation: :get, ids: [:product_id, :id], path: "products//images/.json"}, + {http_method: :post, operation: :post, ids: [:product_id], path: "products//images.json"}, + {http_method: :put, operation: :put, ids: [:product_id, :id], path: "products//images/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(Integer)) } + attr_reader :height + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(Integer)) } + attr_reader :position + sig { returns(T.nilable(Integer)) } + attr_reader :product_id + sig { returns(T.nilable(String)) } + attr_reader :src + sig { returns(T.nilable(String)) } + attr_reader :updated_at + sig { returns(T.nilable(T::Array[Integer])) } + attr_reader :variant_ids + sig { returns(T.nilable(Integer)) } + attr_reader :width + + class << self + sig do + params( + id: T.any(Integer, String), + product_id: T.nilable(T.any(Integer, String)), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(Image)) + end + def find( + id:, + product_id: nil, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id, product_id: product_id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(Image)) + end + + sig do + params( + id: T.any(Integer, String), + product_id: T.nilable(T.any(Integer, String)), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + product_id: nil, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id, product_id: product_id}, + params: {}, + ) + end + + sig do + params( + product_id: T.nilable(T.any(Integer, String)), + since_id: T.untyped, + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Image]) + end + def all( + product_id: nil, + since_id: nil, + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {product_id: product_id}, + params: {since_id: since_id, fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Image]) + end + + sig do + params( + product_id: T.nilable(T.any(Integer, String)), + since_id: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + product_id: nil, + since_id: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {product_id: product_id}, + params: {since_id: since_id}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/inventory_item.rb b/lib/shopify_api/rest/resources/2024_10/inventory_item.rb new file mode 100644 index 00000000..52f3ef77 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/inventory_item.rb @@ -0,0 +1,112 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class InventoryItem < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @cost = T.let(nil, T.nilable(String)) + @country_code_of_origin = T.let(nil, T.nilable(String)) + @country_harmonized_system_codes = T.let(nil, T.nilable(T::Array[T.untyped])) + @created_at = T.let(nil, T.nilable(String)) + @harmonized_system_code = T.let(nil, T.nilable(T.any(Integer, String))) + @id = T.let(nil, T.nilable(Integer)) + @province_code_of_origin = T.let(nil, T.nilable(String)) + @requires_shipping = T.let(nil, T.nilable(T::Boolean)) + @sku = T.let(nil, T.nilable(String)) + @tracked = T.let(nil, T.nilable(T::Boolean)) + @updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [], path: "inventory_items.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "inventory_items/.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "inventory_items/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :cost + sig { returns(T.nilable(String)) } + attr_reader :country_code_of_origin + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :country_harmonized_system_codes + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(T.any(Integer, String))) } + attr_reader :harmonized_system_code + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :province_code_of_origin + sig { returns(T.nilable(T::Boolean)) } + attr_reader :requires_shipping + sig { returns(T.nilable(String)) } + attr_reader :sku + sig { returns(T.nilable(T::Boolean)) } + attr_reader :tracked + sig { returns(T.nilable(String)) } + attr_reader :updated_at + + class << self + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.nilable(InventoryItem)) + end + def find( + id:, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {}, + ) + T.cast(result[0], T.nilable(InventoryItem)) + end + + sig do + params( + ids: T.untyped, + limit: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[InventoryItem]) + end + def all( + ids: nil, + limit: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {ids: ids, limit: limit}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[InventoryItem]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/inventory_level.rb b/lib/shopify_api/rest/resources/2024_10/inventory_level.rb new file mode 100644 index 00000000..a3e3c31a --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/inventory_level.rb @@ -0,0 +1,183 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class InventoryLevel < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @available = T.let(nil, T.nilable(Integer)) + @inventory_item_id = T.let(nil, T.nilable(Integer)) + @location_id = T.let(nil, T.nilable(Integer)) + @updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [], path: "inventory_levels.json"}, + {http_method: :get, operation: :get, ids: [], path: "inventory_levels.json"}, + {http_method: :post, operation: :adjust, ids: [], path: "inventory_levels/adjust.json"}, + {http_method: :post, operation: :connect, ids: [], path: "inventory_levels/connect.json"}, + {http_method: :post, operation: :set, ids: [], path: "inventory_levels/set.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(Integer)) } + attr_reader :available + sig { returns(T.nilable(Integer)) } + attr_reader :inventory_item_id + sig { returns(T.nilable(Integer)) } + attr_reader :location_id + sig { returns(T.nilable(String)) } + attr_reader :updated_at + + class << self + sig do + params( + inventory_item_id: T.untyped, + location_id: T.untyped, + session: Auth::Session + ).returns(T.untyped) + end + def delete( + inventory_item_id: nil, + location_id: nil, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {}, + params: {inventory_item_id: inventory_item_id, location_id: location_id}, + ) + end + + sig do + params( + inventory_item_ids: T.untyped, + location_ids: T.untyped, + limit: T.untyped, + updated_at_min: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[InventoryLevel]) + end + def all( + inventory_item_ids: nil, + location_ids: nil, + limit: nil, + updated_at_min: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {inventory_item_ids: inventory_item_ids, location_ids: location_ids, limit: limit, updated_at_min: updated_at_min}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[InventoryLevel]) + end + + end + + sig do + params( + inventory_item_id: T.untyped, + location_id: T.untyped, + available_adjustment: T.untyped, + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def adjust( + inventory_item_id: nil, + location_id: nil, + available_adjustment: nil, + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :adjust, + session: @session, + ids: {}, + params: {inventory_item_id: inventory_item_id, location_id: location_id, available_adjustment: available_adjustment}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + inventory_item_id: T.untyped, + location_id: T.untyped, + relocate_if_necessary: T.untyped, + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def connect( + inventory_item_id: nil, + location_id: nil, + relocate_if_necessary: nil, + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :connect, + session: @session, + ids: {}, + params: {inventory_item_id: inventory_item_id, location_id: location_id, relocate_if_necessary: relocate_if_necessary}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + inventory_item_id: T.untyped, + location_id: T.untyped, + available: T.untyped, + disconnect_if_necessary: T.untyped, + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def set( + inventory_item_id: nil, + location_id: nil, + available: nil, + disconnect_if_necessary: nil, + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :set, + session: @session, + ids: {}, + params: {inventory_item_id: inventory_item_id, location_id: location_id, available: available, disconnect_if_necessary: disconnect_if_necessary}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/location.rb b/lib/shopify_api/rest/resources/2024_10/location.rb new file mode 100644 index 00000000..11cdb752 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/location.rb @@ -0,0 +1,171 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Location < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @active = T.let(nil, T.nilable(T::Boolean)) + @address1 = T.let(nil, T.nilable(String)) + @address2 = T.let(nil, T.nilable(String)) + @city = T.let(nil, T.nilable(String)) + @country = T.let(nil, T.nilable(String)) + @country_code = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @legacy = T.let(nil, T.nilable(T::Boolean)) + @localized_country_name = T.let(nil, T.nilable(String)) + @localized_province_name = T.let(nil, T.nilable(String)) + @name = T.let(nil, T.nilable(String)) + @phone = T.let(nil, T.nilable(String)) + @province = T.let(nil, T.nilable(String)) + @province_code = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + @zip = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :count, ids: [], path: "locations/count.json"}, + {http_method: :get, operation: :get, ids: [], path: "locations.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "locations/.json"}, + {http_method: :get, operation: :inventory_levels, ids: [:id], path: "locations//inventory_levels.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(T::Boolean)) } + attr_reader :active + sig { returns(T.nilable(String)) } + attr_reader :address1 + sig { returns(T.nilable(String)) } + attr_reader :address2 + sig { returns(T.nilable(String)) } + attr_reader :city + sig { returns(T.nilable(String)) } + attr_reader :country + sig { returns(T.nilable(String)) } + attr_reader :country_code + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(T::Boolean)) } + attr_reader :legacy + sig { returns(T.nilable(String)) } + attr_reader :localized_country_name + sig { returns(T.nilable(String)) } + attr_reader :localized_province_name + sig { returns(T.nilable(String)) } + attr_reader :name + sig { returns(T.nilable(String)) } + attr_reader :phone + sig { returns(T.nilable(String)) } + attr_reader :province + sig { returns(T.nilable(String)) } + attr_reader :province_code + sig { returns(T.nilable(String)) } + attr_reader :updated_at + sig { returns(T.nilable(String)) } + attr_reader :zip + + class << self + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.nilable(Location)) + end + def find( + id:, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {}, + ) + T.cast(result[0], T.nilable(Location)) + end + + sig do + params( + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Location]) + end + def all( + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Location]) + end + + sig do + params( + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def inventory_levels( + id:, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :inventory_levels, + session: session, + ids: {id: id}, + params: {}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/locations_for_move.rb b/lib/shopify_api/rest/resources/2024_10/locations_for_move.rb new file mode 100644 index 00000000..98843233 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/locations_for_move.rb @@ -0,0 +1,60 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class LocationsForMove < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @locations_for_move = T.let(nil, T.nilable(T::Array[T.untyped])) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [:fulfillment_order_id], path: "fulfillment_orders//locations_for_move.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :locations_for_move + + class << self + sig do + params( + fulfillment_order_id: T.nilable(T.any(Integer, String)), + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[LocationsForMove]) + end + def all( + fulfillment_order_id: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {fulfillment_order_id: fulfillment_order_id}, + params: {}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[LocationsForMove]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/marketing_event.rb b/lib/shopify_api/rest/resources/2024_10/marketing_event.rb new file mode 100644 index 00000000..cb7500a9 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/marketing_event.rb @@ -0,0 +1,213 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class MarketingEvent < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @event_type = T.let(nil, T.nilable(String)) + @marketing_channel = T.let(nil, T.nilable(String)) + @paid = T.let(nil, T.nilable(T::Boolean)) + @started_at = T.let(nil, T.nilable(String)) + @UTM_parameters = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @budget = T.let(nil, T.nilable(String)) + @budget_type = T.let(nil, T.nilable(String)) + @currency = T.let(nil, T.nilable(String)) + @description = T.let(nil, T.nilable(String)) + @ended_at = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @manage_url = T.let(nil, T.nilable(String)) + @marketed_resources = T.let(nil, T.nilable(T::Array[T.untyped])) + @preview_url = T.let(nil, T.nilable(String)) + @referring_domain = T.let(nil, T.nilable(String)) + @remote_id = T.let(nil, T.nilable(String)) + @scheduled_to_end_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "marketing_events/.json"}, + {http_method: :get, operation: :count, ids: [], path: "marketing_events/count.json"}, + {http_method: :get, operation: :get, ids: [], path: "marketing_events.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "marketing_events/.json"}, + {http_method: :post, operation: :engagements, ids: [:id], path: "marketing_events//engagements.json"}, + {http_method: :post, operation: :post, ids: [], path: "marketing_events.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "marketing_events/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :event_type + sig { returns(T.nilable(String)) } + attr_reader :marketing_channel + sig { returns(T.nilable(T::Boolean)) } + attr_reader :paid + sig { returns(T.nilable(String)) } + attr_reader :started_at + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :UTM_parameters + sig { returns(T.nilable(String)) } + attr_reader :budget + sig { returns(T.nilable(String)) } + attr_reader :budget_type + sig { returns(T.nilable(String)) } + attr_reader :currency + sig { returns(T.nilable(String)) } + attr_reader :description + sig { returns(T.nilable(String)) } + attr_reader :ended_at + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :manage_url + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :marketed_resources + sig { returns(T.nilable(String)) } + attr_reader :preview_url + sig { returns(T.nilable(String)) } + attr_reader :referring_domain + sig { returns(T.nilable(String)) } + attr_reader :remote_id + sig { returns(T.nilable(String)) } + attr_reader :scheduled_to_end_at + + class << self + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.nilable(MarketingEvent)) + end + def find( + id:, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {}, + ) + T.cast(result[0], T.nilable(MarketingEvent)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + limit: T.untyped, + offset: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[MarketingEvent]) + end + def all( + limit: nil, + offset: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {limit: limit, offset: offset}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[MarketingEvent]) + end + + sig do + params( + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + sig do + params( + occurred_on: T.untyped, + impressions_count: T.untyped, + views_count: T.untyped, + clicks_count: T.untyped, + shares_count: T.untyped, + favorites_count: T.untyped, + comments_count: T.untyped, + ad_spend: T.untyped, + is_cumulative: T.untyped, + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def engagements( + occurred_on: nil, + impressions_count: nil, + views_count: nil, + clicks_count: nil, + shares_count: nil, + favorites_count: nil, + comments_count: nil, + ad_spend: nil, + is_cumulative: nil, + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :engagements, + session: @session, + ids: {id: @id}, + params: {occurred_on: occurred_on, impressions_count: impressions_count, views_count: views_count, clicks_count: clicks_count, shares_count: shares_count, favorites_count: favorites_count, comments_count: comments_count, ad_spend: ad_spend, is_cumulative: is_cumulative}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/metafield.rb b/lib/shopify_api/rest/resources/2024_10/metafield.rb new file mode 100644 index 00000000..70326511 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/metafield.rb @@ -0,0 +1,348 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Metafield < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @key = T.let(nil, T.nilable(String)) + @namespace = T.let(nil, T.nilable(String)) + @value = T.let(nil, T.nilable(T.any(String, Integer, Float, T::Boolean, String))) + @article_id = T.let(nil, T.nilable(Integer)) + @blog_id = T.let(nil, T.nilable(Integer)) + @collection_id = T.let(nil, T.nilable(Integer)) + @created_at = T.let(nil, T.nilable(String)) + @customer_id = T.let(nil, T.nilable(Integer)) + @description = T.let(nil, T.nilable(String)) + @draft_order_id = T.let(nil, T.nilable(Integer)) + @id = T.let(nil, T.nilable(Integer)) + @order_id = T.let(nil, T.nilable(Integer)) + @owner_id = T.let(nil, T.nilable(Integer)) + @owner_resource = T.let(nil, T.nilable(String)) + @page_id = T.let(nil, T.nilable(Integer)) + @product_id = T.let(nil, T.nilable(Integer)) + @product_image_id = T.let(nil, T.nilable(Integer)) + @type = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + @variant_id = T.let(nil, T.nilable(Integer)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:article_id, :id], path: "articles//metafields/.json"}, + {http_method: :delete, operation: :delete, ids: [:blog_id, :id], path: "blogs//metafields/.json"}, + {http_method: :delete, operation: :delete, ids: [:blog_id, :id], path: "blogs//metafields/.json"}, + {http_method: :delete, operation: :delete, ids: [:collection_id, :id], path: "collections//metafields/.json"}, + {http_method: :delete, operation: :delete, ids: [:customer_id, :id], path: "customers//metafields/.json"}, + {http_method: :delete, operation: :delete, ids: [:draft_order_id, :id], path: "draft_orders//metafields/.json"}, + {http_method: :delete, operation: :delete, ids: [:id], path: "metafields/.json"}, + {http_method: :delete, operation: :delete, ids: [:order_id, :id], path: "orders//metafields/.json"}, + {http_method: :delete, operation: :delete, ids: [:page_id, :id], path: "pages//metafields/.json"}, + {http_method: :delete, operation: :delete, ids: [:product_image_id, :id], path: "product_images//metafields/.json"}, + {http_method: :delete, operation: :delete, ids: [:product_id, :id], path: "products//metafields/.json"}, + {http_method: :delete, operation: :delete, ids: [:variant_id, :id], path: "variants//metafields/.json"}, + {http_method: :get, operation: :count, ids: [:article_id], path: "articles//metafields/count.json"}, + {http_method: :get, operation: :count, ids: [:blog_id], path: "blogs//metafields/count.json"}, + {http_method: :get, operation: :count, ids: [:blog_id], path: "blogs//metafields/count.json"}, + {http_method: :get, operation: :count, ids: [:collection_id], path: "collections//metafields/count.json"}, + {http_method: :get, operation: :count, ids: [:customer_id], path: "customers//metafields/count.json"}, + {http_method: :get, operation: :count, ids: [:draft_order_id], path: "draft_orders//metafields/count.json"}, + {http_method: :get, operation: :count, ids: [], path: "metafields/count.json"}, + {http_method: :get, operation: :count, ids: [:order_id], path: "orders//metafields/count.json"}, + {http_method: :get, operation: :count, ids: [:page_id], path: "pages//metafields/count.json"}, + {http_method: :get, operation: :count, ids: [:product_image_id], path: "product_images//metafields/count.json"}, + {http_method: :get, operation: :count, ids: [:product_id], path: "products//metafields/count.json"}, + {http_method: :get, operation: :count, ids: [:variant_id], path: "variants//metafields/count.json"}, + {http_method: :get, operation: :get, ids: [:article_id], path: "articles//metafields.json"}, + {http_method: :get, operation: :get, ids: [:article_id, :id], path: "articles//metafields/.json"}, + {http_method: :get, operation: :get, ids: [:blog_id], path: "blogs//metafields.json"}, + {http_method: :get, operation: :get, ids: [:blog_id], path: "blogs//metafields.json"}, + {http_method: :get, operation: :get, ids: [:blog_id, :id], path: "blogs//metafields/.json"}, + {http_method: :get, operation: :get, ids: [:blog_id, :id], path: "blogs//metafields/.json"}, + {http_method: :get, operation: :get, ids: [:collection_id], path: "collections//metafields.json"}, + {http_method: :get, operation: :get, ids: [:collection_id, :id], path: "collections//metafields/.json"}, + {http_method: :get, operation: :get, ids: [:customer_id], path: "customers//metafields.json"}, + {http_method: :get, operation: :get, ids: [:customer_id, :id], path: "customers//metafields/.json"}, + {http_method: :get, operation: :get, ids: [:draft_order_id], path: "draft_orders//metafields.json"}, + {http_method: :get, operation: :get, ids: [:draft_order_id, :id], path: "draft_orders//metafields/.json"}, + {http_method: :get, operation: :get, ids: [], path: "metafields.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "metafields/.json"}, + {http_method: :get, operation: :get, ids: [:order_id], path: "orders//metafields.json"}, + {http_method: :get, operation: :get, ids: [:order_id, :id], path: "orders//metafields/.json"}, + {http_method: :get, operation: :get, ids: [:page_id], path: "pages//metafields.json"}, + {http_method: :get, operation: :get, ids: [:page_id, :id], path: "pages//metafields/.json"}, + {http_method: :get, operation: :get, ids: [:product_image_id], path: "product_images//metafields.json"}, + {http_method: :get, operation: :get, ids: [:product_image_id, :id], path: "product_images//metafields/.json"}, + {http_method: :get, operation: :get, ids: [:product_id], path: "products//metafields.json"}, + {http_method: :get, operation: :get, ids: [:product_id, :id], path: "products//metafields/.json"}, + {http_method: :get, operation: :get, ids: [:variant_id], path: "variants//metafields.json"}, + {http_method: :get, operation: :get, ids: [:variant_id, :id], path: "variants//metafields/.json"}, + {http_method: :post, operation: :post, ids: [:article_id], path: "articles//metafields.json"}, + {http_method: :post, operation: :post, ids: [:blog_id], path: "blogs//metafields.json"}, + {http_method: :post, operation: :post, ids: [:blog_id], path: "blogs//metafields.json"}, + {http_method: :post, operation: :post, ids: [:collection_id], path: "collections//metafields.json"}, + {http_method: :post, operation: :post, ids: [:customer_id], path: "customers//metafields.json"}, + {http_method: :post, operation: :post, ids: [:draft_order_id], path: "draft_orders//metafields.json"}, + {http_method: :post, operation: :post, ids: [], path: "metafields.json"}, + {http_method: :post, operation: :post, ids: [:order_id], path: "orders//metafields.json"}, + {http_method: :post, operation: :post, ids: [:page_id], path: "pages//metafields.json"}, + {http_method: :post, operation: :post, ids: [:product_image_id], path: "product_images//metafields.json"}, + {http_method: :post, operation: :post, ids: [:product_id], path: "products//metafields.json"}, + {http_method: :post, operation: :post, ids: [:variant_id], path: "variants//metafields.json"}, + {http_method: :put, operation: :put, ids: [:article_id, :id], path: "articles//metafields/.json"}, + {http_method: :put, operation: :put, ids: [:blog_id, :id], path: "blogs//metafields/.json"}, + {http_method: :put, operation: :put, ids: [:blog_id, :id], path: "blogs//metafields/.json"}, + {http_method: :put, operation: :put, ids: [:collection_id, :id], path: "collections//metafields/.json"}, + {http_method: :put, operation: :put, ids: [:customer_id, :id], path: "customers//metafields/.json"}, + {http_method: :put, operation: :put, ids: [:draft_order_id, :id], path: "draft_orders//metafields/.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "metafields/.json"}, + {http_method: :put, operation: :put, ids: [:order_id, :id], path: "orders//metafields/.json"}, + {http_method: :put, operation: :put, ids: [:page_id, :id], path: "pages//metafields/.json"}, + {http_method: :put, operation: :put, ids: [:product_image_id, :id], path: "product_images//metafields/.json"}, + {http_method: :put, operation: :put, ids: [:product_id, :id], path: "products//metafields/.json"}, + {http_method: :put, operation: :put, ids: [:variant_id, :id], path: "variants//metafields/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :key + sig { returns(T.nilable(String)) } + attr_reader :namespace + sig { returns(T.nilable(T.any(String, Integer, Float, T::Boolean, String))) } + attr_reader :value + sig { returns(T.nilable(Integer)) } + attr_reader :article_id + sig { returns(T.nilable(Integer)) } + attr_reader :blog_id + sig { returns(T.nilable(Integer)) } + attr_reader :collection_id + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(Integer)) } + attr_reader :customer_id + sig { returns(T.nilable(String)) } + attr_reader :description + sig { returns(T.nilable(Integer)) } + attr_reader :draft_order_id + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(Integer)) } + attr_reader :order_id + sig { returns(T.nilable(Integer)) } + attr_reader :owner_id + sig { returns(T.nilable(String)) } + attr_reader :owner_resource + sig { returns(T.nilable(Integer)) } + attr_reader :page_id + sig { returns(T.nilable(Integer)) } + attr_reader :product_id + sig { returns(T.nilable(Integer)) } + attr_reader :product_image_id + sig { returns(T.nilable(String)) } + attr_reader :type + sig { returns(T.nilable(String)) } + attr_reader :updated_at + sig { returns(T.nilable(Integer)) } + attr_reader :variant_id + + class << self + sig do + params( + id: T.any(Integer, String), + article_id: T.nilable(T.any(Integer, String)), + blog_id: T.nilable(T.any(Integer, String)), + collection_id: T.nilable(T.any(Integer, String)), + customer_id: T.nilable(T.any(Integer, String)), + draft_order_id: T.nilable(T.any(Integer, String)), + order_id: T.nilable(T.any(Integer, String)), + page_id: T.nilable(T.any(Integer, String)), + product_image_id: T.nilable(T.any(Integer, String)), + product_id: T.nilable(T.any(Integer, String)), + variant_id: T.nilable(T.any(Integer, String)), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(Metafield)) + end + def find( + id:, + article_id: nil, + blog_id: nil, + collection_id: nil, + customer_id: nil, + draft_order_id: nil, + order_id: nil, + page_id: nil, + product_image_id: nil, + product_id: nil, + variant_id: nil, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id, article_id: article_id, blog_id: blog_id, collection_id: collection_id, customer_id: customer_id, draft_order_id: draft_order_id, order_id: order_id, page_id: page_id, product_image_id: product_image_id, product_id: product_id, variant_id: variant_id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(Metafield)) + end + + sig do + params( + id: T.any(Integer, String), + article_id: T.nilable(T.any(Integer, String)), + blog_id: T.nilable(T.any(Integer, String)), + collection_id: T.nilable(T.any(Integer, String)), + customer_id: T.nilable(T.any(Integer, String)), + draft_order_id: T.nilable(T.any(Integer, String)), + order_id: T.nilable(T.any(Integer, String)), + page_id: T.nilable(T.any(Integer, String)), + product_image_id: T.nilable(T.any(Integer, String)), + product_id: T.nilable(T.any(Integer, String)), + variant_id: T.nilable(T.any(Integer, String)), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + article_id: nil, + blog_id: nil, + collection_id: nil, + customer_id: nil, + draft_order_id: nil, + order_id: nil, + page_id: nil, + product_image_id: nil, + product_id: nil, + variant_id: nil, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id, article_id: article_id, blog_id: blog_id, collection_id: collection_id, customer_id: customer_id, draft_order_id: draft_order_id, order_id: order_id, page_id: page_id, product_image_id: product_image_id, product_id: product_id, variant_id: variant_id}, + params: {}, + ) + end + + sig do + params( + article_id: T.nilable(T.any(Integer, String)), + blog_id: T.nilable(T.any(Integer, String)), + collection_id: T.nilable(T.any(Integer, String)), + customer_id: T.nilable(T.any(Integer, String)), + draft_order_id: T.nilable(T.any(Integer, String)), + order_id: T.nilable(T.any(Integer, String)), + page_id: T.nilable(T.any(Integer, String)), + product_image_id: T.nilable(T.any(Integer, String)), + product_id: T.nilable(T.any(Integer, String)), + variant_id: T.nilable(T.any(Integer, String)), + limit: T.untyped, + since_id: T.untyped, + created_at_min: T.untyped, + created_at_max: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + namespace: T.untyped, + key: T.untyped, + type: T.untyped, + fields: T.untyped, + metafield: T.nilable(T::Hash[T.untyped, T.untyped]), + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Metafield]) + end + def all( + article_id: nil, + blog_id: nil, + collection_id: nil, + customer_id: nil, + draft_order_id: nil, + order_id: nil, + page_id: nil, + product_image_id: nil, + product_id: nil, + variant_id: nil, + limit: nil, + since_id: nil, + created_at_min: nil, + created_at_max: nil, + updated_at_min: nil, + updated_at_max: nil, + namespace: nil, + key: nil, + type: nil, + fields: nil, + metafield: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {article_id: article_id, blog_id: blog_id, collection_id: collection_id, customer_id: customer_id, draft_order_id: draft_order_id, order_id: order_id, page_id: page_id, product_image_id: product_image_id, product_id: product_id, variant_id: variant_id}, + params: {limit: limit, since_id: since_id, created_at_min: created_at_min, created_at_max: created_at_max, updated_at_min: updated_at_min, updated_at_max: updated_at_max, namespace: namespace, key: key, type: type, fields: fields, metafield: metafield}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Metafield]) + end + + sig do + params( + article_id: T.nilable(T.any(Integer, String)), + blog_id: T.nilable(T.any(Integer, String)), + collection_id: T.nilable(T.any(Integer, String)), + customer_id: T.nilable(T.any(Integer, String)), + draft_order_id: T.nilable(T.any(Integer, String)), + order_id: T.nilable(T.any(Integer, String)), + page_id: T.nilable(T.any(Integer, String)), + product_image_id: T.nilable(T.any(Integer, String)), + product_id: T.nilable(T.any(Integer, String)), + variant_id: T.nilable(T.any(Integer, String)), + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + article_id: nil, + blog_id: nil, + collection_id: nil, + customer_id: nil, + draft_order_id: nil, + order_id: nil, + page_id: nil, + product_image_id: nil, + product_id: nil, + variant_id: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {article_id: article_id, blog_id: blog_id, collection_id: collection_id, customer_id: customer_id, draft_order_id: draft_order_id, order_id: order_id, page_id: page_id, product_image_id: product_image_id, product_id: product_id, variant_id: variant_id}, + params: {}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/mobile_platform_application.rb b/lib/shopify_api/rest/resources/2024_10/mobile_platform_application.rb new file mode 100644 index 00000000..67908f52 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/mobile_platform_application.rb @@ -0,0 +1,114 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class MobilePlatformApplication < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @application_id = T.let(nil, T.nilable(String)) + @enabled_shared_webcredentials = T.let(nil, T.nilable(T::Boolean)) + @enabled_universal_or_app_links = T.let(nil, T.nilable(T::Boolean)) + @id = T.let(nil, T.nilable(Integer)) + @platform = T.let(nil, T.nilable(String)) + @sha256_cert_fingerprints = T.let(nil, T.nilable(T::Array[T.untyped])) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "mobile_platform_applications/.json"}, + {http_method: :get, operation: :get, ids: [], path: "mobile_platform_applications.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "mobile_platform_applications/.json"}, + {http_method: :post, operation: :post, ids: [], path: "mobile_platform_applications.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "mobile_platform_applications/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :application_id + sig { returns(T.nilable(T::Boolean)) } + attr_reader :enabled_shared_webcredentials + sig { returns(T.nilable(T::Boolean)) } + attr_reader :enabled_universal_or_app_links + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :platform + sig { returns(T.nilable(T::Array[String])) } + attr_reader :sha256_cert_fingerprints + + class << self + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.nilable(MobilePlatformApplication)) + end + def find( + id:, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {}, + ) + T.cast(result[0], T.nilable(MobilePlatformApplication)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[MobilePlatformApplication]) + end + def all( + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[MobilePlatformApplication]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/order.rb b/lib/shopify_api/rest/resources/2024_10/order.rb new file mode 100644 index 00000000..d65d994c --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/order.rb @@ -0,0 +1,490 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Order < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @line_items = T.let(nil, T.nilable(T::Array[T.untyped])) + @app_id = T.let(nil, T.nilable(Integer)) + @billing_address = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @browser_ip = T.let(nil, T.nilable(String)) + @buyer_accepts_marketing = T.let(nil, T.nilable(T::Boolean)) + @cancel_reason = T.let(nil, T.nilable(String)) + @cancelled_at = T.let(nil, T.nilable(String)) + @cart_token = T.let(nil, T.nilable(String)) + @checkout_token = T.let(nil, T.nilable(String)) + @client_details = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @closed_at = T.let(nil, T.nilable(String)) + @company = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @confirmation_number = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @currency = T.let(nil, T.nilable(String)) + @current_subtotal_price = T.let(nil, T.nilable(String)) + @current_subtotal_price_set = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @current_total_additional_fees_set = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @current_total_discounts = T.let(nil, T.nilable(String)) + @current_total_discounts_set = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @current_total_duties_set = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @current_total_price = T.let(nil, T.nilable(String)) + @current_total_price_set = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @current_total_tax = T.let(nil, T.nilable(String)) + @current_total_tax_set = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @customer = T.let(nil, T.nilable(Customer)) + @customer_locale = T.let(nil, T.nilable(String)) + @discount_applications = T.let(nil, T.nilable(T::Array[T.untyped])) + @discount_codes = T.let(nil, T.nilable(T::Array[T.untyped])) + @email = T.let(nil, T.nilable(String)) + @estimated_taxes = T.let(nil, T.nilable(T::Boolean)) + @financial_status = T.let(nil, T.nilable(String)) + @fulfillment_status = T.let(nil, T.nilable(String)) + @fulfillments = T.let(nil, T.nilable(T::Array[T.untyped])) + @gateway = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @landing_site = T.let(nil, T.nilable(String)) + @location_id = T.let(nil, T.nilable(Integer)) + @merchant_of_record_app_id = T.let(nil, T.nilable(Integer)) + @merchant_business_entity_id = T.let(nil, T.nilable(Integer)) + @name = T.let(nil, T.nilable(String)) + @note = T.let(nil, T.nilable(String)) + @note_attributes = T.let(nil, T.nilable(T::Array[T.untyped])) + @number = T.let(nil, T.nilable(Integer)) + @order_number = T.let(nil, T.nilable(Integer)) + @order_status_url = T.let(nil, T.nilable(String)) + @original_total_additional_fees_set = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @original_total_duties_set = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @payment_gateway_names = T.let(nil, T.nilable(T::Array[T.untyped])) + @payment_terms = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @phone = T.let(nil, T.nilable(String)) + @po_number = T.let(nil, T.nilable(String)) + @presentment_currency = T.let(nil, T.nilable(String)) + @processed_at = T.let(nil, T.nilable(String)) + @referring_site = T.let(nil, T.nilable(String)) + @refunds = T.let(nil, T.nilable(T::Array[T.untyped])) + @shipping_address = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @shipping_lines = T.let(nil, T.nilable(T::Array[T.untyped])) + @source_identifier = T.let(nil, T.nilable(String)) + @source_name = T.let(nil, T.nilable(String)) + @source_url = T.let(nil, T.nilable(String)) + @subtotal_price = T.let(nil, T.nilable(String)) + @subtotal_price_set = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @tags = T.let(nil, T.nilable(String)) + @tax_lines = T.let(nil, T.nilable(T::Array[T.untyped])) + @taxes_included = T.let(nil, T.nilable(T::Boolean)) + @test = T.let(nil, T.nilable(T::Boolean)) + @token = T.let(nil, T.nilable(String)) + @total_discounts = T.let(nil, T.nilable(String)) + @total_discounts_set = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @total_line_items_price = T.let(nil, T.nilable(String)) + @total_line_items_price_set = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @total_outstanding = T.let(nil, T.nilable(String)) + @total_price = T.let(nil, T.nilable(String)) + @total_price_set = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @total_shipping_price_set = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @total_tax = T.let(nil, T.nilable(T.any(String, Float))) + @total_tax_set = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @total_tip_received = T.let(nil, T.nilable(String)) + @total_weight = T.let(nil, T.nilable(Integer)) + @updated_at = T.let(nil, T.nilable(String)) + @user_id = T.let(nil, T.nilable(Integer)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({ + customer: Customer + }, T::Hash[Symbol, Class]) + @has_many = T.let({ + discount_codes: DiscountCode, + fulfillments: Fulfillment, + refunds: Refund + }, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "orders/.json"}, + {http_method: :get, operation: :count, ids: [], path: "orders/count.json"}, + {http_method: :get, operation: :get, ids: [], path: "orders.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "orders/.json"}, + {http_method: :post, operation: :cancel, ids: [:id], path: "orders//cancel.json"}, + {http_method: :post, operation: :close, ids: [:id], path: "orders//close.json"}, + {http_method: :post, operation: :open, ids: [:id], path: "orders//open.json"}, + {http_method: :post, operation: :post, ids: [], path: "orders.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "orders/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :line_items + sig { returns(T.nilable(Integer)) } + attr_reader :app_id + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :billing_address + sig { returns(T.nilable(String)) } + attr_reader :browser_ip + sig { returns(T.nilable(T::Boolean)) } + attr_reader :buyer_accepts_marketing + sig { returns(T.nilable(String)) } + attr_reader :cancel_reason + sig { returns(T.nilable(String)) } + attr_reader :cancelled_at + sig { returns(T.nilable(String)) } + attr_reader :cart_token + sig { returns(T.nilable(String)) } + attr_reader :checkout_token + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :client_details + sig { returns(T.nilable(String)) } + attr_reader :closed_at + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :company + sig { returns(T.nilable(String)) } + attr_reader :confirmation_number + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :currency + sig { returns(T.nilable(String)) } + attr_reader :current_subtotal_price + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :current_subtotal_price_set + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :current_total_additional_fees_set + sig { returns(T.nilable(String)) } + attr_reader :current_total_discounts + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :current_total_discounts_set + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :current_total_duties_set + sig { returns(T.nilable(String)) } + attr_reader :current_total_price + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :current_total_price_set + sig { returns(T.nilable(String)) } + attr_reader :current_total_tax + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :current_total_tax_set + sig { returns(T.nilable(Customer)) } + attr_reader :customer + sig { returns(T.nilable(String)) } + attr_reader :customer_locale + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :discount_applications + sig { returns(T.nilable(T::Array[DiscountCode])) } + attr_reader :discount_codes + sig { returns(T.nilable(String)) } + attr_reader :email + sig { returns(T.nilable(T::Boolean)) } + attr_reader :estimated_taxes + sig { returns(T.nilable(String)) } + attr_reader :financial_status + sig { returns(T.nilable(String)) } + attr_reader :fulfillment_status + sig { returns(T.nilable(T::Array[Fulfillment])) } + attr_reader :fulfillments + sig { returns(T.nilable(String)) } + attr_reader :gateway + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :landing_site + sig { returns(T.nilable(Integer)) } + attr_reader :location_id + sig { returns(T.nilable(Integer)) } + attr_reader :merchant_of_record_app_id + sig { returns(T.nilable(String)) } + attr_reader :name + sig { returns(T.nilable(String)) } + attr_reader :note + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :note_attributes + sig { returns(T.nilable(Integer)) } + attr_reader :number + sig { returns(T.nilable(Integer)) } + attr_reader :order_number + sig { returns(T.nilable(String)) } + attr_reader :order_status_url + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :original_total_additional_fees_set + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :original_total_duties_set + sig { returns(T.nilable(T::Array[String])) } + attr_reader :payment_gateway_names + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :payment_terms + sig { returns(T.nilable(String)) } + attr_reader :phone + sig { returns(T.nilable(String)) } + attr_reader :po_number + sig { returns(T.nilable(String)) } + attr_reader :presentment_currency + sig { returns(T.nilable(String)) } + attr_reader :processed_at + sig { returns(T.nilable(String)) } + attr_reader :referring_site + sig { returns(T.nilable(T::Array[Refund])) } + attr_reader :refunds + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :shipping_address + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :shipping_lines + sig { returns(T.nilable(String)) } + attr_reader :source_identifier + sig { returns(T.nilable(String)) } + attr_reader :source_name + sig { returns(T.nilable(String)) } + attr_reader :source_url + sig { returns(T.nilable(String)) } + attr_reader :subtotal_price + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :subtotal_price_set + sig { returns(T.nilable(String)) } + attr_reader :tags + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :tax_lines + sig { returns(T.nilable(T::Boolean)) } + attr_reader :taxes_included + sig { returns(T.nilable(T::Boolean)) } + attr_reader :test + sig { returns(T.nilable(String)) } + attr_reader :token + sig { returns(T.nilable(String)) } + attr_reader :total_discounts + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :total_discounts_set + sig { returns(T.nilable(String)) } + attr_reader :total_line_items_price + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :total_line_items_price_set + sig { returns(T.nilable(String)) } + attr_reader :total_outstanding + sig { returns(T.nilable(String)) } + attr_reader :total_price + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :total_price_set + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :total_shipping_price_set + sig { returns(T.nilable(T.any(String, Float))) } + attr_reader :total_tax + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :total_tax_set + sig { returns(T.nilable(String)) } + attr_reader :total_tip_received + sig { returns(T.nilable(Integer)) } + attr_reader :total_weight + sig { returns(T.nilable(String)) } + attr_reader :updated_at + sig { returns(T.nilable(Integer)) } + attr_reader :user_id + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(Order)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(Order)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + ids: T.untyped, + limit: T.untyped, + since_id: T.untyped, + created_at_min: T.untyped, + created_at_max: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + processed_at_min: T.untyped, + processed_at_max: T.untyped, + attribution_app_id: T.untyped, + status: T.untyped, + financial_status: T.untyped, + fulfillment_status: T.untyped, + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Order]) + end + def all( + ids: nil, + limit: nil, + since_id: nil, + created_at_min: nil, + created_at_max: nil, + updated_at_min: nil, + updated_at_max: nil, + processed_at_min: nil, + processed_at_max: nil, + attribution_app_id: nil, + status: nil, + financial_status: nil, + fulfillment_status: nil, + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {ids: ids, limit: limit, since_id: since_id, created_at_min: created_at_min, created_at_max: created_at_max, updated_at_min: updated_at_min, updated_at_max: updated_at_max, processed_at_min: processed_at_min, processed_at_max: processed_at_max, attribution_app_id: attribution_app_id, status: status, financial_status: financial_status, fulfillment_status: fulfillment_status, fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Order]) + end + + sig do + params( + created_at_min: T.untyped, + created_at_max: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + status: T.untyped, + financial_status: T.untyped, + fulfillment_status: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + created_at_min: nil, + created_at_max: nil, + updated_at_min: nil, + updated_at_max: nil, + status: nil, + financial_status: nil, + fulfillment_status: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {created_at_min: created_at_min, created_at_max: created_at_max, updated_at_min: updated_at_min, updated_at_max: updated_at_max, status: status, financial_status: financial_status, fulfillment_status: fulfillment_status}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + sig do + params( + amount: T.untyped, + currency: T.untyped, + restock: T.untyped, + reason: T.untyped, + email: T.untyped, + refund: T.untyped, + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def cancel( + amount: nil, + currency: nil, + restock: nil, + reason: nil, + email: nil, + refund: nil, + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :cancel, + session: @session, + ids: {id: @id}, + params: {amount: amount, currency: currency, restock: restock, reason: reason, email: email, refund: refund}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def close( + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :close, + session: @session, + ids: {id: @id}, + params: {}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + sig do + params( + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def open( + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :open, + session: @session, + ids: {id: @id}, + params: {}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/order_risk.rb b/lib/shopify_api/rest/resources/2024_10/order_risk.rb new file mode 100644 index 00000000..6e75ee1b --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/order_risk.rb @@ -0,0 +1,148 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class OrderRisk < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @cause_cancel = T.let(nil, T.nilable(T::Boolean)) + @checkout_id = T.let(nil, T.nilable(Integer)) + @display = T.let(nil, T.nilable(T::Boolean)) + @id = T.let(nil, T.nilable(Integer)) + @merchant_message = T.let(nil, T.nilable(String)) + @message = T.let(nil, T.nilable(String)) + @order_id = T.let(nil, T.nilable(Integer)) + @recommendation = T.let(nil, T.nilable(String)) + @score = T.let(nil, T.nilable(String)) + @source = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:order_id, :id], path: "orders//risks/.json"}, + {http_method: :get, operation: :get, ids: [:order_id], path: "orders//risks.json"}, + {http_method: :get, operation: :get, ids: [:order_id, :id], path: "orders//risks/.json"}, + {http_method: :post, operation: :post, ids: [:order_id], path: "orders//risks.json"}, + {http_method: :put, operation: :put, ids: [:order_id, :id], path: "orders//risks/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(T::Boolean)) } + attr_reader :cause_cancel + sig { returns(T.nilable(Integer)) } + attr_reader :checkout_id + sig { returns(T.nilable(T::Boolean)) } + attr_reader :display + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :merchant_message + sig { returns(T.nilable(String)) } + attr_reader :message + sig { returns(T.nilable(Integer)) } + attr_reader :order_id + sig { returns(T.nilable(String)) } + attr_reader :recommendation + sig { returns(T.nilable(String)) } + attr_reader :score + sig { returns(T.nilable(String)) } + attr_reader :source + + class << self + sig do + returns(String) + end + def json_body_name() + "risk" + end + + sig do + returns(T::Array[String]) + end + def json_response_body_names() + [ + "risk" + ] + end + + sig do + params( + id: T.any(Integer, String), + order_id: T.nilable(T.any(Integer, String)), + session: Auth::Session + ).returns(T.nilable(OrderRisk)) + end + def find( + id:, + order_id: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id, order_id: order_id}, + params: {}, + ) + T.cast(result[0], T.nilable(OrderRisk)) + end + + sig do + params( + id: T.any(Integer, String), + order_id: T.nilable(T.any(Integer, String)), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + order_id: nil, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id, order_id: order_id}, + params: {}, + ) + end + + sig do + params( + order_id: T.nilable(T.any(Integer, String)), + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[OrderRisk]) + end + def all( + order_id: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {order_id: order_id}, + params: {}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[OrderRisk]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/page.rb b/lib/shopify_api/rest/resources/2024_10/page.rb new file mode 100644 index 00000000..b7b1c76f --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/page.rb @@ -0,0 +1,198 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Page < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @admin_graphql_api_id = T.let(nil, T.nilable(String)) + @author = T.let(nil, T.nilable(String)) + @body_html = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @handle = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @metafield = T.let(nil, T.nilable(Metafield)) + @published_at = T.let(nil, T.nilable(String)) + @shop_id = T.let(nil, T.nilable(Integer)) + @template_suffix = T.let(nil, T.nilable(String)) + @title = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({ + metafield: Metafield + }, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "pages/.json"}, + {http_method: :get, operation: :count, ids: [], path: "pages/count.json"}, + {http_method: :get, operation: :get, ids: [], path: "pages.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "pages/.json"}, + {http_method: :post, operation: :post, ids: [], path: "pages.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "pages/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :admin_graphql_api_id + sig { returns(T.nilable(String)) } + attr_reader :author + sig { returns(T.nilable(String)) } + attr_reader :body_html + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :handle + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(Metafield)) } + attr_reader :metafield + sig { returns(T.nilable(String)) } + attr_reader :published_at + sig { returns(T.nilable(Integer)) } + attr_reader :shop_id + sig { returns(T.nilable(String)) } + attr_reader :template_suffix + sig { returns(T.nilable(String)) } + attr_reader :title + sig { returns(T.nilable(String)) } + attr_reader :updated_at + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(Page)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(Page)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + limit: T.untyped, + since_id: T.untyped, + title: T.untyped, + handle: T.untyped, + created_at_min: T.untyped, + created_at_max: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + published_at_min: T.untyped, + published_at_max: T.untyped, + fields: T.untyped, + published_status: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Page]) + end + def all( + limit: nil, + since_id: nil, + title: nil, + handle: nil, + created_at_min: nil, + created_at_max: nil, + updated_at_min: nil, + updated_at_max: nil, + published_at_min: nil, + published_at_max: nil, + fields: nil, + published_status: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {limit: limit, since_id: since_id, title: title, handle: handle, created_at_min: created_at_min, created_at_max: created_at_max, updated_at_min: updated_at_min, updated_at_max: updated_at_max, published_at_min: published_at_min, published_at_max: published_at_max, fields: fields, published_status: published_status}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Page]) + end + + sig do + params( + title: T.untyped, + created_at_min: T.untyped, + created_at_max: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + published_at_min: T.untyped, + published_at_max: T.untyped, + published_status: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + title: nil, + created_at_min: nil, + created_at_max: nil, + updated_at_min: nil, + updated_at_max: nil, + published_at_min: nil, + published_at_max: nil, + published_status: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {title: title, created_at_min: created_at_min, created_at_max: created_at_max, updated_at_min: updated_at_min, updated_at_max: updated_at_max, published_at_min: published_at_min, published_at_max: published_at_max, published_status: published_status}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/payment.rb b/lib/shopify_api/rest/resources/2024_10/payment.rb new file mode 100644 index 00000000..068838ad --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/payment.rb @@ -0,0 +1,144 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Payment < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @checkout = T.let(nil, T.nilable(Checkout)) + @credit_card = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @id = T.let(nil, T.nilable(Integer)) + @next_action = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @payment_processing_error_message = T.let(nil, T.nilable(String)) + @transaction = T.let(nil, T.nilable(Transaction)) + @unique_token = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({ + transaction: Transaction, + checkout: Checkout + }, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :count, ids: [:checkout_id], path: "checkouts//payments/count.json"}, + {http_method: :get, operation: :get, ids: [:checkout_id], path: "checkouts//payments.json"}, + {http_method: :get, operation: :get, ids: [:checkout_id, :id], path: "checkouts//payments/.json"}, + {http_method: :post, operation: :post, ids: [:checkout_id], path: "checkouts//payments.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(Checkout)) } + attr_reader :checkout + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :credit_card + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :next_action + sig { returns(T.nilable(String)) } + attr_reader :payment_processing_error_message + sig { returns(T.nilable(Transaction)) } + attr_reader :transaction + sig { returns(T.nilable(String)) } + attr_reader :unique_token + + class << self + sig do + params( + id: T.any(Integer, String), + checkout_id: T.nilable(T.any(Integer, String)), + session: Auth::Session + ).returns(T.nilable(Payment)) + end + def find( + id:, + checkout_id: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id, checkout_id: checkout_id}, + params: {}, + ) + T.cast(result[0], T.nilable(Payment)) + end + + sig do + params( + checkout_id: T.nilable(T.any(Integer, String)), + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Payment]) + end + def all( + checkout_id: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {checkout_id: checkout_id}, + params: {}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Payment]) + end + + sig do + params( + checkout_id: T.nilable(T.any(Integer, String)), + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + checkout_id: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {checkout_id: checkout_id}, + params: {}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + sig do + returns(T.untyped) + end + def checkout_id() + @checkout&.token + end + + sig do + params( + val: T.untyped + ).void + end + def checkout_id=(val) + @checkout = @checkout || Checkout.new(session: @session) + T.unsafe(@checkout).token = val + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/payment_gateway.rb b/lib/shopify_api/rest/resources/2024_10/payment_gateway.rb new file mode 100644 index 00000000..3af8d2b6 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/payment_gateway.rb @@ -0,0 +1,147 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class PaymentGateway < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @attachment = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @credential1 = T.let(nil, T.nilable(String)) + @credential2 = T.let(nil, T.nilable(String)) + @credential3 = T.let(nil, T.nilable(String)) + @credential4 = T.let(nil, T.nilable(String)) + @disabled = T.let(nil, T.nilable(T::Boolean)) + @enabled_card_brands = T.let(nil, T.nilable(T::Array[T.untyped])) + @id = T.let(nil, T.nilable(Integer)) + @name = T.let(nil, T.nilable(String)) + @processing_method = T.let(nil, T.nilable(String)) + @provider_id = T.let(nil, T.nilable(Integer)) + @sandbox = T.let(nil, T.nilable(T::Boolean)) + @service_name = T.let(nil, T.nilable(String)) + @supports_network_tokenization = T.let(nil, T.nilable(T::Boolean)) + @type = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "payment_gateways/.json"}, + {http_method: :get, operation: :get, ids: [], path: "payment_gateways.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "payment_gateways/.json"}, + {http_method: :post, operation: :post, ids: [], path: "payment_gateways.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "payment_gateways/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :attachment + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :credential1 + sig { returns(T.nilable(String)) } + attr_reader :credential2 + sig { returns(T.nilable(String)) } + attr_reader :credential3 + sig { returns(T.nilable(String)) } + attr_reader :credential4 + sig { returns(T.nilable(T::Boolean)) } + attr_reader :disabled + sig { returns(T.nilable(T::Array[String])) } + attr_reader :enabled_card_brands + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :name + sig { returns(T.nilable(String)) } + attr_reader :processing_method + sig { returns(T.nilable(Integer)) } + attr_reader :provider_id + sig { returns(T.nilable(T::Boolean)) } + attr_reader :sandbox + sig { returns(T.nilable(String)) } + attr_reader :service_name + sig { returns(T.nilable(T::Boolean)) } + attr_reader :supports_network_tokenization + sig { returns(T.nilable(String)) } + attr_reader :type + sig { returns(T.nilable(String)) } + attr_reader :updated_at + + class << self + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.nilable(PaymentGateway)) + end + def find( + id:, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {}, + ) + T.cast(result[0], T.nilable(PaymentGateway)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[PaymentGateway]) + end + def all( + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[PaymentGateway]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/payment_transaction.rb b/lib/shopify_api/rest/resources/2024_10/payment_transaction.rb new file mode 100644 index 00000000..279b1d3c --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/payment_transaction.rb @@ -0,0 +1,114 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class PaymentTransaction < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @adjustment_order_transactions = T.let(nil, T.nilable(T::Array[T.untyped])) + @amount = T.let(nil, T.nilable(String)) + @currency = T.let(nil, T.nilable(Currency)) + @fee = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @net = T.let(nil, T.nilable(String)) + @payout_id = T.let(nil, T.nilable(Integer)) + @payout_status = T.let(nil, T.nilable(String)) + @processed_at = T.let(nil, T.nilable(String)) + @source_id = T.let(nil, T.nilable(Integer)) + @source_order_id = T.let(nil, T.nilable(Integer)) + @source_order_transaction_id = T.let(nil, T.nilable(String)) + @source_type = T.let(nil, T.nilable(String)) + @test = T.let(nil, T.nilable(T::Boolean)) + @type = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({ + currency: Currency + }, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :transactions, ids: [], path: "shopify_payments/balance/transactions.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :adjustment_order_transactions + sig { returns(T.nilable(String)) } + attr_reader :amount + sig { returns(T.nilable(Currency)) } + attr_reader :currency + sig { returns(T.nilable(String)) } + attr_reader :fee + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :net + sig { returns(T.nilable(Integer)) } + attr_reader :payout_id + sig { returns(T.nilable(String)) } + attr_reader :payout_status + sig { returns(T.nilable(String)) } + attr_reader :processed_at + sig { returns(T.nilable(Integer)) } + attr_reader :source_id + sig { returns(T.nilable(Integer)) } + attr_reader :source_order_id + sig { returns(T.nilable(String)) } + attr_reader :source_order_transaction_id + sig { returns(T.nilable(String)) } + attr_reader :source_type + sig { returns(T.nilable(T::Boolean)) } + attr_reader :test + sig { returns(T.nilable(String)) } + attr_reader :type + + class << self + sig do + params( + since_id: T.untyped, + last_id: T.untyped, + test: T.untyped, + payout_id: T.untyped, + payout_status: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def transactions( + since_id: nil, + last_id: nil, + test: nil, + payout_id: nil, + payout_status: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :transactions, + session: session, + ids: {}, + params: {since_id: since_id, last_id: last_id, test: test, payout_id: payout_id, payout_status: payout_status}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/payout.rb b/lib/shopify_api/rest/resources/2024_10/payout.rb new file mode 100644 index 00000000..3fa1d7fb --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/payout.rb @@ -0,0 +1,101 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Payout < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @amount = T.let(nil, T.nilable(String)) + @currency = T.let(nil, T.nilable(String)) + @date = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @status = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [], path: "shopify_payments/payouts.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "shopify_payments/payouts/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :amount + sig { returns(T.nilable(String)) } + attr_reader :currency + sig { returns(T.nilable(String)) } + attr_reader :date + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :status + + class << self + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.nilable(Payout)) + end + def find( + id:, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {}, + ) + T.cast(result[0], T.nilable(Payout)) + end + + sig do + params( + since_id: T.untyped, + last_id: T.untyped, + date_min: T.untyped, + date_max: T.untyped, + date: T.untyped, + status: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Payout]) + end + def all( + since_id: nil, + last_id: nil, + date_min: nil, + date_max: nil, + date: nil, + status: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {since_id: since_id, last_id: last_id, date_min: date_min, date_max: date_max, date: date, status: status}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Payout]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/policy.rb b/lib/shopify_api/rest/resources/2024_10/policy.rb new file mode 100644 index 00000000..8342f70a --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/policy.rb @@ -0,0 +1,73 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Policy < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @body = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @handle = T.let(nil, T.nilable(String)) + @title = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + @url = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [], path: "policies.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :body + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :handle + sig { returns(T.nilable(String)) } + attr_reader :title + sig { returns(T.nilable(String)) } + attr_reader :updated_at + sig { returns(T.nilable(String)) } + attr_reader :url + + class << self + sig do + params( + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Policy]) + end + def all( + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Policy]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/price_rule.rb b/lib/shopify_api/rest/resources/2024_10/price_rule.rb new file mode 100644 index 00000000..ddf7b797 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/price_rule.rb @@ -0,0 +1,227 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class PriceRule < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @allocation_limit = T.let(nil, T.nilable(Integer)) + @allocation_method = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @customer_segment_prerequisite_ids = T.let(nil, T.nilable(T::Array[T.untyped])) + @customer_selection = T.let(nil, T.nilable(String)) + @ends_at = T.let(nil, T.nilable(String)) + @entitled_collection_ids = T.let(nil, T.nilable(T::Array[T.untyped])) + @entitled_country_ids = T.let(nil, T.nilable(T::Array[T.untyped])) + @entitled_product_ids = T.let(nil, T.nilable(T::Array[T.untyped])) + @entitled_variant_ids = T.let(nil, T.nilable(T::Array[T.untyped])) + @id = T.let(nil, T.nilable(Integer)) + @once_per_customer = T.let(nil, T.nilable(T::Boolean)) + @prerequisite_collection_ids = T.let(nil, T.nilable(T::Array[T.untyped])) + @prerequisite_customer_ids = T.let(nil, T.nilable(T::Array[T.untyped])) + @prerequisite_product_ids = T.let(nil, T.nilable(T::Array[T.untyped])) + @prerequisite_quantity_range = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @prerequisite_shipping_price_range = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @prerequisite_subtotal_range = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @prerequisite_to_entitlement_purchase = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @prerequisite_to_entitlement_quantity_ratio = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @prerequisite_variant_ids = T.let(nil, T.nilable(T::Array[T.untyped])) + @starts_at = T.let(nil, T.nilable(String)) + @target_selection = T.let(nil, T.nilable(String)) + @target_type = T.let(nil, T.nilable(String)) + @title = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + @usage_limit = T.let(nil, T.nilable(Integer)) + @value = T.let(nil, T.nilable(String)) + @value_type = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "price_rules/.json"}, + {http_method: :get, operation: :count, ids: [], path: "price_rules/count.json"}, + {http_method: :get, operation: :get, ids: [], path: "price_rules.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "price_rules/.json"}, + {http_method: :post, operation: :post, ids: [], path: "price_rules.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "price_rules/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(Integer)) } + attr_reader :allocation_limit + sig { returns(T.nilable(String)) } + attr_reader :allocation_method + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(T::Array[Integer])) } + attr_reader :customer_segment_prerequisite_ids + sig { returns(T.nilable(String)) } + attr_reader :customer_selection + sig { returns(T.nilable(String)) } + attr_reader :ends_at + sig { returns(T.nilable(T::Array[Integer])) } + attr_reader :entitled_collection_ids + sig { returns(T.nilable(T::Array[Integer])) } + attr_reader :entitled_country_ids + sig { returns(T.nilable(T::Array[Integer])) } + attr_reader :entitled_product_ids + sig { returns(T.nilable(T::Array[Integer])) } + attr_reader :entitled_variant_ids + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(T::Boolean)) } + attr_reader :once_per_customer + sig { returns(T.nilable(T::Array[Integer])) } + attr_reader :prerequisite_collection_ids + sig { returns(T.nilable(T::Array[Integer])) } + attr_reader :prerequisite_customer_ids + sig { returns(T.nilable(T::Array[Integer])) } + attr_reader :prerequisite_product_ids + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :prerequisite_quantity_range + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :prerequisite_shipping_price_range + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :prerequisite_subtotal_range + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :prerequisite_to_entitlement_purchase + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :prerequisite_to_entitlement_quantity_ratio + sig { returns(T.nilable(T::Array[Integer])) } + attr_reader :prerequisite_variant_ids + sig { returns(T.nilable(String)) } + attr_reader :starts_at + sig { returns(T.nilable(String)) } + attr_reader :target_selection + sig { returns(T.nilable(String)) } + attr_reader :target_type + sig { returns(T.nilable(String)) } + attr_reader :title + sig { returns(T.nilable(String)) } + attr_reader :updated_at + sig { returns(T.nilable(Integer)) } + attr_reader :usage_limit + sig { returns(T.nilable(String)) } + attr_reader :value + sig { returns(T.nilable(String)) } + attr_reader :value_type + + class << self + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.nilable(PriceRule)) + end + def find( + id:, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {}, + ) + T.cast(result[0], T.nilable(PriceRule)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + limit: T.untyped, + since_id: T.untyped, + created_at_min: T.untyped, + created_at_max: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + starts_at_min: T.untyped, + starts_at_max: T.untyped, + ends_at_min: T.untyped, + ends_at_max: T.untyped, + times_used: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[PriceRule]) + end + def all( + limit: nil, + since_id: nil, + created_at_min: nil, + created_at_max: nil, + updated_at_min: nil, + updated_at_max: nil, + starts_at_min: nil, + starts_at_max: nil, + ends_at_min: nil, + ends_at_max: nil, + times_used: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {limit: limit, since_id: since_id, created_at_min: created_at_min, created_at_max: created_at_max, updated_at_min: updated_at_min, updated_at_max: updated_at_max, starts_at_min: starts_at_min, starts_at_max: starts_at_max, ends_at_min: ends_at_min, ends_at_max: ends_at_max, times_used: times_used}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[PriceRule]) + end + + sig do + params( + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/product.rb b/lib/shopify_api/rest/resources/2024_10/product.rb new file mode 100644 index 00000000..6dcac6ca --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/product.rb @@ -0,0 +1,227 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Product < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @title = T.let(nil, T.nilable(String)) + @body_html = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @handle = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @images = T.let(nil, T.nilable(T::Array[T.untyped])) + @options = T.let(nil, T.nilable(T.any(T::Hash[T.untyped, T.untyped], T::Array[T.untyped]))) + @product_type = T.let(nil, T.nilable(String)) + @published_at = T.let(nil, T.nilable(String)) + @published_scope = T.let(nil, T.nilable(String)) + @status = T.let(nil, T.nilable(String)) + @tags = T.let(nil, T.nilable(T.any(String, T::Array[T.untyped]))) + @template_suffix = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + @variants = T.let(nil, T.nilable(T::Array[T.untyped])) + @vendor = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({ + images: Image, + variants: Variant + }, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "products/.json"}, + {http_method: :get, operation: :count, ids: [], path: "products/count.json"}, + {http_method: :get, operation: :get, ids: [], path: "products.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "products/.json"}, + {http_method: :post, operation: :post, ids: [], path: "products.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "products/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :title + sig { returns(T.nilable(String)) } + attr_reader :body_html + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :handle + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(T::Array[Image])) } + attr_reader :images + sig { returns(T.nilable(T.any(T::Hash[T.untyped, T.untyped], T::Array[T::Hash[T.untyped, T.untyped]]))) } + attr_reader :options + sig { returns(T.nilable(String)) } + attr_reader :product_type + sig { returns(T.nilable(String)) } + attr_reader :published_at + sig { returns(T.nilable(String)) } + attr_reader :published_scope + sig { returns(T.nilable(String)) } + attr_reader :status + sig { returns(T.nilable(T.any(String, T::Array[String]))) } + attr_reader :tags + sig { returns(T.nilable(String)) } + attr_reader :template_suffix + sig { returns(T.nilable(String)) } + attr_reader :updated_at + sig { returns(T.nilable(T::Array[Variant])) } + attr_reader :variants + sig { returns(T.nilable(String)) } + attr_reader :vendor + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(Product)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(Product)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + ids: T.untyped, + limit: T.untyped, + since_id: T.untyped, + title: T.untyped, + vendor: T.untyped, + handle: T.untyped, + product_type: T.untyped, + status: T.untyped, + collection_id: T.untyped, + created_at_min: T.untyped, + created_at_max: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + published_at_min: T.untyped, + published_at_max: T.untyped, + published_status: T.untyped, + fields: T.untyped, + presentment_currencies: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Product]) + end + def all( + ids: nil, + limit: nil, + since_id: nil, + title: nil, + vendor: nil, + handle: nil, + product_type: nil, + status: nil, + collection_id: nil, + created_at_min: nil, + created_at_max: nil, + updated_at_min: nil, + updated_at_max: nil, + published_at_min: nil, + published_at_max: nil, + published_status: nil, + fields: nil, + presentment_currencies: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {ids: ids, limit: limit, since_id: since_id, title: title, vendor: vendor, handle: handle, product_type: product_type, status: status, collection_id: collection_id, created_at_min: created_at_min, created_at_max: created_at_max, updated_at_min: updated_at_min, updated_at_max: updated_at_max, published_at_min: published_at_min, published_at_max: published_at_max, published_status: published_status, fields: fields, presentment_currencies: presentment_currencies}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Product]) + end + + sig do + params( + vendor: T.untyped, + product_type: T.untyped, + collection_id: T.untyped, + created_at_min: T.untyped, + created_at_max: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + published_at_min: T.untyped, + published_at_max: T.untyped, + published_status: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + vendor: nil, + product_type: nil, + collection_id: nil, + created_at_min: nil, + created_at_max: nil, + updated_at_min: nil, + updated_at_max: nil, + published_at_min: nil, + published_at_max: nil, + published_status: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {vendor: vendor, product_type: product_type, collection_id: collection_id, created_at_min: created_at_min, created_at_max: created_at_max, updated_at_min: updated_at_min, updated_at_max: updated_at_max, published_at_min: published_at_min, published_at_max: published_at_max, published_status: published_status}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/product_listing.rb b/lib/shopify_api/rest/resources/2024_10/product_listing.rb new file mode 100644 index 00000000..fd04c112 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/product_listing.rb @@ -0,0 +1,200 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class ProductListing < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @body_html = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @handle = T.let(nil, T.nilable(String)) + @images = T.let(nil, T.nilable(T::Array[T.untyped])) + @options = T.let(nil, T.nilable(T::Array[T.untyped])) + @product_id = T.let(nil, T.nilable(Integer)) + @product_type = T.let(nil, T.nilable(String)) + @published_at = T.let(nil, T.nilable(String)) + @tags = T.let(nil, T.nilable(String)) + @title = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + @variants = T.let(nil, T.nilable(T::Array[T.untyped])) + @vendor = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({ + images: Image, + variants: Variant + }, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:product_id], path: "product_listings/.json"}, + {http_method: :get, operation: :count, ids: [], path: "product_listings/count.json"}, + {http_method: :get, operation: :get, ids: [], path: "product_listings.json"}, + {http_method: :get, operation: :get, ids: [:product_id], path: "product_listings/.json"}, + {http_method: :get, operation: :product_ids, ids: [], path: "product_listings/product_ids.json"}, + {http_method: :put, operation: :put, ids: [:product_id], path: "product_listings/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :body_html + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :handle + sig { returns(T.nilable(T::Array[Image])) } + attr_reader :images + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :options + sig { returns(T.nilable(Integer)) } + attr_reader :product_id + sig { returns(T.nilable(String)) } + attr_reader :product_type + sig { returns(T.nilable(String)) } + attr_reader :published_at + sig { returns(T.nilable(String)) } + attr_reader :tags + sig { returns(T.nilable(String)) } + attr_reader :title + sig { returns(T.nilable(String)) } + attr_reader :updated_at + sig { returns(T.nilable(T::Array[Variant])) } + attr_reader :variants + sig { returns(T.nilable(String)) } + attr_reader :vendor + + class << self + sig do + returns(String) + end + def primary_key() + "product_id" + end + + sig do + params( + product_id: T.any(Integer, String), + session: Auth::Session + ).returns(T.nilable(ProductListing)) + end + def find( + product_id:, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {product_id: product_id}, + params: {}, + ) + T.cast(result[0], T.nilable(ProductListing)) + end + + sig do + params( + product_id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + product_id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {product_id: product_id}, + params: {}, + ) + end + + sig do + params( + product_ids: T.untyped, + limit: T.untyped, + collection_id: T.untyped, + updated_at_min: T.untyped, + handle: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[ProductListing]) + end + def all( + product_ids: nil, + limit: nil, + collection_id: nil, + updated_at_min: nil, + handle: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {product_ids: product_ids, limit: limit, collection_id: collection_id, updated_at_min: updated_at_min, handle: handle}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[ProductListing]) + end + + sig do + params( + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + sig do + params( + limit: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def product_ids( + limit: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :product_ids, + session: session, + ids: {}, + params: {limit: limit}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/product_resource_feedback.rb b/lib/shopify_api/rest/resources/2024_10/product_resource_feedback.rb new file mode 100644 index 00000000..ab35b2b2 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/product_resource_feedback.rb @@ -0,0 +1,92 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class ProductResourceFeedback < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @created_at = T.let(nil, T.nilable(String)) + @feedback_generated_at = T.let(nil, T.nilable(String)) + @messages = T.let(nil, T.nilable(T::Array[T.untyped])) + @product_id = T.let(nil, T.nilable(Integer)) + @resource_id = T.let(nil, T.nilable(Integer)) + @resource_type = T.let(nil, T.nilable(String)) + @resource_updated_at = T.let(nil, T.nilable(String)) + @state = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [:product_id], path: "products//resource_feedback.json"}, + {http_method: :post, operation: :post, ids: [:product_id], path: "products//resource_feedback.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :feedback_generated_at + sig { returns(T.nilable(T::Array[String])) } + attr_reader :messages + sig { returns(T.nilable(Integer)) } + attr_reader :product_id + sig { returns(T.nilable(Integer)) } + attr_reader :resource_id + sig { returns(T.nilable(String)) } + attr_reader :resource_type + sig { returns(T.nilable(String)) } + attr_reader :resource_updated_at + sig { returns(T.nilable(String)) } + attr_reader :state + sig { returns(T.nilable(String)) } + attr_reader :updated_at + + class << self + sig do + returns(String) + end + def json_body_name() + "resource_feedback" + end + + sig do + params( + product_id: T.nilable(T.any(Integer, String)), + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[ProductResourceFeedback]) + end + def all( + product_id: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {product_id: product_id}, + params: {}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[ProductResourceFeedback]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/province.rb b/lib/shopify_api/rest/resources/2024_10/province.rb new file mode 100644 index 00000000..bf626ce1 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/province.rb @@ -0,0 +1,136 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Province < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @code = T.let(nil, T.nilable(String)) + @country_id = T.let(nil, T.nilable(Integer)) + @id = T.let(nil, T.nilable(Integer)) + @name = T.let(nil, T.nilable(String)) + @shipping_zone_id = T.let(nil, T.nilable(Integer)) + @tax = T.let(nil, T.nilable(Float)) + @tax_name = T.let(nil, T.nilable(String)) + @tax_percentage = T.let(nil, T.nilable(Float)) + @tax_type = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :count, ids: [:country_id], path: "countries//provinces/count.json"}, + {http_method: :get, operation: :get, ids: [:country_id], path: "countries//provinces.json"}, + {http_method: :get, operation: :get, ids: [:country_id, :id], path: "countries//provinces/.json"}, + {http_method: :put, operation: :put, ids: [:country_id, :id], path: "countries//provinces/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :code + sig { returns(T.nilable(Integer)) } + attr_reader :country_id + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :name + sig { returns(T.nilable(Integer)) } + attr_reader :shipping_zone_id + sig { returns(T.nilable(Float)) } + attr_reader :tax + sig { returns(T.nilable(String)) } + attr_reader :tax_name + sig { returns(T.nilable(Float)) } + attr_reader :tax_percentage + sig { returns(T.nilable(String)) } + attr_reader :tax_type + + class << self + sig do + params( + id: T.any(Integer, String), + country_id: T.nilable(T.any(Integer, String)), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(Province)) + end + def find( + id:, + country_id: nil, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id, country_id: country_id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(Province)) + end + + sig do + params( + country_id: T.nilable(T.any(Integer, String)), + since_id: T.untyped, + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Province]) + end + def all( + country_id: nil, + since_id: nil, + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {country_id: country_id}, + params: {since_id: since_id, fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Province]) + end + + sig do + params( + country_id: T.nilable(T.any(Integer, String)), + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + country_id: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {country_id: country_id}, + params: {}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/recurring_application_charge.rb b/lib/shopify_api/rest/resources/2024_10/recurring_application_charge.rb new file mode 100644 index 00000000..3358b5f5 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/recurring_application_charge.rb @@ -0,0 +1,184 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class RecurringApplicationCharge < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @activated_on = T.let(nil, T.nilable(String)) + @billing_on = T.let(nil, T.nilable(String)) + @cancelled_on = T.let(nil, T.nilable(String)) + @capped_amount = T.let(nil, T.nilable(T.any(String, Integer))) + @confirmation_url = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @currency = T.let(nil, T.nilable(Currency)) + @id = T.let(nil, T.nilable(Integer)) + @name = T.let(nil, T.nilable(String)) + @price = T.let(nil, T.nilable(T.any(String, Float))) + @return_url = T.let(nil, T.nilable(String)) + @status = T.let(nil, T.nilable(String)) + @terms = T.let(nil, T.nilable(String)) + @test = T.let(nil, T.nilable(T::Boolean)) + @trial_days = T.let(nil, T.nilable(Integer)) + @trial_ends_on = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({ + currency: Currency + }, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "recurring_application_charges/.json"}, + {http_method: :get, operation: :get, ids: [], path: "recurring_application_charges.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "recurring_application_charges/.json"}, + {http_method: :post, operation: :post, ids: [], path: "recurring_application_charges.json"}, + {http_method: :put, operation: :customize, ids: [:id], path: "recurring_application_charges//customize.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :activated_on + sig { returns(T.nilable(String)) } + attr_reader :billing_on + sig { returns(T.nilable(String)) } + attr_reader :cancelled_on + sig { returns(T.nilable(T.any(String, Integer))) } + attr_reader :capped_amount + sig { returns(T.nilable(String)) } + attr_reader :confirmation_url + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(Currency)) } + attr_reader :currency + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :name + sig { returns(T.nilable(T.any(String, Float))) } + attr_reader :price + sig { returns(T.nilable(String)) } + attr_reader :return_url + sig { returns(T.nilable(String)) } + attr_reader :status + sig { returns(T.nilable(String)) } + attr_reader :terms + sig { returns(T.nilable(T::Boolean)) } + attr_reader :test + sig { returns(T.nilable(Integer)) } + attr_reader :trial_days + sig { returns(T.nilable(String)) } + attr_reader :trial_ends_on + sig { returns(T.nilable(String)) } + attr_reader :updated_at + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(RecurringApplicationCharge)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(RecurringApplicationCharge)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + since_id: T.untyped, + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[RecurringApplicationCharge]) + end + def all( + since_id: nil, + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {since_id: since_id, fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[RecurringApplicationCharge]) + end + + sig do + params(session: Auth::Session) + .returns(T.nilable(RecurringApplicationCharge)) + end + def current(session: ShopifyAPI::Context.active_session) + charges = all(session: session) + charges.select { |charge| charge.status == "active" }.first + end + end + + sig do + params( + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def customize( + body: nil, + **kwargs + ) + self.class.request( + http_method: :put, + operation: :customize, + session: @session, + ids: {id: @id}, + params: {}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/redirect.rb b/lib/shopify_api/rest/resources/2024_10/redirect.rb new file mode 100644 index 00000000..374f40f9 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/redirect.rb @@ -0,0 +1,143 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Redirect < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @id = T.let(nil, T.nilable(Integer)) + @path = T.let(nil, T.nilable(String)) + @target = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "redirects/.json"}, + {http_method: :get, operation: :count, ids: [], path: "redirects/count.json"}, + {http_method: :get, operation: :get, ids: [], path: "redirects.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "redirects/.json"}, + {http_method: :post, operation: :post, ids: [], path: "redirects.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "redirects/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :path + sig { returns(T.nilable(String)) } + attr_reader :target + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(Redirect)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(Redirect)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + limit: T.untyped, + since_id: T.untyped, + path: T.untyped, + target: T.untyped, + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Redirect]) + end + def all( + limit: nil, + since_id: nil, + path: nil, + target: nil, + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {limit: limit, since_id: since_id, path: path, target: target, fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Redirect]) + end + + sig do + params( + path: T.untyped, + target: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + path: nil, + target: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {path: path, target: target}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/refund.rb b/lib/shopify_api/rest/resources/2024_10/refund.rb new file mode 100644 index 00000000..49b1165f --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/refund.rb @@ -0,0 +1,155 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Refund < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @created_at = T.let(nil, T.nilable(String)) + @duties = T.let(nil, T.nilable(T::Array[T.untyped])) + @id = T.let(nil, T.nilable(Integer)) + @note = T.let(nil, T.nilable(String)) + @order_adjustments = T.let(nil, T.nilable(T::Array[T.untyped])) + @order_id = T.let(nil, T.nilable(Integer)) + @processed_at = T.let(nil, T.nilable(String)) + @refund_duties = T.let(nil, T.nilable(T::Array[T.untyped])) + @refund_line_items = T.let(nil, T.nilable(T::Array[T.untyped])) + @restock = T.let(nil, T.nilable(T::Boolean)) + @transactions = T.let(nil, T.nilable(T::Array[T.untyped])) + @user_id = T.let(nil, T.nilable(Integer)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({ + transactions: Transaction + }, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [:order_id], path: "orders//refunds.json"}, + {http_method: :get, operation: :get, ids: [:order_id, :id], path: "orders//refunds/.json"}, + {http_method: :post, operation: :calculate, ids: [:order_id], path: "orders//refunds/calculate.json"}, + {http_method: :post, operation: :post, ids: [:order_id], path: "orders//refunds.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :duties + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :note + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :order_adjustments + sig { returns(T.nilable(Integer)) } + attr_reader :order_id + sig { returns(T.nilable(String)) } + attr_reader :processed_at + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :refund_duties + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :refund_line_items + sig { returns(T.nilable(T::Boolean)) } + attr_reader :restock + sig { returns(T.nilable(T::Array[Transaction])) } + attr_reader :transactions + sig { returns(T.nilable(Integer)) } + attr_reader :user_id + + class << self + sig do + params( + id: T.any(Integer, String), + order_id: T.nilable(T.any(Integer, String)), + fields: T.untyped, + in_shop_currency: T.untyped, + session: Auth::Session + ).returns(T.nilable(Refund)) + end + def find( + id:, + order_id: nil, + fields: nil, + in_shop_currency: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id, order_id: order_id}, + params: {fields: fields, in_shop_currency: in_shop_currency}, + ) + T.cast(result[0], T.nilable(Refund)) + end + + sig do + params( + order_id: T.nilable(T.any(Integer, String)), + limit: T.untyped, + fields: T.untyped, + in_shop_currency: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Refund]) + end + def all( + order_id: nil, + limit: nil, + fields: nil, + in_shop_currency: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {order_id: order_id}, + params: {limit: limit, fields: fields, in_shop_currency: in_shop_currency}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Refund]) + end + + end + + sig do + params( + shipping: T.untyped, + refund_line_items: T.untyped, + currency: T.untyped, + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def calculate( + shipping: nil, + refund_line_items: nil, + currency: nil, + body: nil, + **kwargs + ) + self.class.request( + http_method: :post, + operation: :calculate, + session: @session, + ids: {order_id: @order_id}, + params: {shipping: shipping, refund_line_items: refund_line_items, currency: currency}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/resource_feedback.rb b/lib/shopify_api/rest/resources/2024_10/resource_feedback.rb new file mode 100644 index 00000000..86dc804e --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/resource_feedback.rb @@ -0,0 +1,77 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class ResourceFeedback < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @created_at = T.let(nil, T.nilable(String)) + @feedback_generated_at = T.let(nil, T.nilable(String)) + @messages = T.let(nil, T.nilable(T::Array[T.untyped])) + @resource_id = T.let(nil, T.nilable(Integer)) + @resource_type = T.let(nil, T.nilable(String)) + @state = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [], path: "resource_feedback.json"}, + {http_method: :post, operation: :post, ids: [], path: "resource_feedback.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :feedback_generated_at + sig { returns(T.nilable(T::Array[String])) } + attr_reader :messages + sig { returns(T.nilable(Integer)) } + attr_reader :resource_id + sig { returns(T.nilable(String)) } + attr_reader :resource_type + sig { returns(T.nilable(String)) } + attr_reader :state + sig { returns(T.nilable(String)) } + attr_reader :updated_at + + class << self + sig do + params( + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[ResourceFeedback]) + end + def all( + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[ResourceFeedback]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/script_tag.rb b/lib/shopify_api/rest/resources/2024_10/script_tag.rb new file mode 100644 index 00000000..4ccf9ef0 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/script_tag.rb @@ -0,0 +1,159 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class ScriptTag < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @event = T.let(nil, T.nilable(String)) + @src = T.let(nil, T.nilable(String)) + @cache = T.let(nil, T.nilable(T::Boolean)) + @created_at = T.let(nil, T.nilable(String)) + @display_scope = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "script_tags/.json"}, + {http_method: :get, operation: :count, ids: [], path: "script_tags/count.json"}, + {http_method: :get, operation: :get, ids: [], path: "script_tags.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "script_tags/.json"}, + {http_method: :post, operation: :post, ids: [], path: "script_tags.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "script_tags/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :event + sig { returns(T.nilable(String)) } + attr_reader :src + sig { returns(T.nilable(T::Boolean)) } + attr_reader :cache + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :display_scope + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :updated_at + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(ScriptTag)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(ScriptTag)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + limit: T.untyped, + since_id: T.untyped, + created_at_min: T.untyped, + created_at_max: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + src: T.untyped, + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[ScriptTag]) + end + def all( + limit: nil, + since_id: nil, + created_at_min: nil, + created_at_max: nil, + updated_at_min: nil, + updated_at_max: nil, + src: nil, + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {limit: limit, since_id: since_id, created_at_min: created_at_min, created_at_max: created_at_max, updated_at_min: updated_at_min, updated_at_max: updated_at_max, src: src, fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[ScriptTag]) + end + + sig do + params( + src: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + src: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {src: src}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/shipping_zone.rb b/lib/shopify_api/rest/resources/2024_10/shipping_zone.rb new file mode 100644 index 00000000..43566b36 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/shipping_zone.rb @@ -0,0 +1,87 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class ShippingZone < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @carrier_shipping_rate_providers = T.let(nil, T.untyped) + @countries = T.let(nil, T.nilable(T::Array[T.untyped])) + @id = T.let(nil, T.nilable(Integer)) + @location_group_id = T.let(nil, T.nilable(String)) + @name = T.let(nil, T.nilable(String)) + @price_based_shipping_rates = T.let(nil, T.nilable(T::Array[T.untyped])) + @profile_id = T.let(nil, T.nilable(String)) + @provinces = T.let(nil, T.nilable(T::Array[T.untyped])) + @weight_based_shipping_rates = T.let(nil, T.nilable(T::Array[T.untyped])) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({ + countries: Country, + provinces: Province + }, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [], path: "shipping_zones.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.untyped) } + attr_reader :carrier_shipping_rate_providers + sig { returns(T.nilable(T::Array[Country])) } + attr_reader :countries + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :location_group_id + sig { returns(T.nilable(String)) } + attr_reader :name + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :price_based_shipping_rates + sig { returns(T.nilable(String)) } + attr_reader :profile_id + sig { returns(T.nilable(T::Array[Province])) } + attr_reader :provinces + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :weight_based_shipping_rates + + class << self + sig do + params( + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[ShippingZone]) + end + def all( + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[ShippingZone]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/shop.rb b/lib/shopify_api/rest/resources/2024_10/shop.rb new file mode 100644 index 00000000..508bbb70 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/shop.rb @@ -0,0 +1,232 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Shop < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @address1 = T.let(nil, T.nilable(String)) + @address2 = T.let(nil, T.nilable(String)) + @checkout_api_supported = T.let(nil, T.nilable(T::Boolean)) + @city = T.let(nil, T.nilable(String)) + @country = T.let(nil, T.nilable(String)) + @country_code = T.let(nil, T.nilable(String)) + @country_name = T.let(nil, T.nilable(String)) + @county_taxes = T.let(nil, T.nilable(T::Boolean)) + @created_at = T.let(nil, T.nilable(String)) + @currency = T.let(nil, T.nilable(String)) + @customer_email = T.let(nil, T.nilable(String)) + @domain = T.let(nil, T.nilable(String)) + @eligible_for_card_reader_giveaway = T.let(nil, T.nilable(T::Boolean)) + @eligible_for_payments = T.let(nil, T.nilable(T::Boolean)) + @email = T.let(nil, T.nilable(String)) + @enabled_presentment_currencies = T.let(nil, T.nilable(T::Array[T.untyped])) + @finances = T.let(nil, T.nilable(T::Boolean)) + @force_ssl = T.let(nil, T.nilable(T::Boolean)) + @google_apps_domain = T.let(nil, T.nilable(String)) + @google_apps_login_enabled = T.let(nil, T.nilable(T::Boolean)) + @has_discounts = T.let(nil, T.nilable(T::Boolean)) + @has_gift_cards = T.let(nil, T.nilable(T::Boolean)) + @has_storefront = T.let(nil, T.nilable(T::Boolean)) + @iana_timezone = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @latitude = T.let(nil, T.nilable(Float)) + @longitude = T.let(nil, T.nilable(Float)) + @marketing_sms_consent_enabled_at_checkout = T.let(nil, T.nilable(T::Boolean)) + @money_format = T.let(nil, T.nilable(String)) + @money_in_emails_format = T.let(nil, T.nilable(String)) + @money_with_currency_format = T.let(nil, T.nilable(String)) + @money_with_currency_in_emails_format = T.let(nil, T.nilable(String)) + @multi_location_enabled = T.let(nil, T.nilable(T::Boolean)) + @myshopify_domain = T.let(nil, T.nilable(String)) + @name = T.let(nil, T.nilable(String)) + @password_enabled = T.let(nil, T.nilable(T::Boolean)) + @phone = T.let(nil, T.nilable(String)) + @plan_display_name = T.let(nil, T.nilable(String)) + @plan_name = T.let(nil, T.nilable(String)) + @pre_launch_enabled = T.let(nil, T.nilable(T::Boolean)) + @primary_locale = T.let(nil, T.nilable(String)) + @primary_location_id = T.let(nil, T.nilable(Integer)) + @province = T.let(nil, T.nilable(String)) + @province_code = T.let(nil, T.nilable(String)) + @requires_extra_payments_agreement = T.let(nil, T.nilable(T::Boolean)) + @setup_required = T.let(nil, T.nilable(T::Boolean)) + @shop_owner = T.let(nil, T.nilable(String)) + @source = T.let(nil, T.nilable(String)) + @tax_shipping = T.let(nil, T.nilable(T::Boolean)) + @taxes_included = T.let(nil, T.nilable(T::Boolean)) + @timezone = T.let(nil, T.nilable(String)) + @transactional_sms_disabled = T.let(nil, T.nilable(T::Boolean)) + @updated_at = T.let(nil, T.nilable(String)) + @weight_unit = T.let(nil, T.nilable(String)) + @zip = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [], path: "shop.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :address1 + sig { returns(T.nilable(String)) } + attr_reader :address2 + sig { returns(T.nilable(T::Boolean)) } + attr_reader :checkout_api_supported + sig { returns(T.nilable(String)) } + attr_reader :city + sig { returns(T.nilable(String)) } + attr_reader :country + sig { returns(T.nilable(String)) } + attr_reader :country_code + sig { returns(T.nilable(String)) } + attr_reader :country_name + sig { returns(T.nilable(T::Boolean)) } + attr_reader :county_taxes + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :currency + sig { returns(T.nilable(String)) } + attr_reader :customer_email + sig { returns(T.nilable(String)) } + attr_reader :domain + sig { returns(T.nilable(T::Boolean)) } + attr_reader :eligible_for_card_reader_giveaway + sig { returns(T.nilable(T::Boolean)) } + attr_reader :eligible_for_payments + sig { returns(T.nilable(String)) } + attr_reader :email + sig { returns(T.nilable(T::Array[String])) } + attr_reader :enabled_presentment_currencies + sig { returns(T.nilable(T::Boolean)) } + attr_reader :finances + sig { returns(T.nilable(T::Boolean)) } + attr_reader :force_ssl + sig { returns(T.nilable(String)) } + attr_reader :google_apps_domain + sig { returns(T.nilable(T::Boolean)) } + attr_reader :google_apps_login_enabled + sig { returns(T.nilable(T::Boolean)) } + attr_reader :has_discounts + sig { returns(T.nilable(T::Boolean)) } + attr_reader :has_gift_cards + sig { returns(T.nilable(T::Boolean)) } + attr_reader :has_storefront + sig { returns(T.nilable(String)) } + attr_reader :iana_timezone + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(Float)) } + attr_reader :latitude + sig { returns(T.nilable(Float)) } + attr_reader :longitude + sig { returns(T.nilable(T::Boolean)) } + attr_reader :marketing_sms_consent_enabled_at_checkout + sig { returns(T.nilable(String)) } + attr_reader :money_format + sig { returns(T.nilable(String)) } + attr_reader :money_in_emails_format + sig { returns(T.nilable(String)) } + attr_reader :money_with_currency_format + sig { returns(T.nilable(String)) } + attr_reader :money_with_currency_in_emails_format + sig { returns(T.nilable(T::Boolean)) } + attr_reader :multi_location_enabled + sig { returns(T.nilable(String)) } + attr_reader :myshopify_domain + sig { returns(T.nilable(String)) } + attr_reader :name + sig { returns(T.nilable(T::Boolean)) } + attr_reader :password_enabled + sig { returns(T.nilable(String)) } + attr_reader :phone + sig { returns(T.nilable(String)) } + attr_reader :plan_display_name + sig { returns(T.nilable(String)) } + attr_reader :plan_name + sig { returns(T.nilable(T::Boolean)) } + attr_reader :pre_launch_enabled + sig { returns(T.nilable(String)) } + attr_reader :primary_locale + sig { returns(T.nilable(Integer)) } + attr_reader :primary_location_id + sig { returns(T.nilable(String)) } + attr_reader :province + sig { returns(T.nilable(String)) } + attr_reader :province_code + sig { returns(T.nilable(T::Boolean)) } + attr_reader :requires_extra_payments_agreement + sig { returns(T.nilable(T::Boolean)) } + attr_reader :setup_required + sig { returns(T.nilable(String)) } + attr_reader :shop_owner + sig { returns(T.nilable(String)) } + attr_reader :source + sig { returns(T.nilable(T::Boolean)) } + attr_reader :tax_shipping + sig { returns(T.nilable(T::Boolean)) } + attr_reader :taxes_included + sig { returns(T.nilable(String)) } + attr_reader :timezone + sig { returns(T.nilable(T::Boolean)) } + attr_reader :transactional_sms_disabled + sig { returns(T.nilable(String)) } + attr_reader :updated_at + sig { returns(T.nilable(String)) } + attr_reader :weight_unit + sig { returns(T.nilable(String)) } + attr_reader :zip + + class << self + sig do + params( + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Shop]) + end + def all( + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Shop]) + end + + sig do + params( + fields: T.untyped, + session: Auth::Session, + ).returns(T.nilable(Shop)) + end + def current(fields: nil, session: ShopifyAPI::Context.active_session) + all(session: session, fields: fields).first + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/smart_collection.rb b/lib/shopify_api/rest/resources/2024_10/smart_collection.rb new file mode 100644 index 00000000..c80aeb23 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/smart_collection.rb @@ -0,0 +1,220 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class SmartCollection < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @rules = T.let(nil, T.nilable(T.any(T::Hash[T.untyped, T.untyped], T::Array[T.untyped]))) + @title = T.let(nil, T.nilable(String)) + @body_html = T.let(nil, T.nilable(String)) + @disjunctive = T.let(nil, T.nilable(T::Boolean)) + @handle = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @image = T.let(nil, T.nilable(T.any(String, T::Hash[T.untyped, T.untyped]))) + @published_at = T.let(nil, T.nilable(String)) + @published_scope = T.let(nil, T.nilable(String)) + @sort_order = T.let(nil, T.nilable(String)) + @template_suffix = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "smart_collections/.json"}, + {http_method: :get, operation: :count, ids: [], path: "smart_collections/count.json"}, + {http_method: :get, operation: :get, ids: [], path: "smart_collections.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "smart_collections/.json"}, + {http_method: :post, operation: :post, ids: [], path: "smart_collections.json"}, + {http_method: :put, operation: :order, ids: [:id], path: "smart_collections//order.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "smart_collections/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(T.any(T::Hash[T.untyped, T.untyped], T::Array[T::Hash[T.untyped, T.untyped]]))) } + attr_reader :rules + sig { returns(T.nilable(String)) } + attr_reader :title + sig { returns(T.nilable(String)) } + attr_reader :body_html + sig { returns(T.nilable(T::Boolean)) } + attr_reader :disjunctive + sig { returns(T.nilable(String)) } + attr_reader :handle + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(T.any(String, T::Hash[T.untyped, T.untyped]))) } + attr_reader :image + sig { returns(T.nilable(String)) } + attr_reader :published_at + sig { returns(T.nilable(String)) } + attr_reader :published_scope + sig { returns(T.nilable(String)) } + attr_reader :sort_order + sig { returns(T.nilable(String)) } + attr_reader :template_suffix + sig { returns(T.nilable(String)) } + attr_reader :updated_at + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(SmartCollection)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(SmartCollection)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + limit: T.untyped, + ids: T.untyped, + since_id: T.untyped, + title: T.untyped, + product_id: T.untyped, + handle: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + published_at_min: T.untyped, + published_at_max: T.untyped, + published_status: T.untyped, + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[SmartCollection]) + end + def all( + limit: nil, + ids: nil, + since_id: nil, + title: nil, + product_id: nil, + handle: nil, + updated_at_min: nil, + updated_at_max: nil, + published_at_min: nil, + published_at_max: nil, + published_status: nil, + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {limit: limit, ids: ids, since_id: since_id, title: title, product_id: product_id, handle: handle, updated_at_min: updated_at_min, updated_at_max: updated_at_max, published_at_min: published_at_min, published_at_max: published_at_max, published_status: published_status, fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[SmartCollection]) + end + + sig do + params( + title: T.untyped, + product_id: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + published_at_min: T.untyped, + published_at_max: T.untyped, + published_status: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + title: nil, + product_id: nil, + updated_at_min: nil, + updated_at_max: nil, + published_at_min: nil, + published_at_max: nil, + published_status: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {title: title, product_id: product_id, updated_at_min: updated_at_min, updated_at_max: updated_at_max, published_at_min: published_at_min, published_at_max: published_at_max, published_status: published_status}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + sig do + params( + products: T.untyped, + sort_order: T.untyped, + body: T.untyped, + kwargs: T.untyped + ).returns(T.untyped) + end + def order( + products: nil, + sort_order: nil, + body: nil, + **kwargs + ) + self.class.request( + http_method: :put, + operation: :order, + session: @session, + ids: {id: @id}, + params: {products: products, sort_order: sort_order}.merge(kwargs).compact, + body: body, + entity: self, + ) + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/storefront_access_token.rb b/lib/shopify_api/rest/resources/2024_10/storefront_access_token.rb new file mode 100644 index 00000000..b017b25a --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/storefront_access_token.rb @@ -0,0 +1,91 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class StorefrontAccessToken < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @title = T.let(nil, T.nilable(String)) + @access_scope = T.let(nil, T.nilable(String)) + @access_token = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "storefront_access_tokens/.json"}, + {http_method: :get, operation: :get, ids: [], path: "storefront_access_tokens.json"}, + {http_method: :post, operation: :post, ids: [], path: "storefront_access_tokens.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :title + sig { returns(T.nilable(String)) } + attr_reader :access_scope + sig { returns(T.nilable(String)) } + attr_reader :access_token + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(Integer)) } + attr_reader :id + + class << self + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[StorefrontAccessToken]) + end + def all( + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[StorefrontAccessToken]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/tender_transaction.rb b/lib/shopify_api/rest/resources/2024_10/tender_transaction.rb new file mode 100644 index 00000000..2a15be07 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/tender_transaction.rb @@ -0,0 +1,97 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class TenderTransaction < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @amount = T.let(nil, T.nilable(String)) + @currency = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @order_id = T.let(nil, T.nilable(Integer)) + @payment_details = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @payment_method = T.let(nil, T.nilable(String)) + @processed_at = T.let(nil, T.nilable(String)) + @remote_reference = T.let(nil, T.nilable(String)) + @test = T.let(nil, T.nilable(T::Boolean)) + @user_id = T.let(nil, T.nilable(Integer)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [], path: "tender_transactions.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :amount + sig { returns(T.nilable(String)) } + attr_reader :currency + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(Integer)) } + attr_reader :order_id + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :payment_details + sig { returns(T.nilable(String)) } + attr_reader :payment_method + sig { returns(T.nilable(String)) } + attr_reader :processed_at + sig { returns(T.nilable(String)) } + attr_reader :remote_reference + sig { returns(T.nilable(T::Boolean)) } + attr_reader :test + sig { returns(T.nilable(Integer)) } + attr_reader :user_id + + class << self + sig do + params( + limit: T.untyped, + since_id: T.untyped, + processed_at_min: T.untyped, + processed_at_max: T.untyped, + processed_at: T.untyped, + order: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[TenderTransaction]) + end + def all( + limit: nil, + since_id: nil, + processed_at_min: nil, + processed_at_max: nil, + processed_at: nil, + order: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {limit: limit, since_id: since_id, processed_at_min: processed_at_min, processed_at_max: processed_at_max, processed_at: processed_at, order: order}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[TenderTransaction]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/theme.rb b/lib/shopify_api/rest/resources/2024_10/theme.rb new file mode 100644 index 00000000..ae53b8df --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/theme.rb @@ -0,0 +1,127 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Theme < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @created_at = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @name = T.let(nil, T.nilable(String)) + @previewable = T.let(nil, T.nilable(T::Boolean)) + @processing = T.let(nil, T.nilable(T::Boolean)) + @role = T.let(nil, T.nilable(String)) + @src = T.let(nil, T.nilable(String)) + @theme_store_id = T.let(nil, T.nilable(Integer)) + @updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "themes/.json"}, + {http_method: :get, operation: :get, ids: [], path: "themes.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "themes/.json"}, + {http_method: :post, operation: :post, ids: [], path: "themes.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "themes/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :name + sig { returns(T.nilable(T::Boolean)) } + attr_reader :previewable + sig { returns(T.nilable(T::Boolean)) } + attr_reader :processing + sig { returns(T.nilable(String)) } + attr_reader :role + sig { returns(T.nilable(String)) } + attr_reader :src + sig { returns(T.nilable(Integer)) } + attr_reader :theme_store_id + sig { returns(T.nilable(String)) } + attr_reader :updated_at + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(Theme)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(Theme)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Theme]) + end + def all( + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Theme]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/transaction.rb b/lib/shopify_api/rest/resources/2024_10/transaction.rb new file mode 100644 index 00000000..fba8ebf2 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/transaction.rb @@ -0,0 +1,189 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Transaction < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @kind = T.let(nil, T.nilable(String)) + @amount = T.let(nil, T.nilable(String)) + @amount_rounding = T.let(nil, T.nilable(String)) + @authorization = T.let(nil, T.nilable(String)) + @authorization_expires_at = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @currency = T.let(nil, T.nilable(String)) + @currency_exchange_adjustment = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @device_id = T.let(nil, T.nilable(Integer)) + @error_code = T.let(nil, T.nilable(String)) + @extended_authorization_attributes = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @gateway = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @location_id = T.let(nil, T.nilable(Integer)) + @message = T.let(nil, T.nilable(String)) + @order_id = T.let(nil, T.nilable(Integer)) + @parent_id = T.let(nil, T.nilable(Integer)) + @payment_details = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @payments_refund_attributes = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @processed_at = T.let(nil, T.nilable(String)) + @receipt = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @source_name = T.let(nil, T.nilable(String)) + @status = T.let(nil, T.nilable(String)) + @test = T.let(nil, T.nilable(T::Boolean)) + @total_unsettled_set = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @user_id = T.let(nil, T.nilable(Integer)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :count, ids: [:order_id], path: "orders//transactions/count.json"}, + {http_method: :get, operation: :get, ids: [:order_id], path: "orders//transactions.json"}, + {http_method: :get, operation: :get, ids: [:order_id, :id], path: "orders//transactions/.json"}, + {http_method: :post, operation: :post, ids: [:order_id], path: "orders//transactions.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :kind + sig { returns(T.nilable(String)) } + attr_reader :amount + sig { returns(T.nilable(String)) } + attr_reader :authorization + sig { returns(T.nilable(String)) } + attr_reader :authorization_expires_at + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :currency + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :currency_exchange_adjustment + sig { returns(T.nilable(Integer)) } + attr_reader :device_id + sig { returns(T.nilable(String)) } + attr_reader :error_code + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :extended_authorization_attributes + sig { returns(T.nilable(String)) } + attr_reader :gateway + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(Integer)) } + attr_reader :location_id + sig { returns(T.nilable(String)) } + attr_reader :message + sig { returns(T.nilable(Integer)) } + attr_reader :order_id + sig { returns(T.nilable(Integer)) } + attr_reader :parent_id + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :payment_details + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :payments_refund_attributes + sig { returns(T.nilable(String)) } + attr_reader :processed_at + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :receipt + sig { returns(T.nilable(String)) } + attr_reader :source_name + sig { returns(T.nilable(String)) } + attr_reader :status + sig { returns(T.nilable(T::Boolean)) } + attr_reader :test + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :total_unsettled_set + sig { returns(T.nilable(Integer)) } + attr_reader :user_id + + class << self + sig do + params( + id: T.any(Integer, String), + order_id: T.nilable(T.any(Integer, String)), + fields: T.untyped, + in_shop_currency: T.untyped, + session: Auth::Session + ).returns(T.nilable(Transaction)) + end + def find( + id:, + order_id: nil, + fields: nil, + in_shop_currency: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id, order_id: order_id}, + params: {fields: fields, in_shop_currency: in_shop_currency}, + ) + T.cast(result[0], T.nilable(Transaction)) + end + + sig do + params( + order_id: T.nilable(T.any(Integer, String)), + since_id: T.untyped, + fields: T.untyped, + in_shop_currency: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Transaction]) + end + def all( + order_id: nil, + since_id: nil, + fields: nil, + in_shop_currency: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {order_id: order_id}, + params: {since_id: since_id, fields: fields, in_shop_currency: in_shop_currency}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Transaction]) + end + + sig do + params( + order_id: T.nilable(T.any(Integer, String)), + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + order_id: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {order_id: order_id}, + params: {}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/usage_charge.rb b/lib/shopify_api/rest/resources/2024_10/usage_charge.rb new file mode 100644 index 00000000..692dbe54 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/usage_charge.rb @@ -0,0 +1,106 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class UsageCharge < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @created_at = T.let(nil, T.nilable(String)) + @currency = T.let(nil, T.nilable(Currency)) + @description = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @price = T.let(nil, T.nilable(String)) + @recurring_application_charge_id = T.let(nil, T.nilable(Integer)) + @updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({ + currency: Currency + }, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :get, ids: [:recurring_application_charge_id], path: "recurring_application_charges//usage_charges.json"}, + {http_method: :get, operation: :get, ids: [:recurring_application_charge_id, :id], path: "recurring_application_charges//usage_charges/.json"}, + {http_method: :post, operation: :post, ids: [:recurring_application_charge_id], path: "recurring_application_charges//usage_charges.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(Currency)) } + attr_reader :currency + sig { returns(T.nilable(String)) } + attr_reader :description + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :price + sig { returns(T.nilable(Integer)) } + attr_reader :recurring_application_charge_id + sig { returns(T.nilable(String)) } + attr_reader :updated_at + + class << self + sig do + params( + id: T.any(Integer, String), + recurring_application_charge_id: T.nilable(T.any(Integer, String)), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(UsageCharge)) + end + def find( + id:, + recurring_application_charge_id: nil, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id, recurring_application_charge_id: recurring_application_charge_id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(UsageCharge)) + end + + sig do + params( + recurring_application_charge_id: T.nilable(T.any(Integer, String)), + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[UsageCharge]) + end + def all( + recurring_application_charge_id: nil, + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {recurring_application_charge_id: recurring_application_charge_id}, + params: {fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[UsageCharge]) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/user.rb b/lib/shopify_api/rest/resources/2024_10/user.rb new file mode 100644 index 00000000..734c33ea --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/user.rb @@ -0,0 +1,142 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class User < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @account_owner = T.let(nil, T.nilable(T::Boolean)) + @bio = T.let(nil, T.nilable(String)) + @email = T.let(nil, T.nilable(String)) + @first_name = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @im = T.let(nil, T.nilable(String)) + @last_name = T.let(nil, T.nilable(String)) + @locale = T.let(nil, T.nilable(String)) + @permissions = T.let(nil, T.nilable(T::Array[T.untyped])) + @phone = T.let(nil, T.nilable(String)) + @receive_announcements = T.let(nil, T.nilable(Integer)) + @screen_name = T.let(nil, T.nilable(String)) + @url = T.let(nil, T.nilable(String)) + @user_type = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :get, operation: :current, ids: [], path: "users/current.json"}, + {http_method: :get, operation: :get, ids: [], path: "users.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "users/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(T::Boolean)) } + attr_reader :account_owner + sig { returns(T.nilable(String)) } + attr_reader :bio + sig { returns(T.nilable(String)) } + attr_reader :email + sig { returns(T.nilable(String)) } + attr_reader :first_name + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(String)) } + attr_reader :im + sig { returns(T.nilable(String)) } + attr_reader :last_name + sig { returns(T.nilable(String)) } + attr_reader :locale + sig { returns(T.nilable(T::Array[String])) } + attr_reader :permissions + sig { returns(T.nilable(String)) } + attr_reader :phone + sig { returns(T.nilable(Integer)) } + attr_reader :receive_announcements + sig { returns(T.nilable(String)) } + attr_reader :screen_name + sig { returns(T.nilable(String)) } + attr_reader :url + sig { returns(T.nilable(String)) } + attr_reader :user_type + + class << self + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.nilable(User)) + end + def find( + id:, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {}, + ) + T.cast(result[0], T.nilable(User)) + end + + sig do + params( + limit: T.untyped, + page_info: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[User]) + end + def all( + limit: nil, + page_info: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {limit: limit, page_info: page_info}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[User]) + end + + sig do + params( + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def current( + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :current, + session: session, + ids: {}, + params: {}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/variant.rb b/lib/shopify_api/rest/resources/2024_10/variant.rb new file mode 100644 index 00000000..8264b775 --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/variant.rb @@ -0,0 +1,212 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Variant < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @barcode = T.let(nil, T.nilable(String)) + @compare_at_price = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @fulfillment_service = T.let(nil, T.nilable(String)) + @grams = T.let(nil, T.nilable(Integer)) + @id = T.let(nil, T.nilable(Integer)) + @image_id = T.let(nil, T.nilable(Integer)) + @inventory_item_id = T.let(nil, T.nilable(Integer)) + @inventory_management = T.let(nil, T.nilable(String)) + @inventory_policy = T.let(nil, T.nilable(String)) + @inventory_quantity = T.let(nil, T.nilable(T.any(Integer, String))) + @old_inventory_quantity = T.let(nil, T.nilable(T.any(Integer, String))) + @option = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped])) + @position = T.let(nil, T.nilable(Integer)) + @presentment_prices = T.let(nil, T.nilable(T::Array[T.untyped])) + @price = T.let(nil, T.nilable(String)) + @product_id = T.let(nil, T.nilable(Integer)) + @requires_shipping = T.let(nil, T.nilable(T::Boolean)) + @sku = T.let(nil, T.nilable(String)) + @tax_code = T.let(nil, T.nilable(String)) + @taxable = T.let(nil, T.nilable(T::Boolean)) + @title = T.let(nil, T.nilable(String)) + @updated_at = T.let(nil, T.nilable(String)) + @weight = T.let(nil, T.nilable(Float)) + @weight_unit = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:product_id, :id], path: "products//variants/.json"}, + {http_method: :get, operation: :count, ids: [:product_id], path: "products//variants/count.json"}, + {http_method: :get, operation: :get, ids: [:product_id], path: "products//variants.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "variants/.json"}, + {http_method: :post, operation: :post, ids: [:product_id], path: "products//variants.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "variants/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + @read_only_attributes = T.let([ + :inventory_quantity + ], T::Array[Symbol]) + + sig { returns(T.nilable(String)) } + attr_reader :barcode + sig { returns(T.nilable(String)) } + attr_reader :compare_at_price + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(String)) } + attr_reader :fulfillment_service + sig { returns(T.nilable(Integer)) } + attr_reader :grams + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(Integer)) } + attr_reader :image_id + sig { returns(T.nilable(Integer)) } + attr_reader :inventory_item_id + sig { returns(T.nilable(String)) } + attr_reader :inventory_management + sig { returns(T.nilable(String)) } + attr_reader :inventory_policy + sig { returns(T.nilable(T.any(Integer, String))) } + attr_reader :inventory_quantity + sig { returns(T.nilable(T.any(Integer, String))) } + attr_reader :old_inventory_quantity + sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) } + attr_reader :option + sig { returns(T.nilable(Integer)) } + attr_reader :position + sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) } + attr_reader :presentment_prices + sig { returns(T.nilable(String)) } + attr_reader :price + sig { returns(T.nilable(Integer)) } + attr_reader :product_id + sig { returns(T.nilable(T::Boolean)) } + attr_reader :requires_shipping + sig { returns(T.nilable(String)) } + attr_reader :sku + sig { returns(T.nilable(String)) } + attr_reader :tax_code + sig { returns(T.nilable(T::Boolean)) } + attr_reader :taxable + sig { returns(T.nilable(String)) } + attr_reader :title + sig { returns(T.nilable(String)) } + attr_reader :updated_at + sig { returns(T.nilable(Float)) } + attr_reader :weight + sig { returns(T.nilable(String)) } + attr_reader :weight_unit + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(Variant)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(Variant)) + end + + sig do + params( + id: T.any(Integer, String), + product_id: T.nilable(T.any(Integer, String)), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + product_id: nil, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id, product_id: product_id}, + params: {}, + ) + end + + sig do + params( + product_id: T.nilable(T.any(Integer, String)), + limit: T.untyped, + presentment_currencies: T.untyped, + since_id: T.untyped, + fields: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Variant]) + end + def all( + product_id: nil, + limit: nil, + presentment_currencies: nil, + since_id: nil, + fields: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {product_id: product_id}, + params: {limit: limit, presentment_currencies: presentment_currencies, since_id: since_id, fields: fields}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Variant]) + end + + sig do + params( + product_id: T.nilable(T.any(Integer, String)), + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + product_id: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {product_id: product_id}, + params: {}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/lib/shopify_api/rest/resources/2024_10/webhook.rb b/lib/shopify_api/rest/resources/2024_10/webhook.rb new file mode 100644 index 00000000..c78827ae --- /dev/null +++ b/lib/shopify_api/rest/resources/2024_10/webhook.rb @@ -0,0 +1,172 @@ +# typed: false +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +module ShopifyAPI + class Webhook < ShopifyAPI::Rest::Base + extend T::Sig + + @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + @api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + @retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar) + + sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void } + def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil) + + @address = T.let(nil, T.nilable(String)) + @topic = T.let(nil, T.nilable(String)) + @api_version = T.let(nil, T.nilable(String)) + @created_at = T.let(nil, T.nilable(String)) + @fields = T.let(nil, T.nilable(T::Array[T.untyped])) + @format = T.let(nil, T.nilable(String)) + @id = T.let(nil, T.nilable(Integer)) + @metafield_namespaces = T.let(nil, T.nilable(T::Array[T.untyped])) + @private_metafield_namespaces = T.let(nil, T.nilable(T::Array[T.untyped])) + @updated_at = T.let(nil, T.nilable(String)) + + super(session: session, from_hash: from_hash) + end + + @has_one = T.let({}, T::Hash[Symbol, Class]) + @has_many = T.let({}, T::Hash[Symbol, Class]) + @paths = T.let([ + {http_method: :delete, operation: :delete, ids: [:id], path: "webhooks/.json"}, + {http_method: :get, operation: :count, ids: [], path: "webhooks/count.json"}, + {http_method: :get, operation: :get, ids: [], path: "webhooks.json"}, + {http_method: :get, operation: :get, ids: [:id], path: "webhooks/.json"}, + {http_method: :post, operation: :post, ids: [], path: "webhooks.json"}, + {http_method: :put, operation: :put, ids: [:id], path: "webhooks/.json"} + ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]]) + + sig { returns(T.nilable(String)) } + attr_reader :address + sig { returns(T.nilable(String)) } + attr_reader :topic + sig { returns(T.nilable(String)) } + attr_reader :api_version + sig { returns(T.nilable(String)) } + attr_reader :created_at + sig { returns(T.nilable(T::Array[String])) } + attr_reader :fields + sig { returns(T.nilable(String)) } + attr_reader :format + sig { returns(T.nilable(Integer)) } + attr_reader :id + sig { returns(T.nilable(T::Array[String])) } + attr_reader :metafield_namespaces + sig { returns(T.nilable(T::Array[String])) } + attr_reader :private_metafield_namespaces + sig { returns(T.nilable(String)) } + attr_reader :updated_at + + class << self + sig do + params( + id: T.any(Integer, String), + fields: T.untyped, + session: Auth::Session + ).returns(T.nilable(Webhook)) + end + def find( + id:, + fields: nil, + session: ShopifyAPI::Context.active_session + ) + result = base_find( + session: session, + ids: {id: id}, + params: {fields: fields}, + ) + T.cast(result[0], T.nilable(Webhook)) + end + + sig do + params( + id: T.any(Integer, String), + session: Auth::Session + ).returns(T.untyped) + end + def delete( + id:, + session: ShopifyAPI::Context.active_session + ) + request( + http_method: :delete, + operation: :delete, + session: session, + ids: {id: id}, + params: {}, + ) + end + + sig do + params( + address: T.untyped, + created_at_max: T.untyped, + created_at_min: T.untyped, + fields: T.untyped, + limit: T.untyped, + since_id: T.untyped, + topic: T.untyped, + updated_at_min: T.untyped, + updated_at_max: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T::Array[Webhook]) + end + def all( + address: nil, + created_at_max: nil, + created_at_min: nil, + fields: nil, + limit: nil, + since_id: nil, + topic: nil, + updated_at_min: nil, + updated_at_max: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + response = base_find( + session: session, + ids: {}, + params: {address: address, created_at_max: created_at_max, created_at_min: created_at_min, fields: fields, limit: limit, since_id: since_id, topic: topic, updated_at_min: updated_at_min, updated_at_max: updated_at_max}.merge(kwargs).compact, + ) + + T.cast(response, T::Array[Webhook]) + end + + sig do + params( + address: T.untyped, + topic: T.untyped, + session: Auth::Session, + kwargs: T.untyped + ).returns(T.untyped) + end + def count( + address: nil, + topic: nil, + session: ShopifyAPI::Context.active_session, + **kwargs + ) + request( + http_method: :get, + operation: :count, + session: session, + ids: {}, + params: {address: address, topic: topic}.merge(kwargs).compact, + body: {}, + entity: nil, + ) + end + + end + + end +end diff --git a/test/rest/2024_10/abandoned_checkout_test.rb b/test/rest/2024_10/abandoned_checkout_test.rb new file mode 100644 index 00000000..9d98209d --- /dev/null +++ b/test/rest/2024_10/abandoned_checkout_test.rb @@ -0,0 +1,252 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class AbandonedCheckout202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts.json?created_at_max=2013-10-12T07%3A05%3A27-02%3A00") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"checkouts" => [{"id" => 450789469, "token" => "2a1ace52255252df566af0faaedfbfa7", "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "email" => "bob.norman@mail.example.com", "gateway" => nil, "buyer_accepts_marketing" => false, "created_at" => "2012-10-12T07:05:27-04:00", "updated_at" => "2012-10-12T07:05:27-04:00", "landing_site" => nil, "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "referring_site" => nil, "shipping_lines" => [{"code" => "Free Shipping", "price" => "0.00", "original_shop_price" => nil, "original_rate_price" => nil, "original_shop_markup" => nil, "source" => "shopify", "title" => "Free Shipping", "presentment_title" => nil, "phone" => nil, "tax_lines" => nil, "custom_tax_lines" => nil, "validation_context" => nil, "markup" => nil, "delivery_category" => nil, "carrier_identifier" => nil, "carrier_service_id" => nil, "api_client_id" => nil, "requested_fulfillment_service_id" => nil, "applied_discounts" => [], "delivery_option_group_type" => nil, "delivery_expectation_range" => nil, "delivery_expectation_type" => nil, "estimated_delivery_time_range" => nil, "id" => "5da41c1738454765"}], "taxes_included" => false, "total_weight" => 400, "currency" => "USD", "completed_at" => nil, "closed_at" => nil, "user_id" => nil, "location_id" => nil, "source_identifier" => nil, "source_url" => nil, "device_id" => nil, "phone" => nil, "customer_locale" => "en", "line_items" => [{"applied_discounts" => [], "discount_allocations" => [{"id" => nil, "amount" => "19.90", "description" => "TENOFF", "created_at" => nil, "application_type" => "discount_code", "discount_class" => "ORDER"}], "key" => "ead1a659fc5e4010", "destination_location_id" => nil, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => nil, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Red", "product_id" => 632910392, "properties" => nil, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 49148385, "variant_title" => "Red", "variant_price" => nil, "vendor" => "Apple", "user_id" => nil, "unit_price_measurement" => nil, "rank" => nil, "compare_at_price" => nil, "line_price" => "199.00", "price" => "199.00"}, {"applied_discounts" => [], "discount_allocations" => [{"id" => nil, "amount" => "19.90", "description" => "TENOFF", "created_at" => nil, "application_type" => "discount_code", "discount_class" => "ORDER"}], "key" => "6dbb5d36acbcb38a", "destination_location_id" => nil, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => nil, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Pink", "product_id" => 632910392, "properties" => nil, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008PINK", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 808950810, "variant_title" => "Pink", "variant_price" => nil, "vendor" => "Apple", "user_id" => nil, "unit_price_measurement" => nil, "rank" => nil, "compare_at_price" => nil, "line_price" => "199.00", "price" => "199.00"}], "name" => "#450789469", "source" => nil, "abandoned_checkout_url" => "https://checkout.local/548380009/checkouts/2a1ace52255252df566af0faaedfbfa7/recover", "discount_codes" => [{"code" => "TENOFF", "amount" => "39.80", "type" => "percentage"}], "tax_lines" => [{"price" => "21.49", "rate" => 0.06, "title" => "State Tax", "channel_liable" => nil}], "source_name" => "web", "presentment_currency" => "USD", "buyer_accepts_sms_marketing" => false, "sms_marketing_phone" => nil, "total_discounts" => "39.80", "total_line_items_price" => "398.00", "total_price" => "379.69", "total_tax" => "21.49", "subtotal_price" => "358.20", "total_duties" => nil, "reservation_token" => "0123456789abcdef0123456789zjkw", "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}]}), headers: {}) + + response = ShopifyAPI::AbandonedCheckout.checkouts( + created_at_max: "2013-10-12T07:05:27-02:00", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts.json?created_at_max=2013-10-12T07%3A05%3A27-02%3A00") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"checkouts" => [{"id" => 450789469, "token" => "2a1ace52255252df566af0faaedfbfa7", "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "email" => "bob.norman@mail.example.com", "gateway" => nil, "buyer_accepts_marketing" => false, "created_at" => "2012-10-12T07:05:27-04:00", "updated_at" => "2012-10-12T07:05:27-04:00", "landing_site" => nil, "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "referring_site" => nil, "shipping_lines" => [{"code" => "Free Shipping", "price" => "0.00", "original_shop_price" => nil, "original_rate_price" => nil, "original_shop_markup" => nil, "source" => "shopify", "title" => "Free Shipping", "presentment_title" => nil, "phone" => nil, "tax_lines" => nil, "custom_tax_lines" => nil, "validation_context" => nil, "markup" => nil, "delivery_category" => nil, "carrier_identifier" => nil, "carrier_service_id" => nil, "api_client_id" => nil, "requested_fulfillment_service_id" => nil, "applied_discounts" => [], "delivery_option_group_type" => nil, "delivery_expectation_range" => nil, "delivery_expectation_type" => nil, "estimated_delivery_time_range" => nil, "id" => "5da41c1738454765"}], "taxes_included" => false, "total_weight" => 400, "currency" => "USD", "completed_at" => nil, "closed_at" => nil, "user_id" => nil, "location_id" => nil, "source_identifier" => nil, "source_url" => nil, "device_id" => nil, "phone" => nil, "customer_locale" => "en", "line_items" => [{"applied_discounts" => [], "discount_allocations" => [{"id" => nil, "amount" => "19.90", "description" => "TENOFF", "created_at" => nil, "application_type" => "discount_code", "discount_class" => "ORDER"}], "key" => "ead1a659fc5e4010", "destination_location_id" => nil, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => nil, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Red", "product_id" => 632910392, "properties" => nil, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 49148385, "variant_title" => "Red", "variant_price" => nil, "vendor" => "Apple", "user_id" => nil, "unit_price_measurement" => nil, "rank" => nil, "compare_at_price" => nil, "line_price" => "199.00", "price" => "199.00"}, {"applied_discounts" => [], "discount_allocations" => [{"id" => nil, "amount" => "19.90", "description" => "TENOFF", "created_at" => nil, "application_type" => "discount_code", "discount_class" => "ORDER"}], "key" => "6dbb5d36acbcb38a", "destination_location_id" => nil, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => nil, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Pink", "product_id" => 632910392, "properties" => nil, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008PINK", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 808950810, "variant_title" => "Pink", "variant_price" => nil, "vendor" => "Apple", "user_id" => nil, "unit_price_measurement" => nil, "rank" => nil, "compare_at_price" => nil, "line_price" => "199.00", "price" => "199.00"}], "name" => "#450789469", "source" => nil, "abandoned_checkout_url" => "https://checkout.local/548380009/checkouts/2a1ace52255252df566af0faaedfbfa7/recover", "discount_codes" => [{"code" => "TENOFF", "amount" => "39.80", "type" => "percentage"}], "tax_lines" => [{"price" => "21.49", "rate" => 0.06, "title" => "State Tax", "channel_liable" => nil}], "source_name" => "web", "presentment_currency" => "USD", "buyer_accepts_sms_marketing" => false, "sms_marketing_phone" => nil, "total_discounts" => "39.80", "total_line_items_price" => "398.00", "total_price" => "379.69", "total_tax" => "21.49", "subtotal_price" => "358.20", "total_duties" => nil, "reservation_token" => "0123456789abcdef0123456789zjkw", "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}]}), headers: {}) + + response = ShopifyAPI::AbandonedCheckout.checkouts + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts.json?status=closed") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"checkouts" => [{"id" => 450789469, "token" => "2a1ace52255252df566af0faaedfbfa7", "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "email" => "bob.norman@mail.example.com", "gateway" => nil, "buyer_accepts_marketing" => false, "created_at" => "2012-10-12T07:05:27-04:00", "updated_at" => "2012-10-12T07:05:27-04:00", "landing_site" => nil, "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "referring_site" => nil, "shipping_lines" => [{"code" => "Free Shipping", "price" => "0.00", "original_shop_price" => nil, "original_rate_price" => nil, "original_shop_markup" => nil, "source" => "shopify", "title" => "Free Shipping", "presentment_title" => nil, "phone" => nil, "tax_lines" => nil, "custom_tax_lines" => nil, "validation_context" => nil, "markup" => nil, "delivery_category" => nil, "carrier_identifier" => nil, "carrier_service_id" => nil, "api_client_id" => nil, "requested_fulfillment_service_id" => nil, "applied_discounts" => [], "delivery_option_group_type" => nil, "delivery_expectation_range" => nil, "delivery_expectation_type" => nil, "estimated_delivery_time_range" => nil, "id" => "5da41c1738454765"}], "taxes_included" => false, "total_weight" => 400, "currency" => "USD", "completed_at" => nil, "closed_at" => nil, "user_id" => nil, "location_id" => nil, "source_identifier" => nil, "source_url" => nil, "device_id" => nil, "phone" => nil, "customer_locale" => "en", "line_items" => [{"applied_discounts" => [], "discount_allocations" => [{"id" => nil, "amount" => "19.90", "description" => "TENOFF", "created_at" => nil, "application_type" => "discount_code", "discount_class" => "ORDER"}], "key" => "ead1a659fc5e4010", "destination_location_id" => nil, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => nil, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Red", "product_id" => 632910392, "properties" => nil, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 49148385, "variant_title" => "Red", "variant_price" => nil, "vendor" => "Apple", "user_id" => nil, "unit_price_measurement" => nil, "rank" => nil, "compare_at_price" => nil, "line_price" => "199.00", "price" => "199.00"}, {"applied_discounts" => [], "discount_allocations" => [{"id" => nil, "amount" => "19.90", "description" => "TENOFF", "created_at" => nil, "application_type" => "discount_code", "discount_class" => "ORDER"}], "key" => "6dbb5d36acbcb38a", "destination_location_id" => nil, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => nil, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Pink", "product_id" => 632910392, "properties" => nil, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008PINK", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 808950810, "variant_title" => "Pink", "variant_price" => nil, "vendor" => "Apple", "user_id" => nil, "unit_price_measurement" => nil, "rank" => nil, "compare_at_price" => nil, "line_price" => "199.00", "price" => "199.00"}], "name" => "#450789469", "source" => nil, "abandoned_checkout_url" => "https://checkout.local/548380009/checkouts/2a1ace52255252df566af0faaedfbfa7/recover", "discount_codes" => [{"code" => "TENOFF", "amount" => "39.80", "type" => "percentage"}], "tax_lines" => [{"price" => "21.49", "rate" => 0.06, "title" => "State Tax", "channel_liable" => nil}], "source_name" => "web", "presentment_currency" => "USD", "buyer_accepts_sms_marketing" => false, "sms_marketing_phone" => nil, "total_discounts" => "39.80", "total_line_items_price" => "398.00", "total_price" => "379.69", "total_tax" => "21.49", "subtotal_price" => "358.20", "total_duties" => nil, "reservation_token" => "0123456789abcdef0123456789zjkw", "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}]}), headers: {}) + + response = ShopifyAPI::AbandonedCheckout.checkouts( + status: "closed", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts.json?status=closed") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts.json?limit=1") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"checkouts" => [{"id" => 450789469, "token" => "2a1ace52255252df566af0faaedfbfa7", "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "email" => "bob.norman@mail.example.com", "gateway" => nil, "buyer_accepts_marketing" => false, "created_at" => "2012-10-12T07:05:27-04:00", "updated_at" => "2012-10-12T07:05:27-04:00", "landing_site" => nil, "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "referring_site" => nil, "shipping_lines" => [{"code" => "Free Shipping", "price" => "0.00", "original_shop_price" => nil, "original_rate_price" => nil, "original_shop_markup" => nil, "source" => "shopify", "title" => "Free Shipping", "presentment_title" => nil, "phone" => nil, "tax_lines" => nil, "custom_tax_lines" => nil, "validation_context" => nil, "markup" => nil, "delivery_category" => nil, "carrier_identifier" => nil, "carrier_service_id" => nil, "api_client_id" => nil, "requested_fulfillment_service_id" => nil, "applied_discounts" => [], "delivery_option_group_type" => nil, "delivery_expectation_range" => nil, "delivery_expectation_type" => nil, "estimated_delivery_time_range" => nil, "id" => "5da41c1738454765"}], "taxes_included" => false, "total_weight" => 400, "currency" => "USD", "completed_at" => nil, "closed_at" => nil, "user_id" => nil, "location_id" => nil, "source_identifier" => nil, "source_url" => nil, "device_id" => nil, "phone" => nil, "customer_locale" => "en", "line_items" => [{"applied_discounts" => [], "discount_allocations" => [{"id" => nil, "amount" => "19.90", "description" => "TENOFF", "created_at" => nil, "application_type" => "discount_code", "discount_class" => "ORDER"}], "key" => "ead1a659fc5e4010", "destination_location_id" => nil, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => nil, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Red", "product_id" => 632910392, "properties" => nil, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 49148385, "variant_title" => "Red", "variant_price" => nil, "vendor" => "Apple", "user_id" => nil, "unit_price_measurement" => nil, "rank" => nil, "compare_at_price" => nil, "line_price" => "199.00", "price" => "199.00"}, {"applied_discounts" => [], "discount_allocations" => [{"id" => nil, "amount" => "19.90", "description" => "TENOFF", "created_at" => nil, "application_type" => "discount_code", "discount_class" => "ORDER"}], "key" => "6dbb5d36acbcb38a", "destination_location_id" => nil, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => nil, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Pink", "product_id" => 632910392, "properties" => nil, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008PINK", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 808950810, "variant_title" => "Pink", "variant_price" => nil, "vendor" => "Apple", "user_id" => nil, "unit_price_measurement" => nil, "rank" => nil, "compare_at_price" => nil, "line_price" => "199.00", "price" => "199.00"}], "name" => "#450789469", "source" => nil, "abandoned_checkout_url" => "https://checkout.local/548380009/checkouts/2a1ace52255252df566af0faaedfbfa7/recover", "discount_codes" => [{"code" => "TENOFF", "amount" => "39.80", "type" => "percentage"}], "tax_lines" => [{"price" => "21.49", "rate" => 0.06, "title" => "State Tax", "channel_liable" => nil}], "source_name" => "web", "presentment_currency" => "USD", "buyer_accepts_sms_marketing" => false, "sms_marketing_phone" => nil, "total_discounts" => "39.80", "total_line_items_price" => "398.00", "total_price" => "379.69", "total_tax" => "21.49", "subtotal_price" => "358.20", "total_duties" => nil, "reservation_token" => "0123456789abcdef0123456789zjkw", "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}]}), headers: {}) + + response = ShopifyAPI::AbandonedCheckout.checkouts( + limit: "1", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts.json?limit=1") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"checkouts" => [{"id" => 450789469, "token" => "2a1ace52255252df566af0faaedfbfa7", "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "email" => "bob.norman@mail.example.com", "gateway" => nil, "buyer_accepts_marketing" => false, "created_at" => "2012-10-12T07:05:27-04:00", "updated_at" => "2012-10-12T07:05:27-04:00", "landing_site" => nil, "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "referring_site" => nil, "shipping_lines" => [{"code" => "Free Shipping", "price" => "0.00", "original_shop_price" => nil, "original_rate_price" => nil, "original_shop_markup" => nil, "source" => "shopify", "title" => "Free Shipping", "presentment_title" => nil, "phone" => nil, "tax_lines" => nil, "custom_tax_lines" => nil, "validation_context" => nil, "markup" => nil, "delivery_category" => nil, "carrier_identifier" => nil, "carrier_service_id" => nil, "api_client_id" => nil, "requested_fulfillment_service_id" => nil, "applied_discounts" => [], "delivery_option_group_type" => nil, "delivery_expectation_range" => nil, "delivery_expectation_type" => nil, "estimated_delivery_time_range" => nil, "id" => "5da41c1738454765"}], "taxes_included" => false, "total_weight" => 400, "currency" => "USD", "completed_at" => nil, "closed_at" => nil, "user_id" => nil, "location_id" => nil, "source_identifier" => nil, "source_url" => nil, "device_id" => nil, "phone" => nil, "customer_locale" => "en", "line_items" => [{"applied_discounts" => [], "discount_allocations" => [{"id" => nil, "amount" => "19.90", "description" => "TENOFF", "created_at" => nil, "application_type" => "discount_code", "discount_class" => "ORDER"}], "key" => "ead1a659fc5e4010", "destination_location_id" => nil, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => nil, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Red", "product_id" => 632910392, "properties" => nil, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 49148385, "variant_title" => "Red", "variant_price" => nil, "vendor" => "Apple", "user_id" => nil, "unit_price_measurement" => nil, "rank" => nil, "compare_at_price" => nil, "line_price" => "199.00", "price" => "199.00"}, {"applied_discounts" => [], "discount_allocations" => [{"id" => nil, "amount" => "19.90", "description" => "TENOFF", "created_at" => nil, "application_type" => "discount_code", "discount_class" => "ORDER"}], "key" => "6dbb5d36acbcb38a", "destination_location_id" => nil, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => nil, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Pink", "product_id" => 632910392, "properties" => nil, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008PINK", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 808950810, "variant_title" => "Pink", "variant_price" => nil, "vendor" => "Apple", "user_id" => nil, "unit_price_measurement" => nil, "rank" => nil, "compare_at_price" => nil, "line_price" => "199.00", "price" => "199.00"}], "name" => "#450789469", "source" => nil, "abandoned_checkout_url" => "https://checkout.local/548380009/checkouts/2a1ace52255252df566af0faaedfbfa7/recover", "discount_codes" => [{"code" => "TENOFF", "amount" => "39.80", "type" => "percentage"}], "tax_lines" => [{"price" => "21.49", "rate" => 0.06, "title" => "State Tax", "channel_liable" => nil}], "source_name" => "web", "presentment_currency" => "USD", "buyer_accepts_sms_marketing" => false, "sms_marketing_phone" => nil, "total_discounts" => "39.80", "total_line_items_price" => "398.00", "total_price" => "379.69", "total_tax" => "21.49", "subtotal_price" => "358.20", "total_duties" => nil, "reservation_token" => "0123456789abcdef0123456789zjkw", "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}]}), headers: {}) + + response = ShopifyAPI::AbandonedCheckout.checkouts + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts.json?created_at_max=2013-10-12T07%3A05%3A27-02%3A00") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"checkouts" => [{"id" => 450789469, "token" => "2a1ace52255252df566af0faaedfbfa7", "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "email" => "bob.norman@mail.example.com", "gateway" => nil, "buyer_accepts_marketing" => false, "created_at" => "2012-10-12T07:05:27-04:00", "updated_at" => "2012-10-12T07:05:27-04:00", "landing_site" => nil, "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "referring_site" => nil, "shipping_lines" => [{"code" => "Free Shipping", "price" => "0.00", "original_shop_price" => nil, "original_rate_price" => nil, "original_shop_markup" => nil, "source" => "shopify", "title" => "Free Shipping", "presentment_title" => nil, "phone" => nil, "tax_lines" => nil, "custom_tax_lines" => nil, "validation_context" => nil, "markup" => nil, "delivery_category" => nil, "carrier_identifier" => nil, "carrier_service_id" => nil, "api_client_id" => nil, "requested_fulfillment_service_id" => nil, "applied_discounts" => [], "delivery_option_group_type" => nil, "delivery_expectation_range" => nil, "delivery_expectation_type" => nil, "estimated_delivery_time_range" => nil, "id" => "5da41c1738454765"}], "taxes_included" => false, "total_weight" => 400, "currency" => "USD", "completed_at" => nil, "closed_at" => nil, "user_id" => nil, "location_id" => nil, "source_identifier" => nil, "source_url" => nil, "device_id" => nil, "phone" => nil, "customer_locale" => "en", "line_items" => [{"applied_discounts" => [], "discount_allocations" => [{"id" => nil, "amount" => "19.90", "description" => "TENOFF", "created_at" => nil, "application_type" => "discount_code", "discount_class" => "ORDER"}], "key" => "ead1a659fc5e4010", "destination_location_id" => nil, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => nil, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Red", "product_id" => 632910392, "properties" => nil, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 49148385, "variant_title" => "Red", "variant_price" => nil, "vendor" => "Apple", "user_id" => nil, "unit_price_measurement" => nil, "rank" => nil, "compare_at_price" => nil, "line_price" => "199.00", "price" => "199.00"}, {"applied_discounts" => [], "discount_allocations" => [{"id" => nil, "amount" => "19.90", "description" => "TENOFF", "created_at" => nil, "application_type" => "discount_code", "discount_class" => "ORDER"}], "key" => "6dbb5d36acbcb38a", "destination_location_id" => nil, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => nil, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Pink", "product_id" => 632910392, "properties" => nil, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008PINK", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 808950810, "variant_title" => "Pink", "variant_price" => nil, "vendor" => "Apple", "user_id" => nil, "unit_price_measurement" => nil, "rank" => nil, "compare_at_price" => nil, "line_price" => "199.00", "price" => "199.00"}], "name" => "#450789469", "source" => nil, "abandoned_checkout_url" => "https://checkout.local/548380009/checkouts/2a1ace52255252df566af0faaedfbfa7/recover", "discount_codes" => [{"code" => "TENOFF", "amount" => "39.80", "type" => "percentage"}], "tax_lines" => [{"price" => "21.49", "rate" => 0.06, "title" => "State Tax", "channel_liable" => nil}], "source_name" => "web", "presentment_currency" => "USD", "buyer_accepts_sms_marketing" => false, "sms_marketing_phone" => nil, "total_discounts" => "39.80", "total_line_items_price" => "398.00", "total_price" => "379.69", "total_tax" => "21.49", "subtotal_price" => "358.20", "total_duties" => nil, "reservation_token" => "0123456789abcdef0123456789zjkw", "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}]}), headers: {}) + + response = ShopifyAPI::AbandonedCheckout.checkouts( + created_at_max: "2013-10-12T07:05:27-02:00", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts.json?created_at_max=2013-10-12T07%3A05%3A27-02%3A00") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts.json?status=closed") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"checkouts" => [{"id" => 450789469, "token" => "2a1ace52255252df566af0faaedfbfa7", "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "email" => "bob.norman@mail.example.com", "gateway" => nil, "buyer_accepts_marketing" => false, "created_at" => "2012-10-12T07:05:27-04:00", "updated_at" => "2012-10-12T07:05:27-04:00", "landing_site" => nil, "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "referring_site" => nil, "shipping_lines" => [{"code" => "Free Shipping", "price" => "0.00", "original_shop_price" => nil, "original_rate_price" => nil, "original_shop_markup" => nil, "source" => "shopify", "title" => "Free Shipping", "presentment_title" => nil, "phone" => nil, "tax_lines" => nil, "custom_tax_lines" => nil, "validation_context" => nil, "markup" => nil, "delivery_category" => nil, "carrier_identifier" => nil, "carrier_service_id" => nil, "api_client_id" => nil, "requested_fulfillment_service_id" => nil, "applied_discounts" => [], "delivery_option_group_type" => nil, "delivery_expectation_range" => nil, "delivery_expectation_type" => nil, "estimated_delivery_time_range" => nil, "id" => "5da41c1738454765"}], "taxes_included" => false, "total_weight" => 400, "currency" => "USD", "completed_at" => nil, "closed_at" => nil, "user_id" => nil, "location_id" => nil, "source_identifier" => nil, "source_url" => nil, "device_id" => nil, "phone" => nil, "customer_locale" => "en", "line_items" => [{"applied_discounts" => [], "discount_allocations" => [{"id" => nil, "amount" => "19.90", "description" => "TENOFF", "created_at" => nil, "application_type" => "discount_code", "discount_class" => "ORDER"}], "key" => "ead1a659fc5e4010", "destination_location_id" => nil, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => nil, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Red", "product_id" => 632910392, "properties" => nil, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 49148385, "variant_title" => "Red", "variant_price" => nil, "vendor" => "Apple", "user_id" => nil, "unit_price_measurement" => nil, "rank" => nil, "compare_at_price" => nil, "line_price" => "199.00", "price" => "199.00"}, {"applied_discounts" => [], "discount_allocations" => [{"id" => nil, "amount" => "19.90", "description" => "TENOFF", "created_at" => nil, "application_type" => "discount_code", "discount_class" => "ORDER"}], "key" => "6dbb5d36acbcb38a", "destination_location_id" => nil, "fulfillment_service" => "manual", "gift_card" => false, "grams" => 200, "origin_location_id" => nil, "presentment_title" => "IPod Nano - 8GB", "presentment_variant_title" => "Pink", "product_id" => 632910392, "properties" => nil, "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008PINK", "tax_lines" => [], "taxable" => true, "title" => "IPod Nano - 8GB", "variant_id" => 808950810, "variant_title" => "Pink", "variant_price" => nil, "vendor" => "Apple", "user_id" => nil, "unit_price_measurement" => nil, "rank" => nil, "compare_at_price" => nil, "line_price" => "199.00", "price" => "199.00"}], "name" => "#450789469", "source" => nil, "abandoned_checkout_url" => "https://checkout.local/548380009/checkouts/2a1ace52255252df566af0faaedfbfa7/recover", "discount_codes" => [{"code" => "TENOFF", "amount" => "39.80", "type" => "percentage"}], "tax_lines" => [{"price" => "21.49", "rate" => 0.06, "title" => "State Tax", "channel_liable" => nil}], "source_name" => "web", "presentment_currency" => "USD", "buyer_accepts_sms_marketing" => false, "sms_marketing_phone" => nil, "total_discounts" => "39.80", "total_line_items_price" => "398.00", "total_price" => "379.69", "total_tax" => "21.49", "subtotal_price" => "358.20", "total_duties" => nil, "reservation_token" => "0123456789abcdef0123456789zjkw", "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}]}), headers: {}) + + response = ShopifyAPI::AbandonedCheckout.checkouts( + status: "closed", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts.json?status=closed") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/access_scope_test.rb b/test/rest/2024_10/access_scope_test.rb new file mode 100644 index 00000000..da2a7b10 --- /dev/null +++ b/test/rest/2024_10/access_scope_test.rb @@ -0,0 +1,62 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class AccessScope202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/oauth/access_scopes.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"access_scopes" => [{"handle" => "read_products"}, {"handle" => "write_orders"}, {"handle" => "read_orders"}]}), headers: {}) + + response = ShopifyAPI::AccessScope.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/oauth/access_scopes.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/apple_pay_certificate_test.rb b/test/rest/2024_10/apple_pay_certificate_test.rb new file mode 100644 index 00000000..0cabe929 --- /dev/null +++ b/test/rest/2024_10/apple_pay_certificate_test.rb @@ -0,0 +1,195 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class ApplePayCertificate202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/apple_pay_certificates.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "apple_pay_certificate" => hash_including({}) } + ) + .to_return(status: 200, body: JSON.generate({"apple_pay_certificate" => {"id" => 1068938278, "status" => "issuing", "merchant_id" => nil}}), headers: {}) + + response = apple_pay_certificate = ShopifyAPI::ApplePayCertificate.new + + apple_pay_certificate.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/apple_pay_certificates.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/apple_pay_certificates/1068938274.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"apple_pay_certificate" => {"id" => 1068938274, "status" => "csr", "merchant_id" => nil}}), headers: {}) + + response = ShopifyAPI::ApplePayCertificate.find( + id: 1068938274, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/apple_pay_certificates/1068938274.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/apple_pay_certificates/1068938276.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "apple_pay_certificate" => hash_including({"status" => "completed", "merchant_id" => "merchant.something", "encoded_signed_certificate" => "MIIEZzCCBA6gAwIBAgIIWGMideLkDJAwCgYIKoZIzj0EAwIwgYAxNDAyBgNV\nBAMMK0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zIENBIC0g\nRzIxJjAkBgNVBAsMHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRMw\nEQYDVQQKDApBcHBsZSBJbmMuMQswCQYDVQQGEwJVUzAeFw0xNDEyMDgyMTMy\nMDBaFw0xNzAxMDYyMTMyMDBaMIGZMSowKAYKCZImiZPyLGQBAQwabWVyY2hh\nbnQuY29tLm5vcm1vcmUuamFzb24xMDAuBgNVBAMMJ01lcmNoYW50IElEOiBt\nZXJjaGFudC5jb20ubm9ybW9yZS5qYXNvbjETMBEGA1UECwwKNVVZMzJOTE5O\nOTEXMBUGA1UECgwOSm9zaHVhIFRlc3NpZXIxCzAJBgNVBAYTAkNBMFkwEwYH\nKoZIzj0CAQYIKoZIzj0DAQcDQgAEAxDDCvzG6MnsZSJOtbr0hr3MRq+4HzTZ\nx8J4FD34E3kU5CallEnZLBmnzfqmjP8644SO28LLJxvWBnrg7lHFtaOCAlUw\nggJRMEcGCCsGAQUFBwEBBDswOTA3BggrBgEFBQcwAYYraHR0cDovL29jc3Au\nYXBwbGUuY29tL29jc3AwNC1hcHBsZXd3ZHJjYTIwMTAdBgNVHQ4EFgQUkPsO\nKEKvhL/takKomy5GWXtCd8wwDAYDVR0TAQH/BAIwADAfBgNVHSMEGDAWgBSE\ntoTMOoZichZZlOgao71I3zrfCzCCAR0GA1UdIASCARQwggEQMIIBDAYJKoZI\nhvdjZAUBMIH+MIHDBggrBgEFBQcCAjCBtgyBs1JlbGlhbmNlIG9uIHRoaXMg\nY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBv\nZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25k\naXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZp\nY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMDYGCCsGAQUFBwIBFipodHRw\nOi8vd3d3LmFwcGxlLmNvbS9jZXJ0aWZpY2F0ZWF1dGhvcml0eS8wNgYDVR0f\nBC8wLTAroCmgJ4YlaHR0cDovL2NybC5hcHBsZS5jb20vYXBwbGV3d2RyY2Ey\nLmNybDAOBgNVHQ8BAf8EBAMCAygwTwYJKoZIhvdjZAYgBEIMQDM0NTBBMjhB\nOTlGRjIyRkI5OTdDRERFODU1REREOTI5NTE4RjVGMDdBQUM4NzdDMzRCQjM3\nODFCQTg2MzkyNjIwCgYIKoZIzj0EAwIDRwAwRAIgZ/oNx0gCc/PM4pYhOWL2\nCecFQrIgzHr/fZd8qcy3Be8CIEQCaAPpmvQrXEX0hFexoYMHtOHY9dgN2D8L\nNKpVyn3t\n"}) } + ) + .to_return(status: 200, body: JSON.generate({"apple_pay_certificate" => {"id" => 1068938276, "status" => "completed", "merchant_id" => "merchant.something"}}), headers: {}) + + response = apple_pay_certificate = ShopifyAPI::ApplePayCertificate.new + apple_pay_certificate.id = 1068938276 + apple_pay_certificate.status = "completed" + apple_pay_certificate.merchant_id = "merchant.something" + apple_pay_certificate.encoded_signed_certificate = "MIIEZzCCBA6gAwIBAgIIWGMideLkDJAwCgYIKoZIzj0EAwIwgYAxNDAyBgNV\nBAMMK0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zIENBIC0g\nRzIxJjAkBgNVBAsMHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRMw\nEQYDVQQKDApBcHBsZSBJbmMuMQswCQYDVQQGEwJVUzAeFw0xNDEyMDgyMTMy\nMDBaFw0xNzAxMDYyMTMyMDBaMIGZMSowKAYKCZImiZPyLGQBAQwabWVyY2hh\nbnQuY29tLm5vcm1vcmUuamFzb24xMDAuBgNVBAMMJ01lcmNoYW50IElEOiBt\nZXJjaGFudC5jb20ubm9ybW9yZS5qYXNvbjETMBEGA1UECwwKNVVZMzJOTE5O\nOTEXMBUGA1UECgwOSm9zaHVhIFRlc3NpZXIxCzAJBgNVBAYTAkNBMFkwEwYH\nKoZIzj0CAQYIKoZIzj0DAQcDQgAEAxDDCvzG6MnsZSJOtbr0hr3MRq+4HzTZ\nx8J4FD34E3kU5CallEnZLBmnzfqmjP8644SO28LLJxvWBnrg7lHFtaOCAlUw\nggJRMEcGCCsGAQUFBwEBBDswOTA3BggrBgEFBQcwAYYraHR0cDovL29jc3Au\nYXBwbGUuY29tL29jc3AwNC1hcHBsZXd3ZHJjYTIwMTAdBgNVHQ4EFgQUkPsO\nKEKvhL/takKomy5GWXtCd8wwDAYDVR0TAQH/BAIwADAfBgNVHSMEGDAWgBSE\ntoTMOoZichZZlOgao71I3zrfCzCCAR0GA1UdIASCARQwggEQMIIBDAYJKoZI\nhvdjZAUBMIH+MIHDBggrBgEFBQcCAjCBtgyBs1JlbGlhbmNlIG9uIHRoaXMg\nY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBv\nZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25k\naXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZp\nY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMDYGCCsGAQUFBwIBFipodHRw\nOi8vd3d3LmFwcGxlLmNvbS9jZXJ0aWZpY2F0ZWF1dGhvcml0eS8wNgYDVR0f\nBC8wLTAroCmgJ4YlaHR0cDovL2NybC5hcHBsZS5jb20vYXBwbGV3d2RyY2Ey\nLmNybDAOBgNVHQ8BAf8EBAMCAygwTwYJKoZIhvdjZAYgBEIMQDM0NTBBMjhB\nOTlGRjIyRkI5OTdDRERFODU1REREOTI5NTE4RjVGMDdBQUM4NzdDMzRCQjM3\nODFCQTg2MzkyNjIwCgYIKoZIzj0EAwIDRwAwRAIgZ/oNx0gCc/PM4pYhOWL2\nCecFQrIgzHr/fZd8qcy3Be8CIEQCaAPpmvQrXEX0hFexoYMHtOHY9dgN2D8L\nNKpVyn3t\n" + apple_pay_certificate.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/apple_pay_certificates/1068938276.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/apple_pay_certificates/1068938275.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::ApplePayCertificate.delete( + id: 1068938275, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/apple_pay_certificates/1068938275.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/apple_pay_certificates/1068938277/csr.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"csr" => {"key" => "YXBwbGUtcGF5LWNzcg==\n"}}), headers: {}) + + response = ShopifyAPI::ApplePayCertificate.csr( + id: 1068938277, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/apple_pay_certificates/1068938277/csr.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/application_charge_test.rb b/test/rest/2024_10/application_charge_test.rb new file mode 100644 index 00000000..35ad1fc6 --- /dev/null +++ b/test/rest/2024_10/application_charge_test.rb @@ -0,0 +1,195 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class ApplicationCharge202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/application_charges.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "application_charge" => hash_including({"name" => "Super Duper Expensive action", "price" => 100.0, "return_url" => "http://super-duper.shopifyapps.com", "test" => true}) } + ) + .to_return(status: 200, body: JSON.generate({"application_charge" => {"id" => 1017262349, "name" => "Super Duper Expensive action", "api_client_id" => 755357713, "price" => "100.00", "status" => "pending", "return_url" => "http://super-duper.shopifyapps.com/", "test" => true, "created_at" => "2024-10-02T09:01:11-05:00", "updated_at" => "2024-10-02T09:01:11-05:00", "currency" => "USD", "charge_type" => nil, "decorated_return_url" => "http://super-duper.shopifyapps.com/?charge_id=1017262349", "confirmation_url" => "https://jsmith.myshopify.com/admin/charges/755357713/1017262349/ApplicationCharge/confirm_application_charge?signature=BAh7BzoHaWRpBA0xojw6EmF1dG9fYWN0aXZhdGVU--baad61b6ba1e9fbbbc4aea9da6f25c2b49058185"}}), headers: {}) + + response = application_charge = ShopifyAPI::ApplicationCharge.new + application_charge.name = "Super Duper Expensive action" + application_charge.price = 100.0 + application_charge.return_url = "http://super-duper.shopifyapps.com" + application_charge.test = true + application_charge.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/application_charges.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/application_charges.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "application_charge" => hash_including({"name" => "Super Duper Expensive action", "price" => 100.0, "return_url" => "http://super-duper.shopifyapps.com"}) } + ) + .to_return(status: 200, body: JSON.generate({"application_charge" => {"id" => 1017262350, "name" => "Super Duper Expensive action", "api_client_id" => 755357713, "price" => "100.00", "status" => "pending", "return_url" => "http://super-duper.shopifyapps.com/", "test" => nil, "created_at" => "2024-10-02T09:01:12-05:00", "updated_at" => "2024-10-02T09:01:12-05:00", "currency" => "USD", "charge_type" => nil, "decorated_return_url" => "http://super-duper.shopifyapps.com/?charge_id=1017262350", "confirmation_url" => "https://jsmith.myshopify.com/admin/charges/755357713/1017262350/ApplicationCharge/confirm_application_charge?signature=BAh7BzoHaWRpBA4xojw6EmF1dG9fYWN0aXZhdGVU--dd1c1e6ab75e22d48ed7d8688b95d1240c8c6760"}}), headers: {}) + + response = application_charge = ShopifyAPI::ApplicationCharge.new + application_charge.name = "Super Duper Expensive action" + application_charge.price = 100.0 + application_charge.return_url = "http://super-duper.shopifyapps.com" + application_charge.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/application_charges.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/application_charges.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"application_charges" => [{"id" => 556467234, "name" => "Green theme", "api_client_id" => 755357713, "price" => "120.00", "status" => "accepted", "return_url" => "http://google.com", "test" => nil, "external_id" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "currency" => "USD", "charge_type" => "theme", "decorated_return_url" => "http://google.com?charge_id=556467234"}, {"id" => 675931192, "name" => "iPod Cleaning", "api_client_id" => 755357713, "price" => "5.00", "status" => "accepted", "return_url" => "http://google.com", "test" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "currency" => "USD", "charge_type" => nil, "decorated_return_url" => "http://google.com?charge_id=675931192"}, {"id" => 1017262346, "name" => "Create me a logo", "api_client_id" => 755357713, "price" => "123.00", "status" => "accepted", "return_url" => "http://google.com", "test" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "currency" => "USD", "charge_type" => "brokered_service", "decorated_return_url" => "http://google.com?charge_id=1017262346"}]}), headers: {}) + + response = ShopifyAPI::ApplicationCharge.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/application_charges.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/application_charges.json?since_id=556467234") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"application_charges" => [{"id" => 675931192, "name" => "iPod Cleaning", "api_client_id" => 755357713, "price" => "5.00", "status" => "accepted", "return_url" => "http://google.com", "test" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "currency" => "USD", "charge_type" => nil, "decorated_return_url" => "http://google.com?charge_id=675931192"}, {"id" => 1017262346, "name" => "Create me a logo", "api_client_id" => 755357713, "price" => "123.00", "status" => "accepted", "return_url" => "http://google.com", "test" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "currency" => "USD", "charge_type" => "brokered_service", "decorated_return_url" => "http://google.com?charge_id=1017262346"}]}), headers: {}) + + response = ShopifyAPI::ApplicationCharge.all( + since_id: "556467234", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/application_charges.json?since_id=556467234") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/application_charges/675931192.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"application_charge" => {"id" => 675931192, "name" => "iPod Cleaning", "api_client_id" => 755357713, "price" => "5.00", "status" => "accepted", "return_url" => "http://google.com", "test" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "currency" => "USD", "charge_type" => nil, "decorated_return_url" => "http://google.com?charge_id=675931192"}}), headers: {}) + + response = ShopifyAPI::ApplicationCharge.find( + id: 675931192, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/application_charges/675931192.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/application_credit_test.rb b/test/rest/2024_10/application_credit_test.rb new file mode 100644 index 00000000..b7c5a2ba --- /dev/null +++ b/test/rest/2024_10/application_credit_test.rb @@ -0,0 +1,94 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class ApplicationCredit202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/application_credits/140583599.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"application_credit" => {"id" => 140583599, "amount" => "5.00", "description" => "credit for application refund", "test" => nil, "currency" => "USD"}}), headers: {}) + + response = ShopifyAPI::ApplicationCredit.find( + id: 140583599, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/application_credits/140583599.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/application_credits.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"application_credits" => [{"id" => 140583599, "amount" => "5.00", "description" => "credit for application refund", "test" => nil, "currency" => "USD"}]}), headers: {}) + + response = ShopifyAPI::ApplicationCredit.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/application_credits.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/article_test.rb b/test/rest/2024_10/article_test.rb new file mode 100644 index 00000000..eedcfa6e --- /dev/null +++ b/test/rest/2024_10/article_test.rb @@ -0,0 +1,817 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Article202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"articles" => [{"id" => 1051293780, "title" => "Welcome to the world of tomorrow!", "created_at" => "2013-11-06T19:00:00-05:00", "body_html" => "Good news, everybody!", "blog_id" => 241253187, "author" => "dennis", "user_id" => nil, "published_at" => nil, "updated_at" => "2024-10-02T08:59:11-05:00", "summary_html" => nil, "template_suffix" => nil, "handle" => "welcome-to-the-world-of-tomorrow", "tags" => "", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/1051293780"}, {"id" => 989034056, "title" => "Some crazy article I'm coming up with", "created_at" => "2008-12-31T19:00:00-05:00", "body_html" => "I have no idea what to write about, but it's going to rock!", "blog_id" => 241253187, "author" => "John", "user_id" => nil, "published_at" => nil, "updated_at" => "2009-01-31T19:00:00-05:00", "summary_html" => nil, "template_suffix" => nil, "handle" => "some-crazy-article-im-coming-up-with", "tags" => "Mystery", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/989034056"}, {"id" => 294160202, "title" => "Just us bots here", "created_at" => "2013-11-06T19:00:00-05:00", "body_html" => "beep boop", "blog_id" => 241253187, "author" => "dennis", "user_id" => nil, "published_at" => nil, "updated_at" => "2024-10-02T08:59:11-05:00", "summary_html" => nil, "template_suffix" => nil, "handle" => "just-us-bots-here", "tags" => "", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/294160202"}, {"id" => 134645308, "title" => "get on the train now", "created_at" => "2008-07-31T20:00:00-04:00", "body_html" => "

Do you have an IPod yet?

", "blog_id" => 241253187, "author" => "Dennis", "user_id" => 548380009, "published_at" => "2008-07-31T20:00:00-04:00", "updated_at" => "2008-07-31T20:00:00-04:00", "summary_html" => nil, "template_suffix" => nil, "handle" => "get-on-the-train-now", "tags" => "Announcing", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/134645308", "image" => {"created_at" => "2024-10-02T08:59:11-05:00", "alt" => "iMac", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/articles/imac.jpg?v=1704203951"}}]}), headers: {}) + + response = ShopifyAPI::Article.all( + blog_id: 241253187, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles.json?since_id=134645308") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"articles" => [{"id" => 294160202, "title" => "Just us bots here", "created_at" => "2013-11-06T19:00:00-05:00", "body_html" => "beep boop", "blog_id" => 241253187, "author" => "dennis", "user_id" => nil, "published_at" => nil, "updated_at" => "2024-10-02T08:59:11-05:00", "summary_html" => nil, "template_suffix" => nil, "handle" => "just-us-bots-here", "tags" => "", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/294160202"}, {"id" => 989034056, "title" => "Some crazy article I'm coming up with", "created_at" => "2008-12-31T19:00:00-05:00", "body_html" => "I have no idea what to write about, but it's going to rock!", "blog_id" => 241253187, "author" => "John", "user_id" => nil, "published_at" => nil, "updated_at" => "2009-01-31T19:00:00-05:00", "summary_html" => nil, "template_suffix" => nil, "handle" => "some-crazy-article-im-coming-up-with", "tags" => "Mystery", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/989034056"}, {"id" => 1051293780, "title" => "Welcome to the world of tomorrow!", "created_at" => "2013-11-06T19:00:00-05:00", "body_html" => "Good news, everybody!", "blog_id" => 241253187, "author" => "dennis", "user_id" => nil, "published_at" => nil, "updated_at" => "2024-10-02T08:59:11-05:00", "summary_html" => nil, "template_suffix" => nil, "handle" => "welcome-to-the-world-of-tomorrow", "tags" => "", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/1051293780"}]}), headers: {}) + + response = ShopifyAPI::Article.all( + blog_id: 241253187, + since_id: "134645308", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles.json?since_id=134645308") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "article" => hash_including({"title" => "My new Article title", "author" => "John Smith", "tags" => "This Post, Has Been Tagged", "body_html" => "

I like articles

\n

Yea, I like posting them through REST.

", "published_at" => "Thu Mar 24 15:45:47 UTC 2011"}) } + ) + .to_return(status: 200, body: JSON.generate({"article" => {"id" => 1051293781, "title" => "My new Article title", "created_at" => "2024-10-02T09:02:17-05:00", "body_html" => "

I like articles

\n

Yea, I like posting them through REST.

", "blog_id" => 241253187, "author" => "John Smith", "user_id" => 548380009, "published_at" => "2011-03-24T11:45:47-04:00", "updated_at" => "2024-10-02T09:02:17-05:00", "summary_html" => nil, "template_suffix" => nil, "handle" => "my-new-article-title", "tags" => "Has Been Tagged, This Post", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/1051293781"}}), headers: {}) + + response = article = ShopifyAPI::Article.new + article.blog_id = 241253187 + article.title = "My new Article title" + article.author = "John Smith" + article.tags = "This Post, Has Been Tagged" + article.body_html = "

I like articles

\n

Yea, I like posting them through REST.

" + article.published_at = "Thu Mar 24 15:45:47 UTC 2011" + article.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "article" => hash_including({"title" => "My new Article title", "author" => "John Smith", "tags" => "This Post, Has Been Tagged", "body_html" => "

I like articles

\n

Yea, I like posting them through REST.

", "published_at" => "Thu Mar 24 15:45:47 UTC 2011", "image" => {"attachment" => "R0lGODlhAQABAIAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\n"}}) } + ) + .to_return(status: 200, body: JSON.generate({"article" => {"id" => 1051293786, "title" => "My new Article title", "created_at" => "2024-10-02T09:02:30-05:00", "body_html" => "

I like articles

\n

Yea, I like posting them through REST.

", "blog_id" => 241253187, "author" => "John Smith", "user_id" => 548380009, "published_at" => "2011-03-24T11:45:47-04:00", "updated_at" => "2024-10-02T09:02:30-05:00", "summary_html" => nil, "template_suffix" => nil, "handle" => "my-new-article-title", "tags" => "Has Been Tagged, This Post", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/1051293786", "image" => {"created_at" => "2024-10-02T09:02:30-05:00", "alt" => nil, "width" => 1, "height" => 1, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/articles/df3e567d6f16d040326c7a0ea29a4f41.gif?v=1704204150"}}}), headers: {}) + + response = article = ShopifyAPI::Article.new + article.blog_id = 241253187 + article.title = "My new Article title" + article.author = "John Smith" + article.tags = "This Post, Has Been Tagged" + article.body_html = "

I like articles

\n

Yea, I like posting them through REST.

" + article.published_at = "Thu Mar 24 15:45:47 UTC 2011" + article.image = { + "attachment" => "R0lGODlhAQABAIAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\n" + } + article.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "article" => hash_including({"title" => "My new Article title", "author" => "John Smith", "tags" => "This Post, Has Been Tagged", "body_html" => "

I like articles

\n

Yea, I like posting them through REST.

", "published_at" => "Thu Mar 24 15:45:47 UTC 2011", "metafields" => [{"key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"article" => {"id" => 1051293783, "title" => "My new Article title", "created_at" => "2024-10-02T09:02:21-05:00", "body_html" => "

I like articles

\n

Yea, I like posting them through REST.

", "blog_id" => 241253187, "author" => "John Smith", "user_id" => 548380009, "published_at" => "2011-03-24T11:45:47-04:00", "updated_at" => "2024-10-02T09:02:21-05:00", "summary_html" => nil, "template_suffix" => nil, "handle" => "my-new-article-title", "tags" => "Has Been Tagged, This Post", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/1051293783"}}), headers: {}) + + response = article = ShopifyAPI::Article.new + article.blog_id = 241253187 + article.title = "My new Article title" + article.author = "John Smith" + article.tags = "This Post, Has Been Tagged" + article.body_html = "

I like articles

\n

Yea, I like posting them through REST.

" + article.published_at = "Thu Mar 24 15:45:47 UTC 2011" + article.metafields = [ + { + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + } + ] + article.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "article" => hash_including({"title" => "My new Article title", "author" => "John Smith", "tags" => "This Post, Has Been Tagged", "body_html" => "

I like articles

\n

Yea, I like posting them through REST.

", "published_at" => "Thu Mar 24 15:45:47 UTC 2011", "image" => {"src" => "http://example.com/rails_logo.gif", "alt" => "Rails logo"}}) } + ) + .to_return(status: 200, body: JSON.generate({"article" => {"id" => 1051293784, "title" => "My new Article title", "created_at" => "2024-10-02T09:02:23-05:00", "body_html" => "

I like articles

\n

Yea, I like posting them through REST.

", "blog_id" => 241253187, "author" => "John Smith", "user_id" => 548380009, "published_at" => "2011-03-24T11:45:47-04:00", "updated_at" => "2024-10-02T09:02:23-05:00", "summary_html" => nil, "template_suffix" => nil, "handle" => "my-new-article-title", "tags" => "Has Been Tagged, This Post", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/1051293784", "image" => {"created_at" => "2024-10-02T09:02:23-05:00", "alt" => "Rails logo", "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/articles/rails_logo20241002-28582-kv3dal.gif?v=1704204143"}}}), headers: {}) + + response = article = ShopifyAPI::Article.new + article.blog_id = 241253187 + article.title = "My new Article title" + article.author = "John Smith" + article.tags = "This Post, Has Been Tagged" + article.body_html = "

I like articles

\n

Yea, I like posting them through REST.

" + article.published_at = "Thu Mar 24 15:45:47 UTC 2011" + article.image = { + "src" => "http://example.com/rails_logo.gif", + "alt" => "Rails logo" + } + article.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "article" => hash_including({"title" => "My new Article title", "author" => "John Smith", "tags" => "This Post, Has Been Tagged", "body_html" => "

I like articles

\n

Yea, I like posting them through REST.

", "published" => false}) } + ) + .to_return(status: 200, body: JSON.generate({"article" => {"id" => 1051293792, "title" => "My new Article title", "created_at" => "2024-10-02T09:02:50-05:00", "body_html" => "

I like articles

\n

Yea, I like posting them through REST.

", "blog_id" => 241253187, "author" => "John Smith", "user_id" => 548380009, "published_at" => nil, "updated_at" => "2024-10-02T09:02:50-05:00", "summary_html" => nil, "template_suffix" => nil, "handle" => "my-new-article-title", "tags" => "Has Been Tagged, This Post", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/1051293792"}}), headers: {}) + + response = article = ShopifyAPI::Article.new + article.blog_id = 241253187 + article.title = "My new Article title" + article.author = "John Smith" + article.tags = "This Post, Has Been Tagged" + article.body_html = "

I like articles

\n

Yea, I like posting them through REST.

" + article.published = false + article.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 4}), headers: {}) + + response = ShopifyAPI::Article.count( + blog_id: 241253187, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/134645308.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"article" => {"id" => 134645308, "title" => "get on the train now", "created_at" => "2008-07-31T20:00:00-04:00", "body_html" => "

Do you have an IPod yet?

", "blog_id" => 241253187, "author" => "Dennis", "user_id" => 548380009, "published_at" => "2008-07-31T20:00:00-04:00", "updated_at" => "2008-07-31T20:00:00-04:00", "summary_html" => nil, "template_suffix" => nil, "handle" => "get-on-the-train-now", "tags" => "Announcing", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/134645308", "image" => {"created_at" => "2024-10-02T08:59:11-05:00", "alt" => "iMac", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/articles/imac.jpg?v=1704203951"}}}), headers: {}) + + response = ShopifyAPI::Article.find( + blog_id: 241253187, + id: 134645308, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/134645308.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/134645308.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "article" => hash_including({"metafields" => [{"key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"article" => {"blog_id" => 241253187, "title" => "get on the train now", "handle" => "get-on-the-train-now", "body_html" => "

Do you have an IPod yet?

", "author" => "Dennis", "id" => 134645308, "created_at" => "2008-07-31T20:00:00-04:00", "user_id" => 548380009, "published_at" => "2008-07-31T20:00:00-04:00", "updated_at" => "2008-07-31T20:00:00-04:00", "summary_html" => nil, "template_suffix" => nil, "tags" => "Announcing", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/134645308", "image" => {"created_at" => "2024-10-02T08:59:11-05:00", "alt" => "iMac", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/articles/imac.jpg?v=1704203951"}}}), headers: {}) + + response = article = ShopifyAPI::Article.new + article.blog_id = 241253187 + article.id = 134645308 + article.metafields = [ + { + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + } + ] + article.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/134645308.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_11() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/134645308.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "article" => hash_including({"published" => false}) } + ) + .to_return(status: 200, body: JSON.generate({"article" => {"blog_id" => 241253187, "published_at" => nil, "title" => "get on the train now", "handle" => "get-on-the-train-now", "body_html" => "

Do you have an IPod yet?

", "author" => "Dennis", "id" => 134645308, "created_at" => "2008-07-31T20:00:00-04:00", "user_id" => 548380009, "updated_at" => "2024-10-02T09:02:24-05:00", "summary_html" => nil, "template_suffix" => nil, "tags" => "Announcing", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/134645308", "image" => {"created_at" => "2024-10-02T08:59:11-05:00", "alt" => "iMac", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/articles/imac.jpg?v=1704203951"}}}), headers: {}) + + response = article = ShopifyAPI::Article.new + article.blog_id = 241253187 + article.id = 134645308 + article.published = false + article.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/134645308.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_12() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/134645308.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "article" => hash_including({"published" => true}) } + ) + .to_return(status: 200, body: JSON.generate({"article" => {"blog_id" => 241253187, "published_at" => "2024-10-02T09:02:43-05:00", "title" => "get on the train now", "handle" => "get-on-the-train-now", "body_html" => "

Do you have an IPod yet?

", "author" => "Dennis", "id" => 134645308, "created_at" => "2008-07-31T20:00:00-04:00", "user_id" => 548380009, "updated_at" => "2024-10-02T09:02:43-05:00", "summary_html" => nil, "template_suffix" => nil, "tags" => "Announcing", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/134645308", "image" => {"created_at" => "2024-10-02T08:59:11-05:00", "alt" => "iMac", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/articles/imac.jpg?v=1704203951"}}}), headers: {}) + + response = article = ShopifyAPI::Article.new + article.blog_id = 241253187 + article.id = 134645308 + article.published = true + article.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/134645308.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_13() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/134645308.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "article" => hash_including({"image" => ""}) } + ) + .to_return(status: 200, body: JSON.generate({"article" => {"blog_id" => 241253187, "updated_at" => "2024-10-02T09:02:37-05:00", "id" => 134645308, "title" => "get on the train now", "created_at" => "2008-07-31T20:00:00-04:00", "body_html" => "

Do you have an IPod yet?

", "author" => "Dennis", "user_id" => 548380009, "published_at" => "2008-07-31T20:00:00-04:00", "summary_html" => nil, "template_suffix" => nil, "handle" => "get-on-the-train-now", "tags" => "Announcing", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/134645308"}}), headers: {}) + + response = article = ShopifyAPI::Article.new + article.blog_id = 241253187 + article.id = 134645308 + article.image = "" + article.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/134645308.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_14() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/134645308.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "article" => hash_including({"title" => "My new Title", "author" => "Your name", "tags" => "Tags, Will Be, Updated", "body_html" => "

Look, I can even update through a web service.

", "published_at" => "Thu Mar 24 15:45:47 UTC 2011", "image" => {"attachment" => "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n"}}) } + ) + .to_return(status: 200, body: JSON.generate({"article" => {"blog_id" => 241253187, "author" => "Your name", "body_html" => "

Look, I can even update through a web service.

", "published_at" => "2011-03-24T11:45:47-04:00", "title" => "My new Title", "updated_at" => "2024-10-02T09:02:42-05:00", "id" => 134645308, "created_at" => "2008-07-31T20:00:00-04:00", "user_id" => nil, "summary_html" => nil, "template_suffix" => nil, "handle" => "get-on-the-train-now", "tags" => "Tags, Updated, Will Be", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/134645308", "image" => {"created_at" => "2024-10-02T09:02:42-05:00", "alt" => nil, "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/articles/fd43f2c8883f6e9b680e3295fd990d2c.gif?v=1704204162"}}}), headers: {}) + + response = article = ShopifyAPI::Article.new + article.blog_id = 241253187 + article.id = 134645308 + article.title = "My new Title" + article.author = "Your name" + article.tags = "Tags, Will Be, Updated" + article.body_html = "

Look, I can even update through a web service.

" + article.published_at = "Thu Mar 24 15:45:47 UTC 2011" + article.image = { + "attachment" => "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n" + } + article.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/134645308.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_15() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/134645308.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "article" => hash_including({"title" => "My new Title", "author" => "Your name", "tags" => "Tags, Will Be, Updated", "body_html" => "

Look, I can even update through a web service.

", "published_at" => "Thu Mar 24 15:45:47 UTC 2011"}) } + ) + .to_return(status: 200, body: JSON.generate({"article" => {"blog_id" => 241253187, "author" => "Your name", "body_html" => "

Look, I can even update through a web service.

", "published_at" => "2011-03-24T11:45:47-04:00", "title" => "My new Title", "handle" => "get-on-the-train-now", "user_id" => nil, "id" => 134645308, "created_at" => "2008-07-31T20:00:00-04:00", "updated_at" => "2024-10-02T09:02:39-05:00", "summary_html" => nil, "template_suffix" => nil, "tags" => "Tags, Updated, Will Be", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/134645308", "image" => {"created_at" => "2024-10-02T08:59:11-05:00", "alt" => "iMac", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/articles/imac.jpg?v=1704203951"}}}), headers: {}) + + response = article = ShopifyAPI::Article.new + article.blog_id = 241253187 + article.id = 134645308 + article.title = "My new Title" + article.author = "Your name" + article.tags = "Tags, Will Be, Updated" + article.body_html = "

Look, I can even update through a web service.

" + article.published_at = "Thu Mar 24 15:45:47 UTC 2011" + article.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/134645308.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_16() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/134645308.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "article" => hash_including({"title" => "My new Title", "author" => "Your name", "tags" => "Tags, Will Be, Updated", "body_html" => "

Look, I can even update through a web service.

", "published_at" => "Thu Mar 24 15:45:47 UTC 2011", "image" => {"alt" => "Rails logo"}}) } + ) + .to_return(status: 200, body: JSON.generate({"article" => {"blog_id" => 241253187, "author" => "Your name", "body_html" => "

Look, I can even update through a web service.

", "published_at" => "2011-03-24T11:45:47-04:00", "title" => "My new Title", "handle" => "get-on-the-train-now", "id" => 134645308, "created_at" => "2008-07-31T20:00:00-04:00", "user_id" => nil, "updated_at" => "2024-10-02T09:02:31-05:00", "summary_html" => nil, "template_suffix" => nil, "tags" => "Tags, Updated, Will Be", "admin_graphql_api_id" => "gid://shopify/OnlineStoreArticle/134645308", "image" => {"created_at" => "2024-10-02T09:02:31-05:00", "alt" => "Rails logo", "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/articles/rails_logo20241002-28582-75k4rs.gif?v=1704204151"}}}), headers: {}) + + response = article = ShopifyAPI::Article.new + article.blog_id = 241253187 + article.id = 134645308 + article.title = "My new Title" + article.author = "Your name" + article.tags = "Tags, Will Be, Updated" + article.body_html = "

Look, I can even update through a web service.

" + article.published_at = "Thu Mar 24 15:45:47 UTC 2011" + article.image = { + "alt" => "Rails logo" + } + article.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/134645308.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_17() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/134645308.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Article.delete( + blog_id: 241253187, + id: 134645308, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/134645308.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_18() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/articles/authors.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"authors" => ["dennis", "John", "Rob", "Dennis"]}), headers: {}) + + response = ShopifyAPI::Article.authors + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/articles/authors.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_19() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/articles/tags.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"tags" => ["Announcing", "Mystery"]}), headers: {}) + + response = ShopifyAPI::Article.tags + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/articles/tags.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_20() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/articles/tags.json?limit=1&popular=1") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"tags" => ["Announcing"]}), headers: {}) + + response = ShopifyAPI::Article.tags( + limit: "1", + popular: "1", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/articles/tags.json?limit=1&popular=1") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_21() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/tags.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"tags" => ["Announcing", "Mystery"]}), headers: {}) + + response = ShopifyAPI::Article.tags( + blog_id: 241253187, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/tags.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_22() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/tags.json?limit=1&popular=1") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"tags" => ["Announcing"]}), headers: {}) + + response = ShopifyAPI::Article.tags( + blog_id: 241253187, + limit: "1", + popular: "1", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187/articles/tags.json?limit=1&popular=1") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/asset_test.rb b/test/rest/2024_10/asset_test.rb new file mode 100644 index 00000000..7551d794 --- /dev/null +++ b/test/rest/2024_10/asset_test.rb @@ -0,0 +1,266 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Asset202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/themes/828155753/assets.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"assets" => [{"key" => "layout/theme.liquid", "public_url" => nil, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/x-liquid", "size" => 3252, "checksum" => nil, "theme_id" => 828155753}, {"key" => "assets/sidebar-devider.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/sidebar-devider.gif?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "image/gif", "size" => 1016, "checksum" => nil, "theme_id" => 828155753}, {"key" => "assets/bg-body-pink.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/bg-body-pink.gif?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "image/gif", "size" => 1562, "checksum" => nil, "theme_id" => 828155753}, {"key" => "assets/bg-content.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/bg-content.gif?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "image/gif", "size" => 134, "checksum" => nil, "theme_id" => 828155753}, {"key" => "sections/header_section.liquid", "public_url" => nil, "created_at" => "2017-04-28T10:30:00-04:00", "updated_at" => "2017-04-28T10:30:00-04:00", "content_type" => "application/x-liquid", "size" => 998, "checksum" => nil, "theme_id" => 828155753}, {"key" => "assets/shop.css.liquid", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/shop.css.liquid?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/x-liquid", "size" => 14675, "checksum" => nil, "theme_id" => 828155753}, {"key" => "assets/shop.js", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/shop.js?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/javascript", "size" => 348, "checksum" => nil, "theme_id" => 828155753}, {"key" => "assets/bg-main.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/bg-main.gif?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "image/gif", "size" => 297, "checksum" => nil, "theme_id" => 828155753}, {"key" => "sections/content_section.liquid", "public_url" => nil, "created_at" => "2016-02-11T14:31:50-05:00", "updated_at" => "2016-02-11T14:31:50-05:00", "content_type" => "application/x-liquid", "size" => 997, "checksum" => nil, "theme_id" => 828155753}, {"key" => "templates/page.liquid", "public_url" => nil, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/x-liquid", "size" => 147, "checksum" => nil, "theme_id" => 828155753}, {"key" => "assets/bg-body-green.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/bg-body-green.gif?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "image/gif", "size" => 1542, "checksum" => nil, "theme_id" => 828155753}, {"key" => "assets/shop.css", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/shop.css?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "text/css", "size" => 14058, "checksum" => nil, "theme_id" => 828155753}, {"key" => "config/settings_schema.json", "public_url" => nil, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/json", "size" => 4570, "checksum" => nil, "theme_id" => 828155753}, {"key" => "sections/product_section.liquid", "public_url" => nil, "created_at" => "2016-02-14T16:31:41-05:00", "updated_at" => "2016-02-14T16:31:41-05:00", "content_type" => "application/x-liquid", "size" => 2440, "checksum" => nil, "theme_id" => 828155753}, {"key" => "templates/blog.liquid", "public_url" => nil, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/x-liquid", "size" => 786, "checksum" => nil, "theme_id" => 828155753}, {"key" => "templates/article.liquid", "public_url" => nil, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/x-liquid", "size" => 2486, "checksum" => nil, "theme_id" => 828155753}, {"key" => "templates/product.liquid", "public_url" => nil, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/x-liquid", "size" => 2796, "checksum" => nil, "theme_id" => 828155753}, {"key" => "sections/footer_section.liquid", "public_url" => nil, "created_at" => "2017-04-28T10:30:00-04:00", "updated_at" => "2017-04-28T10:30:00-04:00", "content_type" => "application/x-liquid", "size" => 999, "checksum" => nil, "theme_id" => 828155753}, {"key" => "assets/bg-footer.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/bg-footer.gif?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "image/gif", "size" => 1434, "checksum" => nil, "theme_id" => 828155753}, {"key" => "assets/bg-sidebar.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/bg-sidebar.gif?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "image/gif", "size" => 124, "checksum" => nil, "theme_id" => 828155753}, {"key" => "assets/bg-body-orange.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/bg-body-orange.gif?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "image/gif", "size" => 1548, "checksum" => nil, "theme_id" => 828155753}, {"key" => "templates/collection.liquid", "public_url" => nil, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/x-liquid", "size" => 946, "checksum" => nil, "theme_id" => 828155753}, {"key" => "assets/sidebar-menu.jpg", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/sidebar-menu.jpg?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "image/jpeg", "size" => 1609, "checksum" => nil, "theme_id" => 828155753}, {"key" => "templates/cart.liquid", "public_url" => nil, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/x-liquid", "size" => 2047, "checksum" => nil, "theme_id" => 828155753}, {"key" => "config/settings_data.json", "public_url" => nil, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/json", "size" => 4570, "checksum" => nil, "theme_id" => 828155753}, {"key" => "templates/index.liquid", "public_url" => nil, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/x-liquid", "size" => 1068, "checksum" => nil, "theme_id" => 828155753}, {"key" => "assets/bg-body.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/bg-body.gif?v=1278963110", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "image/gif", "size" => 1571, "checksum" => nil, "theme_id" => 828155753}]}), headers: {}) + + response = ShopifyAPI::Asset.all( + theme_id: 828155753, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/themes/828155753/assets.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/themes/828155753/assets.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "asset" => hash_including({"key" => "templates/index.liquid", "value" => "

We are busy updating the store for you and will be back within the hour.

"}) } + ) + .to_return(status: 200, body: JSON.generate({"asset" => {"key" => "templates/index.liquid", "public_url" => nil, "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2024-10-02T09:03:26-05:00", "content_type" => "application/x-liquid", "size" => 110, "checksum" => "cd71db2e14df976c8aa44b44c8dae77b", "theme_id" => 828155753}}), headers: {}) + + response = asset = ShopifyAPI::Asset.new + asset.theme_id = 828155753 + asset.key = "templates/index.liquid" + asset.value = "

We are busy updating the store for you and will be back within the hour.

" + asset.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/themes/828155753/assets.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/themes/828155753/assets.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "asset" => hash_including({"key" => "assets/empty.gif", "attachment" => "R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==\n"}) } + ) + .to_return(status: 200, body: JSON.generate({"asset" => {"key" => "assets/empty.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/empty.gif?v=1704204207", "created_at" => "2024-10-02T09:03:27-05:00", "updated_at" => "2024-10-02T09:03:27-05:00", "content_type" => "image/gif", "size" => 43, "checksum" => "45cf913e5d9d3c9b2058033056d3dd23", "theme_id" => 828155753}}), headers: {}) + + response = asset = ShopifyAPI::Asset.new + asset.theme_id = 828155753 + asset.key = "assets/empty.gif" + asset.attachment = "R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==\n" + asset.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/themes/828155753/assets.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/themes/828155753/assets.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "asset" => hash_including({"key" => "assets/bg-body.gif", "src" => "http://example.com/new_bg.gif"}) } + ) + .to_return(status: 200, body: JSON.generate({"asset" => {"key" => "assets/bg-body.gif", "public_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/t/1/assets/bg-body.gif?v=1704204204", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2024-10-02T09:03:24-05:00", "content_type" => "image/gif", "size" => 43, "checksum" => "45cf913e5d9d3c9b2058033056d3dd23", "theme_id" => 828155753}}), headers: {}) + + response = asset = ShopifyAPI::Asset.new + asset.theme_id = 828155753 + asset.key = "assets/bg-body.gif" + asset.src = "http://example.com/new_bg.gif" + asset.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/themes/828155753/assets.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/themes/828155753/assets.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "asset" => hash_including({"key" => "layout/alternate.liquid", "source_key" => "layout/theme.liquid"}) } + ) + .to_return(status: 200, body: JSON.generate({"asset" => {"key" => "layout/alternate.liquid", "public_url" => nil, "created_at" => "2024-10-02T09:03:21-05:00", "updated_at" => "2024-10-02T09:03:21-05:00", "content_type" => "application/x-liquid", "size" => 3049, "checksum" => "1879a06996941b2ff1ff485a1fe60a97", "theme_id" => 828155753}}), headers: {}) + + response = asset = ShopifyAPI::Asset.new + asset.theme_id = 828155753 + asset.key = "layout/alternate.liquid" + asset.source_key = "layout/theme.liquid" + asset.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/themes/828155753/assets.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/themes/828155753/assets.json?asset%5Bkey%5D=templates%2Findex.liquid") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"asset" => {"key" => "templates/index.liquid", "public_url" => nil, "value" => "\n

Featured Products

\n\n {% tablerow product in collections.frontpage.products cols:3 %}\n {{ product.featured_image | product_img_url: 'small' | img_tag }}\n

{{product.title}}

\n
    \n
  • {{product.price_min | money}}
  • \n
\n {% endtablerow %}\n
\n\n\n{{ content_for_index }}\n\n
\n {% assign article = pages.frontpage %}\n
\n {% if article.content != \"\" %}\n

{{ article.title }}

\n
\n {{ article.content }}\n
\n {% else %}\n
\n In Admin > Blogs & Pages, create a page with the handle frontpage and it will show up here.\n
\n {{ \"Learn more about handles\" | link_to \"http://wiki.shopify.com/Handle\" }}\n
\n {% endif %}\n
\n
\n", "created_at" => "2010-07-12T15:31:50-04:00", "updated_at" => "2010-07-12T15:31:50-04:00", "content_type" => "application/x-liquid", "size" => 1068, "checksum" => nil, "theme_id" => 828155753}}), headers: {}) + + response = ShopifyAPI::Asset.all( + theme_id: 828155753, + asset: {"key" => "templates/index.liquid"}, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/themes/828155753/assets.json?asset%5Bkey%5D=templates%2Findex.liquid") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/themes/828155753/assets.json?asset%5Bkey%5D=assets%2Fbg-body.gif") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"message" => "assets/bg-body.gif was successfully deleted"}), headers: {}) + + response = ShopifyAPI::Asset.delete( + theme_id: 828155753, + asset: {"key" => "assets/bg-body.gif"}, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/themes/828155753/assets.json?asset%5Bkey%5D=assets%2Fbg-body.gif") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/assigned_fulfillment_order_test.rb b/test/rest/2024_10/assigned_fulfillment_order_test.rb new file mode 100644 index 00000000..714f463d --- /dev/null +++ b/test/rest/2024_10/assigned_fulfillment_order_test.rb @@ -0,0 +1,65 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class AssignedFulfillmentOrder202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/assigned_fulfillment_orders.json?assignment_status=cancellation_requested&location_ids%5B%5D=24826418") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_orders" => [{"id" => 1046000811, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "cancellation_requested", "status" => "in_progress", "supported_actions" => ["cancel_fulfillment_order"], "destination" => {"id" => 1046000801, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "line_items" => [{"id" => 1058737552, "shop_id" => 548380009, "fulfillment_order_id" => 1046000811, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}], "outgoing_requests" => [], "international_duties" => nil, "fulfillment_service_handle" => "shipwire-app", "assigned_location" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}}]}), headers: {}) + + response = ShopifyAPI::AssignedFulfillmentOrder.all( + assignment_status: "cancellation_requested", + location_ids: ["24826418"], + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/assigned_fulfillment_orders.json?assignment_status=cancellation_requested&location_ids%5B%5D=24826418") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/balance_test.rb b/test/rest/2024_10/balance_test.rb new file mode 100644 index 00000000..1a0ad969 --- /dev/null +++ b/test/rest/2024_10/balance_test.rb @@ -0,0 +1,62 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Balance202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/balance.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"balance" => [{"amount" => "53.99", "currency" => "USD"}]}), headers: {}) + + response = ShopifyAPI::Balance.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/balance.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/blog_test.rb b/test/rest/2024_10/blog_test.rb new file mode 100644 index 00000000..aaea8c70 --- /dev/null +++ b/test/rest/2024_10/blog_test.rb @@ -0,0 +1,401 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Blog202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"blogs" => [{"id" => 382285388, "handle" => "banana-blog", "title" => "A Gnu Blog", "updated_at" => "2006-02-02T19:00:00-05:00", "commentable" => "no", "feedburner" => nil, "feedburner_location" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "template_suffix" => nil, "tags" => "", "admin_graphql_api_id" => "gid://shopify/OnlineStoreBlog/382285388"}, {"id" => 241253187, "handle" => "apple-blog", "title" => "Mah Blog", "updated_at" => "2006-02-01T19:00:00-05:00", "commentable" => "no", "feedburner" => nil, "feedburner_location" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "template_suffix" => nil, "tags" => "Announcing, Mystery", "admin_graphql_api_id" => "gid://shopify/OnlineStoreBlog/241253187"}]}), headers: {}) + + response = ShopifyAPI::Blog.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs.json?since_id=241253187") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"blogs" => [{"id" => 382285388, "handle" => "banana-blog", "title" => "A Gnu Blog", "updated_at" => "2006-02-02T19:00:00-05:00", "commentable" => "no", "feedburner" => nil, "feedburner_location" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "template_suffix" => nil, "tags" => "", "admin_graphql_api_id" => "gid://shopify/OnlineStoreBlog/382285388"}, {"id" => 1008414253, "handle" => "apple-main-blog", "title" => "Apple main blog", "updated_at" => "2024-10-02T09:12:00-05:00", "commentable" => "no", "feedburner" => nil, "feedburner_location" => nil, "created_at" => "2024-10-02T09:12:00-05:00", "template_suffix" => nil, "tags" => "", "admin_graphql_api_id" => "gid://shopify/OnlineStoreBlog/1008414253"}]}), headers: {}) + + response = ShopifyAPI::Blog.all( + since_id: "241253187", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs.json?since_id=241253187") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/blogs.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "blog" => hash_including({"title" => "Apple main blog"}) } + ) + .to_return(status: 200, body: JSON.generate({"blog" => {"id" => 1008414249, "handle" => "apple-main-blog", "title" => "Apple main blog", "updated_at" => "2024-10-02T09:11:50-05:00", "commentable" => "no", "feedburner" => nil, "feedburner_location" => nil, "created_at" => "2024-10-02T09:11:50-05:00", "template_suffix" => nil, "tags" => "", "admin_graphql_api_id" => "gid://shopify/OnlineStoreBlog/1008414249"}}), headers: {}) + + response = blog = ShopifyAPI::Blog.new + blog.title = "Apple main blog" + blog.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/blogs.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/blogs.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "blog" => hash_including({"title" => "Apple main blog", "metafields" => [{"key" => "sponsor", "value" => "Shopify", "type" => "single_line_text_field", "namespace" => "global"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"blog" => {"id" => 1008414248, "handle" => "apple-main-blog", "title" => "Apple main blog", "updated_at" => "2024-10-02T09:11:48-05:00", "commentable" => "no", "feedburner" => nil, "feedburner_location" => nil, "created_at" => "2024-10-02T09:11:48-05:00", "template_suffix" => nil, "tags" => "", "admin_graphql_api_id" => "gid://shopify/OnlineStoreBlog/1008414248"}}), headers: {}) + + response = blog = ShopifyAPI::Blog.new + blog.title = "Apple main blog" + blog.metafields = [ + { + "key" => "sponsor", + "value" => "Shopify", + "type" => "single_line_text_field", + "namespace" => "global" + } + ] + blog.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/blogs.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 2}), headers: {}) + + response = ShopifyAPI::Blog.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"blog" => {"id" => 241253187, "handle" => "apple-blog", "title" => "Mah Blog", "updated_at" => "2006-02-01T19:00:00-05:00", "commentable" => "no", "feedburner" => nil, "feedburner_location" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "template_suffix" => nil, "tags" => "Announcing, Mystery", "admin_graphql_api_id" => "gid://shopify/OnlineStoreBlog/241253187"}}), headers: {}) + + response = ShopifyAPI::Blog.find( + id: 241253187, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187.json?fields=id%2Ctitle") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"blog" => {"id" => 241253187, "title" => "Mah Blog"}}), headers: {}) + + response = ShopifyAPI::Blog.find( + id: 241253187, + fields: "id,title", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187.json?fields=id%2Ctitle") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "blog" => hash_including({"metafields" => [{"key" => "sponsor", "value" => "Shopify", "type" => "single_line_text_field", "namespace" => "global"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"blog" => {"title" => "Mah Blog", "handle" => "apple-blog", "id" => 241253187, "updated_at" => "2006-02-01T19:00:00-05:00", "commentable" => "no", "feedburner" => nil, "feedburner_location" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "template_suffix" => nil, "tags" => "Announcing, Mystery", "admin_graphql_api_id" => "gid://shopify/OnlineStoreBlog/241253187"}}), headers: {}) + + response = blog = ShopifyAPI::Blog.new + blog.id = 241253187 + blog.metafields = [ + { + "key" => "sponsor", + "value" => "Shopify", + "type" => "single_line_text_field", + "namespace" => "global" + } + ] + blog.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "blog" => hash_including({"title" => "IPod Updates"}) } + ) + .to_return(status: 200, body: JSON.generate({"blog" => {"title" => "IPod Updates", "handle" => "apple-blog", "id" => 241253187, "updated_at" => "2024-10-02T09:11:50-05:00", "commentable" => "no", "feedburner" => nil, "feedburner_location" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "template_suffix" => nil, "tags" => "Announcing, Mystery", "admin_graphql_api_id" => "gid://shopify/OnlineStoreBlog/241253187"}}), headers: {}) + + response = blog = ShopifyAPI::Blog.new + blog.id = 241253187 + blog.title = "IPod Updates" + blog.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "blog" => hash_including({"title" => "IPod Updates", "handle" => "ipod-updates", "commentable" => "moderate"}) } + ) + .to_return(status: 200, body: JSON.generate({"blog" => {"title" => "IPod Updates", "handle" => "ipod-updates", "commentable" => "moderate", "id" => 241253187, "updated_at" => "2024-10-02T09:12:01-05:00", "feedburner" => nil, "feedburner_location" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "template_suffix" => nil, "tags" => "Announcing, Mystery", "admin_graphql_api_id" => "gid://shopify/OnlineStoreBlog/241253187"}}), headers: {}) + + response = blog = ShopifyAPI::Blog.new + blog.id = 241253187 + blog.title = "IPod Updates" + blog.handle = "ipod-updates" + blog.commentable = "moderate" + blog.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_11() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Blog.delete( + id: 241253187, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/241253187.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/cancellation_request_test.rb b/test/rest/2024_10/cancellation_request_test.rb new file mode 100644 index 00000000..2f174617 --- /dev/null +++ b/test/rest/2024_10/cancellation_request_test.rb @@ -0,0 +1,133 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class CancellationRequest202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000839/cancellation_request.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "cancellation_request" => hash_including({"message" => "The customer changed his mind."}) } + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_order" => {"id" => 1046000839, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "cancellation_requested", "status" => "in_progress", "supported_actions" => ["cancel_fulfillment_order"], "destination" => {"id" => 1046000823, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "origin" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "line_items" => [{"id" => 1058737579, "shop_id" => 548380009, "fulfillment_order_id" => 1046000839, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}], "outgoing_requests" => [], "international_duties" => nil, "fulfillment_service_handle" => "shipwire-app"}}), headers: {}) + + response = cancellation_request = ShopifyAPI::CancellationRequest.new + cancellation_request.fulfillment_order_id = 1046000839 + cancellation_request.message = "The customer changed his mind." + cancellation_request.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000839/cancellation_request.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000840/cancellation_request/accept.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "cancellation_request" => hash_including({"message" => "We had not started any processing yet."}) } + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_order" => {"id" => 1046000840, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "cancellation_accepted", "status" => "cancelled", "supported_actions" => ["request_fulfillment"], "destination" => {"id" => 1046000824, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "origin" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "line_items" => [{"id" => 1058737580, "shop_id" => 548380009, "fulfillment_order_id" => 1046000840, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}], "outgoing_requests" => [], "international_duties" => nil, "fulfillment_service_handle" => "shipwire-app"}}), headers: {}) + + response = cancellation_request = ShopifyAPI::CancellationRequest.new + cancellation_request.fulfillment_order_id = 1046000840 + cancellation_request.accept( + body: {"cancellation_request" => {"message" => "We had not started any processing yet."}}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000840/cancellation_request/accept.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000838/cancellation_request/reject.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "cancellation_request" => hash_including({"message" => "We have already send the shipment out."}) } + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_order" => {"id" => 1046000838, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "cancellation_rejected", "status" => "in_progress", "supported_actions" => [], "destination" => {"id" => 1046000822, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "origin" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "line_items" => [{"id" => 1058737578, "shop_id" => 548380009, "fulfillment_order_id" => 1046000838, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}], "outgoing_requests" => [], "international_duties" => nil, "fulfillment_service_handle" => "shipwire-app"}}), headers: {}) + + response = cancellation_request = ShopifyAPI::CancellationRequest.new + cancellation_request.fulfillment_order_id = 1046000838 + cancellation_request.reject( + body: {"cancellation_request" => {"message" => "We have already send the shipment out."}}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000838/cancellation_request/reject.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/carrier_service_test.rb b/test/rest/2024_10/carrier_service_test.rb new file mode 100644 index 00000000..19b46f17 --- /dev/null +++ b/test/rest/2024_10/carrier_service_test.rb @@ -0,0 +1,194 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class CarrierService202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/carrier_services.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "carrier_service" => hash_including({"name" => "Shipping Rate Provider", "callback_url" => "http://shipping.example.com", "service_discovery" => true}) } + ) + .to_return(status: 200, body: JSON.generate({"carrier_service" => {"id" => 1036894960, "name" => "Shipping Rate Provider", "active" => true, "service_discovery" => true, "carrier_service_type" => "api", "admin_graphql_api_id" => "gid://shopify/DeliveryCarrierService/1036894960", "format" => "json", "callback_url" => "http://shipping.example.com/"}}), headers: {}) + + response = carrier_service = ShopifyAPI::CarrierService.new + carrier_service.name = "Shipping Rate Provider" + carrier_service.callback_url = "http://shipping.example.com" + carrier_service.service_discovery = true + carrier_service.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/carrier_services.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/carrier_services.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"carrier_services" => [{"id" => 1036894957, "name" => "Purolator", "active" => true, "service_discovery" => true, "carrier_service_type" => "api", "admin_graphql_api_id" => "gid://shopify/DeliveryCarrierService/1036894957", "format" => "json", "callback_url" => "http://example.com/"}, {"id" => 260046840, "name" => "ups_shipping", "active" => true, "service_discovery" => true, "carrier_service_type" => "legacy", "admin_graphql_api_id" => "gid://shopify/DeliveryCarrierService/260046840"}]}), headers: {}) + + response = ShopifyAPI::CarrierService.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/carrier_services.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/carrier_services/1036894958.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "carrier_service" => hash_including({"name" => "Some new name", "active" => false}) } + ) + .to_return(status: 200, body: JSON.generate({"carrier_service" => {"active" => false, "id" => 1036894958, "name" => "Some new name", "service_discovery" => true, "carrier_service_type" => "api", "admin_graphql_api_id" => "gid://shopify/DeliveryCarrierService/1036894958", "format" => "json", "callback_url" => "http://example.com/"}}), headers: {}) + + response = carrier_service = ShopifyAPI::CarrierService.new + carrier_service.id = 1036894958 + carrier_service.name = "Some new name" + carrier_service.active = false + carrier_service.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/carrier_services/1036894958.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/carrier_services/1036894954.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"carrier_service" => {"id" => 1036894954, "name" => "Purolator", "active" => true, "service_discovery" => true, "carrier_service_type" => "api", "admin_graphql_api_id" => "gid://shopify/DeliveryCarrierService/1036894954", "format" => "json", "callback_url" => "http://example.com/"}}), headers: {}) + + response = ShopifyAPI::CarrierService.find( + id: 1036894954, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/carrier_services/1036894954.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/carrier_services/1036894955.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::CarrierService.delete( + id: 1036894955, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/carrier_services/1036894955.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/checkout_test.rb b/test/rest/2024_10/checkout_test.rb new file mode 100644 index 00000000..69d8b405 --- /dev/null +++ b/test/rest/2024_10/checkout_test.rb @@ -0,0 +1,403 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Checkout202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "checkout" => hash_including({"line_items" => [{"variant_id" => 39072856, "quantity" => 5}]}) } + ) + .to_return(status: 200, body: JSON.generate({"checkout" => {"completed_at" => nil, "created_at" => "2024-10-02T08:56:42-05:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => nil, "customer_locale" => "en", "device_id" => nil, "discount_code" => nil, "discount_codes" => [], "email" => nil, "legal_notice_url" => nil, "location_id" => nil, "name" => "#1066348317", "note" => "", "note_attributes" => {}, "order_id" => nil, "order_status_url" => nil, "order" => nil, "payment_due" => "995.00", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [], "phone" => nil, "shopify_payments_account_id" => nil, "privacy_policy_url" => nil, "refund_policy_url" => nil, "requires_shipping" => true, "reservation_time_left" => 0, "reservation_time" => nil, "source_identifier" => nil, "source_name" => "755357713", "source_url" => nil, "subscription_policy_url" => nil, "subtotal_price" => "995.00", "shipping_policy_url" => nil, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => nil, "terms_of_service_url" => nil, "token" => "f6d029d9d85858636669c7c865ab9e0c", "total_price" => "995.00", "total_tax" => "0.00", "total_tip_received" => "0.00", "total_line_items_price" => "995.00", "updated_at" => "2024-10-02T08:56:42-05:00", "user_id" => nil, "web_url" => "https://jsmith.myshopify.com/548380009/checkouts/f6d029d9d85858636669c7c865ab9e0c", "total_duties" => nil, "total_additional_fees" => nil, "line_items" => [{"id" => "72dab3c1ccce1aec9f79e19dd4151bca", "key" => "72dab3c1ccce1aec9f79e19dd4151bca", "product_id" => 632910392, "variant_id" => 39072856, "sku" => "IPOD2008GREEN", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Green", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => nil, "line_price" => "995.00", "properties" => {}, "quantity" => 5, "grams" => 567, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []}], "gift_cards" => [], "tax_lines" => [], "tax_manipulations" => [], "shipping_line" => nil, "shipping_rate" => nil, "shipping_address" => nil, "credit_card" => nil, "billing_address" => nil, "applied_discount" => nil, "applied_discounts" => [], "discount_violations" => []}}), headers: {}) + + response = checkout = ShopifyAPI::Checkout.new + checkout.line_items = [ + { + "variant_id" => 39072856, + "quantity" => 5 + } + ] + checkout.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "checkout" => hash_including({"email" => "me@example.com"}) } + ) + .to_return(status: 200, body: JSON.generate({"checkout" => {"completed_at" => nil, "created_at" => "2024-10-02T08:56:54-05:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 1073339456, "customer_locale" => "en", "device_id" => nil, "discount_code" => nil, "discount_codes" => [], "email" => "me@example.com", "legal_notice_url" => nil, "location_id" => nil, "name" => "#1066348318", "note" => "", "note_attributes" => {}, "order_id" => nil, "order_status_url" => nil, "order" => nil, "payment_due" => "0.00", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [], "phone" => nil, "shopify_payments_account_id" => nil, "privacy_policy_url" => nil, "refund_policy_url" => nil, "requires_shipping" => false, "reservation_time_left" => 0, "reservation_time" => nil, "source_identifier" => nil, "source_name" => "755357713", "source_url" => nil, "subscription_policy_url" => nil, "subtotal_price" => "0.00", "shipping_policy_url" => nil, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => nil, "terms_of_service_url" => nil, "token" => "9f1e4b3471a65b92e7cbc7664bea0294", "total_price" => "0.00", "total_tax" => "0.00", "total_tip_received" => "0.00", "total_line_items_price" => "0.00", "updated_at" => "2024-10-02T08:56:54-05:00", "user_id" => nil, "web_url" => "https://jsmith.myshopify.com/548380009/checkouts/9f1e4b3471a65b92e7cbc7664bea0294", "total_duties" => nil, "total_additional_fees" => nil, "line_items" => [], "gift_cards" => [], "tax_lines" => [], "tax_manipulations" => [], "shipping_line" => nil, "shipping_rate" => nil, "shipping_address" => nil, "credit_card" => nil, "billing_address" => nil, "applied_discount" => nil, "applied_discounts" => [], "discount_violations" => []}}), headers: {}) + + response = checkout = ShopifyAPI::Checkout.new + checkout.email = "me@example.com" + checkout.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/b490a9220cd14d7344024f4874f640a6/complete.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"checkout" => {"completed_at" => nil, "created_at" => "2012-10-12T07:05:27-04:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 207119551, "customer_locale" => "en", "device_id" => nil, "discount_code" => nil, "discount_codes" => [], "email" => "bob.norman@mail.example.com", "legal_notice_url" => nil, "location_id" => nil, "name" => "#86568385", "note" => "", "note_attributes" => {"custom engraving" => "Happy Birthday", "colour" => "green"}, "order_id" => nil, "order_status_url" => nil, "order" => nil, "payment_due" => "0.00", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [], "phone" => nil, "shopify_payments_account_id" => nil, "privacy_policy_url" => nil, "refund_policy_url" => nil, "requires_shipping" => false, "reservation_time_left" => 0, "reservation_time" => nil, "source_identifier" => nil, "source_name" => "web", "source_url" => nil, "subscription_policy_url" => nil, "subtotal_price" => "0.00", "shipping_policy_url" => nil, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => nil, "terms_of_service_url" => nil, "token" => "b490a9220cd14d7344024f4874f640a6", "total_price" => "0.00", "total_tax" => "0.00", "total_tip_received" => "0.00", "total_line_items_price" => "0.00", "updated_at" => "2024-10-02T08:57:11-05:00", "user_id" => nil, "web_url" => "https://checkout.local/548380009/checkouts/b490a9220cd14d7344024f4874f640a6", "total_duties" => nil, "total_additional_fees" => nil, "line_items" => [{"id" => 49148385, "key" => 49148385, "product_id" => 632910392, "variant_id" => 49148385, "sku" => "IPOD2008RED", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Red", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "taxable" => true, "requires_shipping" => false, "gift_card" => false, "price" => "0.00", "compare_at_price" => nil, "line_price" => "0.00", "properties" => {}, "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []}], "gift_cards" => [], "tax_lines" => [], "tax_manipulations" => [], "shipping_line" => nil, "shipping_rate" => nil, "shipping_address" => {"id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"}, "credit_card" => nil, "billing_address" => {"id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"}, "applied_discount" => nil, "applied_discounts" => [], "discount_violations" => []}}), headers: {}) + + response = checkout = ShopifyAPI::Checkout.new + checkout.token = "b490a9220cd14d7344024f4874f640a6" + checkout.complete + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/b490a9220cd14d7344024f4874f640a6/complete.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/bd5a8aa1ecd019dd3520ff791ee3a24c.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"checkout" => {"completed_at" => "2005-07-31T11:57:11-04:00", "created_at" => "2012-10-12T07:05:27-04:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 207119551, "customer_locale" => "en", "device_id" => nil, "discount_code" => nil, "discount_codes" => [], "email" => "bob.norman@mail.example.com", "legal_notice_url" => nil, "location_id" => nil, "name" => "#901414060", "note" => "", "note_attributes" => {"custom engraving" => "Happy Birthday", "colour" => "green"}, "order_id" => 450789469, "order_status_url" => "https://checkout.local/548380009/checkouts/bd5a8aa1ecd019dd3520ff791ee3a24c/thank_you", "order" => {"id" => 450789469, "name" => "#1001", "status_url" => "https://checkout.local/548380009/checkouts/bd5a8aa1ecd019dd3520ff791ee3a24c/thank_you"}, "payment_due" => "398.00", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [], "phone" => nil, "shopify_payments_account_id" => nil, "privacy_policy_url" => nil, "refund_policy_url" => nil, "requires_shipping" => true, "reservation_time_left" => 0, "reservation_time" => nil, "source_identifier" => nil, "source_name" => "web", "source_url" => nil, "subscription_policy_url" => nil, "subtotal_price" => "398.00", "shipping_policy_url" => nil, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => nil, "terms_of_service_url" => nil, "token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "total_price" => "398.00", "total_tax" => "0.00", "total_tip_received" => "0.00", "total_line_items_price" => "398.00", "updated_at" => "2012-10-12T07:05:27-04:00", "user_id" => nil, "web_url" => "https://checkout.local/548380009/checkouts/bd5a8aa1ecd019dd3520ff791ee3a24c", "total_duties" => nil, "total_additional_fees" => nil, "line_items" => [{"id" => "ca272ce1748d7f8b", "key" => "ca272ce1748d7f8b", "product_id" => 632910392, "variant_id" => 49148385, "sku" => "IPOD2008RED", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Red", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => nil, "line_price" => "199.00", "properties" => {}, "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []}, {"id" => "c59c18c66dea596d", "key" => "c59c18c66dea596d", "product_id" => 632910392, "variant_id" => 808950810, "sku" => "IPOD2008PINK", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Pink", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => nil, "line_price" => "199.00", "properties" => {}, "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []}], "gift_cards" => [], "tax_lines" => [], "tax_manipulations" => [], "shipping_line" => {"handle" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping", "tax_lines" => []}, "shipping_rate" => {"id" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping"}, "shipping_address" => {"id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"}, "credit_card" => nil, "billing_address" => {"id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"}, "applied_discount" => nil, "applied_discounts" => [], "discount_violations" => []}}), headers: {}) + + response = ShopifyAPI::Checkout.find( + token: "bd5a8aa1ecd019dd3520ff791ee3a24c", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/bd5a8aa1ecd019dd3520ff791ee3a24c.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"checkout" => {"completed_at" => nil, "created_at" => "2012-10-12T07:05:27-04:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 207119551, "customer_locale" => "en", "device_id" => nil, "discount_code" => nil, "discount_codes" => [], "email" => "bob.norman@mail.example.com", "legal_notice_url" => nil, "location_id" => nil, "name" => "#446514532", "note" => "", "note_attributes" => {"custom engraving" => "Happy Birthday", "colour" => "green"}, "order_id" => nil, "order_status_url" => nil, "order" => nil, "payment_due" => "419.49", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [{"id" => 25428999, "unique_token" => "e01e661f4a99acd9dcdg6f1422d0d6f7", "payment_processing_error_message" => nil, "fraudulent" => false, "transaction" => {"amount" => "598.94", "amount_in" => nil, "amount_out" => nil, "amount_rounding" => nil, "authorization" => "authorization-key", "created_at" => "2005-08-01T11:57:11-04:00", "currency" => "USD", "error_code" => nil, "parent_id" => nil, "gateway" => "bogus", "id" => 389404469, "kind" => "authorization", "message" => nil, "status" => "success", "test" => false, "receipt" => {"testcase" => true, "authorization" => "123456"}, "location_id" => nil, "user_id" => nil, "transaction_group_id" => nil, "device_id" => nil, "payment_details" => {"credit_card_bin" => nil, "avs_result_code" => nil, "cvv_result_code" => nil, "credit_card_number" => "\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 4242", "credit_card_company" => "Visa", "buyer_action_info" => nil, "credit_card_name" => nil, "credit_card_wallet" => nil, "credit_card_expiration_month" => nil, "credit_card_expiration_year" => nil, "payment_method_name" => "visa"}}, "credit_card" => nil}], "phone" => nil, "shopify_payments_account_id" => nil, "privacy_policy_url" => nil, "refund_policy_url" => nil, "requires_shipping" => true, "reservation_time_left" => 0, "reservation_time" => nil, "source_identifier" => nil, "source_name" => "web", "source_url" => nil, "subscription_policy_url" => nil, "subtotal_price" => "398.00", "shipping_policy_url" => nil, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => nil, "terms_of_service_url" => nil, "token" => "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", "total_price" => "419.49", "total_tax" => "21.49", "total_tip_received" => "0.00", "total_line_items_price" => "398.00", "updated_at" => "2012-10-12T07:05:27-04:00", "user_id" => nil, "web_url" => "https://checkout.local/548380009/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", "total_duties" => nil, "total_additional_fees" => nil, "line_items" => [{"id" => "ca272ce1748d7f8b", "key" => "ca272ce1748d7f8b", "product_id" => 632910392, "variant_id" => 49148385, "sku" => "IPOD2008RED", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Red", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => nil, "line_price" => "199.00", "properties" => {}, "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []}, {"id" => "c59c18c66dea596d", "key" => "c59c18c66dea596d", "product_id" => 632910392, "variant_id" => 808950810, "sku" => "IPOD2008PINK", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Pink", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => nil, "line_price" => "199.00", "properties" => {}, "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []}], "gift_cards" => [], "tax_lines" => [{"price" => "21.49", "rate" => 0.06, "title" => "State Tax", "compare_at" => 0.06}], "tax_manipulations" => [], "shipping_line" => {"handle" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping", "tax_lines" => []}, "shipping_rate" => {"id" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping"}, "shipping_address" => {"id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"}, "credit_card" => {"first_name" => "Bob", "last_name" => "Norman", "first_digits" => "1", "last_digits" => "1", "brand" => "bogus", "expiry_month" => 8, "expiry_year" => 2042, "customer_id" => nil}, "billing_address" => {"id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"}, "applied_discount" => nil, "applied_discounts" => [], "discount_violations" => []}}), headers: {}) + + response = ShopifyAPI::Checkout.find( + token: "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"checkout" => {"completed_at" => nil, "created_at" => "2012-10-12T07:05:27-04:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 207119551, "customer_locale" => "en", "device_id" => nil, "discount_code" => nil, "discount_codes" => [], "email" => "bob.norman@mail.example.com", "legal_notice_url" => nil, "location_id" => nil, "name" => "#862052962", "note" => "", "note_attributes" => {"custom engraving" => "Happy Birthday", "colour" => "green"}, "order_id" => nil, "order_status_url" => nil, "order" => nil, "payment_due" => "419.49", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [], "phone" => nil, "shopify_payments_account_id" => nil, "privacy_policy_url" => nil, "refund_policy_url" => nil, "requires_shipping" => true, "reservation_time_left" => 0, "reservation_time" => nil, "source_identifier" => nil, "source_name" => "web", "source_url" => nil, "subscription_policy_url" => nil, "subtotal_price" => "398.00", "shipping_policy_url" => nil, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => nil, "terms_of_service_url" => nil, "token" => "exuw7apwoycchjuwtiqg8nytfhphr62a", "total_price" => "419.49", "total_tax" => "21.49", "total_tip_received" => "0.00", "total_line_items_price" => "398.00", "updated_at" => "2012-10-12T07:05:27-04:00", "user_id" => nil, "web_url" => "https://checkout.local/548380009/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a", "total_duties" => nil, "total_additional_fees" => nil, "line_items" => [{"id" => "ca272ce1748d7f8b", "key" => "ca272ce1748d7f8b", "product_id" => 632910392, "variant_id" => 49148385, "sku" => "IPOD2008RED", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Red", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => nil, "line_price" => "199.00", "properties" => {}, "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []}, {"id" => "c59c18c66dea596d", "key" => "c59c18c66dea596d", "product_id" => 632910392, "variant_id" => 808950810, "sku" => "IPOD2008PINK", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Pink", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => nil, "line_price" => "199.00", "properties" => {}, "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []}], "gift_cards" => [], "tax_lines" => [{"price" => "21.49", "rate" => 0.06, "title" => "State Tax", "compare_at" => 0.06}], "tax_manipulations" => [], "shipping_line" => {"handle" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping", "tax_lines" => []}, "shipping_rate" => {"id" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping"}, "shipping_address" => {"id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"}, "credit_card" => nil, "billing_address" => {"id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"}, "applied_discount" => nil, "applied_discounts" => [], "discount_violations" => []}}), headers: {}) + + response = ShopifyAPI::Checkout.find( + token: "exuw7apwoycchjuwtiqg8nytfhphr62a", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "checkout" => hash_including({"shipping_line" => {"handle" => "shopify-Free%20Shipping-0.00"}}) } + ) + .to_return(status: 200, body: JSON.generate({"checkout" => {"completed_at" => nil, "created_at" => "2012-10-12T07:05:27-04:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 207119551, "customer_locale" => "en", "device_id" => nil, "discount_code" => nil, "discount_codes" => [], "email" => "bob.norman@mail.example.com", "legal_notice_url" => nil, "location_id" => nil, "name" => "#862052962", "note" => "", "note_attributes" => {"custom engraving" => "Happy Birthday", "colour" => "green"}, "order_id" => nil, "order_status_url" => nil, "order" => nil, "payment_due" => "398.00", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [], "phone" => nil, "shopify_payments_account_id" => nil, "privacy_policy_url" => nil, "refund_policy_url" => nil, "requires_shipping" => true, "reservation_time_left" => 0, "reservation_time" => nil, "source_identifier" => nil, "source_name" => "web", "source_url" => nil, "subscription_policy_url" => nil, "subtotal_price" => "398.00", "shipping_policy_url" => nil, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => nil, "terms_of_service_url" => nil, "token" => "exuw7apwoycchjuwtiqg8nytfhphr62a", "total_price" => "398.00", "total_tax" => "0.00", "total_tip_received" => "0.00", "total_line_items_price" => "398.00", "updated_at" => "2024-10-02T08:56:58-05:00", "user_id" => nil, "web_url" => "https://checkout.local/548380009/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a", "total_duties" => nil, "total_additional_fees" => nil, "line_items" => [{"id" => "ca272ce1748d7f8b", "key" => "ca272ce1748d7f8b", "product_id" => 632910392, "variant_id" => 49148385, "sku" => "IPOD2008RED", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Red", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => nil, "line_price" => "199.00", "properties" => {}, "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []}, {"id" => "c59c18c66dea596d", "key" => "c59c18c66dea596d", "product_id" => 632910392, "variant_id" => 808950810, "sku" => "IPOD2008PINK", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Pink", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => nil, "line_price" => "199.00", "properties" => {}, "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []}], "gift_cards" => [], "tax_lines" => [], "tax_manipulations" => [], "shipping_line" => {"handle" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping", "tax_lines" => []}, "shipping_rate" => {"id" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping"}, "shipping_address" => {"id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"}, "credit_card" => nil, "billing_address" => {"id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"}, "applied_discount" => nil, "applied_discounts" => [], "discount_violations" => []}}), headers: {}) + + response = checkout = ShopifyAPI::Checkout.new + checkout.token = "exuw7apwoycchjuwtiqg8nytfhphr62a" + checkout.shipping_line = { + "handle" => "shopify-Free%20Shipping-0.00" + } + checkout.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "checkout" => hash_including({"email" => "john.smith@example.com", "shipping_address" => {"first_name" => "John", "last_name" => "Smith", "address1" => "126 York St.", "city" => "Los Angeles", "province_code" => "CA", "country_code" => "US", "phone" => "(123)456-7890", "zip" => "90002"}}) } + ) + .to_return(status: 200, body: JSON.generate({"checkout" => {"completed_at" => nil, "created_at" => "2012-10-12T07:05:27-04:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 1073339457, "customer_locale" => "en", "device_id" => nil, "discount_code" => nil, "discount_codes" => [], "email" => "john.smith@example.com", "legal_notice_url" => nil, "location_id" => nil, "name" => "#862052962", "note" => "", "note_attributes" => {"custom engraving" => "Happy Birthday", "colour" => "green"}, "order_id" => nil, "order_status_url" => nil, "order" => nil, "payment_due" => "398.00", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [], "phone" => nil, "shopify_payments_account_id" => nil, "privacy_policy_url" => nil, "refund_policy_url" => nil, "requires_shipping" => true, "reservation_time_left" => 0, "reservation_time" => nil, "source_identifier" => nil, "source_name" => "web", "source_url" => nil, "subscription_policy_url" => nil, "subtotal_price" => "398.00", "shipping_policy_url" => nil, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => nil, "terms_of_service_url" => nil, "token" => "exuw7apwoycchjuwtiqg8nytfhphr62a", "total_price" => "398.00", "total_tax" => "0.00", "total_tip_received" => "0.00", "total_line_items_price" => "398.00", "updated_at" => "2024-10-02T08:57:03-05:00", "user_id" => nil, "web_url" => "https://checkout.local/548380009/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a?key=4a50784c4d35b6f40589ffb5011e1457", "total_duties" => nil, "total_additional_fees" => nil, "line_items" => [{"id" => "ca272ce1748d7f8b", "key" => "ca272ce1748d7f8b", "product_id" => 632910392, "variant_id" => 49148385, "sku" => "IPOD2008RED", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Red", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => nil, "line_price" => "199.00", "properties" => {}, "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []}, {"id" => "c59c18c66dea596d", "key" => "c59c18c66dea596d", "product_id" => 632910392, "variant_id" => 808950810, "sku" => "IPOD2008PINK", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Pink", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203764", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => nil, "line_price" => "199.00", "properties" => {}, "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []}], "gift_cards" => [], "tax_lines" => [], "tax_manipulations" => [], "shipping_line" => nil, "shipping_rate" => nil, "shipping_address" => {"id" => 550558813, "first_name" => "John", "last_name" => "Smith", "phone" => "(123)456-7890", "company" => nil, "address1" => "126 York St.", "address2" => "", "city" => "Los Angeles", "province" => "California", "province_code" => "CA", "country" => "United States", "country_code" => "US", "zip" => "90002"}, "credit_card" => nil, "billing_address" => {"id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"}, "applied_discount" => nil, "applied_discounts" => [], "discount_violations" => []}}), headers: {}) + + response = checkout = ShopifyAPI::Checkout.new + checkout.token = "exuw7apwoycchjuwtiqg8nytfhphr62a" + checkout.email = "john.smith@example.com" + checkout.shipping_address = { + "first_name" => "John", + "last_name" => "Smith", + "address1" => "126 York St.", + "city" => "Los Angeles", + "province_code" => "CA", + "country_code" => "US", + "phone" => "(123)456-7890", + "zip" => "90002" + } + checkout.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a/shipping_rates.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"shipping_rates" => [{"id" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping", "checkout" => {"total_tax" => "0.00", "total_price" => "398.00", "subtotal_price" => "398.00"}, "phone_required" => false, "delivery_range" => nil, "estimated_time_in_transit" => nil, "handle" => "shopify-Free%20Shipping-0.00"}]}), headers: {}) + + response = ShopifyAPI::Checkout.shipping_rates( + token: "exuw7apwoycchjuwtiqg8nytfhphr62a", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a/shipping_rates.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a/shipping_rates.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"shipping_rates" => []}), headers: {}) + + response = ShopifyAPI::Checkout.shipping_rates( + token: "exuw7apwoycchjuwtiqg8nytfhphr62a", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/exuw7apwoycchjuwtiqg8nytfhphr62a/shipping_rates.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_11() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/zs9ru89kuqcdagk8bz4r9hnxt22wwd42/shipping_rates.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"shipping_rates" => []}), headers: {}) + + response = ShopifyAPI::Checkout.shipping_rates( + token: "zs9ru89kuqcdagk8bz4r9hnxt22wwd42", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/zs9ru89kuqcdagk8bz4r9hnxt22wwd42/shipping_rates.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/collect_test.rb b/test/rest/2024_10/collect_test.rb new file mode 100644 index 00000000..6671cc6a --- /dev/null +++ b/test/rest/2024_10/collect_test.rb @@ -0,0 +1,317 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Collect202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/collects.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "collect" => hash_including({"product_id" => 921728736, "collection_id" => 841564295}) } + ) + .to_return(status: 200, body: JSON.generate({"collect" => {"id" => 1071559576, "collection_id" => 841564295, "product_id" => 921728736, "created_at" => "2024-10-02T08:58:05-05:00", "updated_at" => "2024-10-02T08:58:05-05:00", "position" => 2, "sort_value" => "0000000002"}}), headers: {}) + + response = collect = ShopifyAPI::Collect.new + collect.product_id = 921728736 + collect.collection_id = 841564295 + collect.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/collects.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collects.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"collects" => [{"id" => 358268117, "collection_id" => 482865238, "product_id" => 632910392, "created_at" => nil, "updated_at" => nil, "position" => 1, "sort_value" => "0000000001"}, {"id" => 455204334, "collection_id" => 841564295, "product_id" => 632910392, "created_at" => nil, "updated_at" => nil, "position" => 1, "sort_value" => "0000000001"}, {"id" => 773559378, "collection_id" => 395646240, "product_id" => 632910392, "created_at" => nil, "updated_at" => nil, "position" => 1, "sort_value" => "0000000001"}, {"id" => 800915878, "collection_id" => 482865238, "product_id" => 921728736, "created_at" => nil, "updated_at" => nil, "position" => 1, "sort_value" => "0000000001"}]}), headers: {}) + + response = ShopifyAPI::Collect.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collects.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collects.json?collection_id=841564295") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"collects" => [{"id" => 455204334, "collection_id" => 841564295, "product_id" => 632910392, "created_at" => nil, "updated_at" => nil, "position" => 1, "sort_value" => "0000000001"}, {"id" => 1071559575, "collection_id" => 841564295, "product_id" => 921728736, "created_at" => "2024-10-02T08:57:59-05:00", "updated_at" => "2024-10-02T08:57:59-05:00", "position" => 2, "sort_value" => "0000000002"}]}), headers: {}) + + response = ShopifyAPI::Collect.all( + collection_id: "841564295", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collects.json?collection_id=841564295") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collects.json?product_id=632910392") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"collects" => [{"id" => 358268117, "collection_id" => 482865238, "product_id" => 632910392, "created_at" => nil, "updated_at" => nil, "position" => 1, "sort_value" => "0000000001"}, {"id" => 455204334, "collection_id" => 841564295, "product_id" => 632910392, "created_at" => nil, "updated_at" => nil, "position" => 1, "sort_value" => "0000000001"}, {"id" => 773559378, "collection_id" => 395646240, "product_id" => 632910392, "created_at" => nil, "updated_at" => nil, "position" => 1, "sort_value" => "0000000001"}]}), headers: {}) + + response = ShopifyAPI::Collect.all( + product_id: "632910392", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collects.json?product_id=632910392") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/collects/455204334.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Collect.delete( + id: 455204334, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/collects/455204334.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collects/455204334.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"collect" => {"id" => 455204334, "collection_id" => 841564295, "product_id" => 632910392, "created_at" => nil, "updated_at" => nil, "position" => 1, "sort_value" => "0000000001"}}), headers: {}) + + response = ShopifyAPI::Collect.find( + id: 455204334, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collects/455204334.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collects/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 2}), headers: {}) + + response = ShopifyAPI::Collect.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collects/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collects/count.json?collection_id=841564295") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 1}), headers: {}) + + response = ShopifyAPI::Collect.count( + collection_id: "841564295", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collects/count.json?collection_id=841564295") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collects/count.json?product_id=632910392") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 2}), headers: {}) + + response = ShopifyAPI::Collect.count( + product_id: "632910392", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collects/count.json?product_id=632910392") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/collection_listing_test.rb b/test/rest/2024_10/collection_listing_test.rb new file mode 100644 index 00000000..7b6727d9 --- /dev/null +++ b/test/rest/2024_10/collection_listing_test.rb @@ -0,0 +1,190 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class CollectionListing202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collection_listings.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"collection_listings" => [{"collection_id" => 482865238, "updated_at" => "2024-10-02T08:59:11-05:00", "body_html" => "

The best selling ipod ever

", "default_product_image" => nil, "handle" => "smart-ipods", "image" => {"created_at" => "2024-10-02T08:59:11-05:00", "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704203951"}, "title" => "Smart iPods", "sort_order" => "manual", "published_at" => "2017-08-31T20:00:00-04:00"}, {"collection_id" => 841564295, "updated_at" => "2024-10-02T08:59:11-05:00", "body_html" => "

The best selling ipod ever

", "default_product_image" => nil, "handle" => "ipods", "image" => {"created_at" => "2024-10-02T08:59:11-05:00", "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704203951"}, "title" => "IPods", "sort_order" => "manual", "published_at" => "2017-08-31T20:00:00-04:00"}, {"collection_id" => 395646240, "updated_at" => "2024-10-02T08:59:11-05:00", "body_html" => "

The best selling ipod ever. Again

", "default_product_image" => {"id" => 850703190, "created_at" => "2024-10-02T08:59:11-05:00", "position" => 1, "updated_at" => "2024-10-02T08:59:11-05:00", "product_id" => 632910392, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "width" => 123, "height" => 456}, "handle" => "ipods_two", "image" => nil, "title" => "IPods Two", "sort_order" => "manual", "published_at" => "2017-08-31T20:00:00-04:00"}, {"collection_id" => 691652237, "updated_at" => "2024-10-02T08:59:11-05:00", "body_html" => "

No ipods here

", "default_product_image" => nil, "handle" => "non-ipods", "image" => nil, "title" => "Non Ipods", "sort_order" => "manual", "published_at" => "2017-08-31T20:00:00-04:00"}]}), headers: {}) + + response = ShopifyAPI::CollectionListing.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collection_listings.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collection_listings/841564295/product_ids.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"product_ids" => [632910392]}), headers: {}) + + response = ShopifyAPI::CollectionListing.product_ids( + collection_id: 841564295, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collection_listings/841564295/product_ids.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collection_listings/482865238.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"collection_listing" => {"collection_id" => 482865238, "updated_at" => "2024-10-02T08:59:11-05:00", "body_html" => "

The best selling ipod ever

", "default_product_image" => nil, "handle" => "smart-ipods", "image" => {"created_at" => "2024-10-02T08:59:11-05:00", "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704203951"}, "title" => "Smart iPods", "sort_order" => "manual", "published_at" => "2017-08-31T20:00:00-04:00"}}), headers: {}) + + response = ShopifyAPI::CollectionListing.find( + collection_id: 482865238, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collection_listings/482865238.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/collection_listings/482865238.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "collection_listing" => hash_including({}) } + ) + .to_return(status: 200, body: JSON.generate({"collection_listing" => {"collection_id" => 482865238, "updated_at" => "2024-10-02T08:59:11-05:00", "body_html" => "

The best selling ipod ever

", "default_product_image" => nil, "handle" => "smart-ipods", "image" => {"created_at" => "2024-10-02T08:59:11-05:00", "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704203951"}, "title" => "Smart iPods", "sort_order" => "manual", "published_at" => "2017-08-31T20:00:00-04:00"}}), headers: {}) + + response = collection_listing = ShopifyAPI::CollectionListing.new + collection_listing.collection_id = 482865238 + collection_listing.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/collection_listings/482865238.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/collection_listings/841564295.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::CollectionListing.delete( + collection_id: 841564295, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/collection_listings/841564295.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/collection_test.rb b/test/rest/2024_10/collection_test.rb new file mode 100644 index 00000000..ade95369 --- /dev/null +++ b/test/rest/2024_10/collection_test.rb @@ -0,0 +1,96 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Collection202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collections/841564295.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"collection" => {"id" => 841564295, "handle" => "ipods", "title" => "IPods", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "products_count" => 1, "collection_type" => "custom", "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => {"created_at" => "2024-10-02T08:59:11-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704203951"}}}), headers: {}) + + response = ShopifyAPI::Collection.find( + id: 841564295, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collections/841564295.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collections/841564295/products.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"products" => [{"id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-10-02T08:59:11-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => nil, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "options" => [{"id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1}], "images" => [{"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}, {"id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"}, {"id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"}], "image" => {"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}}]}), headers: {}) + + response = ShopifyAPI::Collection.products( + id: 841564295, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collections/841564295/products.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/comment_test.rb b/test/rest/2024_10/comment_test.rb new file mode 100644 index 00000000..a3d02060 --- /dev/null +++ b/test/rest/2024_10/comment_test.rb @@ -0,0 +1,519 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Comment202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/comments.json?since_id=118373535") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"comments" => [{"id" => 653537639, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "status" => "unapproved", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1", "published_at" => nil}]}), headers: {}) + + response = ShopifyAPI::Comment.all( + since_id: "118373535", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/comments.json?since_id=118373535") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/comments.json?article_id=134645308&blog_id=241253187") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"comments" => [{"id" => 653537639, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "status" => "unapproved", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1", "published_at" => nil}, {"id" => 118373535, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "status" => "published", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1", "published_at" => nil}]}), headers: {}) + + response = ShopifyAPI::Comment.all( + article_id: "134645308", + blog_id: "241253187", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/comments.json?article_id=134645308&blog_id=241253187") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/comments.json?blog_id=241253187") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"comments" => [{"id" => 653537639, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "status" => "unapproved", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1", "published_at" => nil}, {"id" => 118373535, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "status" => "published", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1", "published_at" => nil}]}), headers: {}) + + response = ShopifyAPI::Comment.all( + blog_id: "241253187", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/comments.json?blog_id=241253187") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/comments.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"comments" => [{"id" => 653537639, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "status" => "unapproved", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1", "published_at" => nil}, {"id" => 118373535, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "status" => "published", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1", "published_at" => nil}]}), headers: {}) + + response = ShopifyAPI::Comment.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/comments.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/comments/count.json?article_id=134645308&blog_id=241253187") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 2}), headers: {}) + + response = ShopifyAPI::Comment.count( + article_id: "134645308", + blog_id: "241253187", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/comments/count.json?article_id=134645308&blog_id=241253187") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/comments/count.json?blog_id=241253187") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 2}), headers: {}) + + response = ShopifyAPI::Comment.count( + blog_id: "241253187", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/comments/count.json?blog_id=241253187") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/comments/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 2}), headers: {}) + + response = ShopifyAPI::Comment.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/comments/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/comments/118373535.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"comment" => {"id" => 118373535, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "status" => "published", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1", "published_at" => nil}}), headers: {}) + + response = ShopifyAPI::Comment.find( + id: 118373535, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/comments/118373535.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/comments/118373535.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "comment" => hash_including({"body" => "You can even update through a web service.", "author" => "Your new name", "email" => "your@updated-email.com", "published_at" => "2024-10-02T14:00:35.255Z"}) } + ) + .to_return(status: 200, body: JSON.generate({"comment" => {"author" => "Your new name", "body" => "You can even update through a web service.", "email" => "your@updated-email.com", "published_at" => "2024-10-02T09:00:35-05:00", "id" => 118373535, "body_html" => "

You can even update through a web service.

", "status" => "published", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:00:35-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1"}}), headers: {}) + + response = comment = ShopifyAPI::Comment.new + comment.id = 118373535 + comment.body = "You can even update through a web service." + comment.author = "Your new name" + comment.email = "your@updated-email.com" + comment.published_at = "2024-10-02T14:00:35.255Z" + comment.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/comments/118373535.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/comments.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "comment" => hash_including({"body" => "I like comments\nAnd I like posting them *RESTfully*.", "author" => "Your name", "email" => "your@email.com", "ip" => "107.20.160.121", "blog_id" => 241253187, "article_id" => 134645308}) } + ) + .to_return(status: 200, body: JSON.generate({"comment" => {"id" => 757536352, "body" => "I like comments\nAnd I like posting them *RESTfully*.", "body_html" => "

I like comments
\nAnd I like posting them RESTfully.

", "author" => "Your name", "email" => "your@email.com", "status" => "pending", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-10-02T09:00:43-05:00", "updated_at" => "2024-10-02T09:00:43-05:00", "ip" => "107.20.160.121", "user_agent" => nil, "published_at" => nil}}), headers: {}) + + response = comment = ShopifyAPI::Comment.new + comment.body = "I like comments\nAnd I like posting them *RESTfully*." + comment.author = "Your name" + comment.email = "your@email.com" + comment.ip = "107.20.160.121" + comment.blog_id = 241253187 + comment.article_id = 134645308 + comment.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/comments.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_11() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/comments/653537639/spam.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"published_at" => nil, "status" => "spam", "id" => 653537639, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:00:42-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1"}), headers: {}) + + response = comment = ShopifyAPI::Comment.new + comment.id = 653537639 + comment.spam + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/comments/653537639/spam.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_12() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/comments/653537639/not_spam.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"published_at" => "2024-10-02T09:00:37-05:00", "status" => "published", "id" => 653537639, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:00:37-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1"}), headers: {}) + + response = comment = ShopifyAPI::Comment.new + comment.id = 653537639 + comment.not_spam + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/comments/653537639/not_spam.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_13() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/comments/653537639/approve.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"published_at" => "2024-10-02T09:00:45-05:00", "status" => "published", "id" => 653537639, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:00:45-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1"}), headers: {}) + + response = comment = ShopifyAPI::Comment.new + comment.id = 653537639 + comment.approve + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/comments/653537639/approve.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_14() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/comments/653537639/remove.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"published_at" => nil, "status" => "removed", "id" => 653537639, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:00:46-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1"}), headers: {}) + + response = comment = ShopifyAPI::Comment.new + comment.id = 653537639 + comment.remove + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/comments/653537639/remove.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_15() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/comments/653537639/restore.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"published_at" => "2024-10-02T09:00:33-05:00", "status" => "published", "id" => 653537639, "body" => "Hi author, I really _like_ what you're doing there.", "body_html" => "

Hi author, I really like what you're doing there.

", "author" => "Soleone", "email" => "soleone@example.net", "article_id" => 134645308, "blog_id" => 241253187, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:00:33-05:00", "ip" => "127.0.0.1", "user_agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1"}), headers: {}) + + response = comment = ShopifyAPI::Comment.new + comment.id = 653537639 + comment.restore + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/comments/653537639/restore.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/country_test.rb b/test/rest/2024_10/country_test.rb new file mode 100644 index 00000000..b4af6cea --- /dev/null +++ b/test/rest/2024_10/country_test.rb @@ -0,0 +1,286 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Country202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/countries.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"countries" => [{"id" => 879921427, "name" => "Canada", "code" => "CA", "tax_name" => "GST", "tax" => 0.05, "provinces" => [{"id" => 205434194, "country_id" => 879921427, "name" => "Alberta", "code" => "AB", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.08, "tax_percentage" => 8.0}, {"id" => 170405627, "country_id" => 879921427, "name" => "British Columbia", "code" => "BC", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.07, "tax_percentage" => 7.0}, {"id" => 342345110, "country_id" => 879921427, "name" => "Manitoba", "code" => "MB", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.07, "tax_percentage" => 7.0}, {"id" => 92264567, "country_id" => 879921427, "name" => "New Brunswick", "code" => "NB", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.15, "tax_percentage" => 15.0}, {"id" => 243284171, "country_id" => 879921427, "name" => "Newfoundland", "code" => "NL", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.15, "tax_percentage" => 15.0}, {"id" => 439598329, "country_id" => 879921427, "name" => "Northwest Territories", "code" => "NT", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.0, "tax_percentage" => 0.0}, {"id" => 448070559, "country_id" => 879921427, "name" => "Nova Scotia", "code" => "NS", "tax_name" => nil, "tax_type" => "harmonized", "shipping_zone_id" => nil, "tax" => 0.15, "tax_percentage" => 15.0}, {"id" => 670206421, "country_id" => 879921427, "name" => "Nunavut", "code" => "NU", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.0, "tax_percentage" => 0.0}, {"id" => 702530425, "country_id" => 879921427, "name" => "Ontario", "code" => "ON", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.08, "tax_percentage" => 8.0}, {"id" => 570891722, "country_id" => 879921427, "name" => "Prince Edward Island", "code" => "PE", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.1, "tax_percentage" => 10.0}, {"id" => 224293623, "country_id" => 879921427, "name" => "Quebec", "code" => "QC", "tax_name" => "HST", "tax_type" => "compounded", "shipping_zone_id" => nil, "tax" => 0.09, "tax_percentage" => 9.0}, {"id" => 473391800, "country_id" => 879921427, "name" => "Saskatchewan", "code" => "SK", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.09, "tax_percentage" => 9.0}, {"id" => 1005264686, "country_id" => 879921427, "name" => "Yukon", "code" => "YT", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.0, "tax_percentage" => 0.0}]}, {"id" => 359115488, "name" => "Colombia", "code" => "CO", "tax_name" => "VAT", "tax" => 0.15, "provinces" => []}, {"id" => 817138619, "name" => "United States", "code" => "US", "tax_name" => "Federal Tax", "tax" => 0.0, "provinces" => [{"id" => 952629862, "country_id" => 817138619, "name" => "California", "code" => "CA", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => 1039932365, "tax" => 0.05, "tax_percentage" => 5.0}, {"id" => 222234158, "country_id" => 817138619, "name" => "Kentucky", "code" => "KY", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => 1039932365, "tax" => 0.06, "tax_percentage" => 6.0}, {"id" => 9350860, "country_id" => 817138619, "name" => "Massachusetts", "code" => "MA", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.065, "tax_percentage" => 6.5}, {"id" => 696485510, "country_id" => 817138619, "name" => "Minnesota", "code" => "MN", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.065, "tax_percentage" => 6.5}, {"id" => 753050225, "country_id" => 817138619, "name" => "New Jersey", "code" => "NJ", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.06, "tax_percentage" => 6.0}, {"id" => 1013111685, "country_id" => 817138619, "name" => "New York", "code" => "NY", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.04, "tax_percentage" => 4.0}, {"id" => 915134533, "country_id" => 817138619, "name" => "Pennsylvania", "code" => "PA", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.05, "tax_percentage" => 5.0}, {"id" => 591478044, "country_id" => 817138619, "name" => "Rhode Island", "code" => "RI", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.07, "tax_percentage" => 7.0}]}]}), headers: {}) + + response = ShopifyAPI::Country.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/countries.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/countries.json?since_id=359115488") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"countries" => [{"id" => 817138619, "name" => "United States", "code" => "US", "tax_name" => "Federal Tax", "tax" => 0.0, "provinces" => [{"id" => 952629862, "country_id" => 817138619, "name" => "California", "code" => "CA", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => 1039932365, "tax" => 0.05, "tax_percentage" => 5.0}, {"id" => 222234158, "country_id" => 817138619, "name" => "Kentucky", "code" => "KY", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => 1039932365, "tax" => 0.06, "tax_percentage" => 6.0}, {"id" => 9350860, "country_id" => 817138619, "name" => "Massachusetts", "code" => "MA", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.065, "tax_percentage" => 6.5}, {"id" => 696485510, "country_id" => 817138619, "name" => "Minnesota", "code" => "MN", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.065, "tax_percentage" => 6.5}, {"id" => 753050225, "country_id" => 817138619, "name" => "New Jersey", "code" => "NJ", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.06, "tax_percentage" => 6.0}, {"id" => 1013111685, "country_id" => 817138619, "name" => "New York", "code" => "NY", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.04, "tax_percentage" => 4.0}, {"id" => 915134533, "country_id" => 817138619, "name" => "Pennsylvania", "code" => "PA", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.05, "tax_percentage" => 5.0}, {"id" => 591478044, "country_id" => 817138619, "name" => "Rhode Island", "code" => "RI", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.07, "tax_percentage" => 7.0}]}, {"id" => 879921427, "name" => "Canada", "code" => "CA", "tax_name" => "GST", "tax" => 0.05, "provinces" => [{"id" => 205434194, "country_id" => 879921427, "name" => "Alberta", "code" => "AB", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.08, "tax_percentage" => 8.0}, {"id" => 170405627, "country_id" => 879921427, "name" => "British Columbia", "code" => "BC", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.07, "tax_percentage" => 7.0}, {"id" => 342345110, "country_id" => 879921427, "name" => "Manitoba", "code" => "MB", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.07, "tax_percentage" => 7.0}, {"id" => 92264567, "country_id" => 879921427, "name" => "New Brunswick", "code" => "NB", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.15, "tax_percentage" => 15.0}, {"id" => 243284171, "country_id" => 879921427, "name" => "Newfoundland", "code" => "NL", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.15, "tax_percentage" => 15.0}, {"id" => 439598329, "country_id" => 879921427, "name" => "Northwest Territories", "code" => "NT", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.0, "tax_percentage" => 0.0}, {"id" => 448070559, "country_id" => 879921427, "name" => "Nova Scotia", "code" => "NS", "tax_name" => nil, "tax_type" => "harmonized", "shipping_zone_id" => nil, "tax" => 0.15, "tax_percentage" => 15.0}, {"id" => 670206421, "country_id" => 879921427, "name" => "Nunavut", "code" => "NU", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.0, "tax_percentage" => 0.0}, {"id" => 702530425, "country_id" => 879921427, "name" => "Ontario", "code" => "ON", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.08, "tax_percentage" => 8.0}, {"id" => 570891722, "country_id" => 879921427, "name" => "Prince Edward Island", "code" => "PE", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.1, "tax_percentage" => 10.0}, {"id" => 224293623, "country_id" => 879921427, "name" => "Quebec", "code" => "QC", "tax_name" => "HST", "tax_type" => "compounded", "shipping_zone_id" => nil, "tax" => 0.09, "tax_percentage" => 9.0}, {"id" => 473391800, "country_id" => 879921427, "name" => "Saskatchewan", "code" => "SK", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.09, "tax_percentage" => 9.0}, {"id" => 1005264686, "country_id" => 879921427, "name" => "Yukon", "code" => "YT", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.0, "tax_percentage" => 0.0}]}]}), headers: {}) + + response = ShopifyAPI::Country.all( + since_id: "359115488", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/countries.json?since_id=359115488") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/countries.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "country" => hash_including({"code" => "FR"}) } + ) + .to_return(status: 200, body: JSON.generate({"country" => {"id" => 1070231511, "name" => "France", "code" => "FR", "tax_name" => "TVA", "tax" => 0.2, "provinces" => []}}), headers: {}) + + response = country = ShopifyAPI::Country.new + country.code = "FR" + country.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/countries.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/countries.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "country" => hash_including({"code" => "FR", "tax" => 0.2}) } + ) + .to_return(status: 200, body: JSON.generate({"country" => {"id" => 1070231512, "name" => "France", "code" => "FR", "tax_name" => "TVA", "tax" => 0.2, "provinces" => []}}), headers: {}) + + response = country = ShopifyAPI::Country.new + country.code = "FR" + country.tax = 0.2 + country.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/countries.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/countries/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 3}), headers: {}) + + response = ShopifyAPI::Country.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/countries/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/countries/879921427.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"country" => {"id" => 879921427, "name" => "Canada", "code" => "CA", "tax_name" => "GST", "tax" => 0.05, "provinces" => [{"id" => 205434194, "country_id" => 879921427, "name" => "Alberta", "code" => "AB", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.08, "tax_percentage" => 8.0}, {"id" => 170405627, "country_id" => 879921427, "name" => "British Columbia", "code" => "BC", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.07, "tax_percentage" => 7.0}, {"id" => 342345110, "country_id" => 879921427, "name" => "Manitoba", "code" => "MB", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.07, "tax_percentage" => 7.0}, {"id" => 92264567, "country_id" => 879921427, "name" => "New Brunswick", "code" => "NB", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.15, "tax_percentage" => 15.0}, {"id" => 243284171, "country_id" => 879921427, "name" => "Newfoundland", "code" => "NL", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.15, "tax_percentage" => 15.0}, {"id" => 439598329, "country_id" => 879921427, "name" => "Northwest Territories", "code" => "NT", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.0, "tax_percentage" => 0.0}, {"id" => 448070559, "country_id" => 879921427, "name" => "Nova Scotia", "code" => "NS", "tax_name" => nil, "tax_type" => "harmonized", "shipping_zone_id" => nil, "tax" => 0.15, "tax_percentage" => 15.0}, {"id" => 670206421, "country_id" => 879921427, "name" => "Nunavut", "code" => "NU", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.0, "tax_percentage" => 0.0}, {"id" => 702530425, "country_id" => 879921427, "name" => "Ontario", "code" => "ON", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.08, "tax_percentage" => 8.0}, {"id" => 570891722, "country_id" => 879921427, "name" => "Prince Edward Island", "code" => "PE", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.1, "tax_percentage" => 10.0}, {"id" => 224293623, "country_id" => 879921427, "name" => "Quebec", "code" => "QC", "tax_name" => "HST", "tax_type" => "compounded", "shipping_zone_id" => nil, "tax" => 0.09, "tax_percentage" => 9.0}, {"id" => 473391800, "country_id" => 879921427, "name" => "Saskatchewan", "code" => "SK", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.09, "tax_percentage" => 9.0}, {"id" => 1005264686, "country_id" => 879921427, "name" => "Yukon", "code" => "YT", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.0, "tax_percentage" => 0.0}]}}), headers: {}) + + response = ShopifyAPI::Country.find( + id: 879921427, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/countries/879921427.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/countries/879921427.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "country" => hash_including({"tax" => 0.05}) } + ) + .to_return(status: 200, body: JSON.generate({"country" => {"id" => 879921427, "name" => "Canada", "code" => "CA", "tax_name" => "GST", "tax" => 0.05, "provinces" => [{"country_id" => 879921427, "tax_name" => "Tax", "id" => 205434194, "name" => "Alberta", "code" => "AB", "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.08, "tax_percentage" => 8.0}, {"country_id" => 879921427, "tax_name" => "Tax", "id" => 170405627, "name" => "British Columbia", "code" => "BC", "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.07, "tax_percentage" => 7.0}, {"country_id" => 879921427, "tax_name" => "Tax", "id" => 342345110, "name" => "Manitoba", "code" => "MB", "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.07, "tax_percentage" => 7.0}, {"country_id" => 879921427, "tax_name" => "Tax", "id" => 92264567, "name" => "New Brunswick", "code" => "NB", "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.15, "tax_percentage" => 15.0}, {"country_id" => 879921427, "tax_name" => "Tax", "id" => 243284171, "name" => "Newfoundland", "code" => "NL", "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.15, "tax_percentage" => 15.0}, {"country_id" => 879921427, "tax_name" => "Tax", "id" => 439598329, "name" => "Northwest Territories", "code" => "NT", "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.0, "tax_percentage" => 0.0}, {"country_id" => 879921427, "tax_name" => "Tax", "id" => 448070559, "name" => "Nova Scotia", "code" => "NS", "tax_type" => "harmonized", "shipping_zone_id" => nil, "tax" => 0.15, "tax_percentage" => 15.0}, {"country_id" => 879921427, "tax_name" => "Tax", "id" => 670206421, "name" => "Nunavut", "code" => "NU", "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.0, "tax_percentage" => 0.0}, {"country_id" => 879921427, "tax_name" => "Tax", "id" => 702530425, "name" => "Ontario", "code" => "ON", "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.08, "tax_percentage" => 8.0}, {"country_id" => 879921427, "tax_name" => "Tax", "id" => 570891722, "name" => "Prince Edward Island", "code" => "PE", "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.1, "tax_percentage" => 10.0}, {"id" => 224293623, "country_id" => 879921427, "name" => "Quebec", "code" => "QC", "tax_name" => "HST", "tax_type" => "compounded", "shipping_zone_id" => nil, "tax" => 0.09, "tax_percentage" => 9.0}, {"country_id" => 879921427, "tax_name" => "Tax", "id" => 473391800, "name" => "Saskatchewan", "code" => "SK", "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.09, "tax_percentage" => 9.0}, {"country_id" => 879921427, "tax_name" => "Tax", "id" => 1005264686, "name" => "Yukon", "code" => "YT", "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.0, "tax_percentage" => 0.0}]}}), headers: {}) + + response = country = ShopifyAPI::Country.new + country.id = 879921427 + country.tax = 0.05 + country.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/countries/879921427.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/countries/879921427.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Country.delete( + id: 879921427, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/countries/879921427.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/currency_test.rb b/test/rest/2024_10/currency_test.rb new file mode 100644 index 00000000..50aa84c3 --- /dev/null +++ b/test/rest/2024_10/currency_test.rb @@ -0,0 +1,62 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Currency202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/currencies.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"currencies" => [{"currency" => "CAD", "rate_updated_at" => "2018-01-23T19:01:01-05:00", "enabled" => true}, {"currency" => "EUR", "rate_updated_at" => "2018-01-23T19:01:01-05:00", "enabled" => true}, {"currency" => "JPY", "rate_updated_at" => "2018-01-23T19:01:01-05:00", "enabled" => true}]}), headers: {}) + + response = ShopifyAPI::Currency.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/currencies.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/custom_collection_test.rb b/test/rest/2024_10/custom_collection_test.rb new file mode 100644 index 00000000..9fa7e42b --- /dev/null +++ b/test/rest/2024_10/custom_collection_test.rb @@ -0,0 +1,756 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class CustomCollection202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections.json?ids=395646240%2C691652237%2C841564295") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"custom_collections" => [{"id" => 841564295, "handle" => "ipods", "title" => "IPods", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => {"created_at" => "2024-10-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"}}, {"id" => 395646240, "handle" => "ipods_two", "title" => "IPods Two", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever. Again

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/395646240"}, {"id" => 691652237, "handle" => "non-ipods", "title" => "Non Ipods", "updated_at" => "2013-02-01T19:00:00-05:00", "body_html" => "

No ipods here

", "published_at" => "2013-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/691652237"}]}), headers: {}) + + response = ShopifyAPI::CustomCollection.all( + ids: "395646240,691652237,841564295", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections.json?ids=395646240%2C691652237%2C841564295") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"custom_collections" => [{"id" => 841564295, "handle" => "ipods", "title" => "IPods", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => {"created_at" => "2024-10-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"}}, {"id" => 395646240, "handle" => "ipods_two", "title" => "IPods Two", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever. Again

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/395646240"}, {"id" => 691652237, "handle" => "non-ipods", "title" => "Non Ipods", "updated_at" => "2013-02-01T19:00:00-05:00", "body_html" => "

No ipods here

", "published_at" => "2013-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/691652237"}]}), headers: {}) + + response = ShopifyAPI::CustomCollection.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections.json?since_id=841564295") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"custom_collections" => [{"id" => 1063001337, "handle" => "macbooks", "title" => "Macbooks", "updated_at" => "2024-10-02T09:30:33-05:00", "body_html" => nil, "published_at" => "2024-10-02T09:30:33-05:00", "sort_order" => "best-selling", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001337"}]}), headers: {}) + + response = ShopifyAPI::CustomCollection.all( + since_id: "841564295", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections.json?since_id=841564295") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections.json?product_id=632910392") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"custom_collections" => [{"id" => 841564295, "handle" => "ipods", "title" => "IPods", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => {"created_at" => "2024-10-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"}}, {"id" => 395646240, "handle" => "ipods_two", "title" => "IPods Two", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever. Again

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/395646240"}]}), headers: {}) + + response = ShopifyAPI::CustomCollection.all( + product_id: "632910392", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections.json?product_id=632910392") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 3}), headers: {}) + + response = ShopifyAPI::CustomCollection.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/count.json?product_id=632910392") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 2}), headers: {}) + + response = ShopifyAPI::CustomCollection.count( + product_id: "632910392", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/count.json?product_id=632910392") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/841564295.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"custom_collection" => {"id" => 841564295, "handle" => "ipods", "title" => "IPods", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "products_count" => 1, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => {"created_at" => "2024-10-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"}}}), headers: {}) + + response = ShopifyAPI::CustomCollection.find( + id: 841564295, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/841564295.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/841564295.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "custom_collection" => hash_including({"collects" => [{"product_id" => 921728736, "position" => 1}, {"id" => 455204334, "position" => 2}]}) } + ) + .to_return(status: 200, body: JSON.generate({"custom_collection" => {"title" => "IPods", "handle" => "ipods", "body_html" => "

The best selling ipod ever

", "id" => 841564295, "updated_at" => "2024-10-02T09:30:46-05:00", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => {"created_at" => "2024-10-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"}}}), headers: {}) + + response = custom_collection = ShopifyAPI::CustomCollection.new + custom_collection.id = 841564295 + custom_collection.collects = [ + { + "product_id" => 921728736, + "position" => 1 + }, + { + "id" => 455204334, + "position" => 2 + } + ] + custom_collection.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/841564295.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/841564295.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "custom_collection" => hash_including({"metafields" => [{"key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"custom_collection" => {"title" => "IPods", "handle" => "ipods", "body_html" => "

The best selling ipod ever

", "id" => 841564295, "updated_at" => "2008-02-01T19:00:00-05:00", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => {"created_at" => "2024-10-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"}}}), headers: {}) + + response = custom_collection = ShopifyAPI::CustomCollection.new + custom_collection.id = 841564295 + custom_collection.metafields = [ + { + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + } + ] + custom_collection.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/841564295.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/841564295.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "custom_collection" => hash_including({"published" => false}) } + ) + .to_return(status: 200, body: JSON.generate({"custom_collection" => {"title" => "IPods", "handle" => "ipods", "body_html" => "

The best selling ipod ever

", "id" => 841564295, "published_at" => nil, "updated_at" => "2024-10-02T09:30:36-05:00", "sort_order" => "manual", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => {"created_at" => "2024-10-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"}}}), headers: {}) + + response = custom_collection = ShopifyAPI::CustomCollection.new + custom_collection.id = 841564295 + custom_collection.published = false + custom_collection.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/841564295.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_11() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/841564295.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "custom_collection" => hash_including({"published" => true}) } + ) + .to_return(status: 200, body: JSON.generate({"custom_collection" => {"title" => "IPods", "handle" => "ipods", "body_html" => "

The best selling ipod ever

", "id" => 841564295, "published_at" => "2024-10-02T09:30:25-05:00", "updated_at" => "2024-10-02T09:30:25-05:00", "sort_order" => "manual", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => {"created_at" => "2024-10-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"}}}), headers: {}) + + response = custom_collection = ShopifyAPI::CustomCollection.new + custom_collection.id = 841564295 + custom_collection.published = true + custom_collection.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/841564295.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_12() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/841564295.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "custom_collection" => hash_including({"image" => "", "updated_at" => "2024-10-02T09:30:36-05:00", "title" => "IPods", "handle" => "ipods", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295"}) } + ) + .to_return(status: 200, body: JSON.generate({"custom_collection" => {"body_html" => "

The best selling ipod ever

", "handle" => "ipods", "updated_at" => "2024-10-02T09:30:37-05:00", "id" => 841564295, "sort_order" => "manual", "title" => "IPods", "template_suffix" => nil, "published_at" => "2008-02-01T19:00:00-05:00", "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295"}}), headers: {}) + + response = custom_collection = ShopifyAPI::CustomCollection.new + custom_collection.id = 841564295 + custom_collection.image = "" + custom_collection.updated_at = "2024-10-02T09:30:36-05:00" + custom_collection.title = "IPods" + custom_collection.handle = "ipods" + custom_collection.body_html = "

The best selling ipod ever

" + custom_collection.published_at = "2008-02-01T19:00:00-05:00" + custom_collection.sort_order = "manual" + custom_collection.template_suffix = nil + custom_collection.published_scope = "web" + custom_collection.admin_graphql_api_id = "gid://shopify/Collection/841564295" + custom_collection.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/841564295.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_13() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/841564295.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "custom_collection" => hash_including({"image" => {"attachment" => "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n", "alt" => "Rails logo"}}) } + ) + .to_return(status: 200, body: JSON.generate({"custom_collection" => {"updated_at" => "2024-10-02T09:30:21-05:00", "id" => 841564295, "title" => "IPods", "handle" => "ipods", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => {"created_at" => "2024-10-02T09:30:21-05:00", "alt" => "Rails logo", "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/fd43f2c8883f6e9b680e3295fd990d2c.gif?v=1704205821"}}}), headers: {}) + + response = custom_collection = ShopifyAPI::CustomCollection.new + custom_collection.id = 841564295 + custom_collection.image = { + "attachment" => "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n", + "alt" => "Rails logo" + } + custom_collection.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/841564295.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_14() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/841564295.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "custom_collection" => hash_including({"image" => {"alt" => "Rails logo"}}) } + ) + .to_return(status: 200, body: JSON.generate({"custom_collection" => {"updated_at" => "2024-10-02T09:30:17-05:00", "id" => 841564295, "title" => "IPods", "handle" => "ipods", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => {"alt" => "Rails logo", "created_at" => "2024-10-02T09:30:16-05:00", "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/rails_logo20241002-28582-3dbsyd.gif?v=1704205817"}}}), headers: {}) + + response = custom_collection = ShopifyAPI::CustomCollection.new + custom_collection.id = 841564295 + custom_collection.image = { + "alt" => "Rails logo" + } + custom_collection.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/841564295.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_15() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/841564295.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "custom_collection" => hash_including({"body_html" => "

5000 songs in your pocket

"}) } + ) + .to_return(status: 200, body: JSON.generate({"custom_collection" => {"body_html" => "

5000 songs in your pocket

", "title" => "IPods", "handle" => "ipods", "id" => 841564295, "updated_at" => "2024-10-02T09:30:27-05:00", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/841564295", "image" => {"created_at" => "2024-10-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"}}}), headers: {}) + + response = custom_collection = ShopifyAPI::CustomCollection.new + custom_collection.id = 841564295 + custom_collection.body_html = "

5000 songs in your pocket

" + custom_collection.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/841564295.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_16() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/841564295.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::CustomCollection.delete( + id: 841564295, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections/841564295.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_17() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "custom_collection" => hash_including({"title" => "IPods", "collects" => [{"product_id" => 921728736}]}) } + ) + .to_return(status: 200, body: JSON.generate({"custom_collection" => {"id" => 1063001330, "handle" => "ipods-1", "title" => "IPods", "updated_at" => "2024-10-02T09:30:23-05:00", "body_html" => nil, "published_at" => "2024-10-02T09:30:23-05:00", "sort_order" => "best-selling", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001330"}}), headers: {}) + + response = custom_collection = ShopifyAPI::CustomCollection.new + custom_collection.title = "IPods" + custom_collection.collects = [ + { + "product_id" => 921728736 + } + ] + custom_collection.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_18() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "custom_collection" => hash_including({"title" => "Macbooks"}) } + ) + .to_return(status: 200, body: JSON.generate({"custom_collection" => {"id" => 1063001335, "handle" => "macbooks", "title" => "Macbooks", "updated_at" => "2024-10-02T09:30:31-05:00", "body_html" => nil, "published_at" => "2024-10-02T09:30:31-05:00", "sort_order" => "best-selling", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001335"}}), headers: {}) + + response = custom_collection = ShopifyAPI::CustomCollection.new + custom_collection.title = "Macbooks" + custom_collection.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_19() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "custom_collection" => hash_including({"title" => "Macbooks", "metafields" => [{"key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"custom_collection" => {"id" => 1063001340, "handle" => "macbooks", "title" => "Macbooks", "updated_at" => "2024-10-02T09:30:44-05:00", "body_html" => nil, "published_at" => "2024-10-02T09:30:44-05:00", "sort_order" => "best-selling", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001340"}}), headers: {}) + + response = custom_collection = ShopifyAPI::CustomCollection.new + custom_collection.title = "Macbooks" + custom_collection.metafields = [ + { + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + } + ] + custom_collection.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_20() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "custom_collection" => hash_including({"title" => "Macbooks", "image" => {"src" => "http://example.com/rails_logo.gif", "alt" => "Rails Logo"}}) } + ) + .to_return(status: 200, body: JSON.generate({"custom_collection" => {"id" => 1063001338, "handle" => "macbooks", "title" => "Macbooks", "updated_at" => "2024-10-02T09:30:34-05:00", "body_html" => nil, "published_at" => "2024-10-02T09:30:34-05:00", "sort_order" => "best-selling", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001338", "image" => {"created_at" => "2024-10-02T09:30:34-05:00", "alt" => "Rails Logo", "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/rails_logo20241002-28582-cm2doy.gif?v=1704205834"}}}), headers: {}) + + response = custom_collection = ShopifyAPI::CustomCollection.new + custom_collection.title = "Macbooks" + custom_collection.image = { + "src" => "http://example.com/rails_logo.gif", + "alt" => "Rails Logo" + } + custom_collection.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_21() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "custom_collection" => hash_including({"title" => "Macbooks", "published" => false}) } + ) + .to_return(status: 200, body: JSON.generate({"custom_collection" => {"id" => 1063001329, "handle" => "macbooks", "title" => "Macbooks", "updated_at" => "2024-10-02T09:30:19-05:00", "body_html" => nil, "published_at" => nil, "sort_order" => "best-selling", "template_suffix" => nil, "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001329"}}), headers: {}) + + response = custom_collection = ShopifyAPI::CustomCollection.new + custom_collection.title = "Macbooks" + custom_collection.published = false + custom_collection.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/custom_collections.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/customer_address_test.rb b/test/rest/2024_10/customer_address_test.rb new file mode 100644 index 00000000..73d3a6f0 --- /dev/null +++ b/test/rest/2024_10/customer_address_test.rb @@ -0,0 +1,318 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class CustomerAddress202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/addresses.json?limit=1") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"addresses" => [{"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}]}), headers: {}) + + response = ShopifyAPI::CustomerAddress.all( + customer_id: 207119551, + limit: "1", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/addresses.json?limit=1") + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/addresses.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"addresses" => [{"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}]}), headers: {}) + + response = ShopifyAPI::CustomerAddress.all( + customer_id: 207119551, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/addresses.json") + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/addresses/207119551.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"customer_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}), headers: {}) + + response = ShopifyAPI::CustomerAddress.find( + customer_id: 207119551, + id: 207119551, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/addresses/207119551.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/addresses/207119551.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "address" => hash_including({"zip" => "90210"}) } + ) + .to_return(status: 200, body: JSON.generate({"customer_address" => {"customer_id" => 207119551, "zip" => "90210", "country" => "United States", "province" => "Kentucky", "city" => "Louisville", "address1" => "Chestnut Street 92", "address2" => "", "first_name" => nil, "last_name" => nil, "company" => nil, "phone" => "555-625-1199", "id" => 207119551, "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}), headers: {}) + + response = customer_address = ShopifyAPI::CustomerAddress.new + customer_address.customer_id = 207119551 + customer_address.id = 207119551 + customer_address.zip = "90210" + customer_address.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/addresses/207119551.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/addresses/207119551.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "address" => hash_including({"address1" => "Apartment 23", "address2" => "Chestnut Street 92"}) } + ) + .to_return(status: 200, body: JSON.generate({"customer_address" => {"customer_id" => 207119551, "address1" => "Apartment 23", "address2" => "Chestnut Street 92", "country" => "United States", "province" => "Kentucky", "zip" => "40202", "city" => "Louisville", "first_name" => nil, "last_name" => nil, "company" => nil, "phone" => "555-625-1199", "id" => 207119551, "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}), headers: {}) + + response = customer_address = ShopifyAPI::CustomerAddress.new + customer_address.customer_id = 207119551 + customer_address.id = 207119551 + customer_address.address1 = "Apartment 23" + customer_address.address2 = "Chestnut Street 92" + customer_address.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/addresses/207119551.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/addresses/1053317322.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::CustomerAddress.delete( + customer_id: 207119551, + id: 1053317322, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/addresses/1053317322.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/addresses.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "address" => hash_including({"address1" => "1 Rue des Carrieres", "address2" => "Suite 1234", "city" => "Montreal", "company" => "Fancy Co.", "first_name" => "Samuel", "last_name" => "de Champlain", "phone" => "819-555-5555", "province" => "Quebec", "country" => "Canada", "zip" => "G1R 4P5", "name" => "Samuel de Champlain", "province_code" => "QC", "country_code" => "CA", "country_name" => "Canada"}) } + ) + .to_return(status: 200, body: JSON.generate({"customer_address" => {"id" => 1053317323, "customer_id" => 207119551, "first_name" => "Samuel", "last_name" => "de Champlain", "company" => "Fancy Co.", "address1" => "1 Rue des Carrieres", "address2" => "Suite 1234", "city" => "Montreal", "province" => "Quebec", "country" => "Canada", "zip" => "G1R 4P5", "phone" => "819-555-5555", "name" => "Samuel de Champlain", "province_code" => "QC", "country_code" => "CA", "country_name" => "Canada", "default" => false}}), headers: {}) + + response = customer_address = ShopifyAPI::CustomerAddress.new + customer_address.customer_id = 207119551 + customer_address.address1 = "1 Rue des Carrieres" + customer_address.address2 = "Suite 1234" + customer_address.city = "Montreal" + customer_address.company = "Fancy Co." + customer_address.first_name = "Samuel" + customer_address.last_name = "de Champlain" + customer_address.phone = "819-555-5555" + customer_address.province = "Quebec" + customer_address.country = "Canada" + customer_address.zip = "G1R 4P5" + customer_address.name = "Samuel de Champlain" + customer_address.province_code = "QC" + customer_address.country_code = "CA" + customer_address.country_name = "Canada" + customer_address.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/addresses.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/addresses/set.json?address_ids%5B%5D=1053317321&operation=destroy") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = customer_address = ShopifyAPI::CustomerAddress.new + customer_address.customer_id = 207119551 + customer_address.set( + address_ids: ["1053317321"], + operation: "destroy", + ) + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/addresses/set.json?address_ids%5B%5D=1053317321&operation=destroy") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/addresses/1053317320/default.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"customer_address" => {"id" => 1053317320, "customer_id" => 207119551, "first_name" => "Bob", "last_name" => "Norman", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "Bob Norman", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}), headers: {}) + + response = customer_address = ShopifyAPI::CustomerAddress.new + customer_address.customer_id = 207119551 + customer_address.id = 1053317320 + customer_address.default + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/addresses/1053317320/default.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/customer_test.rb b/test/rest/2024_10/customer_test.rb new file mode 100644 index 00000000..6626bb76 --- /dev/null +++ b/test/rest/2024_10/customer_test.rb @@ -0,0 +1,1054 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Customer202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers.json?ids=207119551%2C1073339482") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"customers" => [{"id" => 1073339482, "email" => "steve.lastnameson@example.com", "created_at" => "2024-10-02T09:24:09-05:00", "updated_at" => "2024-10-02T09:24:09-05:00", "first_name" => "Steve", "last_name" => "Lastnameson", "orders_count" => 0, "state" => "disabled", "total_spent" => "0.00", "last_order_id" => nil, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "", "last_order_name" => nil, "currency" => "USD", "phone" => "+15142546011", "addresses" => [{"id" => 1053317315, "customer_id" => 1073339482, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => nil, "address1" => "123 Oak St", "address2" => nil, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true}], "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => nil}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => nil, "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/1073339482", "default_address" => {"id" => 1053317315, "customer_id" => 1073339482, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => nil, "address1" => "123 Oak St", "address2" => nil, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true}}, {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T09:23:53-05:00", "updated_at" => "2024-10-02T09:23:53-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [{"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}], "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T09:23:53-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}]}), headers: {}) + + response = ShopifyAPI::Customer.all( + ids: "207119551,1073339482", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers.json?ids=207119551%2C1073339482") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers.json?since_id=207119551") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"customers" => [{"id" => 1073339472, "email" => "steve.lastnameson@example.com", "created_at" => "2024-10-02T09:16:09-05:00", "updated_at" => "2024-10-02T09:16:09-05:00", "first_name" => "Steve", "last_name" => "Lastnameson", "orders_count" => 0, "state" => "disabled", "total_spent" => "0.00", "last_order_id" => nil, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "", "last_order_name" => nil, "currency" => "USD", "phone" => "+15142546011", "addresses" => [{"id" => 1053317305, "customer_id" => 1073339472, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => nil, "address1" => "123 Oak St", "address2" => nil, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true}], "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => nil}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => nil, "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/1073339472", "default_address" => {"id" => 1053317305, "customer_id" => 1073339472, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => nil, "address1" => "123 Oak St", "address2" => nil, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true}}]}), headers: {}) + + response = ShopifyAPI::Customer.all( + since_id: "207119551", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers.json?since_id=207119551") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers.json?updated_at_min=2024-10-01+14%3A27%3A15") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"customers" => [{"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T09:26:59-05:00", "updated_at" => "2024-10-02T09:26:59-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [{"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}], "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T09:26:59-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}]}), headers: {}) + + response = ShopifyAPI::Customer.all( + updated_at_min: "2024-10-01 14:27:15", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers.json?updated_at_min=2024-10-01+14%3A27%3A15") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"customers" => [{"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T09:17:48-05:00", "updated_at" => "2024-10-02T09:17:48-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [{"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}], "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T09:17:48-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}]}), headers: {}) + + response = ShopifyAPI::Customer.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers.json?fields=id%2Cemail%2Ctags") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"customers" => [{"id" => 207119551, "email" => "bob.norman@mail.example.com", "tags" => "L\u00E9on, No\u00EBl"}]}), headers: {}) + + response = ShopifyAPI::Customer.all( + fields: "id,email,tags", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers.json?fields=id%2Cemail%2Ctags") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/search.json?query=email%3Abob.norman%40mail.example.com") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"customers" => [{"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T09:21:37-05:00", "updated_at" => "2024-10-02T09:21:37-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [{"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}], "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T09:21:37-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}]}), headers: {}) + + response = ShopifyAPI::Customer.search( + query: "email:bob.norman@mail.example.com", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/search.json?query=email%3Abob.norman%40mail.example.com") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/search.json?fields=id%2C+email%2C+first_name%2C+last_name&query=last_name%3ANorman") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"customers" => [{"id" => 207119551, "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman"}]}), headers: {}) + + response = ShopifyAPI::Customer.search( + fields: "id, email, first_name, last_name", + query: "last_name:Norman", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/search.json?fields=id%2C+email%2C+first_name%2C+last_name&query=last_name%3ANorman") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/search.json?fields=id%2C+email%2C+first_name%2C+last_name%2C+tags&query=customer_tag%3ANew+Customer") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"customers" => [{"id" => 1073339474, "email" => "isabella.garcia@example.com", "first_name" => "Isabella", "last_name" => "Garcia", "tags" => "New Customer"}]}), headers: {}) + + response = ShopifyAPI::Customer.search( + fields: "id, email, first_name, last_name, tags", + query: "customer_tag:New Customer", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/search.json?fields=id%2C+email%2C+first_name%2C+last_name%2C+tags&query=customer_tag%3ANew+Customer") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/search.json?query=first_name%3ABob+country%3AUnited+States") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"customers" => [{"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T09:13:58-05:00", "updated_at" => "2024-10-02T09:13:58-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [{"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}], "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T09:13:58-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}]}), headers: {}) + + response = ShopifyAPI::Customer.search( + query: "first_name:Bob country:United States", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/search.json?query=first_name%3ABob+country%3AUnited+States") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/search.json?query=email%3A%2A%40mail.example.com") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"customers" => [{"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T09:26:43-05:00", "updated_at" => "2024-10-02T09:26:43-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [{"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}], "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T09:26:43-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}]}), headers: {}) + + response = ShopifyAPI::Customer.search( + query: "email:*@mail.example.com", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/search.json?query=email%3A%2A%40mail.example.com") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_11() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/search.json?fields=id%2C+email%2C+first_name%2C+last_name%2C+verified_email&query=verified_email%3Atrue") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"customers" => [{"id" => 1073339479, "email" => "isabella.garcia@example.com", "first_name" => "Isabella", "last_name" => "Garcia", "verified_email" => true}, {"id" => 207119551, "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "verified_email" => true}]}), headers: {}) + + response = ShopifyAPI::Customer.search( + fields: "id, email, first_name, last_name, verified_email", + query: "verified_email:true", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/search.json?fields=id%2C+email%2C+first_name%2C+last_name%2C+verified_email&query=verified_email%3Atrue") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_12() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T09:20:49-05:00", "updated_at" => "2024-10-02T09:20:49-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [{"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}], "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T09:20:49-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}), headers: {}) + + response = ShopifyAPI::Customer.find( + id: 207119551, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_13() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "customer" => hash_including({"metafields" => [{"key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"customer" => {"email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "id" => 207119551, "accepts_marketing" => false, "created_at" => "2024-10-02T09:24:29-05:00", "updated_at" => "2024-10-02T09:24:29-05:00", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [{"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}], "accepts_marketing_updated_at" => "2005-06-12T11:57:11-04:00", "marketing_opt_in_level" => nil, "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T09:24:29-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}), headers: {}) + + response = customer = ShopifyAPI::Customer.new + customer.id = 207119551 + customer.metafields = [ + { + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + } + ] + customer.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_14() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "customer" => hash_including({"accepts_marketing" => true, "accepts_marketing_updated_at" => "2023-12-30T09:13:25-05:00", "marketing_opt_in_level" => "confirmed_opt_in"}) } + ) + .to_return(status: 200, body: JSON.generate({"customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "accepts_marketing" => true, "created_at" => "2024-10-02T09:13:11-05:00", "updated_at" => "2024-10-02T09:13:26-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [{"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}], "accepts_marketing_updated_at" => "2023-12-30T09:13:25-05:00", "marketing_opt_in_level" => "confirmed_opt_in", "tax_exemptions" => [], "email_marketing_consent" => {"state" => "subscribed", "opt_in_level" => "confirmed_opt_in", "consent_updated_at" => "2023-12-30T09:13:25-05:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T09:13:11-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}), headers: {}) + + response = customer = ShopifyAPI::Customer.new + customer.id = 207119551 + customer.accepts_marketing = true + customer.accepts_marketing_updated_at = "2023-12-30T09:13:25-05:00" + customer.marketing_opt_in_level = "confirmed_opt_in" + customer.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_15() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "customer" => hash_including({"tags" => "New Customer, Repeat Customer"}) } + ) + .to_return(status: 200, body: JSON.generate({"customer" => {"email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "id" => 207119551, "accepts_marketing" => false, "created_at" => "2024-10-02T09:25:37-05:00", "updated_at" => "2024-10-02T09:25:37-05:00", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "New Customer, Repeat Customer", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [{"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}], "accepts_marketing_updated_at" => "2005-06-12T11:57:11-04:00", "marketing_opt_in_level" => nil, "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T09:25:37-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}), headers: {}) + + response = customer = ShopifyAPI::Customer.new + customer.id = 207119551 + customer.tags = "New Customer, Repeat Customer" + customer.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_16() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "customer" => hash_including({"email" => "changed@example.com", "note" => "Customer is a great guy"}) } + ) + .to_return(status: 200, body: JSON.generate({"customer" => {"email" => "changed@example.com", "note" => "Customer is a great guy", "first_name" => "Bob", "last_name" => "Norman", "id" => 207119551, "accepts_marketing" => false, "created_at" => "2024-10-02T09:27:53-05:00", "updated_at" => "2024-10-02T09:28:08-05:00", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "addresses" => [{"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}], "accepts_marketing_updated_at" => "2024-10-02T09:28:08-05:00", "marketing_opt_in_level" => nil, "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => nil}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T09:27:53-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}), headers: {}) + + response = customer = ShopifyAPI::Customer.new + customer.id = 207119551 + customer.email = "changed@example.com" + customer.note = "Customer is a great guy" + customer.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_17() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Customer.delete( + id: 207119551, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_18() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/customers.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "customer" => hash_including({"first_name" => "Steve", "last_name" => "Lastnameson", "email" => "steve.lastnameson@example.com", "phone" => "+15142546011", "verified_email" => true, "addresses" => [{"address1" => "123 Oak St", "city" => "Ottawa", "province" => "ON", "phone" => "555-1212", "zip" => "123 ABC", "last_name" => "Lastnameson", "first_name" => "Mother", "country" => "CA"}], "password" => "newpass", "password_confirmation" => "newpass", "send_email_welcome" => false}) } + ) + .to_return(status: 200, body: JSON.generate({"customer" => {"id" => 1073339470, "email" => "steve.lastnameson@example.com", "accepts_marketing" => false, "created_at" => "2024-10-02T09:12:20-05:00", "updated_at" => "2024-10-02T09:12:20-05:00", "first_name" => "Steve", "last_name" => "Lastnameson", "orders_count" => 0, "state" => "enabled", "total_spent" => "0.00", "last_order_id" => nil, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "", "last_order_name" => nil, "currency" => "USD", "phone" => "+15142546011", "addresses" => [{"id" => 1053317303, "customer_id" => 1073339470, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => nil, "address1" => "123 Oak St", "address2" => nil, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true}], "accepts_marketing_updated_at" => "2024-10-02T09:12:20-05:00", "marketing_opt_in_level" => nil, "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => nil}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => nil, "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/1073339470", "default_address" => {"id" => 1053317303, "customer_id" => 1073339470, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => nil, "address1" => "123 Oak St", "address2" => nil, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true}}}), headers: {}) + + response = customer = ShopifyAPI::Customer.new + customer.first_name = "Steve" + customer.last_name = "Lastnameson" + customer.email = "steve.lastnameson@example.com" + customer.phone = "+15142546011" + customer.verified_email = true + customer.addresses = [ + { + "address1" => "123 Oak St", + "city" => "Ottawa", + "province" => "ON", + "phone" => "555-1212", + "zip" => "123 ABC", + "last_name" => "Lastnameson", + "first_name" => "Mother", + "country" => "CA" + } + ] + customer.password = "newpass" + customer.password_confirmation = "newpass" + customer.send_email_welcome = false + customer.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/customers.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_19() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/customers.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "customer" => hash_including({"first_name" => "Steve", "last_name" => "Lastnameson", "email" => "steve.lastnameson@example.com", "phone" => "+15142546011", "verified_email" => true, "addresses" => [{"address1" => "123 Oak St", "city" => "Ottawa", "province" => "ON", "phone" => "555-1212", "zip" => "123 ABC", "last_name" => "Lastnameson", "first_name" => "Mother", "country" => "CA"}], "send_email_invite" => true}) } + ) + .to_return(status: 200, body: JSON.generate({"customer" => {"id" => 1073339475, "email" => "steve.lastnameson@example.com", "accepts_marketing" => false, "created_at" => "2024-10-02T09:19:10-05:00", "updated_at" => "2024-10-02T09:19:10-05:00", "first_name" => "Steve", "last_name" => "Lastnameson", "orders_count" => 0, "state" => "disabled", "total_spent" => "0.00", "last_order_id" => nil, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "", "last_order_name" => nil, "currency" => "USD", "phone" => "+15142546011", "addresses" => [{"id" => 1053317308, "customer_id" => 1073339475, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => nil, "address1" => "123 Oak St", "address2" => nil, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true}], "accepts_marketing_updated_at" => "2024-10-02T09:19:10-05:00", "marketing_opt_in_level" => nil, "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => nil}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => nil, "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/1073339475", "default_address" => {"id" => 1053317308, "customer_id" => 1073339475, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => nil, "address1" => "123 Oak St", "address2" => nil, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true}}}), headers: {}) + + response = customer = ShopifyAPI::Customer.new + customer.first_name = "Steve" + customer.last_name = "Lastnameson" + customer.email = "steve.lastnameson@example.com" + customer.phone = "+15142546011" + customer.verified_email = true + customer.addresses = [ + { + "address1" => "123 Oak St", + "city" => "Ottawa", + "province" => "ON", + "phone" => "555-1212", + "zip" => "123 ABC", + "last_name" => "Lastnameson", + "first_name" => "Mother", + "country" => "CA" + } + ] + customer.send_email_invite = true + customer.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/customers.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_20() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/customers.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "customer" => hash_including({"first_name" => "Steve", "last_name" => "Lastnameson", "email" => "steve.lastnameson@example.com", "phone" => "+15142546011", "verified_email" => true, "addresses" => [{"address1" => "123 Oak St", "city" => "Ottawa", "province" => "ON", "phone" => "555-1212", "zip" => "123 ABC", "last_name" => "Lastnameson", "first_name" => "Mother", "country" => "CA"}], "metafields" => [{"key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"customer" => {"id" => 1073339484, "email" => "steve.lastnameson@example.com", "accepts_marketing" => false, "created_at" => "2024-10-02T09:26:43-05:00", "updated_at" => "2024-10-02T09:26:43-05:00", "first_name" => "Steve", "last_name" => "Lastnameson", "orders_count" => 0, "state" => "disabled", "total_spent" => "0.00", "last_order_id" => nil, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "", "last_order_name" => nil, "currency" => "USD", "phone" => "+15142546011", "addresses" => [{"id" => 1053317317, "customer_id" => 1073339484, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => nil, "address1" => "123 Oak St", "address2" => nil, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true}], "accepts_marketing_updated_at" => "2024-10-02T09:26:43-05:00", "marketing_opt_in_level" => nil, "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => nil}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => nil, "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/1073339484", "default_address" => {"id" => 1053317317, "customer_id" => 1073339484, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => nil, "address1" => "123 Oak St", "address2" => nil, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true}}}), headers: {}) + + response = customer = ShopifyAPI::Customer.new + customer.first_name = "Steve" + customer.last_name = "Lastnameson" + customer.email = "steve.lastnameson@example.com" + customer.phone = "+15142546011" + customer.verified_email = true + customer.addresses = [ + { + "address1" => "123 Oak St", + "city" => "Ottawa", + "province" => "ON", + "phone" => "555-1212", + "zip" => "123 ABC", + "last_name" => "Lastnameson", + "first_name" => "Mother", + "country" => "CA" + } + ] + customer.metafields = [ + { + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + } + ] + customer.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/customers.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_21() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/customers.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "customer" => hash_including({"first_name" => "Steve", "last_name" => "Lastnameson", "email" => "steve.lastnameson@example.com", "phone" => "+15142546011", "verified_email" => true, "addresses" => [{"address1" => "123 Oak St", "city" => "Ottawa", "province" => "ON", "phone" => "555-1212", "zip" => "123 ABC", "last_name" => "Lastnameson", "first_name" => "Mother", "country" => "CA"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"customer" => {"id" => 1073339476, "email" => "steve.lastnameson@example.com", "accepts_marketing" => false, "created_at" => "2024-10-02T09:20:33-05:00", "updated_at" => "2024-10-02T09:20:33-05:00", "first_name" => "Steve", "last_name" => "Lastnameson", "orders_count" => 0, "state" => "disabled", "total_spent" => "0.00", "last_order_id" => nil, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "", "last_order_name" => nil, "currency" => "USD", "phone" => "+15142546011", "addresses" => [{"id" => 1053317309, "customer_id" => 1073339476, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => nil, "address1" => "123 Oak St", "address2" => nil, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true}], "accepts_marketing_updated_at" => "2024-10-02T09:20:33-05:00", "marketing_opt_in_level" => nil, "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => nil}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => nil, "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/1073339476", "default_address" => {"id" => 1053317309, "customer_id" => 1073339476, "first_name" => "Mother", "last_name" => "Lastnameson", "company" => nil, "address1" => "123 Oak St", "address2" => nil, "city" => "Ottawa", "province" => "Ontario", "country" => "Canada", "zip" => "123 ABC", "phone" => "555-1212", "name" => "Mother Lastnameson", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true}}}), headers: {}) + + response = customer = ShopifyAPI::Customer.new + customer.first_name = "Steve" + customer.last_name = "Lastnameson" + customer.email = "steve.lastnameson@example.com" + customer.phone = "+15142546011" + customer.verified_email = true + customer.addresses = [ + { + "address1" => "123 Oak St", + "city" => "Ottawa", + "province" => "ON", + "phone" => "555-1212", + "zip" => "123 ABC", + "last_name" => "Lastnameson", + "first_name" => "Mother", + "country" => "CA" + } + ] + customer.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/customers.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_22() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/account_activation_url.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"account_activation_url" => "https://jsmith.myshopify.com/account/activate/207119551/56271022a23ff6168cad2270ccbf967d-1704205002"}), headers: {}) + + response = customer = ShopifyAPI::Customer.new + customer.id = 207119551 + customer.account_activation_url + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/account_activation_url.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_23() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/send_invite.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: hash_including({"customer_invite" => {"to" => "new_test_email@shopify.com", "from" => "j.limited@example.com", "bcc" => ["j.limited@example.com"], "subject" => "Welcome to my new shop", "custom_message" => "My awesome new store"}}) + ) + .to_return(status: 200, body: JSON.generate({"customer_invite" => {"to" => "new_test_email@shopify.com", "from" => "j.limited@example.com", "subject" => "Welcome to my new shop", "custom_message" => "My awesome new store", "bcc" => ["j.limited@example.com"]}}), headers: {}) + + response = customer = ShopifyAPI::Customer.new + customer.id = 207119551 + customer.send_invite( + body: {"customer_invite" => {"to" => "new_test_email@shopify.com", "from" => "j.limited@example.com", "bcc" => ["j.limited@example.com"], "subject" => "Welcome to my new shop", "custom_message" => "My awesome new store"}}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/send_invite.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_24() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/send_invite.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: hash_including({"customer_invite" => {}}) + ) + .to_return(status: 200, body: JSON.generate({"customer_invite" => {"to" => "bob.norman@mail.example.com", "from" => "j.smith@example.com", "subject" => "Customer account activation", "custom_message" => "", "bcc" => []}}), headers: {}) + + response = customer = ShopifyAPI::Customer.new + customer.id = 207119551 + customer.send_invite( + body: {"customer_invite" => {}}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/send_invite.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_25() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 1}), headers: {}) + + response = ShopifyAPI::Customer.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_26() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/count.json?updated_at_min=2024-10-01+14%3A20%3A49") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 1}), headers: {}) + + response = ShopifyAPI::Customer.count( + updated_at_min: "2024-10-01 14:20:49", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/count.json?updated_at_min=2024-10-01+14%3A20%3A49") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_27() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/count.json?created_at_min=2024-10-01+14%3A28%3A25") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 1}), headers: {}) + + response = ShopifyAPI::Customer.count( + created_at_min: "2024-10-01 14:28:25", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/count.json?created_at_min=2024-10-01+14%3A28%3A25") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_28() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/orders.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"orders" => [{"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => nil, "confirmation_number" => nil, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "3.33", "current_total_discounts_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.65", "current_total_price_set" => {"shop_money" => {"amount" => "199.65", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.65", "currency_code" => "USD"}}, "current_total_tax" => "3.98", "current_total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2008-01-10T11:00:00-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T09:24:45-05:00", "updated_at" => "2024-10-02T09:24:45-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T09:24:45-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T09:24:45-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T09:24:45-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-10-02T09:24:45-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-10-02T09:24:45-05:00", "restock" => true, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => 548380009, "order_adjustments" => [], "transactions" => [{"id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => nil, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => {}, "source_name" => "web", "status" => "success", "test" => false, "user_id" => nil}], "refund_line_items" => [{"id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}]}), headers: {}) + + response = ShopifyAPI::Customer.orders( + id: 207119551, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/orders.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_29() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/orders.json?status=any") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"orders" => [{"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => nil, "confirmation_number" => nil, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "3.33", "current_total_discounts_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.65", "current_total_price_set" => {"shop_money" => {"amount" => "199.65", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.65", "currency_code" => "USD"}}, "current_total_tax" => "3.98", "current_total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2008-01-10T11:00:00-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T09:18:20-05:00", "updated_at" => "2024-10-02T09:18:20-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T09:18:20-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T09:18:20-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T09:18:20-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-10-02T09:18:20-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-10-02T09:18:20-05:00", "restock" => true, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => 548380009, "order_adjustments" => [], "transactions" => [{"id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => nil, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => {}, "source_name" => "web", "status" => "success", "test" => false, "user_id" => nil}], "refund_line_items" => [{"id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}]}), headers: {}) + + response = ShopifyAPI::Customer.orders( + id: 207119551, + status: "any", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/orders.json?status=any") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/deprecated_api_call_test.rb b/test/rest/2024_10/deprecated_api_call_test.rb new file mode 100644 index 00000000..b1f30cdc --- /dev/null +++ b/test/rest/2024_10/deprecated_api_call_test.rb @@ -0,0 +1,62 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class DeprecatedApiCall202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/deprecated_api_calls.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"data_updated_at" => "2020-10-13T00:15:30Z", "deprecated_api_calls" => [{"api_type" => "REST", "description" => "The page filter has been removed from multiple endpoints. Use cursor-based pagination instead.", "documentation_url" => "https://shopify.dev/api/usage/pagination-rest", "endpoint" => "Product", "last_call_at" => "2020-06-12T03:46:18Z", "migration_deadline" => "2020-07-02T13:00:00Z", "graphql_schema_name" => nil, "version" => "2019-07"}]}), headers: {}) + + response = ShopifyAPI::DeprecatedApiCall.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/deprecated_api_calls.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/discount_code_test.rb b/test/rest/2024_10/discount_code_test.rb new file mode 100644 index 00000000..a8520812 --- /dev/null +++ b/test/rest/2024_10/discount_code_test.rb @@ -0,0 +1,327 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class DiscountCode202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175/discount_codes.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "discount_code" => hash_including({"code" => "SUMMERSALE10OFF"}) } + ) + .to_return(status: 200, body: JSON.generate({"discount_code" => {"id" => 1054381139, "price_rule_id" => 507328175, "code" => "SUMMERSALE10OFF", "usage_count" => 0, "created_at" => "2024-10-02T08:58:18-05:00", "updated_at" => "2024-10-02T08:58:18-05:00"}}), headers: {}) + + response = discount_code = ShopifyAPI::DiscountCode.new + discount_code.price_rule_id = 507328175 + discount_code.code = "SUMMERSALE10OFF" + discount_code.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175/discount_codes.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175/discount_codes.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"discount_codes" => [{"id" => 507328175, "price_rule_id" => 507328175, "code" => "SUMMERSALE10OFF", "usage_count" => 0, "created_at" => "2024-10-02T08:56:04-05:00", "updated_at" => "2024-10-02T08:56:04-05:00"}]}), headers: {}) + + response = ShopifyAPI::DiscountCode.all( + price_rule_id: 507328175, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175/discount_codes.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175/discount_codes/507328175.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "discount_code" => hash_including({"code" => "WINTERSALE20OFF"}) } + ) + .to_return(status: 200, body: JSON.generate({"discount_code" => {"id" => 507328175, "price_rule_id" => 507328175, "code" => "WINTERSALE20OFF", "usage_count" => 0, "created_at" => "2024-10-02T08:56:04-05:00", "updated_at" => "2024-10-02T08:58:12-05:00"}}), headers: {}) + + response = discount_code = ShopifyAPI::DiscountCode.new + discount_code.price_rule_id = 507328175 + discount_code.id = 507328175 + discount_code.code = "WINTERSALE20OFF" + discount_code.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175/discount_codes/507328175.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175/discount_codes/507328175.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"discount_code" => {"id" => 507328175, "price_rule_id" => 507328175, "code" => "SUMMERSALE10OFF", "usage_count" => 0, "created_at" => "2024-10-02T08:56:04-05:00", "updated_at" => "2024-10-02T08:56:04-05:00"}}), headers: {}) + + response = ShopifyAPI::DiscountCode.find( + price_rule_id: 507328175, + id: 507328175, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175/discount_codes/507328175.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175/discount_codes/507328175.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::DiscountCode.delete( + price_rule_id: 507328175, + id: 507328175, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175/discount_codes/507328175.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/discount_codes/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 2}), headers: {}) + + response = ShopifyAPI::DiscountCode.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/discount_codes/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175/batch.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: hash_including({"discount_codes" => [{"code" => "SUMMER1"}, {"code" => "SUMMER2"}, {"code" => "SUMMER3"}]}) + ) + .to_return(status: 200, body: JSON.generate({"discount_code_creation" => {"id" => 989355119, "price_rule_id" => 507328175, "started_at" => nil, "completed_at" => nil, "created_at" => "2024-10-02T08:58:20-05:00", "updated_at" => "2024-10-02T08:58:20-05:00", "status" => "queued", "codes_count" => 3, "imported_count" => 0, "failed_count" => 0, "logs" => []}}), headers: {}) + + response = discount_code = ShopifyAPI::DiscountCode.new + discount_code.price_rule_id = 507328175 + discount_code.batch( + body: {"discount_codes" => [{"code" => "SUMMER1"}, {"code" => "SUMMER2"}, {"code" => "SUMMER3"}]}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175/batch.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175/batch/173232803.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"discount_code_creation" => {"id" => 173232803, "price_rule_id" => 507328175, "started_at" => nil, "completed_at" => nil, "created_at" => "2024-10-02T08:56:04-05:00", "updated_at" => "2024-10-02T08:56:04-05:00", "status" => "queued", "codes_count" => 3, "imported_count" => 0, "failed_count" => 0, "logs" => []}}), headers: {}) + + response = ShopifyAPI::DiscountCode.get_all( + price_rule_id: 507328175, + batch_id: 173232803, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175/batch/173232803.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175/batch/173232803/discount_codes.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"discount_codes" => [{"id" => nil, "code" => "foo", "errors" => {}}, {"id" => nil, "code" => "", "errors" => {}}, {"id" => nil, "code" => "bar", "errors" => {}}]}), headers: {}) + + response = ShopifyAPI::DiscountCode.all( + price_rule_id: 507328175, + batch_id: 173232803, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175/batch/173232803/discount_codes.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/dispute_evidence_test.rb b/test/rest/2024_10/dispute_evidence_test.rb new file mode 100644 index 00000000..af8844bb --- /dev/null +++ b/test/rest/2024_10/dispute_evidence_test.rb @@ -0,0 +1,153 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class DisputeEvidence202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/disputes/598735659/dispute_evidences.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"dispute_evidence" => {"id" => 819974671, "payments_dispute_id" => 598735659, "access_activity_log" => nil, "billing_address" => {"id" => 867402159, "address1" => "123 Amoebobacterieae St", "address2" => "", "city" => "Ottawa", "province" => "Ontario", "province_code" => "ON", "country" => "Canada", "country_code" => "CA", "zip" => "K2P0V6"}, "cancellation_policy_disclosure" => nil, "cancellation_rebuttal" => nil, "customer_email_address" => "example@shopify.com", "customer_first_name" => "Kermit", "customer_last_name" => "the Frog", "product_description" => "Product name: Draft\nTitle: 151cm\nPrice: $10.00\nQuantity: 1\nProduct Description: good board", "refund_policy_disclosure" => nil, "refund_refusal_explanation" => nil, "shipping_address" => {"id" => 867402159, "address1" => "123 Amoebobacterieae St", "address2" => "", "city" => "Ottawa", "province" => "Ontario", "province_code" => "ON", "country" => "Canada", "country_code" => "CA", "zip" => "K2P0V6"}, "uncategorized_text" => "Sample uncategorized text", "created_at" => "2023-10-03T13:17:01-04:00", "updated_at" => "2023-10-03T13:19:24-04:00", "submitted_by_merchant_on" => nil, "fulfillments" => [{"shipping_carrier" => "UPS", "shipping_tracking_number" => "1234", "shipping_date" => "2017-01-01"}, {"shipping_carrier" => "FedEx", "shipping_tracking_number" => "4321", "shipping_date" => "2017-01-02"}], "dispute_evidence_files" => {"cancellation_policy_file_id" => nil, "customer_communication_file_id" => 539650252, "customer_signature_file_id" => 799719586, "refund_policy_file_id" => nil, "service_documentation_file_id" => nil, "shipping_documentation_file_id" => 799719586, "uncategorized_file_id" => 567271523}}}), headers: {}) + + response = ShopifyAPI::DisputeEvidence.find( + dispute_id: 598735659, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/disputes/598735659/dispute_evidences.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/disputes/598735659/dispute_evidences.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "dispute_evidence" => hash_including({"submit_evidence" => true}) } + ) + .to_return(status: 200, body: JSON.generate({"dispute_evidence" => {"id" => 819974671, "payments_dispute_id" => 598735659, "access_activity_log" => nil, "billing_address" => {"id" => 867402159, "address1" => "123 Amoebobacterieae St", "address2" => "", "city" => "Ottawa", "province" => "Ontario", "province_code" => "ON", "country" => "Canada", "country_code" => "CA", "zip" => "K2P0V6"}, "cancellation_policy_disclosure" => nil, "cancellation_rebuttal" => nil, "customer_email_address" => "example@shopify.com", "customer_first_name" => "Kermit", "customer_last_name" => "the Frog", "product_description" => "Product name: Draft\nTitle: 151cm\nPrice: $10.00\nQuantity: 1\nProduct Description: good board", "refund_policy_disclosure" => nil, "refund_refusal_explanation" => nil, "shipping_address" => {"id" => 867402159, "address1" => "123 Amoebobacterieae St", "address2" => "", "city" => "Ottawa", "province" => "Ontario", "province_code" => "ON", "country" => "Canada", "country_code" => "CA", "zip" => "K2P0V6"}, "uncategorized_text" => "Sample uncategorized text", "created_at" => "2023-10-03T13:17:01-04:00", "updated_at" => "2023-10-03T13:19:26-04:00", "submitted_by_merchant_on" => "2023-10-03T13:19:26-04:00", "fulfillments" => [{"shipping_carrier" => "UPS", "shipping_tracking_number" => "1234", "shipping_date" => "2017-01-01"}, {"shipping_carrier" => "FedEx", "shipping_tracking_number" => "4321", "shipping_date" => "2017-01-02"}], "dispute_evidence_files" => {"cancellation_policy_file_id" => nil, "customer_communication_file_id" => 539650252, "customer_signature_file_id" => 799719586, "refund_policy_file_id" => nil, "service_documentation_file_id" => nil, "shipping_documentation_file_id" => 799719586, "uncategorized_file_id" => 567271523}}}), headers: {}) + + response = dispute_evidence = ShopifyAPI::DisputeEvidence.new + dispute_evidence.dispute_id = 598735659 + dispute_evidence.submit_evidence = true + dispute_evidence.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/disputes/598735659/dispute_evidences.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/disputes/598735659/dispute_evidences.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "dispute_evidence" => hash_including({"access_activity_log" => "https://example.com/access-activity-log", "cancellation_policy_disclosure" => "https://example.com/cancellation-policy", "cancellation_rebuttal" => "https://example.com/cancellation-rebuttal", "customer_email_address" => "customer@example.com", "customer_first_name" => "John", "customer_last_name" => "Doe", "refund_policy_disclosure" => "https://example.com/refund-policy", "refund_refusal_explanation" => "Product must have receipt of proof of purchase", "uncategorized_text" => "Any additional notes", "shipping_address_attributes" => {"address1" => "1 Infinite Loop", "address2" => "Muppet Studio", "city" => "Cupertino", "zip" => "95014", "country_code" => "US", "province_code" => "CA"}, "fulfillments_attributes" => [{"shipping_carrier" => "FedEx", "shipping_tracking_number" => 4321, "shipping_date" => "2017-01-02T13:00:00+00:00"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"dispute_evidence" => {"id" => 819974671, "payments_dispute_id" => 598735659, "access_activity_log" => "https://example.com/access-activity-log", "billing_address" => {"id" => 867402159, "address1" => "1 Infinite Loop", "address2" => "Muppet Studio", "city" => "Cupertino", "province" => "California", "province_code" => "CA", "country" => "United States", "country_code" => "US", "zip" => "95014"}, "cancellation_policy_disclosure" => "https://example.com/cancellation-policy", "cancellation_rebuttal" => "https://example.com/cancellation-rebuttal", "customer_email_address" => "customer@example.com", "customer_first_name" => "John", "customer_last_name" => "Doe", "product_description" => "Product name: Draft\nTitle: 151cm\nPrice: $10.00\nQuantity: 1\nProduct Description: good board", "refund_policy_disclosure" => "https://example.com/refund-policy", "refund_refusal_explanation" => "Product must have receipt of proof of purchase", "shipping_address" => {"id" => 867402159, "address1" => "1 Infinite Loop", "address2" => "Muppet Studio", "city" => "Cupertino", "province" => "California", "province_code" => "CA", "country" => "United States", "country_code" => "US", "zip" => "95014"}, "uncategorized_text" => "Any additional notes", "created_at" => "2023-10-03T13:17:01-04:00", "updated_at" => "2023-10-03T13:19:24-04:00", "submitted_by_merchant_on" => nil, "fulfillments" => [{"shipping_carrier" => "UPS", "shipping_tracking_number" => "1234", "shipping_date" => "2017-01-01"}, {"shipping_carrier" => "FedEx", "shipping_tracking_number" => "4321", "shipping_date" => "2017-01-02"}, {"shipping_carrier" => "FedEx", "shipping_tracking_number" => "4321", "shipping_date" => "2017-01-02"}], "dispute_evidence_files" => {"cancellation_policy_file_id" => nil, "customer_communication_file_id" => 539650252, "customer_signature_file_id" => 799719586, "refund_policy_file_id" => nil, "service_documentation_file_id" => nil, "shipping_documentation_file_id" => 799719586, "uncategorized_file_id" => 567271523}}}), headers: {}) + + response = dispute_evidence = ShopifyAPI::DisputeEvidence.new + dispute_evidence.dispute_id = 598735659 + dispute_evidence.access_activity_log = "https://example.com/access-activity-log" + dispute_evidence.cancellation_policy_disclosure = "https://example.com/cancellation-policy" + dispute_evidence.cancellation_rebuttal = "https://example.com/cancellation-rebuttal" + dispute_evidence.customer_email_address = "customer@example.com" + dispute_evidence.customer_first_name = "John" + dispute_evidence.customer_last_name = "Doe" + dispute_evidence.refund_policy_disclosure = "https://example.com/refund-policy" + dispute_evidence.refund_refusal_explanation = "Product must have receipt of proof of purchase" + dispute_evidence.uncategorized_text = "Any additional notes" + dispute_evidence.shipping_address_attributes = { + "address1" => "1 Infinite Loop", + "address2" => "Muppet Studio", + "city" => "Cupertino", + "zip" => "95014", + "country_code" => "US", + "province_code" => "CA" + } + dispute_evidence.fulfillments_attributes = [ + { + "shipping_carrier" => "FedEx", + "shipping_tracking_number" => 4321, + "shipping_date" => "2017-01-02T13:00:00+00:00" + } + ] + dispute_evidence.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/disputes/598735659/dispute_evidences.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/dispute_file_upload_test.rb b/test/rest/2024_10/dispute_file_upload_test.rb new file mode 100644 index 00000000..765e279b --- /dev/null +++ b/test/rest/2024_10/dispute_file_upload_test.rb @@ -0,0 +1,101 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class DisputeFileUpload202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/disputes/598735659/dispute_file_uploads.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "dispute_file_upload" => hash_including({"document_type" => "uncategorized_file", "filename" => "test.pdf", "mimetype" => "application/pdf", "data" => "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ZW5kc3RyZWFtCmVuZG9iagoyMSAwIG9iagoxNTk1MgplbmRvYmoKMjIgMCBvYmoKKExvcmVtIElwc3VtKQplbmRvYmoKMjMgMCBvYmoKKE1hYyBPUyBYIDEwLjEwIFF1YXJ0eiBQREZDb250ZXh0KQplbmRvYmoKMjQgMCBvYmoKKFNob3BpZnkgSW5jKQplbmRvYmoKMjUgMCBvYmoKKCkKZW5kb2JqCjI2IDAgb2JqCihXb3JkKQplbmRvYmoKMjcgMCBvYmoKKEQ6MjAxNDExMjUyMTM4NDlaMDAnMDAnKQplbmRvYmoKMjggMCBvYmoKKCkKZW5kb2JqCjI5IDAgb2JqClsgKCkgXQplbmRvYmoKMSAwIG9iago8PCAvVGl0bGUgMjIgMCBSIC9BdXRob3IgMjQgMCBSIC9TdWJqZWN0IDI1IDAgUiAvUHJvZHVjZXIgMjMgMCBSIC9DcmVhdG9yCjI2IDAgUiAvQ3JlYXRpb25EYXRlIDI3IDAgUiAvTW9kRGF0ZSAyNyAwIFIgL0tleXdvcmRzIDI4IDAgUiAvQUFQTDpLZXl3b3JkcwoyOSAwIFIgPj4KZW5kb2JqCnhyZWYKMCAzMAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMzM1NzYgMDAwMDAgbiAKMDAwMDAwNjg4NSAwMDAwMCBuIAowMDAwMDA5ODcwIDAwMDAwIG4gCjAwMDAwMDAwMjIgMDAwMDAgbiAKMDAwMDAwNjg2NSAwMDAwMCBuIAowMDAwMDA2OTg5IDAwMDAwIG4gCjAwMDAwMDk4MzQgMDAwMDAgbiAKMDAwMDAxNjU4NyAwMDAwMCBuIAowMDAwMDAwMDAwIDAwMDAwIG4gCjAwMDAwMTAwMDMgMDAwMDAgbiAKMDAwMDAwNzA5OCAwMDAwMCBuIAowMDAwMDA5ODEzIDAwMDAwIG4gCjAwMDAwMDk5NTMgMDAwMDAgbiAKMDAwMDAxMDQ5NSAwMDAwMCBuIAowMDAwMDEwMTY2IDAwMDAwIG4gCjAwMDAwMTA0NzUgMDAwMDAgbiAKMDAwMDAxMDczMyAwMDAwMCBuIAowMDAwMDE2NTY2IDAwMDAwIG4gCjAwMDAwMTcwMTQgMDAwMDAgbiAKMDAwMDAxNzI3NCAwMDAwMCBuIAowMDAwMDMzMzE3IDAwMDAwIG4gCjAwMDAwMzMzMzkgMDAwMDAgbiAKMDAwMDAzMzM2OSAwMDAwMCBuIAowMDAwMDMzNDIwIDAwMDAwIG4gCjAwMDAwMzM0NTAgMDAwMDAgbiAKMDAwMDAzMzQ2OSAwMDAwMCBuIAowMDAwMDMzNDkyIDAwMDAwIG4gCjAwMDAwMzM1MzQgMDAwMDAgbiAKMDAwMDAzMzU1MyAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDMwIC9Sb290IDEzIDAgUiAvSW5mbyAxIDAgUiAvSUQgWyA8YWFkYjdhZjU5ZjIxNWE0Y2U4Y2QzZWIwYzFiNmNjNTc+CjxhYWRiN2FmNTlmMjE1YTRjZThjZDNlYjBjMWI2Y2M1Nz4gXSA+PgpzdGFydHhyZWYKMzM3NTEKJSVFT0YK"}) } + ) + .to_return(status: 200, body: JSON.generate({"dispute_file_upload" => {"id" => 1047018778, "shop_id" => 220006451, "file_size" => 34509, "file_type" => "application/pdf", "original_filename" => "test.pdf", "filename" => "e93db761-74c1-4d3a-9a31-1c98510fee6e.pdf", "created_at" => "2024-10-05T08:50:34-05:00", "updated_at" => "2024-10-05T08:50:34-05:00", "dispute_evidence_id" => 819974671, "dispute_evidence_type" => "uncategorized_file", "url" => "https://unittest.storage.googleapis.com/s/files/1/0002/2000/6451/payments_file_uploads/e93db761-74c1-4d3a-9a31-1c98510fee6e.pdf?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=shopify-core-gcs-test%40shopify-tiers.iam.gserviceaccount.com%2F20200912%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2024-10-05T13:50:34Z&X-Goog-Expires=604800&X-Goog-SignedHeaders=host&response-content-disposition=&X-Goog-Signature=87811646776a232917997f6a4595871d9123629da45d35b2b915e7210eececff55a58147e79ac636861617cc21b5a2f\n 6e5ea6547d9a20e9503e64caca84c9043ecccbf27d20142118017c60d2418edb7896c53eb466335fca\n 9153d8d73c15645962eace819a3588301d55bcbc5b4ecf2225561de914b104e2069daa400e741a59a\n 306d094f7b147c0ae2215f8203e4ce20a907c983a2e4be074c584725bd1c9e399f633499531160dac25\n b34054527795ef5ea48a4ac1d392585d4bc0976d62cab57e18d33547c9110599f39368983e4c88275790\n 0bac1eddcb41b87d4d26269bfe01b0161ef0a81088a0e4d6596380f4d3d37e4e72a8c5fefc6bc07551efb59"}}), headers: {}) + + response = dispute_file_upload = ShopifyAPI::DisputeFileUpload.new + dispute_file_upload.dispute_id = 598735659 + dispute_file_upload.document_type = "uncategorized_file" + dispute_file_upload.filename = "test.pdf" + dispute_file_upload.mimetype = "application/pdf" + dispute_file_upload.data = "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ZW5kc3RyZWFtCmVuZG9iagoyMSAwIG9iagoxNTk1MgplbmRvYmoKMjIgMCBvYmoKKExvcmVtIElwc3VtKQplbmRvYmoKMjMgMCBvYmoKKE1hYyBPUyBYIDEwLjEwIFF1YXJ0eiBQREZDb250ZXh0KQplbmRvYmoKMjQgMCBvYmoKKFNob3BpZnkgSW5jKQplbmRvYmoKMjUgMCBvYmoKKCkKZW5kb2JqCjI2IDAgb2JqCihXb3JkKQplbmRvYmoKMjcgMCBvYmoKKEQ6MjAxNDExMjUyMTM4NDlaMDAnMDAnKQplbmRvYmoKMjggMCBvYmoKKCkKZW5kb2JqCjI5IDAgb2JqClsgKCkgXQplbmRvYmoKMSAwIG9iago8PCAvVGl0bGUgMjIgMCBSIC9BdXRob3IgMjQgMCBSIC9TdWJqZWN0IDI1IDAgUiAvUHJvZHVjZXIgMjMgMCBSIC9DcmVhdG9yCjI2IDAgUiAvQ3JlYXRpb25EYXRlIDI3IDAgUiAvTW9kRGF0ZSAyNyAwIFIgL0tleXdvcmRzIDI4IDAgUiAvQUFQTDpLZXl3b3JkcwoyOSAwIFIgPj4KZW5kb2JqCnhyZWYKMCAzMAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMzM1NzYgMDAwMDAgbiAKMDAwMDAwNjg4NSAwMDAwMCBuIAowMDAwMDA5ODcwIDAwMDAwIG4gCjAwMDAwMDAwMjIgMDAwMDAgbiAKMDAwMDAwNjg2NSAwMDAwMCBuIAowMDAwMDA2OTg5IDAwMDAwIG4gCjAwMDAwMDk4MzQgMDAwMDAgbiAKMDAwMDAxNjU4NyAwMDAwMCBuIAowMDAwMDAwMDAwIDAwMDAwIG4gCjAwMDAwMTAwMDMgMDAwMDAgbiAKMDAwMDAwNzA5OCAwMDAwMCBuIAowMDAwMDA5ODEzIDAwMDAwIG4gCjAwMDAwMDk5NTMgMDAwMDAgbiAKMDAwMDAxMDQ5NSAwMDAwMCBuIAowMDAwMDEwMTY2IDAwMDAwIG4gCjAwMDAwMTA0NzUgMDAwMDAgbiAKMDAwMDAxMDczMyAwMDAwMCBuIAowMDAwMDE2NTY2IDAwMDAwIG4gCjAwMDAwMTcwMTQgMDAwMDAgbiAKMDAwMDAxNzI3NCAwMDAwMCBuIAowMDAwMDMzMzE3IDAwMDAwIG4gCjAwMDAwMzMzMzkgMDAwMDAgbiAKMDAwMDAzMzM2OSAwMDAwMCBuIAowMDAwMDMzNDIwIDAwMDAwIG4gCjAwMDAwMzM0NTAgMDAwMDAgbiAKMDAwMDAzMzQ2OSAwMDAwMCBuIAowMDAwMDMzNDkyIDAwMDAwIG4gCjAwMDAwMzM1MzQgMDAwMDAgbiAKMDAwMDAzMzU1MyAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDMwIC9Sb290IDEzIDAgUiAvSW5mbyAxIDAgUiAvSUQgWyA8YWFkYjdhZjU5ZjIxNWE0Y2U4Y2QzZWIwYzFiNmNjNTc+CjxhYWRiN2FmNTlmMjE1YTRjZThjZDNlYjBjMWI2Y2M1Nz4gXSA+PgpzdGFydHhyZWYKMzM3NTEKJSVFT0YK" + dispute_file_upload.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/disputes/598735659/dispute_file_uploads.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/disputes/598735659/dispute_file_uploads/799719586.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::DisputeFileUpload.delete( + dispute_id: 598735659, + id: 799719586, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/disputes/598735659/dispute_file_uploads/799719586.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/dispute_test.rb b/test/rest/2024_10/dispute_test.rb new file mode 100644 index 00000000..7cc649a1 --- /dev/null +++ b/test/rest/2024_10/dispute_test.rb @@ -0,0 +1,158 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Dispute202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/disputes.json?initiated_at=2013-05-03") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"disputes" => []}), headers: {}) + + response = ShopifyAPI::Dispute.all( + initiated_at: "2013-05-03", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/disputes.json?initiated_at=2013-05-03") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/disputes.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"disputes" => [{"id" => 1052608616, "order_id" => nil, "type" => "chargeback", "amount" => "100.00", "currency" => "USD", "reason" => "fraudulent", "network_reason_code" => "4827", "status" => "won", "evidence_due_by" => "2013-07-03T19:00:00-04:00", "evidence_sent_on" => "2013-07-04T07:00:00-04:00", "finalized_on" => nil, "initiated_at" => "2013-05-03T20:00:00-04:00"}, {"id" => 815713555, "order_id" => 625362839, "type" => "chargeback", "amount" => "11.50", "currency" => "USD", "reason" => "credit_not_processed", "network_reason_code" => "4827", "status" => "needs_response", "evidence_due_by" => "2024-10-14T19:00:00-05:00", "evidence_sent_on" => nil, "finalized_on" => nil, "initiated_at" => "2013-05-03T20:00:00-04:00"}, {"id" => 782360659, "order_id" => 625362839, "type" => "chargeback", "amount" => "11.50", "currency" => "USD", "reason" => "fraudulent", "network_reason_code" => "4827", "status" => "won", "evidence_due_by" => "2013-07-03T19:00:00-04:00", "evidence_sent_on" => "2013-07-04T07:00:00-04:00", "finalized_on" => nil, "initiated_at" => "2013-05-03T20:00:00-04:00"}, {"id" => 670893524, "order_id" => 625362839, "type" => "inquiry", "amount" => "11.50", "currency" => "USD", "reason" => "fraudulent", "network_reason_code" => "4827", "status" => "needs_response", "evidence_due_by" => nil, "evidence_sent_on" => nil, "finalized_on" => nil, "initiated_at" => "2013-05-03T20:00:00-04:00"}, {"id" => 598735659, "order_id" => 625362839, "type" => "chargeback", "amount" => "11.50", "currency" => "USD", "reason" => "fraudulent", "network_reason_code" => "4827", "status" => "needs_response", "evidence_due_by" => "2024-10-14T19:00:00-05:00", "evidence_sent_on" => nil, "finalized_on" => nil, "initiated_at" => "2013-05-03T20:00:00-04:00"}, {"id" => 297752803, "order_id" => 625362839, "type" => "chargeback", "amount" => "100.00", "currency" => "USD", "reason" => "fraudulent", "network_reason_code" => "4827", "status" => "lost", "evidence_due_by" => "2024-10-14T19:00:00-05:00", "evidence_sent_on" => nil, "finalized_on" => nil, "initiated_at" => "2013-05-03T20:00:00-04:00"}, {"id" => 85190714, "order_id" => 625362839, "type" => "chargeback", "amount" => "11.50", "currency" => "USD", "reason" => "fraudulent", "network_reason_code" => "4827", "status" => "under_review", "evidence_due_by" => "2024-10-14T19:00:00-05:00", "evidence_sent_on" => "2024-10-01T19:00:00-05:00", "finalized_on" => nil, "initiated_at" => "2013-05-03T20:00:00-04:00"}, {"id" => 46484353, "order_id" => 625362839, "type" => "chargeback", "amount" => "100.00", "currency" => "USD", "reason" => "fraudulent", "network_reason_code" => "4827", "status" => "lost", "evidence_due_by" => "2024-10-14T19:00:00-05:00", "evidence_sent_on" => nil, "finalized_on" => nil, "initiated_at" => "2013-05-03T20:00:00-04:00"}, {"id" => 35982383, "order_id" => 625362839, "type" => "chargeback", "amount" => "11.50", "currency" => "USD", "reason" => "subscription_canceled", "network_reason_code" => "4827", "status" => "needs_response", "evidence_due_by" => "2024-10-14T19:00:00-05:00", "evidence_sent_on" => nil, "finalized_on" => nil, "initiated_at" => "2013-05-03T20:00:00-04:00"}]}), headers: {}) + + response = ShopifyAPI::Dispute.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/disputes.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/disputes.json?status=won") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"disputes" => [{"id" => 1052608616, "order_id" => nil, "type" => "chargeback", "amount" => "100.00", "currency" => "USD", "reason" => "fraudulent", "network_reason_code" => "4827", "status" => "won", "evidence_due_by" => "2013-07-03T19:00:00-04:00", "evidence_sent_on" => "2013-07-04T07:00:00-04:00", "finalized_on" => nil, "initiated_at" => "2013-05-03T20:00:00-04:00"}, {"id" => 782360659, "order_id" => 625362839, "type" => "chargeback", "amount" => "11.50", "currency" => "USD", "reason" => "fraudulent", "network_reason_code" => "4827", "status" => "won", "evidence_due_by" => "2013-07-03T19:00:00-04:00", "evidence_sent_on" => "2013-07-04T07:00:00-04:00", "finalized_on" => nil, "initiated_at" => "2013-05-03T20:00:00-04:00"}]}), headers: {}) + + response = ShopifyAPI::Dispute.all( + status: "won", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/disputes.json?status=won") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/disputes/598735659.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"dispute" => {"id" => 598735659, "order_id" => 625362839, "type" => "chargeback", "amount" => "11.50", "currency" => "USD", "reason" => "fraudulent", "network_reason_code" => "4827", "status" => "needs_response", "evidence_due_by" => "2024-10-14T19:00:00-05:00", "evidence_sent_on" => nil, "finalized_on" => nil, "initiated_at" => "2013-05-03T20:00:00-04:00"}}), headers: {}) + + response = ShopifyAPI::Dispute.find( + id: 598735659, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/disputes/598735659.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/draft_order_test.rb b/test/rest/2024_10/draft_order_test.rb new file mode 100644 index 00000000..8d77a28d --- /dev/null +++ b/test/rest/2024_10/draft_order_test.rb @@ -0,0 +1,712 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class DraftOrder202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "draft_order" => hash_including({"line_items" => [{"title" => "Custom Tee", "price" => "20.00", "quantity" => 2}], "applied_discount" => {"description" => "Custom discount", "value_type" => "fixed_amount", "value" => "10.0", "amount" => "10.00", "title" => "Custom"}, "customer" => {"id" => 207119551}, "use_customer_default_address" => true}) } + ) + .to_return(status: 200, body: JSON.generate({"draft_order" => {"id" => 1069920477, "note" => nil, "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => nil, "created_at" => "2024-10-02T09:10:48-05:00", "updated_at" => "2024-10-02T09:10:48-05:00", "tax_exempt" => false, "completed_at" => nil, "name" => "#D3", "status" => "open", "line_items" => [{"id" => 1066630382, "variant_id" => nil, "product_id" => nil, "title" => "Custom Tee", "variant_title" => nil, "sku" => nil, "vendor" => nil, "quantity" => 2, "requires_shipping" => false, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 0, "tax_lines" => [], "applied_discount" => nil, "name" => "Custom Tee", "properties" => [], "custom" => true, "price" => "20.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/1066630382"}], "shipping_address" => {"first_name" => nil, "address1" => "Chestnut Street 92", "phone" => "555-625-1199", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => nil, "address2" => "", "company" => nil, "latitude" => nil, "longitude" => nil, "name" => "", "country_code" => "US", "province_code" => "KY"}, "billing_address" => {"first_name" => nil, "address1" => "Chestnut Street 92", "phone" => "555-625-1199", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => nil, "address2" => "", "company" => nil, "latitude" => nil, "longitude" => nil, "name" => "", "country_code" => "US", "province_code" => "KY"}, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/71a3b2c9278fdea9bedb7e0b95656ccc", "applied_discount" => {"description" => "Custom discount", "value" => "10.0", "title" => "Custom", "amount" => "10.00", "value_type" => "fixed_amount"}, "order_id" => nil, "shipping_line" => nil, "tax_lines" => [], "tags" => "", "note_attributes" => [], "total_price" => "30.00", "subtotal_price" => "30.00", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => {"shop_money" => {"amount" => "40.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "40.00", "currency_code" => "USD"}}, "total_price_set" => {"shop_money" => {"amount" => "30.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "30.00", "currency_code" => "USD"}}, "subtotal_price_set" => {"shop_money" => {"amount" => "30.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "30.00", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_additional_fees_set" => nil, "total_duties_set" => nil, "payment_terms" => nil, "admin_graphql_api_id" => "gid://shopify/DraftOrder/1069920477", "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}}), headers: {}) + + response = draft_order = ShopifyAPI::DraftOrder.new + draft_order.line_items = [ + { + "title" => "Custom Tee", + "price" => "20.00", + "quantity" => 2 + } + ] + draft_order.applied_discount = { + "description" => "Custom discount", + "value_type" => "fixed_amount", + "value" => "10.0", + "amount" => "10.00", + "title" => "Custom" + } + draft_order.customer = { + "id" => 207119551 + } + draft_order.use_customer_default_address = true + draft_order.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "draft_order" => hash_including({"line_items" => [{"title" => "Custom Tee", "price" => "20.00", "quantity" => 1, "applied_discount" => {"description" => "Custom discount", "value_type" => "percentage", "value" => "10.0", "amount" => "2.0", "title" => "Custom"}}]}) } + ) + .to_return(status: 200, body: JSON.generate({"draft_order" => {"id" => 1069920479, "note" => nil, "email" => nil, "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => nil, "created_at" => "2024-10-02T09:10:50-05:00", "updated_at" => "2024-10-02T09:10:50-05:00", "tax_exempt" => false, "completed_at" => nil, "name" => "#D3", "status" => "open", "line_items" => [{"id" => 1066630384, "variant_id" => nil, "product_id" => nil, "title" => "Custom Tee", "variant_title" => nil, "sku" => nil, "vendor" => nil, "quantity" => 1, "requires_shipping" => false, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 0, "tax_lines" => [{"rate" => 0.05, "title" => "GST", "price" => "0.90"}, {"rate" => 0.08, "title" => "Tax", "price" => "1.44"}], "applied_discount" => {"description" => "Custom discount", "value" => "10.0", "title" => "Custom", "amount" => "2.00", "value_type" => "percentage"}, "name" => "Custom Tee", "properties" => [], "custom" => true, "price" => "20.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/1066630384"}], "shipping_address" => nil, "billing_address" => nil, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/e94febf78f1a10336ee6d9324631578c", "applied_discount" => nil, "order_id" => nil, "shipping_line" => nil, "tax_lines" => [{"rate" => 0.05, "title" => "GST", "price" => "0.90"}, {"rate" => 0.08, "title" => "Tax", "price" => "1.44"}], "tags" => "", "note_attributes" => [], "total_price" => "20.34", "subtotal_price" => "18.00", "total_tax" => "2.34", "presentment_currency" => "USD", "total_line_items_price_set" => {"shop_money" => {"amount" => "20.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "20.00", "currency_code" => "USD"}}, "total_price_set" => {"shop_money" => {"amount" => "20.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "20.34", "currency_code" => "USD"}}, "subtotal_price_set" => {"shop_money" => {"amount" => "18.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "18.00", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "2.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "2.34", "currency_code" => "USD"}}, "total_discounts_set" => {"shop_money" => {"amount" => "2.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "2.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_additional_fees_set" => nil, "total_duties_set" => nil, "payment_terms" => nil, "admin_graphql_api_id" => "gid://shopify/DraftOrder/1069920479"}}), headers: {}) + + response = draft_order = ShopifyAPI::DraftOrder.new + draft_order.line_items = [ + { + "title" => "Custom Tee", + "price" => "20.00", + "quantity" => 1, + "applied_discount" => { + "description" => "Custom discount", + "value_type" => "percentage", + "value" => "10.0", + "amount" => "2.0", + "title" => "Custom" + } + } + ] + draft_order.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "draft_order" => hash_including({"line_items" => [{"title" => "Custom Tee", "price" => "20.00", "quantity" => 2}], "customer" => {"id" => 207119551}, "use_customer_default_address" => true}) } + ) + .to_return(status: 200, body: JSON.generate({"draft_order" => {"id" => 1069920475, "note" => nil, "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => nil, "created_at" => "2024-10-02T09:10:43-05:00", "updated_at" => "2024-10-02T09:10:43-05:00", "tax_exempt" => false, "completed_at" => nil, "name" => "#D3", "status" => "open", "line_items" => [{"id" => 1066630380, "variant_id" => nil, "product_id" => nil, "title" => "Custom Tee", "variant_title" => nil, "sku" => nil, "vendor" => nil, "quantity" => 2, "requires_shipping" => false, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 0, "tax_lines" => [], "applied_discount" => nil, "name" => "Custom Tee", "properties" => [], "custom" => true, "price" => "20.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/1066630380"}], "shipping_address" => {"first_name" => nil, "address1" => "Chestnut Street 92", "phone" => "555-625-1199", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => nil, "address2" => "", "company" => nil, "latitude" => nil, "longitude" => nil, "name" => "", "country_code" => "US", "province_code" => "KY"}, "billing_address" => {"first_name" => nil, "address1" => "Chestnut Street 92", "phone" => "555-625-1199", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => nil, "address2" => "", "company" => nil, "latitude" => nil, "longitude" => nil, "name" => "", "country_code" => "US", "province_code" => "KY"}, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/4428445c4fe9ad579aba5483d01bc543", "applied_discount" => nil, "order_id" => nil, "shipping_line" => nil, "tax_lines" => [], "tags" => "", "note_attributes" => [], "total_price" => "40.00", "subtotal_price" => "40.00", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => {"shop_money" => {"amount" => "40.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "40.00", "currency_code" => "USD"}}, "total_price_set" => {"shop_money" => {"amount" => "40.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "40.00", "currency_code" => "USD"}}, "subtotal_price_set" => {"shop_money" => {"amount" => "40.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "40.00", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_additional_fees_set" => nil, "total_duties_set" => nil, "payment_terms" => nil, "admin_graphql_api_id" => "gid://shopify/DraftOrder/1069920475", "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}}), headers: {}) + + response = draft_order = ShopifyAPI::DraftOrder.new + draft_order.line_items = [ + { + "title" => "Custom Tee", + "price" => "20.00", + "quantity" => 2 + } + ] + draft_order.customer = { + "id" => 207119551 + } + draft_order.use_customer_default_address = true + draft_order.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "draft_order" => hash_including({"line_items" => [{"variant_id" => 447654529, "quantity" => 1}], "billing_address" => {"first_name" => "Bob", "last_name" => "Norman", "address1" => "123 Main St", "city" => "Anytown", "province" => "ON", "country" => "Canada", "zip" => "A1B2C3", "phone" => "555-555-5555"}}) } + ) + .to_return(status: 200, body: JSON.generate({"draft_order" => {"id" => 1069920480, "note" => nil, "email" => nil, "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => nil, "created_at" => "2024-10-02T09:10:52-05:00", "updated_at" => "2024-10-02T09:10:52-05:00", "tax_exempt" => false, "completed_at" => nil, "name" => "#D3", "status" => "open", "line_items" => [{"id" => 1066630386, "variant_id" => 447654529, "product_id" => 921728736, "title" => "IPod Touch 8GB", "variant_title" => "Black", "sku" => "IPOD2009BLACK", "vendor" => "Apple", "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "shipwire-app", "grams" => 567, "tax_lines" => [{"rate" => 0.05, "title" => "GST", "price" => "9.95"}, {"rate" => 0.08, "title" => "Tax", "price" => "15.92"}], "applied_discount" => nil, "name" => "IPod Touch 8GB - Black", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/1066630386"}], "shipping_address" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "123 Main St", "phone" => "555-555-5555", "city" => "Anytown", "zip" => "A1B2C3", "province" => "Ontario", "country" => "Canada", "last_name" => "Norman", "address2" => nil, "company" => nil, "latitude" => nil, "longitude" => nil, "name" => "Bob Norman", "country_code" => "CA", "province_code" => "ON"}, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/97f6f75a03ba21b525d331e6ab39471d", "applied_discount" => nil, "order_id" => nil, "shipping_line" => nil, "tax_lines" => [{"rate" => 0.05, "title" => "GST", "price" => "9.95"}, {"rate" => 0.08, "title" => "Tax", "price" => "15.92"}], "tags" => "", "note_attributes" => [], "total_price" => "224.87", "subtotal_price" => "199.00", "total_tax" => "25.87", "presentment_currency" => "USD", "total_line_items_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_price_set" => {"shop_money" => {"amount" => "224.87", "currency_code" => "USD"}, "presentment_money" => {"amount" => "224.87", "currency_code" => "USD"}}, "subtotal_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "25.87", "currency_code" => "USD"}, "presentment_money" => {"amount" => "25.87", "currency_code" => "USD"}}, "total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_additional_fees_set" => nil, "total_duties_set" => nil, "payment_terms" => nil, "admin_graphql_api_id" => "gid://shopify/DraftOrder/1069920480", "customer" => {"id" => 1073339469, "email" => nil, "created_at" => "2024-10-02T09:10:52-05:00", "updated_at" => "2024-10-02T09:10:52-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 0, "state" => "disabled", "total_spent" => "0.00", "last_order_id" => nil, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "", "last_order_name" => nil, "currency" => "USD", "phone" => nil, "tax_exemptions" => [], "email_marketing_consent" => nil, "sms_marketing_consent" => nil, "admin_graphql_api_id" => "gid://shopify/Customer/1073339469", "default_address" => {"id" => 1053317302, "customer_id" => 1073339469, "first_name" => "Bob", "last_name" => "Norman", "company" => nil, "address1" => "123 Main St", "address2" => nil, "city" => "Anytown", "province" => nil, "country" => "Canada", "zip" => "A1B2C3", "phone" => "555-555-5555", "name" => "Bob Norman", "province_code" => nil, "country_code" => "CA", "country_name" => "Canada", "default" => true}}}}), headers: {}) + + response = draft_order = ShopifyAPI::DraftOrder.new + draft_order.line_items = [ + { + "variant_id" => 447654529, + "quantity" => 1 + } + ] + draft_order.billing_address = { + "first_name" => "Bob", + "last_name" => "Norman", + "address1" => "123 Main St", + "city" => "Anytown", + "province" => "ON", + "country" => "Canada", + "zip" => "A1B2C3", + "phone" => "555-555-5555" + } + draft_order.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "draft_order" => hash_including({"line_items" => [{"variant_id" => 447654529, "quantity" => 1}], "shipping_address" => {"first_name" => "Bob", "last_name" => "Norman", "address1" => "123 Main St", "city" => "Anytown", "province" => "ON", "country" => "Canada", "zip" => "A1B2C3", "phone" => "555-555-5555"}}) } + ) + .to_return(status: 200, body: JSON.generate({"draft_order" => {"id" => 1069920478, "note" => nil, "email" => nil, "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => nil, "created_at" => "2024-10-02T09:10:49-05:00", "updated_at" => "2024-10-02T09:10:49-05:00", "tax_exempt" => false, "completed_at" => nil, "name" => "#D3", "status" => "open", "line_items" => [{"id" => 1066630383, "variant_id" => 447654529, "product_id" => 921728736, "title" => "IPod Touch 8GB", "variant_title" => "Black", "sku" => "IPOD2009BLACK", "vendor" => "Apple", "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "shipwire-app", "grams" => 567, "tax_lines" => [{"rate" => 0.05, "title" => "GST", "price" => "9.95"}, {"rate" => 0.08, "title" => "Tax", "price" => "15.92"}], "applied_discount" => nil, "name" => "IPod Touch 8GB - Black", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/1066630383"}], "shipping_address" => {"first_name" => "Bob", "address1" => "123 Main St", "phone" => "555-555-5555", "city" => "Anytown", "zip" => "A1B2C3", "province" => "Ontario", "country" => "Canada", "last_name" => "Norman", "address2" => nil, "company" => nil, "latitude" => nil, "longitude" => nil, "name" => "Bob Norman", "country_code" => "CA", "province_code" => "ON"}, "billing_address" => nil, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/042547bc7babd96e87b1a54f888c263c", "applied_discount" => nil, "order_id" => nil, "shipping_line" => nil, "tax_lines" => [{"rate" => 0.05, "title" => "GST", "price" => "9.95"}, {"rate" => 0.08, "title" => "Tax", "price" => "15.92"}], "tags" => "", "note_attributes" => [], "total_price" => "224.87", "subtotal_price" => "199.00", "total_tax" => "25.87", "presentment_currency" => "USD", "total_line_items_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_price_set" => {"shop_money" => {"amount" => "224.87", "currency_code" => "USD"}, "presentment_money" => {"amount" => "224.87", "currency_code" => "USD"}}, "subtotal_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "25.87", "currency_code" => "USD"}, "presentment_money" => {"amount" => "25.87", "currency_code" => "USD"}}, "total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_additional_fees_set" => nil, "total_duties_set" => nil, "payment_terms" => nil, "admin_graphql_api_id" => "gid://shopify/DraftOrder/1069920478", "customer" => {"id" => 1073339468, "email" => nil, "created_at" => "2024-10-02T09:10:48-05:00", "updated_at" => "2024-10-02T09:10:48-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 0, "state" => "disabled", "total_spent" => "0.00", "last_order_id" => nil, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "", "last_order_name" => nil, "currency" => "USD", "phone" => nil, "tax_exemptions" => [], "email_marketing_consent" => nil, "sms_marketing_consent" => nil, "admin_graphql_api_id" => "gid://shopify/Customer/1073339468", "default_address" => {"id" => 1053317301, "customer_id" => 1073339468, "first_name" => "Bob", "last_name" => "Norman", "company" => nil, "address1" => "123 Main St", "address2" => nil, "city" => "Anytown", "province" => nil, "country" => "Canada", "zip" => "A1B2C3", "phone" => "555-555-5555", "name" => "Bob Norman", "province_code" => nil, "country_code" => "CA", "country_name" => "Canada", "default" => true}}}}), headers: {}) + + response = draft_order = ShopifyAPI::DraftOrder.new + draft_order.line_items = [ + { + "variant_id" => 447654529, + "quantity" => 1 + } + ] + draft_order.shipping_address = { + "first_name" => "Bob", + "last_name" => "Norman", + "address1" => "123 Main St", + "city" => "Anytown", + "province" => "ON", + "country" => "Canada", + "zip" => "A1B2C3", + "phone" => "555-555-5555" + } + draft_order.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "draft_order" => hash_including({"line_items" => [{"title" => "Custom Tee", "price" => "20.00", "quantity" => 1, "applied_discount" => {"description" => "Custom discount", "value_type" => "fixed_amount", "value" => "10.0", "amount" => "10.0", "title" => "Custom"}}]}) } + ) + .to_return(status: 200, body: JSON.generate({"draft_order" => {"id" => 1069920481, "note" => nil, "email" => nil, "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => nil, "created_at" => "2024-10-02T09:10:57-05:00", "updated_at" => "2024-10-02T09:10:57-05:00", "tax_exempt" => false, "completed_at" => nil, "name" => "#D3", "status" => "open", "line_items" => [{"id" => 1066630387, "variant_id" => nil, "product_id" => nil, "title" => "Custom Tee", "variant_title" => nil, "sku" => nil, "vendor" => nil, "quantity" => 1, "requires_shipping" => false, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 0, "tax_lines" => [{"rate" => 0.05, "title" => "GST", "price" => "0.50"}, {"rate" => 0.08, "title" => "Tax", "price" => "0.80"}], "applied_discount" => {"description" => "Custom discount", "value" => "10.0", "title" => "Custom", "amount" => "10.00", "value_type" => "fixed_amount"}, "name" => "Custom Tee", "properties" => [], "custom" => true, "price" => "20.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/1066630387"}], "shipping_address" => nil, "billing_address" => nil, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/0b86f66c5aa866b1727b1c2263a6469a", "applied_discount" => nil, "order_id" => nil, "shipping_line" => nil, "tax_lines" => [{"rate" => 0.05, "title" => "GST", "price" => "0.50"}, {"rate" => 0.08, "title" => "Tax", "price" => "0.80"}], "tags" => "", "note_attributes" => [], "total_price" => "11.30", "subtotal_price" => "10.00", "total_tax" => "1.30", "presentment_currency" => "USD", "total_line_items_price_set" => {"shop_money" => {"amount" => "20.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "20.00", "currency_code" => "USD"}}, "total_price_set" => {"shop_money" => {"amount" => "11.30", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.30", "currency_code" => "USD"}}, "subtotal_price_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "1.30", "currency_code" => "USD"}, "presentment_money" => {"amount" => "1.30", "currency_code" => "USD"}}, "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_additional_fees_set" => nil, "total_duties_set" => nil, "payment_terms" => nil, "admin_graphql_api_id" => "gid://shopify/DraftOrder/1069920481"}}), headers: {}) + + response = draft_order = ShopifyAPI::DraftOrder.new + draft_order.line_items = [ + { + "title" => "Custom Tee", + "price" => "20.00", + "quantity" => 1, + "applied_discount" => { + "description" => "Custom discount", + "value_type" => "fixed_amount", + "value" => "10.0", + "amount" => "10.0", + "title" => "Custom" + } + } + ] + draft_order.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "draft_order" => hash_including({"line_items" => [{"variant_id" => 447654529, "quantity" => 1}]}) } + ) + .to_return(status: 200, body: JSON.generate({"draft_order" => {"id" => 1069920476, "note" => nil, "email" => nil, "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => nil, "created_at" => "2024-10-02T09:10:47-05:00", "updated_at" => "2024-10-02T09:10:47-05:00", "tax_exempt" => false, "completed_at" => nil, "name" => "#D3", "status" => "open", "line_items" => [{"id" => 1066630381, "variant_id" => 447654529, "product_id" => 921728736, "title" => "IPod Touch 8GB", "variant_title" => "Black", "sku" => "IPOD2009BLACK", "vendor" => "Apple", "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "shipwire-app", "grams" => 567, "tax_lines" => [{"rate" => 0.05, "title" => "GST", "price" => "9.95"}, {"rate" => 0.08, "title" => "Tax", "price" => "15.92"}], "applied_discount" => nil, "name" => "IPod Touch 8GB - Black", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/1066630381"}], "shipping_address" => nil, "billing_address" => nil, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/1f6cd8830766f66541635bf86efbf290", "applied_discount" => nil, "order_id" => nil, "shipping_line" => nil, "tax_lines" => [{"rate" => 0.05, "title" => "GST", "price" => "9.95"}, {"rate" => 0.08, "title" => "Tax", "price" => "15.92"}], "tags" => "", "note_attributes" => [], "total_price" => "224.87", "subtotal_price" => "199.00", "total_tax" => "25.87", "presentment_currency" => "USD", "total_line_items_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_price_set" => {"shop_money" => {"amount" => "224.87", "currency_code" => "USD"}, "presentment_money" => {"amount" => "224.87", "currency_code" => "USD"}}, "subtotal_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "25.87", "currency_code" => "USD"}, "presentment_money" => {"amount" => "25.87", "currency_code" => "USD"}}, "total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_additional_fees_set" => nil, "total_duties_set" => nil, "payment_terms" => nil, "admin_graphql_api_id" => "gid://shopify/DraftOrder/1069920476"}}), headers: {}) + + response = draft_order = ShopifyAPI::DraftOrder.new + draft_order.line_items = [ + { + "variant_id" => 447654529, + "quantity" => 1 + } + ] + draft_order.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"draft_orders" => [{"id" => 72885271, "note" => "rush order", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "tax_exempt" => false, "completed_at" => nil, "name" => "#D1", "status" => "completed", "line_items" => [{"id" => 498266019, "variant_id" => 39072856, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "green", "sku" => "IPOD2008GREEN", "vendor" => nil, "quantity" => 2, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => nil, "name" => "IPod Nano - 8gb - green", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/498266019"}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/f945c7e2b158dbb69fa642cb8d79171f", "applied_discount" => nil, "order_id" => 450789469, "shipping_line" => nil, "tax_lines" => [], "tags" => "", "note_attributes" => [], "total_price" => "408.00", "subtotal_price" => "398.00", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => {"shop_money" => {"amount" => "398.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "398.00", "currency_code" => "USD"}}, "total_price_set" => {"shop_money" => {"amount" => "408.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "408.00", "currency_code" => "USD"}}, "subtotal_price_set" => {"shop_money" => {"amount" => "398.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "398.00", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_additional_fees_set" => nil, "total_duties_set" => nil, "payment_terms" => nil, "admin_graphql_api_id" => "gid://shopify/DraftOrder/72885271", "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}, {"id" => 622762746, "note" => "rush order", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "tax_exempt" => false, "completed_at" => nil, "name" => "#D1", "status" => "open", "line_items" => [{"id" => 466157049, "variant_id" => 39072856, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "green", "sku" => "IPOD2008GREEN", "vendor" => nil, "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => nil, "name" => "IPod Nano - 8gb - green", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/466157049"}, {"id" => 605833968, "variant_id" => nil, "product_id" => nil, "title" => "IPod Nano Engraving", "variant_title" => nil, "sku" => "IPODENGRAVING", "vendor" => nil, "quantity" => 1, "requires_shipping" => false, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 0, "tax_lines" => [], "applied_discount" => nil, "name" => "IPod Nano Engraving", "properties" => [], "custom" => true, "price" => "30.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/605833968"}, {"id" => 783764327, "variant_id" => 457924702, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "black", "sku" => "IPOD2008BLACK", "vendor" => nil, "quantity" => 3, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => nil, "name" => "IPod Nano - 8gb - black", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/783764327"}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/f1df1a91d10a6d7704cf2f0315461api", "applied_discount" => nil, "order_id" => nil, "shipping_line" => {"title" => "custom shipping", "custom" => true, "handle" => nil, "price" => "10.00"}, "tax_lines" => [], "tags" => "", "note_attributes" => [], "total_price" => "836.00", "subtotal_price" => "826.00", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => {"shop_money" => {"amount" => "826.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "826.00", "currency_code" => "USD"}}, "total_price_set" => {"shop_money" => {"amount" => "836.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "836.00", "currency_code" => "USD"}}, "subtotal_price_set" => {"shop_money" => {"amount" => "826.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "826.00", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_additional_fees_set" => nil, "total_duties_set" => nil, "payment_terms" => nil, "admin_graphql_api_id" => "gid://shopify/DraftOrder/622762746", "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}, {"id" => 691042898, "note" => "rush order", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => "2016-12-31T19:00:00-05:00", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "tax_exempt" => false, "completed_at" => "2016-12-31T19:00:00-05:00", "name" => "#D1", "status" => "completed", "line_items" => [{"id" => 158115779, "variant_id" => 39072856, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "green", "sku" => "IPOD2008GREEN", "vendor" => nil, "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => nil, "name" => "IPod Nano - 8gb - green", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/158115779"}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/56dd92fb7adc1a2c38402b1aab15b2f4", "applied_discount" => nil, "order_id" => 450789469, "shipping_line" => {"title" => "UPS Ground", "custom" => false, "handle" => "e67f43adc63f6b9c7e969ba3dad33297", "price" => "12.25"}, "tax_lines" => [], "tags" => "", "note_attributes" => [], "total_price" => "209.00", "subtotal_price" => "199.00", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_price_set" => {"shop_money" => {"amount" => "209.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "209.00", "currency_code" => "USD"}}, "subtotal_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_additional_fees_set" => nil, "total_duties_set" => nil, "payment_terms" => nil, "admin_graphql_api_id" => "gid://shopify/DraftOrder/691042898", "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}, {"id" => 994118539, "note" => "rush order", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "tax_exempt" => false, "completed_at" => nil, "name" => "#D2", "status" => "open", "line_items" => [{"id" => 994118539, "variant_id" => 39072856, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "green", "sku" => "IPOD2008GREEN", "vendor" => nil, "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => nil, "name" => "IPod Nano - 8gb - green", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/994118539"}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/ba8dcf6c022ccad3d47e3909e378e33f", "applied_discount" => {"description" => "$5promo", "value" => "5.0", "title" => nil, "amount" => "5.00", "value_type" => "fixed_amount"}, "order_id" => nil, "shipping_line" => {"title" => "UPS Ground", "custom" => false, "handle" => "e67f43adc63f6b9c7e969ba3dad33297", "price" => "12.25"}, "tax_lines" => [], "tags" => "Wholesale", "note_attributes" => [], "total_price" => "206.25", "subtotal_price" => "194.00", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_price_set" => {"shop_money" => {"amount" => "206.25", "currency_code" => "USD"}, "presentment_money" => {"amount" => "206.25", "currency_code" => "USD"}}, "subtotal_price_set" => {"shop_money" => {"amount" => "194.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "194.00", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_discounts_set" => {"shop_money" => {"amount" => "5.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "5.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "12.25", "currency_code" => "USD"}, "presentment_money" => {"amount" => "12.25", "currency_code" => "USD"}}, "total_additional_fees_set" => nil, "total_duties_set" => nil, "payment_terms" => nil, "admin_graphql_api_id" => "gid://shopify/DraftOrder/994118539", "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}, {"id" => 1012750869, "note" => "rush order", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "tax_exempt" => false, "completed_at" => nil, "name" => "#D2", "status" => "open", "line_items" => [{"id" => 294997122, "variant_id" => 39072856, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "green", "sku" => "IPOD2008GREEN", "vendor" => nil, "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => nil, "name" => "IPod Nano - 8gb - green", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/294997122"}], "shipping_address" => nil, "billing_address" => nil, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/f1df1a91d10a6d7704cf2f0315461noaddressapi", "applied_discount" => nil, "order_id" => nil, "shipping_line" => nil, "tax_lines" => [], "tags" => "", "note_attributes" => [], "total_price" => "232.88", "subtotal_price" => "199.00", "total_tax" => "23.88", "presentment_currency" => "USD", "total_line_items_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_price_set" => {"shop_money" => {"amount" => "232.88", "currency_code" => "USD"}, "presentment_money" => {"amount" => "232.88", "currency_code" => "USD"}}, "subtotal_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "23.88", "currency_code" => "USD"}, "presentment_money" => {"amount" => "23.88", "currency_code" => "USD"}}, "total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_additional_fees_set" => nil, "total_duties_set" => nil, "payment_terms" => nil, "admin_graphql_api_id" => "gid://shopify/DraftOrder/1012750869"}]}), headers: {}) + + response = ShopifyAPI::DraftOrder.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/994118539.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "draft_order" => hash_including({"applied_discount" => {"description" => "Custom discount", "value_type" => "percentage", "value" => "10.0", "amount" => "19.90", "title" => "Custom"}}) } + ) + .to_return(status: 200, body: JSON.generate({"draft_order" => {"id" => 994118539, "note" => "rush order", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:10:54-05:00", "tax_exempt" => false, "completed_at" => nil, "name" => "#D2", "status" => "open", "line_items" => [{"id" => 994118539, "variant_id" => 39072856, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "green", "sku" => "IPOD2008GREEN", "vendor" => nil, "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => nil, "name" => "IPod Nano - 8gb - green", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/994118539"}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/ba8dcf6c022ccad3d47e3909e378e33f", "applied_discount" => {"description" => "Custom discount", "value" => "10.0", "title" => "Custom", "amount" => "19.90", "value_type" => "percentage"}, "order_id" => nil, "shipping_line" => {"title" => "UPS Ground", "custom" => true, "handle" => nil, "price" => "12.25"}, "tax_lines" => [], "tags" => "Wholesale", "note_attributes" => [], "total_price" => "191.35", "subtotal_price" => "179.10", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_price_set" => {"shop_money" => {"amount" => "191.35", "currency_code" => "USD"}, "presentment_money" => {"amount" => "191.35", "currency_code" => "USD"}}, "subtotal_price_set" => {"shop_money" => {"amount" => "179.10", "currency_code" => "USD"}, "presentment_money" => {"amount" => "179.10", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_discounts_set" => {"shop_money" => {"amount" => "19.90", "currency_code" => "USD"}, "presentment_money" => {"amount" => "19.90", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "12.25", "currency_code" => "USD"}, "presentment_money" => {"amount" => "12.25", "currency_code" => "USD"}}, "total_additional_fees_set" => nil, "total_duties_set" => nil, "payment_terms" => nil, "admin_graphql_api_id" => "gid://shopify/DraftOrder/994118539", "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}}), headers: {}) + + response = draft_order = ShopifyAPI::DraftOrder.new + draft_order.id = 994118539 + draft_order.applied_discount = { + "description" => "Custom discount", + "value_type" => "percentage", + "value" => "10.0", + "amount" => "19.90", + "title" => "Custom" + } + draft_order.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/994118539.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/994118539.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "draft_order" => hash_including({"note" => "Customer contacted us about a custom engraving on this iPod"}) } + ) + .to_return(status: 200, body: JSON.generate({"draft_order" => {"id" => 994118539, "note" => "Customer contacted us about a custom engraving on this iPod", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:10:58-05:00", "tax_exempt" => false, "completed_at" => nil, "name" => "#D2", "status" => "open", "line_items" => [{"id" => 994118539, "variant_id" => 39072856, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "green", "sku" => "IPOD2008GREEN", "vendor" => nil, "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => nil, "name" => "IPod Nano - 8gb - green", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/994118539"}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/ba8dcf6c022ccad3d47e3909e378e33f", "applied_discount" => {"description" => "$5promo", "value" => "5.0", "title" => nil, "amount" => "5.00", "value_type" => "fixed_amount"}, "order_id" => nil, "shipping_line" => {"title" => "UPS Ground", "custom" => true, "handle" => nil, "price" => "12.25"}, "tax_lines" => [], "tags" => "Wholesale", "note_attributes" => [], "total_price" => "206.25", "subtotal_price" => "194.00", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_price_set" => {"shop_money" => {"amount" => "206.25", "currency_code" => "USD"}, "presentment_money" => {"amount" => "206.25", "currency_code" => "USD"}}, "subtotal_price_set" => {"shop_money" => {"amount" => "194.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "194.00", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_discounts_set" => {"shop_money" => {"amount" => "5.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "5.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "12.25", "currency_code" => "USD"}, "presentment_money" => {"amount" => "12.25", "currency_code" => "USD"}}, "total_additional_fees_set" => nil, "total_duties_set" => nil, "payment_terms" => nil, "admin_graphql_api_id" => "gid://shopify/DraftOrder/994118539", "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}}), headers: {}) + + response = draft_order = ShopifyAPI::DraftOrder.new + draft_order.id = 994118539 + draft_order.note = "Customer contacted us about a custom engraving on this iPod" + draft_order.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/994118539.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_11() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/994118539.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "draft_order" => hash_including({"line_items" => [{"variant_id" => 447654529, "quantity" => 1}]}) } + ) + .to_return(status: 200, body: JSON.generate({"draft_order" => {"id" => 994118539, "note" => "rush order", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:10:51-05:00", "tax_exempt" => false, "completed_at" => nil, "name" => "#D2", "status" => "open", "line_items" => [{"id" => 1066630385, "variant_id" => 447654529, "product_id" => 921728736, "title" => "IPod Touch 8GB", "variant_title" => "Black", "sku" => "IPOD2009BLACK", "vendor" => "Apple", "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "shipwire-app", "grams" => 567, "tax_lines" => [], "applied_discount" => nil, "name" => "IPod Touch 8GB - Black", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/1066630385"}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/ba8dcf6c022ccad3d47e3909e378e33f", "applied_discount" => {"description" => "$5promo", "value" => "5.0", "title" => nil, "amount" => "5.00", "value_type" => "fixed_amount"}, "order_id" => nil, "shipping_line" => {"title" => "UPS Ground", "custom" => true, "handle" => nil, "price" => "12.25"}, "tax_lines" => [], "tags" => "Wholesale", "note_attributes" => [], "total_price" => "206.25", "subtotal_price" => "194.00", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_price_set" => {"shop_money" => {"amount" => "206.25", "currency_code" => "USD"}, "presentment_money" => {"amount" => "206.25", "currency_code" => "USD"}}, "subtotal_price_set" => {"shop_money" => {"amount" => "194.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "194.00", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_discounts_set" => {"shop_money" => {"amount" => "5.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "5.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "12.25", "currency_code" => "USD"}, "presentment_money" => {"amount" => "12.25", "currency_code" => "USD"}}, "total_additional_fees_set" => nil, "total_duties_set" => nil, "payment_terms" => nil, "admin_graphql_api_id" => "gid://shopify/DraftOrder/994118539", "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}}), headers: {}) + + response = draft_order = ShopifyAPI::DraftOrder.new + draft_order.id = 994118539 + draft_order.line_items = [ + { + "variant_id" => 447654529, + "quantity" => 1 + } + ] + draft_order.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/994118539.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_12() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/994118539.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"draft_order" => {"id" => 994118539, "note" => "rush order", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "tax_exempt" => false, "completed_at" => nil, "name" => "#D2", "status" => "open", "line_items" => [{"id" => 994118539, "variant_id" => 39072856, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "green", "sku" => "IPOD2008GREEN", "vendor" => nil, "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => nil, "name" => "IPod Nano - 8gb - green", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/994118539"}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/ba8dcf6c022ccad3d47e3909e378e33f", "applied_discount" => {"description" => "$5promo", "value" => "5.0", "title" => nil, "amount" => "5.00", "value_type" => "fixed_amount"}, "order_id" => nil, "shipping_line" => {"title" => "UPS Ground", "custom" => false, "handle" => "e67f43adc63f6b9c7e969ba3dad33297", "price" => "12.25"}, "tax_lines" => [], "tags" => "Wholesale", "note_attributes" => [], "total_price" => "206.25", "subtotal_price" => "194.00", "total_tax" => "0.00", "payment_terms" => nil, "admin_graphql_api_id" => "gid://shopify/DraftOrder/994118539", "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 1, "state" => "disabled", "total_spent" => "199.65", "last_order_id" => 450789469, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1001", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}}), headers: {}) + + response = ShopifyAPI::DraftOrder.find( + id: 994118539, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/994118539.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_13() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/994118539.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::DraftOrder.delete( + id: 994118539, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/994118539.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_14() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 5}), headers: {}) + + response = ShopifyAPI::DraftOrder.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_15() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/994118539/send_invoice.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: hash_including({"draft_order_invoice" => {"to" => "first@example.com", "from" => "j.smith@example.com", "bcc" => ["j.smith@example.com"], "subject" => "Apple Computer Invoice", "custom_message" => "Thank you for ordering!"}}) + ) + .to_return(status: 200, body: JSON.generate({"draft_order_invoice" => {"to" => "first@example.com", "from" => "j.smith@example.com", "subject" => "Apple Computer Invoice", "custom_message" => "Thank you for ordering!", "bcc" => ["j.smith@example.com"]}}), headers: {}) + + response = draft_order = ShopifyAPI::DraftOrder.new + draft_order.id = 994118539 + draft_order.send_invoice( + body: {"draft_order_invoice" => {"to" => "first@example.com", "from" => "j.smith@example.com", "bcc" => ["j.smith@example.com"], "subject" => "Apple Computer Invoice", "custom_message" => "Thank you for ordering!"}}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/994118539/send_invoice.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_16() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/994118539/send_invoice.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: hash_including({"draft_order_invoice" => {}}) + ) + .to_return(status: 200, body: JSON.generate({"draft_order_invoice" => {"to" => "bob.norman@mail.example.com", "from" => "\"John Smith Test Store\" ", "subject" => "Draft Order #D2", "custom_message" => "", "bcc" => []}}), headers: {}) + + response = draft_order = ShopifyAPI::DraftOrder.new + draft_order.id = 994118539 + draft_order.send_invoice( + body: {"draft_order_invoice" => {}}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/994118539/send_invoice.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_17() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/994118539/complete.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"draft_order" => {"id" => 994118539, "note" => "rush order", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:10:39-05:00", "tax_exempt" => false, "completed_at" => "2024-10-02T09:10:39-05:00", "name" => "#D2", "status" => "completed", "line_items" => [{"id" => 994118539, "variant_id" => 39072856, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "green", "sku" => "IPOD2008GREEN", "vendor" => nil, "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => nil, "name" => "IPod Nano - 8gb - green", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/994118539"}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/ba8dcf6c022ccad3d47e3909e378e33f", "applied_discount" => {"description" => "$5promo", "value" => "5.0", "title" => nil, "amount" => "5.00", "value_type" => "fixed_amount"}, "order_id" => 1073459985, "shipping_line" => {"title" => "UPS Ground", "custom" => false, "handle" => "e67f43adc63f6b9c7e969ba3dad33297", "price" => "12.25"}, "tax_lines" => [], "tags" => "Wholesale", "note_attributes" => [], "total_price" => "206.25", "subtotal_price" => "194.00", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_price_set" => {"shop_money" => {"amount" => "206.25", "currency_code" => "USD"}, "presentment_money" => {"amount" => "206.25", "currency_code" => "USD"}}, "subtotal_price_set" => {"shop_money" => {"amount" => "194.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "194.00", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_discounts_set" => {"shop_money" => {"amount" => "5.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "5.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "12.25", "currency_code" => "USD"}, "presentment_money" => {"amount" => "12.25", "currency_code" => "USD"}}, "total_additional_fees_set" => nil, "total_duties_set" => nil, "payment_terms" => nil, "admin_graphql_api_id" => "gid://shopify/DraftOrder/994118539", "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:10:40-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 2, "state" => "disabled", "total_spent" => "405.90", "last_order_id" => 1073459985, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1002", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 1053317299, "customer_id" => 207119551, "first_name" => "Bob", "last_name" => "Norman", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "+1(502)-459-2181", "name" => "Bob Norman", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}}), headers: {}) + + response = draft_order = ShopifyAPI::DraftOrder.new + draft_order.id = 994118539 + draft_order.complete + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/994118539/complete.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_18() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/994118539/complete.json?payment_pending=true") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"draft_order" => {"id" => 994118539, "note" => "rush order", "email" => "bob.norman@mail.example.com", "taxes_included" => false, "currency" => "USD", "invoice_sent_at" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:10:42-05:00", "tax_exempt" => false, "completed_at" => "2024-10-02T09:10:42-05:00", "name" => "#D2", "status" => "completed", "line_items" => [{"id" => 994118539, "variant_id" => 39072856, "product_id" => 632910392, "title" => "IPod Nano - 8gb", "variant_title" => "green", "sku" => "IPOD2008GREEN", "vendor" => nil, "quantity" => 1, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "fulfillment_service" => "manual", "grams" => 567, "tax_lines" => [], "applied_discount" => nil, "name" => "IPod Nano - 8gb - green", "properties" => [], "custom" => false, "price" => "199.00", "admin_graphql_api_id" => "gid://shopify/DraftOrderLineItem/994118539"}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "invoice_url" => "https://jsmith.myshopify.com/548380009/invoices/ba8dcf6c022ccad3d47e3909e378e33f", "applied_discount" => {"description" => "$5promo", "value" => "5.0", "title" => nil, "amount" => "5.00", "value_type" => "fixed_amount"}, "order_id" => 1073459986, "shipping_line" => {"title" => "UPS Ground", "custom" => false, "handle" => "e67f43adc63f6b9c7e969ba3dad33297", "price" => "12.25"}, "tax_lines" => [], "tags" => "Wholesale", "note_attributes" => [], "total_price" => "206.25", "subtotal_price" => "194.00", "total_tax" => "0.00", "presentment_currency" => "USD", "total_line_items_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_price_set" => {"shop_money" => {"amount" => "206.25", "currency_code" => "USD"}, "presentment_money" => {"amount" => "206.25", "currency_code" => "USD"}}, "subtotal_price_set" => {"shop_money" => {"amount" => "194.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "194.00", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_discounts_set" => {"shop_money" => {"amount" => "5.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "5.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "12.25", "currency_code" => "USD"}, "presentment_money" => {"amount" => "12.25", "currency_code" => "USD"}}, "total_additional_fees_set" => nil, "total_duties_set" => nil, "payment_terms" => nil, "admin_graphql_api_id" => "gid://shopify/DraftOrder/994118539", "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:10:42-05:00", "first_name" => "Bob", "last_name" => "Norman", "orders_count" => 2, "state" => "disabled", "total_spent" => "405.90", "last_order_id" => 1073459986, "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "tags" => "L\u00E9on, No\u00EBl", "last_order_name" => "#1002", "currency" => "USD", "phone" => "+16136120707", "tax_exemptions" => [], "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 1053317300, "customer_id" => 207119551, "first_name" => "Bob", "last_name" => "Norman", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "+1(502)-459-2181", "name" => "Bob Norman", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}}}), headers: {}) + + response = draft_order = ShopifyAPI::DraftOrder.new + draft_order.id = 994118539 + draft_order.complete( + payment_pending: "true", + ) + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/994118539/complete.json?payment_pending=true") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/event_test.rb b/test/rest/2024_10/event_test.rb new file mode 100644 index 00000000..1e75f22c --- /dev/null +++ b/test/rest/2024_10/event_test.rb @@ -0,0 +1,383 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Event202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/events.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"events" => [{"id" => 164748010, "subject_id" => 450789469, "created_at" => "2008-01-10T06:00:00-05:00", "subject_type" => "Order", "verb" => "confirmed", "arguments" => ["#1001", "Bob Norman"], "body" => nil, "message" => "Received new order #1001 by Bob Norman.", "author" => "Shopify", "description" => "Received new order #1001 by Bob Norman.", "path" => "/admin/orders/450789469"}, {"id" => 365755215, "subject_id" => 632910392, "created_at" => "2008-01-10T07:00:00-05:00", "subject_type" => "Product", "verb" => "create", "arguments" => ["IPod Nano - 8GB"], "body" => nil, "message" => "Product was created: IPod Nano - 8GB.", "author" => "Shopify", "description" => "Product was created: IPod Nano - 8GB.", "path" => "/admin/products/632910392"}, {"id" => 677313116, "subject_id" => 921728736, "created_at" => "2008-01-10T08:00:00-05:00", "subject_type" => "Product", "verb" => "create", "arguments" => ["IPod Touch 8GB"], "body" => nil, "message" => "Product was created: IPod Touch 8GB.", "author" => "Shopify", "description" => "Product was created: IPod Touch 8GB.", "path" => "/admin/products/921728736"}]}), headers: {}) + + response = ShopifyAPI::Event.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/events.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/events.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"events" => [{"id" => 103105390, "subject_id" => 450789469, "created_at" => "2008-01-10T05:00:00-05:00", "subject_type" => "Order", "verb" => "authorization_success", "arguments" => ["389404469", "210.94", "USD"], "body" => nil, "message" => "A transaction was authorized.", "author" => "Shopify", "description" => "A transaction was authorized.", "path" => "/admin/orders/450789469"}, {"id" => 164748010, "subject_id" => 450789469, "created_at" => "2008-01-10T06:00:00-05:00", "subject_type" => "Order", "verb" => "confirmed", "arguments" => ["#1001", "Bob Norman"], "body" => nil, "message" => "Received new order #1001 by Bob Norman.", "author" => "Shopify", "description" => "Received new order #1001 by Bob Norman.", "path" => "/admin/orders/450789469"}, {"id" => 852065041, "subject_id" => 450789469, "created_at" => "2008-01-10T09:00:00-05:00", "subject_type" => "Order", "verb" => "placed", "arguments" => [], "body" => nil, "message" => "This order was created for Bob Norman from draft order #D1.", "author" => "Shopify", "description" => "This order was created for Bob Norman from draft order #D1.", "path" => "/admin/orders/450789469"}]}), headers: {}) + + response = ShopifyAPI::Event.all( + order_id: 450789469, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/events.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/events.json?filter=Product%2COrder") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"events" => [{"id" => 164748010, "subject_id" => 450789469, "created_at" => "2008-01-10T06:00:00-05:00", "subject_type" => "Order", "verb" => "confirmed", "arguments" => ["#1001", "Bob Norman"], "body" => nil, "message" => "Received new order #1001 by Bob Norman.", "author" => "Shopify", "description" => "Received new order #1001 by Bob Norman.", "path" => "/admin/orders/450789469"}, {"id" => 365755215, "subject_id" => 632910392, "created_at" => "2008-01-10T07:00:00-05:00", "subject_type" => "Product", "verb" => "create", "arguments" => ["IPod Nano - 8GB"], "body" => nil, "message" => "Product was created: IPod Nano - 8GB.", "author" => "Shopify", "description" => "Product was created: IPod Nano - 8GB.", "path" => "/admin/products/632910392"}, {"id" => 677313116, "subject_id" => 921728736, "created_at" => "2008-01-10T08:00:00-05:00", "subject_type" => "Product", "verb" => "create", "arguments" => ["IPod Touch 8GB"], "body" => nil, "message" => "Product was created: IPod Touch 8GB.", "author" => "Shopify", "description" => "Product was created: IPod Touch 8GB.", "path" => "/admin/products/921728736"}]}), headers: {}) + + response = ShopifyAPI::Event.all( + filter: "Product,Order", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/events.json?filter=Product%2COrder") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/events.json?filter=Product&verb=destroy") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"events" => []}), headers: {}) + + response = ShopifyAPI::Event.all( + filter: "Product", + verb: "destroy", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/events.json?filter=Product&verb=destroy") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/events.json?created_at_min=2008-01-10+12%3A30%3A00%2B00%3A00") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"events" => [{"id" => 677313116, "subject_id" => 921728736, "created_at" => "2008-01-10T08:00:00-05:00", "subject_type" => "Product", "verb" => "create", "arguments" => ["IPod Touch 8GB"], "body" => nil, "message" => "Product was created: IPod Touch 8GB.", "author" => "Shopify", "description" => "Product was created: IPod Touch 8GB.", "path" => "/admin/products/921728736"}]}), headers: {}) + + response = ShopifyAPI::Event.all( + created_at_min: "2008-01-10 12:30:00+00:00", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/events.json?created_at_min=2008-01-10+12%3A30%3A00%2B00%3A00") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/events.json?since_id=164748010") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"events" => [{"id" => 365755215, "subject_id" => 632910392, "created_at" => "2008-01-10T07:00:00-05:00", "subject_type" => "Product", "verb" => "create", "arguments" => ["IPod Nano - 8GB"], "body" => nil, "message" => "Product was created: IPod Nano - 8GB.", "author" => "Shopify", "description" => "Product was created: IPod Nano - 8GB.", "path" => "/admin/products/632910392"}, {"id" => 677313116, "subject_id" => 921728736, "created_at" => "2008-01-10T08:00:00-05:00", "subject_type" => "Product", "verb" => "create", "arguments" => ["IPod Touch 8GB"], "body" => nil, "message" => "Product was created: IPod Touch 8GB.", "author" => "Shopify", "description" => "Product was created: IPod Touch 8GB.", "path" => "/admin/products/921728736"}]}), headers: {}) + + response = ShopifyAPI::Event.all( + since_id: "164748010", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/events.json?since_id=164748010") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/921728736/events.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"events" => [{"id" => 677313116, "subject_id" => 921728736, "created_at" => "2008-01-10T08:00:00-05:00", "subject_type" => "Product", "verb" => "create", "arguments" => ["IPod Touch 8GB"], "body" => nil, "message" => "Product was created: IPod Touch 8GB.", "author" => "Shopify", "description" => "Product was created: IPod Touch 8GB.", "path" => "/admin/products/921728736"}]}), headers: {}) + + response = ShopifyAPI::Event.all( + product_id: 921728736, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/921728736/events.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/events.json?limit=1&since_id=164748010") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"events" => [{"id" => 852065041, "subject_id" => 450789469, "created_at" => "2008-01-10T09:00:00-05:00", "subject_type" => "Order", "verb" => "placed", "arguments" => [], "body" => nil, "message" => "This order was created for Bob Norman from draft order #D1.", "author" => "Shopify", "description" => "This order was created for Bob Norman from draft order #D1.", "path" => "/admin/orders/450789469"}]}), headers: {}) + + response = ShopifyAPI::Event.all( + order_id: 450789469, + limit: "1", + since_id: "164748010", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/events.json?limit=1&since_id=164748010") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/events/677313116.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"event" => {"id" => 677313116, "subject_id" => 921728736, "created_at" => "2008-01-10T08:00:00-05:00", "subject_type" => "Product", "verb" => "create", "arguments" => ["IPod Touch 8GB"], "body" => nil, "message" => "Product was created: IPod Touch 8GB.", "author" => "Shopify", "description" => "Product was created: IPod Touch 8GB.", "path" => "/admin/products/921728736"}}), headers: {}) + + response = ShopifyAPI::Event.find( + id: 677313116, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/events/677313116.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/events/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 3}), headers: {}) + + response = ShopifyAPI::Event.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/events/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_11() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/events/count.json?created_at_min=2008-01-10T13%3A00%3A00%2B00%3A00") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 1}), headers: {}) + + response = ShopifyAPI::Event.count( + created_at_min: "2008-01-10T13:00:00+00:00", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/events/count.json?created_at_min=2008-01-10T13%3A00%3A00%2B00%3A00") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/fulfillment_event_test.rb b/test/rest/2024_10/fulfillment_event_test.rb new file mode 100644 index 00000000..198e1080 --- /dev/null +++ b/test/rest/2024_10/fulfillment_event_test.rb @@ -0,0 +1,167 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class FulfillmentEvent202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillments/255858046/events.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_events" => [{"id" => 944956392, "fulfillment_id" => 255858046, "status" => "in_transit", "message" => nil, "happened_at" => "2024-10-02T09:30:55-05:00", "city" => nil, "province" => nil, "country" => nil, "zip" => nil, "address1" => nil, "latitude" => nil, "longitude" => nil, "shop_id" => 548380009, "created_at" => "2024-10-02T09:30:55-05:00", "updated_at" => "2024-10-02T09:30:55-05:00", "estimated_delivery_at" => nil, "order_id" => 450789469, "admin_graphql_api_id" => "gid://shopify/FulfillmentEvent/944956392"}]}), headers: {}) + + response = ShopifyAPI::FulfillmentEvent.all( + order_id: 450789469, + fulfillment_id: 255858046, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillments/255858046/events.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillments/255858046/events.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "event" => hash_including({"status" => "in_transit"}) } + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_event" => {"id" => 944956394, "fulfillment_id" => 255858046, "status" => "in_transit", "message" => nil, "happened_at" => "2024-10-02T09:30:58-05:00", "city" => nil, "province" => nil, "country" => nil, "zip" => nil, "address1" => nil, "latitude" => nil, "longitude" => nil, "shop_id" => 548380009, "created_at" => "2024-10-02T09:30:58-05:00", "updated_at" => "2024-10-02T09:30:58-05:00", "estimated_delivery_at" => nil, "order_id" => 450789469, "admin_graphql_api_id" => "gid://shopify/FulfillmentEvent/944956394"}}), headers: {}) + + response = fulfillment_event = ShopifyAPI::FulfillmentEvent.new + fulfillment_event.order_id = 450789469 + fulfillment_event.fulfillment_id = 255858046 + fulfillment_event.status = "in_transit" + fulfillment_event.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillments/255858046/events.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillments/255858046/events/944956391.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_event" => {"id" => 944956391, "fulfillment_id" => 255858046, "status" => "in_transit", "message" => nil, "happened_at" => "2024-10-02T09:30:55-05:00", "city" => nil, "province" => nil, "country" => nil, "zip" => nil, "address1" => nil, "latitude" => nil, "longitude" => nil, "shop_id" => 548380009, "created_at" => "2024-10-02T09:30:55-05:00", "updated_at" => "2024-10-02T09:30:55-05:00", "estimated_delivery_at" => nil, "order_id" => 450789469, "admin_graphql_api_id" => "gid://shopify/FulfillmentEvent/944956391"}}), headers: {}) + + response = ShopifyAPI::FulfillmentEvent.find( + order_id: 450789469, + fulfillment_id: 255858046, + id: 944956391, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillments/255858046/events/944956391.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillments/255858046/events/944956393.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::FulfillmentEvent.delete( + order_id: 450789469, + fulfillment_id: 255858046, + id: 944956393, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillments/255858046/events/944956393.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/fulfillment_order_test.rb b/test/rest/2024_10/fulfillment_order_test.rb new file mode 100644 index 00000000..9fe885c5 --- /dev/null +++ b/test/rest/2024_10/fulfillment_order_test.rb @@ -0,0 +1,494 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class FulfillmentOrder202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillment_orders.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_orders" => [{"id" => 1046000823, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => {"id" => 1046000807, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "line_items" => [{"id" => 1058737564, "shop_id" => 548380009, "fulfillment_order_id" => 1046000823, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}], "international_duties" => nil, "fulfill_at" => nil, "fulfill_by" => nil, "fulfillment_holds" => [], "created_at" => "2024-10-02T09:11:25-05:00", "updated_at" => "2024-10-02T09:11:25-05:00", "delivery_method" => nil, "assigned_location" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "merchant_requests" => []}]}), headers: {}) + + response = ShopifyAPI::FulfillmentOrder.all( + order_id: 450789469, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillment_orders.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillment_orders.json?include_financial_summaries=true") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_orders" => [{"id" => 1046000836, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => {"id" => 1046000820, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "line_items" => [{"id" => 1058737576, "shop_id" => 548380009, "fulfillment_order_id" => 1046000836, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385, "financial_summaries" => [{"quantity" => 1, "original_unit_price_set" => "199.00", "approximate_discounted_unit_price_set" => "199.00", "discount_allocations" => [{"amount" => "3.33", "discount_application" => {"allocation_method" => "across", "target_selection" => "all", "target_type" => "line_item"}}]}]}], "international_duties" => nil, "fulfill_at" => nil, "fulfill_by" => nil, "fulfillment_holds" => [], "created_at" => "2024-10-02T09:11:42-05:00", "updated_at" => "2024-10-02T09:11:42-05:00", "delivery_method" => nil, "assigned_location" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "merchant_requests" => []}]}), headers: {}) + + response = ShopifyAPI::FulfillmentOrder.all( + order_id: 450789469, + include_financial_summaries: "true", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillment_orders.json?include_financial_summaries=true") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillment_orders.json?include_order_reference_fields=true") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_orders" => [{"id" => 1046000826, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => {"id" => 1046000810, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "line_items" => [{"id" => 1058737566, "shop_id" => 548380009, "fulfillment_order_id" => 1046000826, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}], "international_duties" => nil, "fulfill_at" => nil, "fulfill_by" => nil, "fulfillment_holds" => [], "created_at" => "2024-10-02T09:11:28-05:00", "updated_at" => "2024-10-02T09:11:28-05:00", "order_name" => "#1001", "order_processed_at" => "2008-01-10T11:00:00-05:00", "channel_id" => nil, "delivery_method" => nil, "assigned_location" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "merchant_requests" => []}]}), headers: {}) + + response = ShopifyAPI::FulfillmentOrder.all( + order_id: 450789469, + include_order_reference_fields: "true", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillment_orders.json?include_order_reference_fields=true") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000819.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_order" => {"id" => 1046000819, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => {"id" => 1046000803, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "line_items" => [{"id" => 1058737560, "shop_id" => 548380009, "fulfillment_order_id" => 1046000819, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}], "international_duties" => nil, "fulfill_at" => nil, "fulfill_by" => nil, "fulfillment_holds" => [], "created_at" => "2024-10-02T09:11:20-05:00", "updated_at" => "2024-10-02T09:11:20-05:00", "delivery_method" => nil, "assigned_location" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "merchant_requests" => []}}), headers: {}) + + response = ShopifyAPI::FulfillmentOrder.find( + id: 1046000819, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000819.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000837.json?include_financial_summaries=true") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_order" => {"id" => 1046000837, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => {"id" => 1046000821, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "line_items" => [{"id" => 1058737577, "shop_id" => 548380009, "fulfillment_order_id" => 1046000837, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385, "financial_summaries" => [{"quantity" => 1, "original_unit_price_set" => "199.00", "approximate_discounted_unit_price_set" => "199.00", "discount_allocations" => [{"amount" => "3.33", "discount_application" => {"allocation_method" => "across", "target_selection" => "all", "target_type" => "line_item"}}]}]}], "international_duties" => nil, "fulfill_at" => nil, "fulfill_by" => nil, "fulfillment_holds" => [], "created_at" => "2024-10-02T09:11:43-05:00", "updated_at" => "2024-10-02T09:11:43-05:00", "delivery_method" => nil, "assigned_location" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "merchant_requests" => []}}), headers: {}) + + response = ShopifyAPI::FulfillmentOrder.find( + id: 1046000837, + include_financial_summaries: "true", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000837.json?include_financial_summaries=true") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000828.json?include_order_reference_fields=true") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_order" => {"id" => 1046000828, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => {"id" => 1046000812, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "line_items" => [{"id" => 1058737568, "shop_id" => 548380009, "fulfillment_order_id" => 1046000828, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}], "international_duties" => nil, "fulfill_at" => nil, "fulfill_by" => nil, "fulfillment_holds" => [], "created_at" => "2024-10-02T09:11:32-05:00", "updated_at" => "2024-10-02T09:11:32-05:00", "order_name" => "#1001", "order_processed_at" => "2008-01-10T11:00:00-05:00", "channel_id" => nil, "delivery_method" => nil, "assigned_location" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "merchant_requests" => []}}), headers: {}) + + response = ShopifyAPI::FulfillmentOrder.find( + id: 1046000828, + include_order_reference_fields: "true", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000828.json?include_order_reference_fields=true") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000824/cancel.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_order" => {"id" => 1046000824, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "closed", "supported_actions" => [], "destination" => {"id" => 1046000808, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "line_items" => [], "international_duties" => nil, "fulfillment_service_handle" => "mars-fulfillment", "assigned_location" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "merchant_requests" => []}, "replacement_fulfillment_order" => {"id" => 1046000825, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "unsubmitted", "status" => "open", "supported_actions" => ["request_fulfillment"], "destination" => {"id" => 1046000809, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "line_items" => [{"id" => 1058737565, "shop_id" => 548380009, "fulfillment_order_id" => 1046000825, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}], "international_duties" => nil, "fulfillment_service_handle" => "mars-fulfillment", "assigned_location" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "merchant_requests" => []}}), headers: {}) + + response = fulfillment_order = ShopifyAPI::FulfillmentOrder.new + fulfillment_order.id = 1046000824 + fulfillment_order.cancel + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000824/cancel.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000818/close.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "fulfillment_order" => hash_including({"message" => "Not enough inventory to complete this work."}) } + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_order" => {"id" => 1046000818, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "closed", "status" => "incomplete", "supported_actions" => ["request_fulfillment"], "destination" => {"id" => 1046000802, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "line_items" => [{"id" => 1058737559, "shop_id" => 548380009, "fulfillment_order_id" => 1046000818, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}], "international_duties" => nil, "fulfillment_service_handle" => "mars-fulfillment", "assigned_location" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "merchant_requests" => []}}), headers: {}) + + response = fulfillment_order = ShopifyAPI::FulfillmentOrder.new + fulfillment_order.id = 1046000818 + fulfillment_order.close( + body: {"fulfillment_order" => {"message" => "Not enough inventory to complete this work."}}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000818/close.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000834/move.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "fulfillment_order" => hash_including({"new_location_id" => 655441491, "fulfillment_order_line_items" => [{"id" => 1058737574, "quantity" => 1}]}) } + ) + .to_return(status: 200, body: JSON.generate({"original_fulfillment_order" => {"id" => 1046000834, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 487838322, "request_status" => "submitted", "status" => "closed", "supported_actions" => [], "destination" => {"id" => 1046000818, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "line_items" => [], "international_duties" => nil, "fulfillment_service_handle" => "manual", "assigned_location" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "merchant_requests" => []}, "moved_fulfillment_order" => {"id" => 1046000835, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 655441491, "request_status" => "unsubmitted", "status" => "open", "supported_actions" => ["create_fulfillment", "move"], "destination" => {"id" => 1046000819, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "line_items" => [{"id" => 1058737575, "shop_id" => 548380009, "fulfillment_order_id" => 1046000835, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}], "international_duties" => nil, "fulfillment_service_handle" => "manual", "assigned_location" => {"address1" => "50 Rideau Street", "address2" => nil, "city" => "Ottawa", "country_code" => "CA", "location_id" => 655441491, "name" => "50 Rideau Street", "phone" => nil, "province" => "Ontario", "zip" => "K1N 9J7"}, "merchant_requests" => []}, "remaining_fulfillment_order" => nil}), headers: {}) + + response = fulfillment_order = ShopifyAPI::FulfillmentOrder.new + fulfillment_order.id = 1046000834 + fulfillment_order.move( + body: {"fulfillment_order" => {"new_location_id" => 655441491, "fulfillment_order_line_items" => [{"id" => 1058737574, "quantity" => 1}]}}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000834/move.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000821/open.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_order" => {"id" => 1046000821, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "unsubmitted", "status" => "open", "supported_actions" => ["request_fulfillment"], "destination" => {"id" => 1046000805, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "line_items" => [{"id" => 1058737562, "shop_id" => 548380009, "fulfillment_order_id" => 1046000821, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}], "international_duties" => nil, "fulfillment_service_handle" => "mars-fulfillment", "fulfill_at" => nil, "assigned_location" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "merchant_requests" => []}}), headers: {}) + + response = fulfillment_order = ShopifyAPI::FulfillmentOrder.new + fulfillment_order.id = 1046000821 + fulfillment_order.open + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000821/open.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_11() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000830/reschedule.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "fulfillment_order" => hash_including({"new_fulfill_at" => "2025-02-02 14:11 UTC"}) } + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_order" => {"id" => 1046000830, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "unsubmitted", "status" => "scheduled", "supported_actions" => ["mark_as_open"], "destination" => {"id" => 1046000814, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "line_items" => [{"id" => 1058737570, "shop_id" => 548380009, "fulfillment_order_id" => 1046000830, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}], "international_duties" => nil, "fulfillment_service_handle" => "mars-fulfillment", "fulfill_at" => "2025-02-02T09:11:00-05:00", "assigned_location" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "merchant_requests" => []}}), headers: {}) + + response = fulfillment_order = ShopifyAPI::FulfillmentOrder.new + fulfillment_order.id = 1046000830 + fulfillment_order.reschedule( + body: {"fulfillment_order" => {"new_fulfill_at" => "2025-02-02 14:11 UTC"}}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000830/reschedule.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_12() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000827/hold.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: hash_including({"fulfillment_hold" => {"reason" => "inventory_out_of_stock", "reason_notes" => "Not enough inventory to complete this work.", "fulfillment_order_line_items" => [{"id" => 1058737567, "quantity" => 1}]}}) + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_order" => {"id" => 1046000827, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "unsubmitted", "status" => "on_hold", "supported_actions" => ["release_hold"], "destination" => {"id" => 1046000811, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "line_items" => [{"id" => 1058737567, "shop_id" => 548380009, "fulfillment_order_id" => 1046000827, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}], "international_duties" => nil, "fulfill_at" => nil, "fulfillment_holds" => [{"reason" => "inventory_out_of_stock", "reason_notes" => "Not enough inventory to complete this work."}], "delivery_method" => nil, "assigned_location" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "merchant_requests" => []}}), headers: {}) + + response = fulfillment_order = ShopifyAPI::FulfillmentOrder.new + fulfillment_order.id = 1046000827 + fulfillment_order.hold( + body: {"fulfillment_hold" => {"reason" => "inventory_out_of_stock", "reason_notes" => "Not enough inventory to complete this work.", "fulfillment_order_line_items" => [{"id" => 1058737567, "quantity" => 1}]}}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000827/hold.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_13() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/set_fulfillment_orders_deadline.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: hash_including({"fulfillment_order_ids" => [1046000820], "fulfillment_deadline" => "2021-05-26T10:00:00-04:00"}) + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = fulfillment_order = ShopifyAPI::FulfillmentOrder.new + + fulfillment_order.set_fulfillment_orders_deadline( + body: {"fulfillment_order_ids" => [1046000820], "fulfillment_deadline" => "2021-05-26T10:00:00-04:00"}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/set_fulfillment_orders_deadline.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_14() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000829/release_hold.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_order" => {"id" => 1046000829, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => {"id" => 1046000813, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "origin" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "line_items" => [{"id" => 1058737569, "shop_id" => 548380009, "fulfillment_order_id" => 1046000829, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}], "outgoing_requests" => [], "international_duties" => nil, "fulfill_at" => nil, "fulfillment_holds" => [], "delivery_method" => nil}}), headers: {}) + + response = fulfillment_order = ShopifyAPI::FulfillmentOrder.new + fulfillment_order.id = 1046000829 + fulfillment_order.release_hold + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000829/release_hold.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/fulfillment_request_test.rb b/test/rest/2024_10/fulfillment_request_test.rb new file mode 100644 index 00000000..446f818f --- /dev/null +++ b/test/rest/2024_10/fulfillment_request_test.rb @@ -0,0 +1,176 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class FulfillmentRequest202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000778/fulfillment_request.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "fulfillment_request" => hash_including({"message" => "Fulfill this ASAP please."}) } + ) + .to_return(status: 200, body: JSON.generate({"original_fulfillment_order" => {"id" => 1046000778, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => {"id" => 1046000778, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "origin" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "line_items" => [{"id" => 1058737484, "shop_id" => 548380009, "fulfillment_order_id" => 1046000778, "quantity" => 1, "line_item_id" => 466157049, "inventory_item_id" => 39072856, "fulfillable_quantity" => 1, "variant_id" => 39072856}, {"id" => 1058737485, "shop_id" => 548380009, "fulfillment_order_id" => 1046000778, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}, {"id" => 1058737486, "shop_id" => 548380009, "fulfillment_order_id" => 1046000778, "quantity" => 1, "line_item_id" => 703073504, "inventory_item_id" => 457924702, "fulfillable_quantity" => 1, "variant_id" => 457924702}], "outgoing_requests" => [{"message" => "Fulfill this ASAP please.", "request_options" => {"notify_customer" => false}, "sent_at" => "2024-10-02T08:57:14-05:00", "kind" => "fulfillment_request"}], "international_duties" => nil, "fulfillment_service_handle" => "shipwire-app"}, "submitted_fulfillment_order" => {"id" => 1046000778, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => {"id" => 1046000778, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "origin" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "line_items" => [{"id" => 1058737484, "shop_id" => 548380009, "fulfillment_order_id" => 1046000778, "quantity" => 1, "line_item_id" => 466157049, "inventory_item_id" => 39072856, "fulfillable_quantity" => 1, "variant_id" => 39072856}, {"id" => 1058737485, "shop_id" => 548380009, "fulfillment_order_id" => 1046000778, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}, {"id" => 1058737486, "shop_id" => 548380009, "fulfillment_order_id" => 1046000778, "quantity" => 1, "line_item_id" => 703073504, "inventory_item_id" => 457924702, "fulfillable_quantity" => 1, "variant_id" => 457924702}], "outgoing_requests" => [{"message" => "Fulfill this ASAP please.", "request_options" => {"notify_customer" => false}, "sent_at" => "2024-10-02T08:57:14-05:00", "kind" => "fulfillment_request"}], "international_duties" => nil, "fulfillment_service_handle" => "shipwire-app"}, "unsubmitted_fulfillment_order" => nil}), headers: {}) + + response = fulfillment_request = ShopifyAPI::FulfillmentRequest.new + fulfillment_request.fulfillment_order_id = 1046000778 + fulfillment_request.message = "Fulfill this ASAP please." + fulfillment_request.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000778/fulfillment_request.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000779/fulfillment_request.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "fulfillment_request" => hash_including({"message" => "Fulfill this ASAP please.", "fulfillment_order_line_items" => [{"id" => 1058737487, "quantity" => 1}, {"id" => 1058737488, "quantity" => 1}]}) } + ) + .to_return(status: 200, body: JSON.generate({"original_fulfillment_order" => {"id" => 1046000779, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => {"id" => 1046000779, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "origin" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "line_items" => [{"id" => 1058737487, "shop_id" => 548380009, "fulfillment_order_id" => 1046000779, "quantity" => 1, "line_item_id" => 466157049, "inventory_item_id" => 39072856, "fulfillable_quantity" => 1, "variant_id" => 39072856}, {"id" => 1058737488, "shop_id" => 548380009, "fulfillment_order_id" => 1046000779, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}], "outgoing_requests" => [{"message" => "Fulfill this ASAP please.", "request_options" => {"notify_customer" => false}, "sent_at" => "2024-10-02T08:57:16-05:00", "kind" => "fulfillment_request"}], "international_duties" => nil, "fulfillment_service_handle" => "shipwire-app"}, "submitted_fulfillment_order" => {"id" => 1046000779, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "submitted", "status" => "open", "supported_actions" => ["cancel_fulfillment_order"], "destination" => {"id" => 1046000779, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "origin" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "line_items" => [{"id" => 1058737487, "shop_id" => 548380009, "fulfillment_order_id" => 1046000779, "quantity" => 1, "line_item_id" => 466157049, "inventory_item_id" => 39072856, "fulfillable_quantity" => 1, "variant_id" => 39072856}, {"id" => 1058737488, "shop_id" => 548380009, "fulfillment_order_id" => 1046000779, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}], "outgoing_requests" => [{"message" => "Fulfill this ASAP please.", "request_options" => {"notify_customer" => false}, "sent_at" => "2024-10-02T08:57:16-05:00", "kind" => "fulfillment_request"}], "international_duties" => nil, "fulfillment_service_handle" => "shipwire-app"}, "unsubmitted_fulfillment_order" => {"id" => 1046000780, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "unsubmitted", "status" => "open", "supported_actions" => ["request_fulfillment"], "destination" => {"id" => 1046000780, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "origin" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "line_items" => [{"id" => 1058737489, "shop_id" => 548380009, "fulfillment_order_id" => 1046000780, "quantity" => 1, "line_item_id" => 703073504, "inventory_item_id" => 457924702, "fulfillable_quantity" => 1, "variant_id" => 457924702}], "outgoing_requests" => [], "international_duties" => nil, "fulfillment_service_handle" => "shipwire-app"}}), headers: {}) + + response = fulfillment_request = ShopifyAPI::FulfillmentRequest.new + fulfillment_request.fulfillment_order_id = 1046000779 + fulfillment_request.message = "Fulfill this ASAP please." + fulfillment_request.fulfillment_order_line_items = [ + { + "id" => 1058737487, + "quantity" => 1 + }, + { + "id" => 1058737488, + "quantity" => 1 + } + ] + fulfillment_request.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000779/fulfillment_request.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000781/fulfillment_request/accept.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "fulfillment_request" => hash_including({"message" => "We will start processing your fulfillment on the next business day."}) } + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_order" => {"id" => 1046000781, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "accepted", "status" => "in_progress", "supported_actions" => ["request_cancellation"], "destination" => {"id" => 1046000781, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "origin" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "line_items" => [{"id" => 1058737490, "shop_id" => 548380009, "fulfillment_order_id" => 1046000781, "quantity" => 1, "line_item_id" => 466157049, "inventory_item_id" => 39072856, "fulfillable_quantity" => 1, "variant_id" => 39072856}, {"id" => 1058737491, "shop_id" => 548380009, "fulfillment_order_id" => 1046000781, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}, {"id" => 1058737492, "shop_id" => 548380009, "fulfillment_order_id" => 1046000781, "quantity" => 1, "line_item_id" => 703073504, "inventory_item_id" => 457924702, "fulfillable_quantity" => 1, "variant_id" => 457924702}], "outgoing_requests" => [], "international_duties" => nil, "fulfillment_service_handle" => "shipwire-app"}}), headers: {}) + + response = fulfillment_request = ShopifyAPI::FulfillmentRequest.new + fulfillment_request.fulfillment_order_id = 1046000781 + fulfillment_request.accept( + body: {"fulfillment_request" => {"message" => "We will start processing your fulfillment on the next business day."}}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000781/fulfillment_request/accept.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000777/fulfillment_request/reject.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "fulfillment_request" => hash_including({"message" => "Not enough inventory on hand to complete the work.", "reason" => "inventory_out_of_stock", "line_items" => [{"fulfillment_order_line_item_id" => 1058737481, "message" => "Not enough inventory."}]}) } + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_order" => {"id" => 1046000777, "shop_id" => 548380009, "order_id" => 450789469, "assigned_location_id" => 24826418, "request_status" => "rejected", "status" => "open", "supported_actions" => ["request_fulfillment"], "destination" => {"id" => 1046000777, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "company" => nil, "country" => "United States", "email" => "bob.norman@mail.example.com", "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "province" => "Kentucky", "zip" => "40202"}, "origin" => {"address1" => nil, "address2" => nil, "city" => nil, "country_code" => "DE", "location_id" => 24826418, "name" => "Apple Api Shipwire", "phone" => nil, "province" => nil, "zip" => nil}, "line_items" => [{"id" => 1058737481, "shop_id" => 548380009, "fulfillment_order_id" => 1046000777, "quantity" => 1, "line_item_id" => 466157049, "inventory_item_id" => 39072856, "fulfillable_quantity" => 1, "variant_id" => 39072856}, {"id" => 1058737482, "shop_id" => 548380009, "fulfillment_order_id" => 1046000777, "quantity" => 1, "line_item_id" => 518995019, "inventory_item_id" => 49148385, "fulfillable_quantity" => 1, "variant_id" => 49148385}, {"id" => 1058737483, "shop_id" => 548380009, "fulfillment_order_id" => 1046000777, "quantity" => 1, "line_item_id" => 703073504, "inventory_item_id" => 457924702, "fulfillable_quantity" => 1, "variant_id" => 457924702}], "outgoing_requests" => [], "international_duties" => nil, "fulfillment_service_handle" => "shipwire-app"}}), headers: {}) + + response = fulfillment_request = ShopifyAPI::FulfillmentRequest.new + fulfillment_request.fulfillment_order_id = 1046000777 + fulfillment_request.reject( + body: {"fulfillment_request" => {"message" => "Not enough inventory on hand to complete the work.", "reason" => "inventory_out_of_stock", "line_items" => [{"fulfillment_order_line_item_id" => 1058737481, "message" => "Not enough inventory."}]}}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000777/fulfillment_request/reject.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/fulfillment_service_test.rb b/test/rest/2024_10/fulfillment_service_test.rb new file mode 100644 index 00000000..0d1344b2 --- /dev/null +++ b/test/rest/2024_10/fulfillment_service_test.rb @@ -0,0 +1,230 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class FulfillmentService202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_services.json?scope=all") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_services" => [{"id" => 611870435, "name" => "Venus Fulfillment", "email" => nil, "service_name" => "Venus Fulfillment", "handle" => "venus-fulfillment", "fulfillment_orders_opt_in" => false, "include_pending_stock" => false, "provider_id" => nil, "location_id" => 611870435, "callback_url" => nil, "tracking_support" => true, "inventory_management" => true, "admin_graphql_api_id" => "gid://shopify/ApiFulfillmentService/611870435"}, {"id" => 755357713, "name" => "Mars Fulfillment", "email" => nil, "service_name" => "Mars Fulfillment", "handle" => "mars-fulfillment", "fulfillment_orders_opt_in" => true, "include_pending_stock" => false, "provider_id" => nil, "location_id" => 24826418, "callback_url" => "http://google.com/", "tracking_support" => true, "inventory_management" => true, "admin_graphql_api_id" => "gid://shopify/ApiFulfillmentService/755357713"}]}), headers: {}) + + response = ShopifyAPI::FulfillmentService.all( + scope: "all", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_services.json?scope=all") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_services.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_services" => [{"id" => 755357713, "name" => "Mars Fulfillment", "email" => nil, "service_name" => "Mars Fulfillment", "handle" => "mars-fulfillment", "fulfillment_orders_opt_in" => true, "include_pending_stock" => false, "provider_id" => nil, "location_id" => 24826418, "callback_url" => "http://google.com/", "tracking_support" => true, "inventory_management" => true, "admin_graphql_api_id" => "gid://shopify/ApiFulfillmentService/755357713"}]}), headers: {}) + + response = ShopifyAPI::FulfillmentService.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_services.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_services.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "fulfillment_service" => hash_including({"name" => "Jupiter Fulfillment", "callback_url" => "http://google.com", "inventory_management" => true, "tracking_support" => true, "requires_shipping_method" => true, "format" => "json", "permits_sku_sharing" => true, "fulfillment_orders_opt_in" => true}) } + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_service" => {"id" => 1061774488, "name" => "Jupiter Fulfillment", "email" => nil, "service_name" => "Jupiter Fulfillment", "handle" => "jupiter-fulfillment", "fulfillment_orders_opt_in" => true, "include_pending_stock" => false, "provider_id" => nil, "location_id" => 1072404545, "callback_url" => "http://google.com/", "tracking_support" => true, "inventory_management" => true, "admin_graphql_api_id" => "gid://shopify/ApiFulfillmentService/1061774488", "permits_sku_sharing" => true}}), headers: {}) + + response = fulfillment_service = ShopifyAPI::FulfillmentService.new + fulfillment_service.name = "Jupiter Fulfillment" + fulfillment_service.callback_url = "http://google.com" + fulfillment_service.inventory_management = true + fulfillment_service.tracking_support = true + fulfillment_service.requires_shipping_method = true + fulfillment_service.format = "json" + fulfillment_service.permits_sku_sharing = true + fulfillment_service.fulfillment_orders_opt_in = true + fulfillment_service.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_services.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_services/755357713.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_service" => {"id" => 755357713, "name" => "Mars Fulfillment", "email" => nil, "service_name" => "Mars Fulfillment", "handle" => "mars-fulfillment", "fulfillment_orders_opt_in" => true, "include_pending_stock" => false, "provider_id" => nil, "location_id" => 24826418, "callback_url" => "http://google.com/", "tracking_support" => true, "inventory_management" => true, "admin_graphql_api_id" => "gid://shopify/ApiFulfillmentService/755357713"}}), headers: {}) + + response = ShopifyAPI::FulfillmentService.find( + id: 755357713, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_services/755357713.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_services/755357713.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "fulfillment_service" => hash_including({"name" => "New Fulfillment Service Name"}) } + ) + .to_return(status: 200, body: JSON.generate({"fulfillment_service" => {"id" => 755357713, "name" => "New Fulfillment Service Name", "email" => nil, "service_name" => "New Fulfillment Service Name", "handle" => "mars-fulfillment", "fulfillment_orders_opt_in" => true, "include_pending_stock" => false, "provider_id" => nil, "location_id" => 24826418, "callback_url" => "http://google.com/", "tracking_support" => true, "inventory_management" => true, "admin_graphql_api_id" => "gid://shopify/ApiFulfillmentService/755357713"}}), headers: {}) + + response = fulfillment_service = ShopifyAPI::FulfillmentService.new + fulfillment_service.id = 755357713 + fulfillment_service.name = "New Fulfillment Service Name" + fulfillment_service.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_services/755357713.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_services/755357713.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::FulfillmentService.delete( + id: 755357713, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_services/755357713.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/fulfillment_test.rb b/test/rest/2024_10/fulfillment_test.rb new file mode 100644 index 00000000..c292bd1a --- /dev/null +++ b/test/rest/2024_10/fulfillment_test.rb @@ -0,0 +1,499 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Fulfillment202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillments.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"fulfillments" => [{"id" => 255858046, "order_id" => 450789469, "status" => "failure", "created_at" => "2024-10-02T08:59:11-05:00", "service" => "manual", "updated_at" => "2024-10-02T08:59:11-05:00", "tracking_company" => "USPS", "shipment_status" => nil, "location_id" => 655441491, "origin_address" => nil, "line_items" => [{"id" => 466157049, "variant_id" => 39072856, "title" => "IPod Nano - 8gb", "quantity" => 1, "sku" => "IPOD2008GREEN", "variant_title" => "green", "vendor" => nil, "fulfillment_service" => "manual", "product_id" => 632910392, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "IPod Nano - 8gb - green", "variant_inventory_management" => "shopify", "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "product_exists" => true, "fulfillable_quantity" => 0, "grams" => 200, "price" => "199.00", "total_discount" => "0.00", "fulfillment_status" => nil, "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "discount_allocations" => [{"amount" => "3.34", "discount_application_index" => 0, "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}}], "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "duties" => [], "tax_lines" => [{"price" => "3.98", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "channel_liable" => nil}], "fulfillment_line_item_id" => 225088298}], "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "receipt" => {"testcase" => true, "authorization" => "123456"}, "name" => "#1001.0", "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046"}]}), headers: {}) + + response = ShopifyAPI::Fulfillment.all( + order_id: 450789469, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillments.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillments.json?since_id=255858046") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"fulfillments" => [{"id" => 1069019863, "order_id" => 450789469, "status" => "success", "created_at" => "2024-10-02T09:01:34-05:00", "service" => "shipwire-app", "updated_at" => "2024-10-02T09:01:34-05:00", "tracking_company" => "TNT", "shipment_status" => nil, "location_id" => 24826418, "origin_address" => nil, "line_items" => [{"id" => 518995019, "variant_id" => 49148385, "title" => "IPod Nano - 8gb", "quantity" => 1, "sku" => "IPOD2008RED", "variant_title" => "red", "vendor" => nil, "fulfillment_service" => "shipwire-app", "product_id" => 632910392, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "IPod Nano - 8gb - red", "variant_inventory_management" => "shopify", "properties" => [], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 200, "price" => "199.00", "total_discount" => "0.00", "fulfillment_status" => nil, "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "discount_allocations" => [{"amount" => "3.33", "discount_application_index" => 0, "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}}], "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "duties" => [], "tax_lines" => [{"price" => "3.98", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "channel_liable" => nil}], "fulfillment_line_item_id" => 952525844}], "tracking_number" => "123456789", "tracking_numbers" => ["123456789"], "tracking_url" => "https://www.tnt.com/express/en_us/site/tracking.html?searchType=con&cons=123456789", "tracking_urls" => ["https://www.tnt.com/express/en_us/site/tracking.html?searchType=con&cons=123456789"], "receipt" => {}, "name" => "#1001.1", "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019863"}]}), headers: {}) + + response = ShopifyAPI::Fulfillment.all( + order_id: 450789469, + since_id: "255858046", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillments.json?since_id=255858046") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000799/fulfillments.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"fulfillments" => [{"id" => 1069019876, "order_id" => 450789469, "status" => "success", "created_at" => "2024-10-02T08:59:11-05:00", "service" => "manual", "updated_at" => "2024-10-02T08:59:11-05:00", "tracking_company" => "UPS", "shipment_status" => nil, "location_id" => 24826418, "line_items" => [{"id" => 1071823182, "variant_id" => 43729076, "title" => "Draft", "quantity" => 1, "sku" => "draft-151", "variant_title" => "151cm", "vendor" => nil, "fulfillment_service" => "manual", "product_id" => 108828309, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "Draft - 151cm", "variant_inventory_management" => nil, "properties" => [], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 0, "price" => "10.00", "total_discount" => "0.00", "fulfillment_status" => "fulfilled", "price_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "discount_allocations" => [], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/1071823182", "tax_lines" => []}], "tracking_number" => "#\u26201\u2622\n---\n4321\n", "tracking_numbers" => ["#\u26201\u2622\n---\n4321\n"], "tracking_url" => "https://www.ups.com/WebTracking?loc=en_US&requester=ST&trackNums=#\u26201\u2622---4321", "tracking_urls" => ["https://www.ups.com/WebTracking?loc=en_US&requester=ST&trackNums=#\u26201\u2622---4321"], "receipt" => {}, "name" => "#1001.1", "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019876"}]}), headers: {}) + + response = ShopifyAPI::Fulfillment.all( + fulfillment_order_id: 1046000799, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000799/fulfillments.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillments/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 1}), headers: {}) + + response = ShopifyAPI::Fulfillment.count( + order_id: 450789469, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillments/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillments/255858046.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"fulfillment" => {"id" => 255858046, "order_id" => 450789469, "status" => "failure", "created_at" => "2024-10-02T08:59:11-05:00", "service" => "manual", "updated_at" => "2024-10-02T08:59:11-05:00", "tracking_company" => "USPS", "shipment_status" => nil, "location_id" => 655441491, "origin_address" => nil, "line_items" => [{"id" => 466157049, "variant_id" => 39072856, "title" => "IPod Nano - 8gb", "quantity" => 1, "sku" => "IPOD2008GREEN", "variant_title" => "green", "vendor" => nil, "fulfillment_service" => "manual", "product_id" => 632910392, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "IPod Nano - 8gb - green", "variant_inventory_management" => "shopify", "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 200, "price" => "199.00", "total_discount" => "0.00", "fulfillment_status" => nil, "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "discount_allocations" => [{"amount" => "3.34", "discount_application_index" => 0, "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}}], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "tax_lines" => [{"title" => "State Tax", "price" => "3.98", "rate" => 0.06, "channel_liable" => nil, "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}}]}], "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "receipt" => {"testcase" => true, "authorization" => "123456"}, "name" => "#1001.0", "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046"}}), headers: {}) + + response = ShopifyAPI::Fulfillment.find( + order_id: 450789469, + id: 255858046, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/fulfillments/255858046.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillments.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "fulfillment" => hash_including({"line_items_by_fulfillment_order" => [{"fulfillment_order_id" => 1046000805}], "tracking_info" => {"number" => "MS1562678", "url" => "https://www.my-shipping-company.com?tracking_number=MS1562678"}}) } + ) + .to_return(status: 200, body: JSON.generate({"fulfillment" => {"id" => 1069019884, "order_id" => 450789469, "status" => "success", "created_at" => "2024-10-02T09:02:00-05:00", "service" => "manual", "updated_at" => "2024-10-02T09:02:00-05:00", "tracking_company" => nil, "shipment_status" => nil, "location_id" => 24826418, "line_items" => [{"id" => 1071823187, "variant_id" => 389013007, "title" => "Crafty Shoes - Red", "quantity" => 1, "sku" => "crappy_shoes_red", "variant_title" => "Small", "vendor" => nil, "fulfillment_service" => "manual", "product_id" => 910489600, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "Crafty Shoes - Red - Small", "variant_inventory_management" => nil, "properties" => [], "product_exists" => true, "fulfillable_quantity" => 0, "grams" => 0, "price" => "10.00", "total_discount" => "0.00", "fulfillment_status" => "fulfilled", "price_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "discount_allocations" => [], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/1071823187", "tax_lines" => []}], "tracking_number" => "MS1562678", "tracking_numbers" => ["MS1562678"], "tracking_url" => "https://www.my-shipping-company.com?tracking_number=MS1562678", "tracking_urls" => ["https://www.my-shipping-company.com?tracking_number=MS1562678"], "receipt" => {}, "name" => "#1001.2", "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019884"}}), headers: {}) + + response = fulfillment = ShopifyAPI::Fulfillment.new + fulfillment.line_items_by_fulfillment_order = [ + { + "fulfillment_order_id" => 1046000805 + } + ] + fulfillment.tracking_info = { + "number" => "MS1562678", + "url" => "https://www.my-shipping-company.com?tracking_number=MS1562678" + } + fulfillment.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillments.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillments.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "fulfillment" => hash_including({"line_items_by_fulfillment_order" => [{"fulfillment_order_id" => 1046000801}], "tracking_info" => {"number" => "1Z001985YW99744790"}}) } + ) + .to_return(status: 200, body: JSON.generate({"fulfillment" => {"id" => 1069019879, "order_id" => 450789469, "status" => "success", "created_at" => "2024-10-02T09:01:55-05:00", "service" => "manual", "updated_at" => "2024-10-02T09:01:55-05:00", "tracking_company" => "UPS", "shipment_status" => nil, "location_id" => 24826418, "line_items" => [{"id" => 1071823185, "variant_id" => 389013007, "title" => "Crafty Shoes - Red", "quantity" => 1, "sku" => "crappy_shoes_red", "variant_title" => "Small", "vendor" => nil, "fulfillment_service" => "manual", "product_id" => 910489600, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "Crafty Shoes - Red - Small", "variant_inventory_management" => nil, "properties" => [], "product_exists" => true, "fulfillable_quantity" => 0, "grams" => 0, "price" => "10.00", "total_discount" => "0.00", "fulfillment_status" => "fulfilled", "price_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "discount_allocations" => [], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/1071823185", "tax_lines" => []}], "tracking_number" => "1Z001985YW99744790", "tracking_numbers" => ["1Z001985YW99744790"], "tracking_url" => "https://www.ups.com/WebTracking?loc=en_US&requester=ST&trackNums=1Z001985YW99744790", "tracking_urls" => ["https://www.ups.com/WebTracking?loc=en_US&requester=ST&trackNums=1Z001985YW99744790"], "receipt" => {}, "name" => "#1001.2", "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019879"}}), headers: {}) + + response = fulfillment = ShopifyAPI::Fulfillment.new + fulfillment.line_items_by_fulfillment_order = [ + { + "fulfillment_order_id" => 1046000801 + } + ] + fulfillment.tracking_info = { + "number" => "1Z001985YW99744790" + } + fulfillment.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillments.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillments.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "fulfillment" => hash_including({"message" => "The package was shipped this morning.", "notify_customer" => false, "tracking_info" => {"number" => "MS1562678", "url" => "https://www.my-shipping-company.com?tracking=MS1562678"}, "line_items_by_fulfillment_order" => [{"fulfillment_order_id" => 1046000787}]}) } + ) + .to_return(status: 200, body: JSON.generate({"fulfillment" => {"id" => 1069019867, "order_id" => 450789469, "status" => "success", "created_at" => "2024-10-02T09:01:37-05:00", "service" => "manual", "updated_at" => "2024-10-02T09:01:37-05:00", "tracking_company" => nil, "shipment_status" => nil, "location_id" => 24826418, "line_items" => [{"id" => 1071823175, "variant_id" => 389013007, "title" => "Crafty Shoes - Red", "quantity" => 1, "sku" => "crappy_shoes_red", "variant_title" => "Small", "vendor" => nil, "fulfillment_service" => "manual", "product_id" => 910489600, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "Crafty Shoes - Red - Small", "variant_inventory_management" => nil, "properties" => [], "product_exists" => true, "fulfillable_quantity" => 0, "grams" => 0, "price" => "10.00", "total_discount" => "0.00", "fulfillment_status" => "fulfilled", "price_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "discount_allocations" => [], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/1071823175", "tax_lines" => []}], "tracking_number" => "MS1562678", "tracking_numbers" => ["MS1562678"], "tracking_url" => "https://www.my-shipping-company.com?tracking=MS1562678", "tracking_urls" => ["https://www.my-shipping-company.com?tracking=MS1562678"], "receipt" => {}, "name" => "#1001.2", "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019867"}}), headers: {}) + + response = fulfillment = ShopifyAPI::Fulfillment.new + fulfillment.message = "The package was shipped this morning." + fulfillment.notify_customer = false + fulfillment.tracking_info = { + "number" => "MS1562678", + "url" => "https://www.my-shipping-company.com?tracking=MS1562678" + } + fulfillment.line_items_by_fulfillment_order = [ + { + "fulfillment_order_id" => 1046000787 + } + ] + fulfillment.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillments.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillments.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "fulfillment" => hash_including({"message" => "The package was shipped this morning.", "notify_customer" => false, "tracking_info" => {"number" => "1Z001985YW99744790", "company" => "UPS"}, "line_items_by_fulfillment_order" => [{"fulfillment_order_id" => 1046000798, "fulfillment_order_line_items" => [{"id" => 1058737525, "quantity" => 1}]}]}) } + ) + .to_return(status: 200, body: JSON.generate({"fulfillment" => {"id" => 1069019875, "order_id" => 450789469, "status" => "success", "created_at" => "2024-10-02T09:01:51-05:00", "service" => "manual", "updated_at" => "2024-10-02T09:01:51-05:00", "tracking_company" => "UPS", "shipment_status" => nil, "location_id" => 24826418, "line_items" => [{"id" => 1071823181, "variant_id" => 389013007, "title" => "Crafty Shoes - Red", "quantity" => 1, "sku" => "crappy_shoes_red", "variant_title" => "Small", "vendor" => nil, "fulfillment_service" => "manual", "product_id" => 910489600, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "Crafty Shoes - Red - Small", "variant_inventory_management" => nil, "properties" => [], "product_exists" => true, "fulfillable_quantity" => 0, "grams" => 0, "price" => "10.00", "total_discount" => "0.00", "fulfillment_status" => "fulfilled", "price_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "discount_allocations" => [], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/1071823181", "tax_lines" => []}], "tracking_number" => "1Z001985YW99744790", "tracking_numbers" => ["1Z001985YW99744790"], "tracking_url" => "https://www.ups.com/WebTracking?loc=en_US&requester=ST&trackNums=1Z001985YW99744790", "tracking_urls" => ["https://www.ups.com/WebTracking?loc=en_US&requester=ST&trackNums=1Z001985YW99744790"], "receipt" => {}, "name" => "#1001.2", "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019875"}}), headers: {}) + + response = fulfillment = ShopifyAPI::Fulfillment.new + fulfillment.message = "The package was shipped this morning." + fulfillment.notify_customer = false + fulfillment.tracking_info = { + "number" => "1Z001985YW99744790", + "company" => "UPS" + } + fulfillment.line_items_by_fulfillment_order = [ + { + "fulfillment_order_id" => 1046000798, + "fulfillment_order_line_items" => [ + { + "id" => 1058737525, + "quantity" => 1 + } + ] + } + ] + fulfillment.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillments.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillments.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "fulfillment" => hash_including({"line_items_by_fulfillment_order" => [{"fulfillment_order_id" => 1046000808}]}) } + ) + .to_return(status: 200, body: JSON.generate({"fulfillment" => {"id" => 1069019886, "order_id" => 450789469, "status" => "success", "created_at" => "2024-10-02T09:02:02-05:00", "service" => "manual", "updated_at" => "2024-10-02T09:02:02-05:00", "tracking_company" => nil, "shipment_status" => nil, "location_id" => 24826418, "line_items" => [{"id" => 1071823189, "variant_id" => 389013007, "title" => "Crafty Shoes - Red", "quantity" => 1, "sku" => "crappy_shoes_red", "variant_title" => "Small", "vendor" => nil, "fulfillment_service" => "manual", "product_id" => 910489600, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "Crafty Shoes - Red - Small", "variant_inventory_management" => nil, "properties" => [], "product_exists" => true, "fulfillable_quantity" => 0, "grams" => 0, "price" => "10.00", "total_discount" => "0.00", "fulfillment_status" => "fulfilled", "price_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "discount_allocations" => [], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/1071823189", "tax_lines" => []}], "tracking_number" => nil, "tracking_numbers" => [], "tracking_url" => nil, "tracking_urls" => [], "receipt" => {}, "name" => "#1001.2", "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019886"}}), headers: {}) + + response = fulfillment = ShopifyAPI::Fulfillment.new + fulfillment.line_items_by_fulfillment_order = [ + { + "fulfillment_order_id" => 1046000808 + } + ] + fulfillment.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillments.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_11() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillments/1069019869/update_tracking.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "fulfillment" => hash_including({"notify_customer" => true, "tracking_info" => {"company" => "UPS", "number" => "1Z001985YW99744790"}}) } + ) + .to_return(status: 200, body: JSON.generate({"fulfillment" => {"tracking_company" => "UPS", "location_id" => 24826418, "id" => 1069019869, "order_id" => 450789469, "status" => "success", "created_at" => "2024-10-02T08:59:11-05:00", "service" => "manual", "updated_at" => "2024-10-02T09:01:43-05:00", "shipment_status" => nil, "line_items" => [{"id" => 1071823176, "variant_id" => 43729076, "title" => "Draft", "quantity" => 1, "sku" => "draft-151", "variant_title" => "151cm", "vendor" => nil, "fulfillment_service" => "manual", "product_id" => 108828309, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "Draft - 151cm", "variant_inventory_management" => nil, "properties" => [], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 0, "price" => "10.00", "total_discount" => "0.00", "fulfillment_status" => "fulfilled", "price_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "discount_allocations" => [], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/1071823176", "tax_lines" => []}], "tracking_number" => "1Z001985YW99744790", "tracking_numbers" => ["1Z001985YW99744790"], "tracking_url" => "https://www.ups.com/WebTracking?loc=en_US&requester=ST&trackNums=1Z001985YW99744790", "tracking_urls" => ["https://www.ups.com/WebTracking?loc=en_US&requester=ST&trackNums=1Z001985YW99744790"], "receipt" => {}, "name" => "#1001.1", "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019869"}}), headers: {}) + + response = fulfillment = ShopifyAPI::Fulfillment.new + fulfillment.id = 1069019869 + fulfillment.update_tracking( + body: {"fulfillment" => {"notify_customer" => true, "tracking_info" => {"company" => "UPS", "number" => "1Z001985YW99744790"}}}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillments/1069019869/update_tracking.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_12() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillments/1069019864/update_tracking.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "fulfillment" => hash_including({"notify_customer" => true, "tracking_info" => {"number" => "1111", "url" => "http://www.my-url.com"}}) } + ) + .to_return(status: 200, body: JSON.generate({"fulfillment" => {"tracking_company" => nil, "location_id" => 24826418, "id" => 1069019864, "order_id" => 450789469, "status" => "success", "created_at" => "2024-10-02T08:59:11-05:00", "service" => "manual", "updated_at" => "2024-10-02T09:01:35-05:00", "shipment_status" => nil, "line_items" => [{"id" => 1071823172, "variant_id" => 43729076, "title" => "Draft", "quantity" => 1, "sku" => "draft-151", "variant_title" => "151cm", "vendor" => nil, "fulfillment_service" => "manual", "product_id" => 108828309, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "Draft - 151cm", "variant_inventory_management" => nil, "properties" => [], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 0, "price" => "10.00", "total_discount" => "0.00", "fulfillment_status" => "fulfilled", "price_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "discount_allocations" => [], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/1071823172", "tax_lines" => []}], "tracking_number" => "1111", "tracking_numbers" => ["1111"], "tracking_url" => "http://www.my-url.com", "tracking_urls" => ["http://www.my-url.com"], "receipt" => {}, "name" => "#1001.1", "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019864"}}), headers: {}) + + response = fulfillment = ShopifyAPI::Fulfillment.new + fulfillment.id = 1069019864 + fulfillment.update_tracking( + body: {"fulfillment" => {"notify_customer" => true, "tracking_info" => {"number" => "1111", "url" => "http://www.my-url.com"}}}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillments/1069019864/update_tracking.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_13() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillments/1069019871/cancel.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"fulfillment" => {"order_id" => 450789469, "status" => "cancelled", "location_id" => 24826418, "id" => 1069019871, "created_at" => "2024-10-02T08:59:11-05:00", "service" => "manual", "updated_at" => "2024-10-02T09:01:46-05:00", "tracking_company" => "UPS", "shipment_status" => nil, "line_items" => [{"id" => 1071823178, "variant_id" => 43729076, "title" => "Draft", "quantity" => 1, "sku" => "draft-151", "variant_title" => "151cm", "vendor" => nil, "fulfillment_service" => "manual", "product_id" => 108828309, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "Draft - 151cm", "variant_inventory_management" => nil, "properties" => [], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 0, "price" => "10.00", "total_discount" => "0.00", "fulfillment_status" => "fulfilled", "price_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "discount_allocations" => [], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/1071823178", "tax_lines" => []}], "tracking_number" => "#\u26201\u2622\n---\n4321\n", "tracking_numbers" => ["#\u26201\u2622\n---\n4321\n"], "tracking_url" => "https://www.ups.com/WebTracking?loc=en_US&requester=ST&trackNums=#\u26201\u2622---4321", "tracking_urls" => ["https://www.ups.com/WebTracking?loc=en_US&requester=ST&trackNums=#\u26201\u2622---4321"], "receipt" => {}, "name" => "#1001.1", "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019871"}}), headers: {}) + + response = fulfillment = ShopifyAPI::Fulfillment.new + fulfillment.id = 1069019871 + fulfillment.cancel + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillments/1069019871/cancel.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/gift_card_adjustment_test.rb b/test/rest/2024_10/gift_card_adjustment_test.rb new file mode 100644 index 00000000..67ab8d54 --- /dev/null +++ b/test/rest/2024_10/gift_card_adjustment_test.rb @@ -0,0 +1,234 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class GiftCardAdjustment202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/1035197676/adjustments.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"adjustments" => [{"id" => 1064273908, "gift_card_id" => 1035197676, "api_client_id" => nil, "user_id" => nil, "order_transaction_id" => nil, "number" => nil, "amount" => "10.00", "processed_at" => nil, "created_at" => "2024-10-03T11:57:29-05:00", "updated_at" => "2024-10-03T11:57:29-05:00", "note" => "Customer refilled gift card by $10", "remote_transaction_ref" => nil, "remote_transaction_url" => nil}]}), headers: {}) + + response = ShopifyAPI::GiftCardAdjustment.all( + gift_card_id: 1035197676, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/1035197676/adjustments.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/1035197676/adjustments.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "adjustment" => hash_including({"amount" => 10.0, "remote_transaction_ref" => "gift_card_app_transaction_193402", "remote_transaction_url" => "http://example.com/my-gift-card-app/gift_card_adjustments/193402"}) } + ) + .to_return(status: 200, body: JSON.generate({"adjustment" => {"id" => 1064273909, "gift_card_id" => 1035197676, "api_client_id" => 755357713, "user_id" => nil, "order_transaction_id" => nil, "number" => 1, "amount" => "10.00", "processed_at" => "2024-10-03T11:58:04-05:00", "created_at" => "2024-10-03T11:58:04-05:00", "updated_at" => "2024-10-03T11:58:04-05:00", "note" => nil, "remote_transaction_ref" => "gift_card_app_transaction_193402", "remote_transaction_url" => "http://example.com/my-gift-card-app/gift_card_adjustments/193402"}}), headers: {}) + + response = gift_card_adjustment = ShopifyAPI::GiftCardAdjustment.new + gift_card_adjustment.gift_card_id = 1035197676 + gift_card_adjustment.amount = 10.0 + gift_card_adjustment.remote_transaction_ref = "gift_card_app_transaction_193402" + gift_card_adjustment.remote_transaction_url = "http://example.com/my-gift-card-app/gift_card_adjustments/193402" + gift_card_adjustment.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/1035197676/adjustments.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/1035197676/adjustments.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "adjustment" => hash_including({"amount" => 10.0, "note" => "Customer refilled gift card by $10"}) } + ) + .to_return(status: 200, body: JSON.generate({"adjustment" => {"id" => 1064273912, "gift_card_id" => 1035197676, "api_client_id" => 755357713, "user_id" => nil, "order_transaction_id" => nil, "number" => 1, "amount" => "10.00", "processed_at" => "2024-10-03T11:58:07-05:00", "created_at" => "2024-10-03T11:58:07-05:00", "updated_at" => "2024-10-03T11:58:07-05:00", "note" => "Customer refilled gift card by $10", "remote_transaction_ref" => nil, "remote_transaction_url" => nil}}), headers: {}) + + response = gift_card_adjustment = ShopifyAPI::GiftCardAdjustment.new + gift_card_adjustment.gift_card_id = 1035197676 + gift_card_adjustment.amount = 10.0 + gift_card_adjustment.note = "Customer refilled gift card by $10" + gift_card_adjustment.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/1035197676/adjustments.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/1035197676/adjustments.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "adjustment" => hash_including({"amount" => -20.0, "note" => "Customer spent $20 via external service"}) } + ) + .to_return(status: 200, body: JSON.generate({"adjustment" => {"id" => 1064273911, "gift_card_id" => 1035197676, "api_client_id" => 755357713, "user_id" => nil, "order_transaction_id" => nil, "number" => 1, "amount" => "-20.00", "processed_at" => "2024-10-03T11:58:06-05:00", "created_at" => "2024-10-03T11:58:06-05:00", "updated_at" => "2024-10-03T11:58:06-05:00", "note" => "Customer spent $20 via external service", "remote_transaction_ref" => nil, "remote_transaction_url" => nil}}), headers: {}) + + response = gift_card_adjustment = ShopifyAPI::GiftCardAdjustment.new + gift_card_adjustment.gift_card_id = 1035197676 + gift_card_adjustment.amount = -20.0 + gift_card_adjustment.note = "Customer spent $20 via external service" + gift_card_adjustment.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/1035197676/adjustments.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/1035197676/adjustments.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "adjustment" => hash_including({"amount" => 10.0, "processed_at" => "2023-07-03T11:58:04-04:00"}) } + ) + .to_return(status: 200, body: JSON.generate({"adjustment" => {"id" => 1064273910, "gift_card_id" => 1035197676, "api_client_id" => 755357713, "user_id" => nil, "order_transaction_id" => nil, "number" => 1, "amount" => "10.00", "processed_at" => "2023-07-03T11:58:04-04:00", "created_at" => "2024-10-03T11:58:04-05:00", "updated_at" => "2024-10-03T11:58:04-05:00", "note" => nil, "remote_transaction_ref" => nil, "remote_transaction_url" => nil}}), headers: {}) + + response = gift_card_adjustment = ShopifyAPI::GiftCardAdjustment.new + gift_card_adjustment.gift_card_id = 1035197676 + gift_card_adjustment.amount = 10.0 + gift_card_adjustment.processed_at = "2023-07-03T11:58:04-04:00" + gift_card_adjustment.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/1035197676/adjustments.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/1035197676/adjustments/1064273908.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"adjustment" => {"id" => 1064273908, "gift_card_id" => 1035197676, "api_client_id" => nil, "user_id" => nil, "order_transaction_id" => nil, "number" => nil, "amount" => "10.00", "processed_at" => nil, "created_at" => "2024-10-03T11:57:29-05:00", "updated_at" => "2024-10-03T11:57:29-05:00", "note" => "Customer refilled gift card by $10", "remote_transaction_ref" => nil, "remote_transaction_url" => nil}}), headers: {}) + + response = ShopifyAPI::GiftCardAdjustment.find( + gift_card_id: 1035197676, + id: 1064273908, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/1035197676/adjustments/1064273908.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/gift_card_test.rb b/test/rest/2024_10/gift_card_test.rb new file mode 100644 index 00000000..ed969bfb --- /dev/null +++ b/test/rest/2024_10/gift_card_test.rb @@ -0,0 +1,422 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class GiftCard202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards.json?status=enabled") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"gift_cards" => [{"id" => 766118925, "balance" => "25.00", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "currency" => "USD", "initial_value" => "50.00", "disabled_at" => nil, "line_item_id" => nil, "api_client_id" => nil, "user_id" => nil, "customer_id" => nil, "note" => nil, "expires_on" => "2023-01-02", "template_suffix" => nil, "recipient_id" => nil, "message" => nil, "send_on" => nil, "notify" => true, "last_characters" => "0e0e", "order_id" => nil}, {"id" => 10274553, "balance" => "0.00", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "currency" => "USD", "initial_value" => "50.00", "disabled_at" => nil, "line_item_id" => nil, "api_client_id" => nil, "user_id" => nil, "customer_id" => nil, "note" => nil, "expires_on" => nil, "template_suffix" => nil, "recipient_id" => nil, "message" => nil, "send_on" => nil, "notify" => true, "last_characters" => "0y0y", "order_id" => nil}]}), headers: {}) + + response = ShopifyAPI::GiftCard.all( + status: "enabled", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards.json?status=enabled") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"gift_cards" => [{"id" => 1035197676, "balance" => "100.00", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "currency" => "USD", "initial_value" => "100.00", "disabled_at" => nil, "line_item_id" => nil, "api_client_id" => nil, "user_id" => nil, "customer_id" => nil, "note" => nil, "expires_on" => nil, "template_suffix" => nil, "recipient_id" => nil, "message" => nil, "send_on" => nil, "notify" => true, "last_characters" => "0d0d", "order_id" => nil}, {"id" => 766118925, "balance" => "25.00", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "currency" => "USD", "initial_value" => "50.00", "disabled_at" => nil, "line_item_id" => nil, "api_client_id" => nil, "user_id" => nil, "customer_id" => nil, "note" => nil, "expires_on" => "2023-01-02", "template_suffix" => nil, "recipient_id" => nil, "message" => nil, "send_on" => nil, "notify" => true, "last_characters" => "0e0e", "order_id" => nil}, {"id" => 10274553, "balance" => "0.00", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "currency" => "USD", "initial_value" => "50.00", "disabled_at" => nil, "line_item_id" => nil, "api_client_id" => nil, "user_id" => nil, "customer_id" => nil, "note" => nil, "expires_on" => nil, "template_suffix" => nil, "recipient_id" => nil, "message" => nil, "send_on" => nil, "notify" => true, "last_characters" => "0y0y", "order_id" => nil}]}), headers: {}) + + response = ShopifyAPI::GiftCard.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/1035197676.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"gift_card" => {"id" => 1035197676, "balance" => "100.00", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "currency" => "USD", "initial_value" => "100.00", "disabled_at" => nil, "line_item_id" => nil, "api_client_id" => nil, "user_id" => nil, "customer_id" => nil, "note" => nil, "expires_on" => nil, "template_suffix" => nil, "last_characters" => "0d0d", "order_id" => nil}}), headers: {}) + + response = ShopifyAPI::GiftCard.find( + id: 1035197676, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/1035197676.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/1035197676.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "gift_card" => hash_including({"expires_on" => "2020-01-01"}) } + ) + .to_return(status: 200, body: JSON.generate({"gift_card" => {"expires_on" => "2020-01-01", "template_suffix" => nil, "initial_value" => "100.00", "balance" => "100.00", "customer_id" => nil, "id" => 1035197676, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:01:27-05:00", "currency" => "USD", "disabled_at" => nil, "line_item_id" => nil, "api_client_id" => nil, "user_id" => nil, "note" => nil, "last_characters" => "0d0d", "order_id" => nil}}), headers: {}) + + response = gift_card = ShopifyAPI::GiftCard.new + gift_card.id = 1035197676 + gift_card.expires_on = "2020-01-01" + gift_card.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/1035197676.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/1035197676.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "gift_card" => hash_including({"note" => "Updating with a new note"}) } + ) + .to_return(status: 200, body: JSON.generate({"gift_card" => {"note" => "Updating with a new note", "template_suffix" => nil, "initial_value" => "100.00", "balance" => "100.00", "customer_id" => nil, "id" => 1035197676, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:01:23-05:00", "currency" => "USD", "disabled_at" => nil, "line_item_id" => nil, "api_client_id" => nil, "user_id" => nil, "expires_on" => nil, "last_characters" => "0d0d", "order_id" => nil}}), headers: {}) + + response = gift_card = ShopifyAPI::GiftCard.new + gift_card.id = 1035197676 + gift_card.note = "Updating with a new note" + gift_card.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/1035197676.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 3}), headers: {}) + + response = ShopifyAPI::GiftCard.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/count.json?status=enabled") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 3}), headers: {}) + + response = ShopifyAPI::GiftCard.count( + status: "enabled", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/count.json?status=enabled") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "gift_card" => hash_including({"note" => "This is a note", "initial_value" => "100.00", "code" => "ABCD EFGH IJKL MNOP", "template_suffix" => "gift_cards.birthday.liquid"}) } + ) + .to_return(status: 200, body: JSON.generate({"gift_card" => {"id" => 1063936318, "balance" => "100.00", "created_at" => "2024-10-02T09:01:24-05:00", "updated_at" => "2024-10-02T09:01:24-05:00", "currency" => "USD", "initial_value" => "100.00", "disabled_at" => nil, "line_item_id" => nil, "api_client_id" => 755357713, "user_id" => nil, "customer_id" => nil, "note" => "This is a note", "expires_on" => nil, "template_suffix" => "gift_cards.birthday.liquid", "last_characters" => "mnop", "order_id" => nil, "code" => "abcdefghijklmnop"}}), headers: {}) + + response = gift_card = ShopifyAPI::GiftCard.new + gift_card.note = "This is a note" + gift_card.initial_value = "100.00" + gift_card.code = "ABCD EFGH IJKL MNOP" + gift_card.template_suffix = "gift_cards.birthday.liquid" + gift_card.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "gift_card" => hash_including({"initial_value" => "25.00"}) } + ) + .to_return(status: 200, body: JSON.generate({"gift_card" => {"id" => 1063936319, "balance" => "25.00", "created_at" => "2024-10-02T09:01:25-05:00", "updated_at" => "2024-10-02T09:01:25-05:00", "currency" => "USD", "initial_value" => "25.00", "disabled_at" => nil, "line_item_id" => nil, "api_client_id" => 755357713, "user_id" => nil, "customer_id" => nil, "note" => nil, "expires_on" => nil, "template_suffix" => nil, "last_characters" => "bc76", "order_id" => nil, "code" => "ad62h8aae5c3bc76"}}), headers: {}) + + response = gift_card = ShopifyAPI::GiftCard.new + gift_card.initial_value = "25.00" + gift_card.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "gift_card" => hash_including({"initial_value" => "100.00", "recipient_id" => 207119551, "message" => "Happy birthday!", "send_on" => "2023-12-31T19:00:00-05:00"}) } + ) + .to_return(status: 200, body: JSON.generate({"gift_card" => {"id" => 1063936320, "balance" => "100.00", "created_at" => "2024-10-02T09:01:26-05:00", "updated_at" => "2024-10-02T09:01:26-05:00", "currency" => "USD", "initial_value" => "100.00", "disabled_at" => nil, "line_item_id" => nil, "api_client_id" => 755357713, "user_id" => nil, "customer_id" => nil, "note" => nil, "expires_on" => nil, "template_suffix" => nil, "last_characters" => "6ag3", "order_id" => nil, "code" => "96577h3499436ag3"}}), headers: {}) + + response = gift_card = ShopifyAPI::GiftCard.new + gift_card.initial_value = "100.00" + gift_card.recipient_id = 207119551 + gift_card.message = "Happy birthday!" + gift_card.send_on = "2023-12-31T19:00:00-05:00" + gift_card.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_11() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/1035197676/disable.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "gift_card" => hash_including({"id" => 1035197676}) } + ) + .to_return(status: 200, body: JSON.generate({"gift_card" => {"disabled_at" => "2024-10-02T09:01:25-05:00", "template_suffix" => nil, "initial_value" => "100.00", "balance" => "100.00", "customer_id" => nil, "id" => 1035197676, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:01:25-05:00", "currency" => "USD", "line_item_id" => nil, "api_client_id" => nil, "user_id" => nil, "note" => nil, "expires_on" => nil, "last_characters" => "0d0d", "order_id" => nil}}), headers: {}) + + response = gift_card = ShopifyAPI::GiftCard.new + gift_card.id = 1035197676 + gift_card.disable( + body: {"gift_card" => {"id" => 1035197676}}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/1035197676/disable.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_12() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/search.json?query=last_characters%3Amnop") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"gift_cards" => [{"id" => 1063936321, "balance" => "10.00", "created_at" => "2024-10-02T09:01:29-05:00", "updated_at" => "2024-10-02T09:01:29-05:00", "currency" => "USD", "initial_value" => "10.00", "disabled_at" => nil, "line_item_id" => nil, "api_client_id" => nil, "user_id" => nil, "customer_id" => nil, "note" => nil, "expires_on" => nil, "template_suffix" => nil, "recipient_id" => nil, "message" => nil, "send_on" => nil, "notify" => true, "last_characters" => "mnop", "order_id" => nil}]}), headers: {}) + + response = ShopifyAPI::GiftCard.search( + query: "last_characters:mnop", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/gift_cards/search.json?query=last_characters%3Amnop") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/image_test.rb b/test/rest/2024_10/image_test.rb new file mode 100644 index 00000000..3203ecc9 --- /dev/null +++ b/test/rest/2024_10/image_test.rb @@ -0,0 +1,524 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Image202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"images" => [{"id" => 850703190, "alt" => nil, "position" => 1, "product_id" => 632910392, "created_at" => "2024-10-02T08:56:04-05:00", "updated_at" => "2024-10-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "variant_ids" => []}, {"id" => 562641783, "alt" => nil, "position" => 2, "product_id" => 632910392, "created_at" => "2024-10-02T08:56:04-05:00", "updated_at" => "2024-10-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203764", "variant_ids" => [808950810]}, {"id" => 378407906, "alt" => nil, "position" => 3, "product_id" => 632910392, "created_at" => "2024-10-02T08:56:04-05:00", "updated_at" => "2024-10-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "variant_ids" => []}]}), headers: {}) + + response = ShopifyAPI::Image.all( + product_id: 632910392, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images.json?since_id=850703190") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"images" => [{"id" => 1001473899, "alt" => nil, "position" => 4, "product_id" => 632910392, "created_at" => "2024-10-02T08:58:45-05:00", "updated_at" => "2024-10-02T08:58:45-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473899", "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/files/rails_logo.gif?v=1704203925", "variant_ids" => []}]}), headers: {}) + + response = ShopifyAPI::Image.all( + product_id: 632910392, + since_id: "850703190", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images.json?since_id=850703190") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "image" => hash_including({"position" => 1, "metafields" => [{"key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"}], "attachment" => "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\nU7Mq2Mq1K9cUW8GKTUG2rNkUHNByWMuWLdWva7t1W7UKG4S7eO/ycEhQHgaK\nsL4VGGyocGE3br5929KuxQFFkEtIlgypsuUDmDMfWGRmUZvPoEHfGU36jgDT\nLQSoVt3IQ2sPsL0IUNZGlZ0H0lo00jEkCytWMspdGzBgn/F9EBIWnKIQlqHB\nhA0bQpx48Z7UAkoEcMTdUeTJJSxf/4akOTNnzqHb3GkjrUdp0gKwq77jWdod\nO7dNKWvhRUcWT6zYQI82xB03AAQNCdTKX/xAAB10hfVCnRtbVIhIAy14oJoZ\nAXS4XXfdQaYIeOGJRx555Z1nRnrqqUeaMtIYY8dmn7Vg2yK57TYEgAzIQGBx\nxyXHj0A0OOTggxFKSN1iWwTTAIYanpYdMtFE4+GVIHrn3XeUmVhZeWiIMoOY\nnVQDGiTgKALJjIssIsADt0mjjI6+AXcDgQYi2M8/7ijEwzRIFmBIL9NVV+EW\nVzyZ4Wqj9RBABchQWeWkV3aY5ZYjjgieeKL446mnjxwAiZVpliAjZqblt19/\n/7HCwIAFGv+X3J4s9fMckoYhphiTQTwJ5Wqn9dDDAWuMUUEFviTrS6STVlmp\npVmKqCkOn34aB6TIBAAOJeHZAYl6ptixSCL8edGbq8HFeqBDcygEyIOCGqYk\nkxUW4euiq7knbA/gUDHGv//ec2wFayQbaQWinOCslVhmSUq1/gCDLJXacgtJ\nCYu4J66cjbAKoA3CxapnOgm9g+ughdK7xYX3Rinlvj2YYcYanVBBhTg2Axzw\nG4/4k4bBzDZbKRUQP1LIsRSX6sgBZtwhzQP68ccbj7AWty4/5igEoaC9dK3r\noVtgs4evvzKqb8wyQ0JFJzXXbDMVcQBQLTDGVmCssstKGs09oPT/jQcRoBw9\nMamKgEOeeg/gqBtvdVZSDnHFIQgRD4RxXWhiYEOQKNn4zncHzDIzHc0ZpHdy\nRicIQOypKDf7q3Pd96ABzSab+E1EIYIvS2o0ijA92gPZiCB1qwL+iJxL78Z7\n2NeHQrAK2YrCZva+bcgcujFUQIEG6WigonoCdLT9tr9UbIIAMMCEkkYacvvT\nxSgsBPKGJKBEAw4yjhx+hyn+PAJFfztyVdWOt5B3RehyimneFuwFvQxFyTSf\n25f1zCAqSFACDXTQ3gwSoDoElI5tZyBAINqnuhJ+Kg9vOIOaVnSHT5ECHucK\n0OMiBxJAPCdXmGseBLoBvei5rFEStB5m/yBhjFJUIw50oIMoLvCpFRAADduj\nwxvUYMIqmvARCBiDeiwRBk+lQQTEq5qQ3CWdJSkGAlu4y9h66EBgAbF6QhSV\nMUpQilKcQRNLwIenfpFEJebBioC0ohrQQJ8QhMIfSwhgj2YouYTYUEmGqhBe\nFNBDH5otgmgLnRyLWMdq0GEGCMCHJjSBjzQE8pSChMLTCJBI4pXDBeuiiA1T\nprK7PK+SUPphsIQ1wSEag5OUKIUlyiAmAowClci0YizKILUAFi+WDQEEJOmF\nxlnMYnOVbOP0gkjBTdZRmDiwhCuywcRkmtOEpHjC1DzBABto4xqN5AcgdEXN\nNO4Ql0+CB2xctv9LM2SSgpXhZB0t0QlT+iMUkzinQquFihD452P0gGdGAPGN\nHKYxjbOAwBpxqU9+ApGXQgyoQDWRgASwoAMGMMAHDrnQhc5AkQPSU0NgYVF7\nQmAWKcBnPvc5HwGcbUVxJCInEfACQXQACUhFQkqRwAIOttScv9ABO21wA8k1\np5Z3mYXYdNqAjvLzbHDUpFCNIQoUdGAdHUhrUg2gVAOg4AXmvEAaOPEGaCCA\nAASQxBtIYYIq5kEHAaKHVfsRGB3eNBPYxKdXGVWGUnAzdOSxgyg+MIxhoDWt\nal3rUlXABEBeYBQIiMMm0AAKPBBAE1A4nTjWEIAzvGEFqsvDEHqEjZj/wMKw\n1rwlVxerGkv4AxVoAOkEmXGMOKDgA8i1LFrRioSjKrWtKRVEQlXHBBSKQhLQ\nEG3tCHCLJaSWClD0zgHO8LBqDeIYNsDGTG4ryZtak4G7lZ6G2sBSfyCAaTK7\nAzfgQIEzoOC/yKVsZS+bWeim1BsdqEG10oCANxDgDZwIRHa3O4hbaA91nlKB\nKA7QBhHo0VPwCFBtAdNea86CZVztKk8FUN5PjQIHxKWABihQBkHY+L/HTa5l\nMetcAxvAG94wQAQAkA1SIIAUBvUHdkVLgBkMwrvkPSEkVtSCJ/yCAJ5gZ20l\nwgObziITGk3xTqUHhWoxYQVdAIYINMBmO0TA/8aCwHGOBbwOAvc4pXj2RieY\nIY69ttgfpJBEHOLQ5ArTAQ2SaPAb4lAC33XsoaxYhUx4kFVrZoKSYlYxbOzg\nPX8kAM1d6AILOuEDDQzBBCaIwJvhjOMAU7bOmE0qdMUhhFozQhVxiMWnuiAJ\nQTfZyahFQydWGwA1cbiZAJL0Qiht6UzoVsxetUQaJhEKZzhDBdh+A5s9AQxU\nq3rVN241ne0sa1rXWgjbqLUd3uqPUYhCFNDAxwzm3d3vjgF/vTvAHegUaYbw\nwMSZyAR8oX0I2BwiC2eoQQ2srYJA6IDNb2ABqr39bVYDWMfkRgIVzs1xdEOD\nCjhQ4nXlPe9BaOLQNf+rRjQc0eg2DM8TyvZTs3mY6Xwy4xI2YLMGdIAAhTvD\nFWzuhKhZIHGKq9riF381rDtQho53/Bjpboc1OiEJktMbtaplrbHboCOYT9rS\nOdhopocwgiRowOw6L0MNCKCBKjwA26IW9cRTXfE4i1vAlpUEHJze8XTXehvc\n2AQ05k3vDHaiDGNYeaPNoAzGxbwf/86EHDCd4kbsyBMySII2NH92nevg4TbI\nA7ZVEGqiF93ocLb7nIdhgGMIoROW4Dvft2GHOqQiDoM3+YWJnT8O7yYL3fgI\nDwK+CrFX0lwBctUxtLH55qNd5xkYxMKvDffSn/7b4L47JYQgjnW0XvZOv0L/\nKmz/BS5sIg5QvtkavDPlO/Am+FzOBCBqgU8veEJA9LCBDRjQznIw3/lJEIBs\n5gqhUIALN3rWR3QTh31IFwcUkAiV1QEOCH4ddw8LkAqpUH5cgAtnIGzikHgs\nxzSW1w3+Jgc0Bz32Rw8DoA3lQA8yIAP6xwoj4H//B4BJYAOjoAZqYIDWRn0J\nuIB1Z3fHQAGdgHeJQIEcxwwLQH5csIHEQARE4C9aRx49oAPw5ydyIHaANUPE\nwXwtmH/6Vw5iKIb/F4DaoAGisAIroIM7WG0MR3pDd3qoJwjVQAEUAAdvEGAG\nsHcUgITFgAtLmIFNiAtQeAInMAa+UGwiyAEW8QMc//AkgKUNx7EPkLOCLOiC\nNiADIzCDY0iDm2cHLxCKbNiGPueDcVh02McJ/GWHjfABxyUJdigEfUiB+pAL\ndVAHX1B+uPCERHAChSAw8QAOHMaIE6EF3MAKkjiJxlGJljgC+UcPm7iJnch8\nDJAHoRiKaqiDBRgK01d9LDB0QFiHdmiH1YACSDCE4ziLsscIdRCIGriLhfiL\naxAPOKAKtbARPFAFQKKMywg5XuiC9ACN0TiNOwAAAHCNL5CN2siN3QiHcYhq\nwCAD6WiHomAJEzmO4LcGueCOG4gLf2OIAjOPOHCPEEFT/KiMzKgNLigDABmN\nnKgL02aQB3mNCkmKB+iNCv+IBjI2Y+O4ihcZi063DcywkReYi04Yj/ewBmuA\nAyRYEbAAAVVwkv3oj9rwgizJks4okCMwCI+ACqgwCQaJkGq4hm3IjW8YakPn\nCWxmhzz5kxfJd3iwkUx4lL0ojw/QlAnxlG4glQYCOStplS8YkJuoCwnwCIY5\nCYgZljRJlqTYg9WnbTq3lm3plrGojrVWixuJgRpIDB95AgLTCCRYkjeVAXw5\nlfqXiVa5ks64QSVlmF8JljO5mAtplj4IdJE5YzpHmenYcXCwAHKJi7rIi74Y\nD7oQms1xU71QmpQ4AOVwmvoHmAH5ABcwna3pmompmAnJmDzIcGp5m2upmxMp\ni+f/Zg9AIJeCeJSG+ACHAH8OwWyzoJyUCIOnCYOAKQP4wATTeQElVZio8AiI\nCZtiSZbbuHAIUAXemZu5CZ4YyQ250KAXeJ6c2YsCYIUYwWyZUADK6QoEwAfO\nOZ8yoANSwAT4SZ37eZjXGZtjOZshoAFQ8HAHOo6TCZ5CgAfluYS4OIhPGA8C\n4AXBtxBP+WXvWZrZ4ClhYAkdmokzgAkhKqIjqp+GaaIyGaAL+XDOEAEueqC4\nGaNuKQTWAAQ1OpceCQktcAgcYFuHJQc+wJfhADFpsAPhcJpewAZKKgVL2qTV\n2ZUnKptqMApJ8ADVZqVYKpkKaodwEAflaYvAuYFE4HIe/8CIEWGhchCkJ7kE\nJQQAHGoDZcYGckqnTGqnhWmiALqYS5AEdGCAVmqgBvqiMqagquANX3qe8cCo\njpqX1iQHsAALaWogx5FkEBMO7URCmjqnTJqfJQql2LkClpAEwNCGahABapmq\nqqqgjAAE3uCgTFgC6tEIZVoRzCYHckBpJ+kBJoQA+xcCqrOpdeqpT/qf2JkF\nSQAPOdiGLoqq0QqeVOCqDUp+RMBh+7atDgELX+atPJCPKOkAJmQJ7fRH54oJ\nc7qk+amfn+qfsAkAKqB5SeAFo7CGwBCo3smWlMkMQPaqyAAJi2AaKTBpECB5\nUdFlKJk6qoMK/McHVsSwdFqnxP9aUv3JrgRghhcbCCswqp0XmdAamTtJmXHg\nqjWaCmqCIwJwsg/RrSvLA6R5HDIAAyJAAJ3mKQQAAwxwC4Akp8Iqog9bna+5\nA2V4g+kUgM/HZlUwtB2rparwYzWKB/nzAG3QtBVaq1HxA5+wl8cBA1iABTCg\nCyGgsK7Af1lrReiariTKn6ggAmTIfDfIAJuntt7pth2bjnAABHKbC74ADi13\nByfLrQG7sp/AA8dBD4EruIILAy0ABboAA66ATMHKqcMKsZ/aCNMouWrbu2vb\nthw7kdUgt3VgP41WsinwEPzwb7NgqzzwA3xrCMYBuKu7ujBwvTBAAOYEtrbr\nqQkwg5z/GLmVa7GWy7EJmo7ccGB4gAxp8i3SMLoNEXnOywOf8AmwsA/aUL3V\ni726QELJtLi3W1ICWQ7SGLm+67tCi6UeSwGb8GOFkC1L+74uAbAq+7z1Sw0F\nwACXcAmBy8H6O7sLxb22O52k4IwD2Yk0SL69a763KWOJgAQLACnFBgl267Qy\nV8H0+wnUgAEb3MMbrL/a+1SaWrNMSgpYqZUEPIY1qMICyMJtCQSB4wv2czjw\nC3mla8E6nAzcEA4+jAU/HLiJG8IAbMRW6ZLgq8S8e8BOPGM4cDtSDLqboQD4\neMV8m8VXkAV47MMeDMJP9SmLiw82oAOpicThm8IHXL6BSgEn/4AHhbAsaRLH\nMSG/e3vBjojHWRADeowFg9DHEMO9DmADDjAK1ZCaLknAhZzGaoyl3IALXHAC\nMry0cjwR8juwz0sN1OBs3HDJlpwFl8DLvMrJnqKpUADKIUoKD1DGpVzAZ3vI\nWKoIxNDKr0yysRy/dKzDP3BTChADunzJlxAOygDMJkQANlAGmMCk+CDI0KiV\nBYzGh9zEOmcDRPCEjEwlI3IACtARkmzB1JBRs9AN3KDN2mzJZQDOJRQGNmAH\nDSuiyhCYL2jGKIzKCMxmdwCFRMDIb9xo07y8V1y/14wXVxADIA3QWRDEBF0t\nBi0CAOwKgDkCmmjGpzy+anwPvbjIJ//gyBitvLNswRmVVewQ0iL9yyVt0PVA\nAIsLBfVJytK4zuXQzknADIZoiIVABNEsx8vWvN/6vJRmU6vw0T4tsyWtOvxn\nA+EABQCgpID8gqh5lQ6dxGR4yIrgi78o01MdyVY9sJ+QCd+ARlmVzT490F8N\nMTEQ1gwQDiGwPh260i2dzJ3Yu8eAO/fw2BVwD408w7UAEv9mqyubQBe1Q/98\nCCA9A38NMSLAf4JtAyFw2Gnd0Il9wmKotm0Q10o5j41svFQtc/M7CwmU1/ZU\nC559CLrwC6FdLSFA2sR9pB5anw4dvlUZDyE5j/SINKBb2RRx2ZldHUxyFxwQ\nA70d3NUCBa7/QtyljdrIvdZj6AFKGQ/oTY84YA8PnCb3ON11PQv0dN0QgA1X\noAuH4Fvc7SkIwABcC97hfdiIvdrgSwnOrd72QAkGDsHSnRDD57wS0g4NcAVb\ncN1bkAKHcAh+vd95cL3+DeABPp+pjcybeAnojQMobg8JTgmqQAlSrAjSHb8q\nOwvT0QDocOMTQAJ6UARk4M+HANr77SnY6+Egrn/tdKTjHY2LkOIqruCq8OR2\n8MYk6ScqSyiGQAI3fuNRsOVRMAEKcAjAHeT+cARD/t8g3k5HLuJHLQMMYA/r\nreAsbhv48QCUYD8NDnmSR+MF0At/YARGoOXoEAW8QAscMARhHNwh/1DmHm7m\nxZ3mxw2Y1rDicY4ft/EAlp4tlS3LkndD3ODnfp7lW14EW7AHYu4pg9C6Zc5/\njE7a+4fkad3iTy7nlW4KtC4N9hAAU47nR1IAwtAMno4Of77labQHrVDqYWC9\nis61qx7i83kIsU7plk7rppAI1G4K0UCSDp4JbgAdJNAMvv7pOL4YViAPpe4P\n+pvsy87qrT6ftQHtiUPr1K4M+9EC9nDnlOYDg+EDf+Dt3/7n6EALi0EL+VDu\nD4DsqI69ql7kjo4F7r4IpiAN8T7vjdAIdmDv74DvPsAN/O7tv14EiUECUQAC\npV4G+ovsqf7hAH6a1jDr8E7tLaAbE+8FMv//3n6S79MwBDuw7xzv6e2gGBMQ\nBadQ6gSABQ5AAA4gAodg8kOe8GduCu8O8S7/8jHfH5/HDiWRDH6QA9hwK4PB\nDfbyBLRAAtPxDbaw5X0g5mlwCXzsMwgABUdw8Aif7ocg7fEu9VP/eUPwCmDw\nAzPxA+TgBxgQ+BBgMpUjKNQR6FEwB6WuDJdw6AAQuMnO9KQNI3UP8x0DQHoP\nBmBABnuxEH4f+KAP+LitPNNRDFq+DCN/CSQt3Psb+fyXBZU/8ZevA5mv+Zqf\nAz/AED+gBeQA+r4f+DkAAShTBKAu8kFOAOFQDQV97oqu6o0g8TFP+7Vv+5Ug\nC9+q+1PQ+7//+1n/DwFF4O/osAFiDgB4DNT+UPDWC/lljgV23zF5b/vwXwny\njw3f+hE/kP1TsP36/wxNABBNeEVBp87fQYQJFS5k2NBOjGoEwvxKSOASFowZ\nscDgyHFIo0ZehrwCU9JkyUopK8nKlIkHP379+P2YMoUcBpw5deZ8RohQE6Cn\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n", "filename" => "rails_logo.gif"}) } + ) + .to_return(status: 200, body: JSON.generate({"image" => {"width" => 110, "height" => 140, "position" => 1, "alt" => nil, "id" => 1001473897, "product_id" => 632910392, "created_at" => "2024-10-02T08:58:42-05:00", "updated_at" => "2024-10-02T08:58:42-05:00", "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/files/rails_logo.gif?v=1704203922", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473897"}}), headers: {}) + + response = image = ShopifyAPI::Image.new + image.product_id = 632910392 + image.position = 1 + image.metafields = [ + { + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + } + ] + image.attachment = "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n" + image.filename = "rails_logo.gif" + image.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "image" => hash_including({"variant_ids" => [808950810, 457924702], "attachment" => "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n", "filename" => "rails_logo.gif"}) } + ) + .to_return(status: 200, body: JSON.generate({"image" => {"id" => 1001473900, "product_id" => 632910392, "position" => 4, "created_at" => "2024-10-02T08:58:49-05:00", "updated_at" => "2024-10-02T08:58:49-05:00", "alt" => nil, "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/files/rails_logo.gif?v=1704203929", "variant_ids" => [457924702, 808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473900"}}), headers: {}) + + response = image = ShopifyAPI::Image.new + image.product_id = 632910392 + image.variant_ids = [ + 808950810, + 457924702 + ] + image.attachment = "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n" + image.filename = "rails_logo.gif" + image.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "image" => hash_including({"position" => 1, "attachment" => "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n", "filename" => "rails_logo.gif"}) } + ) + .to_return(status: 200, body: JSON.generate({"image" => {"position" => 1, "width" => 110, "height" => 140, "alt" => nil, "id" => 1001473896, "product_id" => 632910392, "created_at" => "2024-10-02T08:58:40-05:00", "updated_at" => "2024-10-02T08:58:40-05:00", "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/files/rails_logo.gif?v=1704203920", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473896"}}), headers: {}) + + response = image = ShopifyAPI::Image.new + image.product_id = 632910392 + image.position = 1 + image.attachment = "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n" + image.filename = "rails_logo.gif" + image.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "image" => hash_including({"src" => "http://example.com/rails_logo.gif"}) } + ) + .to_return(status: 200, body: JSON.generate({"image" => {"id" => 1001473895, "product_id" => 632910392, "position" => 4, "created_at" => "2024-10-02T08:58:39-05:00", "updated_at" => "2024-10-02T08:58:39-05:00", "alt" => nil, "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/files/rails_logo20241002-28582-k6leis.gif?v=1704203919", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473895"}}), headers: {}) + + response = image = ShopifyAPI::Image.new + image.product_id = 632910392 + image.src = "http://example.com/rails_logo.gif" + image.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "image" => hash_including({"attachment" => "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n", "filename" => "rails_logo.gif"}) } + ) + .to_return(status: 200, body: JSON.generate({"image" => {"id" => 1001473898, "product_id" => 632910392, "position" => 4, "created_at" => "2024-10-02T08:58:43-05:00", "updated_at" => "2024-10-02T08:58:43-05:00", "alt" => nil, "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/files/rails_logo.gif?v=1704203923", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473898"}}), headers: {}) + + response = image = ShopifyAPI::Image.new + image.product_id = 632910392 + image.attachment = "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n" + image.filename = "rails_logo.gif" + image.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 3}), headers: {}) + + response = ShopifyAPI::Image.count( + product_id: 632910392, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images/count.json?since_id=850703190") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 0}), headers: {}) + + response = ShopifyAPI::Image.count( + product_id: 632910392, + since_id: "850703190", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images/count.json?since_id=850703190") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images/850703190.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"image" => {"id" => 850703190, "alt" => nil, "position" => 1, "product_id" => 632910392, "created_at" => "2024-10-02T08:56:04-05:00", "updated_at" => "2024-10-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "variant_ids" => []}}), headers: {}) + + response = ShopifyAPI::Image.find( + product_id: 632910392, + id: 850703190, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images/850703190.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_11() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images/850703190.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "image" => hash_including({"position" => 2, "alt" => "new alt tag content"}) } + ) + .to_return(status: 200, body: JSON.generate({"image" => {"id" => 850703190, "product_id" => 632910392, "position" => 2, "created_at" => "2024-10-02T08:56:04-05:00", "updated_at" => "2024-10-02T08:58:38-05:00", "alt" => "new alt tag content", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203918", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}}), headers: {}) + + response = image = ShopifyAPI::Image.new + image.product_id = 632910392 + image.id = 850703190 + image.position = 2 + image.alt = "new alt tag content" + image.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images/850703190.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_12() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images/850703190.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "image" => hash_including({"metafields" => [{"key" => "my_new_metafield", "value" => "my_new_value", "type" => "single_line_text_field", "namespace" => "tags"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"image" => {"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:56:04-05:00", "updated_at" => "2024-10-02T08:56:04-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}}), headers: {}) + + response = image = ShopifyAPI::Image.new + image.product_id = 632910392 + image.id = 850703190 + image.metafields = [ + { + "key" => "my_new_metafield", + "value" => "my_new_value", + "type" => "single_line_text_field", + "namespace" => "tags" + } + ] + image.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images/850703190.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_13() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images/850703190.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "image" => hash_including({"variant_ids" => [808950810, 457924702]}) } + ) + .to_return(status: 200, body: JSON.generate({"image" => {"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:56:04-05:00", "updated_at" => "2024-10-02T08:56:04-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203764", "variant_ids" => [457924702, 808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}}), headers: {}) + + response = image = ShopifyAPI::Image.new + image.product_id = 632910392 + image.id = 850703190 + image.variant_ids = [ + 808950810, + 457924702 + ] + image.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images/850703190.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_14() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images/850703190.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Image.delete( + product_id: 632910392, + id: 850703190, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/images/850703190.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/inventory_item_test.rb b/test/rest/2024_10/inventory_item_test.rb new file mode 100644 index 00000000..03372bac --- /dev/null +++ b/test/rest/2024_10/inventory_item_test.rb @@ -0,0 +1,162 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class InventoryItem202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_items.json?ids=808950810%2C39072856%2C457924702") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"inventory_items" => [{"id" => 39072856, "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00", "requires_shipping" => true, "cost" => "25.00", "country_code_of_origin" => nil, "province_code_of_origin" => nil, "harmonized_system_code" => nil, "tracked" => true, "country_harmonized_system_codes" => [], "admin_graphql_api_id" => "gid://shopify/InventoryItem/39072856"}, {"id" => 457924702, "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00", "requires_shipping" => true, "cost" => "25.00", "country_code_of_origin" => nil, "province_code_of_origin" => nil, "harmonized_system_code" => nil, "tracked" => true, "country_harmonized_system_codes" => [], "admin_graphql_api_id" => "gid://shopify/InventoryItem/457924702"}, {"id" => 808950810, "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00", "requires_shipping" => true, "cost" => "25.00", "country_code_of_origin" => nil, "province_code_of_origin" => nil, "harmonized_system_code" => nil, "tracked" => true, "country_harmonized_system_codes" => [], "admin_graphql_api_id" => "gid://shopify/InventoryItem/808950810"}]}), headers: {}) + + response = ShopifyAPI::InventoryItem.all( + ids: "808950810,39072856,457924702", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_items.json?ids=808950810%2C39072856%2C457924702") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_items/808950810.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"inventory_item" => {"id" => 808950810, "sku" => "IPOD2008PINK", "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00", "requires_shipping" => true, "cost" => "25.00", "country_code_of_origin" => nil, "province_code_of_origin" => nil, "harmonized_system_code" => nil, "tracked" => true, "country_harmonized_system_codes" => [], "admin_graphql_api_id" => "gid://shopify/InventoryItem/808950810"}}), headers: {}) + + response = ShopifyAPI::InventoryItem.find( + id: 808950810, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_items/808950810.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_items/808950810.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "inventory_item" => hash_including({"sku" => "new sku"}) } + ) + .to_return(status: 200, body: JSON.generate({"inventory_item" => {"id" => 808950810, "sku" => "new sku", "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:31:51-05:00", "requires_shipping" => true, "cost" => "25.00", "country_code_of_origin" => nil, "province_code_of_origin" => nil, "harmonized_system_code" => nil, "tracked" => true, "country_harmonized_system_codes" => [], "admin_graphql_api_id" => "gid://shopify/InventoryItem/808950810"}}), headers: {}) + + response = inventory_item = ShopifyAPI::InventoryItem.new + inventory_item.id = 808950810 + inventory_item.sku = "new sku" + inventory_item.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_items/808950810.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_items/808950810.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "inventory_item" => hash_including({"cost" => "25.00"}) } + ) + .to_return(status: 200, body: JSON.generate({"inventory_item" => {"id" => 808950810, "sku" => "IPOD2008PINK", "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00", "requires_shipping" => true, "cost" => "25.00", "country_code_of_origin" => nil, "province_code_of_origin" => nil, "harmonized_system_code" => nil, "tracked" => true, "country_harmonized_system_codes" => [], "admin_graphql_api_id" => "gid://shopify/InventoryItem/808950810"}}), headers: {}) + + response = inventory_item = ShopifyAPI::InventoryItem.new + inventory_item.id = 808950810 + inventory_item.cost = "25.00" + inventory_item.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_items/808950810.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/inventory_level_test.rb b/test/rest/2024_10/inventory_level_test.rb new file mode 100644 index 00000000..b1fa9f1a --- /dev/null +++ b/test/rest/2024_10/inventory_level_test.rb @@ -0,0 +1,264 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class InventoryLevel202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_levels.json?location_ids=655441491") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"inventory_levels" => [{"inventory_item_id" => 49148385, "location_id" => 655441491, "available" => 2, "updated_at" => "2024-10-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/655441491?inventory_item_id=49148385"}, {"inventory_item_id" => 808950810, "location_id" => 655441491, "available" => 1, "updated_at" => "2024-10-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/655441491?inventory_item_id=808950810"}, {"inventory_item_id" => 457924702, "location_id" => 655441491, "available" => 4, "updated_at" => "2024-10-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/655441491?inventory_item_id=457924702"}, {"inventory_item_id" => 39072856, "location_id" => 655441491, "available" => 3, "updated_at" => "2024-10-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/655441491?inventory_item_id=39072856"}]}), headers: {}) + + response = ShopifyAPI::InventoryLevel.all( + location_ids: "655441491", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_levels.json?location_ids=655441491") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_levels.json?inventory_item_ids=808950810") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"inventory_levels" => [{"inventory_item_id" => 808950810, "location_id" => 487838322, "available" => 9, "updated_at" => "2024-10-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/548380009?inventory_item_id=808950810"}, {"inventory_item_id" => 808950810, "location_id" => 655441491, "available" => 1, "updated_at" => "2024-10-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/655441491?inventory_item_id=808950810"}]}), headers: {}) + + response = ShopifyAPI::InventoryLevel.all( + inventory_item_ids: "808950810", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_levels.json?inventory_item_ids=808950810") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_levels.json?inventory_item_ids=808950810%2C39072856&location_ids=655441491%2C487838322") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"inventory_levels" => [{"inventory_item_id" => 808950810, "location_id" => 487838322, "available" => 9, "updated_at" => "2024-10-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/548380009?inventory_item_id=808950810"}, {"inventory_item_id" => 39072856, "location_id" => 487838322, "available" => 27, "updated_at" => "2024-10-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/548380009?inventory_item_id=39072856"}, {"inventory_item_id" => 808950810, "location_id" => 655441491, "available" => 1, "updated_at" => "2024-10-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/655441491?inventory_item_id=808950810"}, {"inventory_item_id" => 39072856, "location_id" => 655441491, "available" => 3, "updated_at" => "2024-10-02T08:56:04-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/655441491?inventory_item_id=39072856"}]}), headers: {}) + + response = ShopifyAPI::InventoryLevel.all( + inventory_item_ids: "808950810,39072856", + location_ids: "655441491,487838322", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_levels.json?inventory_item_ids=808950810%2C39072856&location_ids=655441491%2C487838322") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_levels/adjust.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: hash_including({"location_id" => 655441491, "inventory_item_id" => 808950810, "available_adjustment" => 5}) + ) + .to_return(status: 200, body: JSON.generate({"inventory_level" => {"inventory_item_id" => 808950810, "location_id" => 655441491, "available" => 6, "updated_at" => "2024-10-02T08:57:27-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/655441491?inventory_item_id=808950810"}}), headers: {}) + + response = inventory_level = ShopifyAPI::InventoryLevel.new + + inventory_level.adjust( + body: {"location_id" => 655441491, "inventory_item_id" => 808950810, "available_adjustment" => 5}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_levels/adjust.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_levels.json?inventory_item_id=808950810&location_id=655441491") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::InventoryLevel.delete( + inventory_item_id: "808950810", + location_id: "655441491", + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_levels.json?inventory_item_id=808950810&location_id=655441491") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_levels/connect.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: hash_including({"location_id" => 844681632, "inventory_item_id" => 457924702}) + ) + .to_return(status: 200, body: JSON.generate({"inventory_level" => {"inventory_item_id" => 457924702, "location_id" => 844681632, "available" => 0, "updated_at" => "2024-10-02T08:57:20-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/844681632?inventory_item_id=457924702"}}), headers: {}) + + response = inventory_level = ShopifyAPI::InventoryLevel.new + + inventory_level.connect( + body: {"location_id" => 844681632, "inventory_item_id" => 457924702}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_levels/connect.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_levels/set.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: hash_including({"location_id" => 655441491, "inventory_item_id" => 808950810, "available" => 42}) + ) + .to_return(status: 200, body: JSON.generate({"inventory_level" => {"inventory_item_id" => 808950810, "location_id" => 655441491, "available" => 42, "updated_at" => "2024-10-02T08:57:24-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/655441491?inventory_item_id=808950810"}}), headers: {}) + + response = inventory_level = ShopifyAPI::InventoryLevel.new + + inventory_level.set( + body: {"location_id" => 655441491, "inventory_item_id" => 808950810, "available" => 42}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/inventory_levels/set.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/location_test.rb b/test/rest/2024_10/location_test.rb new file mode 100644 index 00000000..cae8d69b --- /dev/null +++ b/test/rest/2024_10/location_test.rb @@ -0,0 +1,156 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Location202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/locations.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"locations" => [{"id" => 655441491, "name" => "50 Rideau Street", "address1" => "50 Rideau Street", "address2" => nil, "city" => "Ottawa", "zip" => "K1N 9J7", "province" => "Ontario", "country" => "CA", "phone" => nil, "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00", "country_code" => "CA", "country_name" => "Canada", "province_code" => "ON", "legacy" => false, "active" => true, "admin_graphql_api_id" => "gid://shopify/Location/655441491", "localized_country_name" => "Canada", "localized_province_name" => "Ontario"}, {"id" => 24826418, "name" => "Apple Api Shipwire", "address1" => nil, "address2" => nil, "city" => nil, "zip" => nil, "province" => nil, "country" => "DE", "phone" => nil, "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00", "country_code" => "DE", "country_name" => "Germany", "province_code" => nil, "legacy" => true, "active" => true, "admin_graphql_api_id" => "gid://shopify/Location/24826418", "localized_country_name" => "Germany", "localized_province_name" => nil}, {"id" => 844681632, "name" => "Apple Cupertino", "address1" => nil, "address2" => nil, "city" => nil, "zip" => nil, "province" => nil, "country" => "US", "phone" => nil, "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00", "country_code" => "US", "country_name" => "United States", "province_code" => nil, "legacy" => false, "active" => true, "admin_graphql_api_id" => "gid://shopify/Location/844681632", "localized_country_name" => "United States", "localized_province_name" => nil}, {"id" => 611870435, "name" => "Apple Shipwire", "address1" => nil, "address2" => nil, "city" => nil, "zip" => nil, "province" => nil, "country" => "DE", "phone" => nil, "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00", "country_code" => "DE", "country_name" => "Germany", "province_code" => nil, "legacy" => true, "active" => true, "admin_graphql_api_id" => "gid://shopify/Location/611870435", "localized_country_name" => "Germany", "localized_province_name" => nil}, {"id" => 487838322, "name" => "Fifth Avenue AppleStore", "address1" => nil, "address2" => nil, "city" => nil, "zip" => nil, "province" => nil, "country" => "US", "phone" => nil, "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00", "country_code" => "US", "country_name" => "United States", "province_code" => nil, "legacy" => false, "active" => true, "admin_graphql_api_id" => "gid://shopify/Location/487838322", "localized_country_name" => "United States", "localized_province_name" => nil}]}), headers: {}) + + response = ShopifyAPI::Location.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/locations.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/locations/487838322.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"location" => {"id" => 487838322, "name" => "Fifth Avenue AppleStore", "address1" => nil, "address2" => nil, "city" => nil, "zip" => nil, "province" => nil, "country" => "US", "phone" => nil, "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00", "country_code" => "US", "country_name" => "United States", "province_code" => nil, "legacy" => false, "active" => true, "admin_graphql_api_id" => "gid://shopify/Location/487838322"}}), headers: {}) + + response = ShopifyAPI::Location.find( + id: 487838322, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/locations/487838322.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/locations/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 5}), headers: {}) + + response = ShopifyAPI::Location.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/locations/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/locations/487838322/inventory_levels.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"inventory_levels" => [{"inventory_item_id" => 49148385, "location_id" => 487838322, "available" => 18, "updated_at" => "2024-10-02T09:28:43-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/548380009?inventory_item_id=49148385"}, {"inventory_item_id" => 808950810, "location_id" => 487838322, "available" => 9, "updated_at" => "2024-10-02T09:28:43-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/548380009?inventory_item_id=808950810"}, {"inventory_item_id" => 457924702, "location_id" => 487838322, "available" => 36, "updated_at" => "2024-10-02T09:28:43-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/548380009?inventory_item_id=457924702"}, {"inventory_item_id" => 39072856, "location_id" => 487838322, "available" => 27, "updated_at" => "2024-10-02T09:28:43-05:00", "admin_graphql_api_id" => "gid://shopify/InventoryLevel/548380009?inventory_item_id=39072856"}]}), headers: {}) + + response = ShopifyAPI::Location.inventory_levels( + id: 487838322, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/locations/487838322/inventory_levels.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/locations_for_move_test.rb b/test/rest/2024_10/locations_for_move_test.rb new file mode 100644 index 00000000..203ccde2 --- /dev/null +++ b/test/rest/2024_10/locations_for_move_test.rb @@ -0,0 +1,64 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class LocationsForMove202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000782/locations_for_move.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"locations_for_move" => [{"location" => {"id" => 1072404542, "name" => "Alpha Location"}, "message" => "Current location.", "movable" => false}, {"location" => {"id" => 1072404543, "name" => "Bravo Location"}, "message" => "No items are stocked at this location.", "movable" => false}]}), headers: {}) + + response = ShopifyAPI::LocationsForMove.all( + fulfillment_order_id: 1046000782, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/fulfillment_orders/1046000782/locations_for_move.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/marketing_event_test.rb b/test/rest/2024_10/marketing_event_test.rb new file mode 100644 index 00000000..9bd0b2af --- /dev/null +++ b/test/rest/2024_10/marketing_event_test.rb @@ -0,0 +1,273 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class MarketingEvent202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/marketing_events.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"marketing_events" => [{"id" => 998730532, "event_type" => "post", "remote_id" => "12345678", "started_at" => "2024-10-15T10:56:18-05:00", "ended_at" => nil, "scheduled_to_end_at" => nil, "budget" => "10.11", "currency" => "GBP", "manage_url" => nil, "preview_url" => nil, "utm_campaign" => "1234567890", "utm_source" => "facebook", "utm_medium" => "facebook-post", "budget_type" => "daily", "description" => nil, "marketing_channel" => "social", "paid" => false, "referring_domain" => "facebook.com", "breadcrumb_id" => nil, "marketing_activity_id" => nil, "admin_graphql_api_id" => "gid://shopify/MarketingEvent/998730532", "marketed_resources" => []}]}), headers: {}) + + response = ShopifyAPI::MarketingEvent.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/marketing_events.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/marketing_events.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "marketing_event" => hash_including({"started_at" => "2024-12-15", "utm_campaign" => "Christmas2024", "utm_source" => "facebook", "utm_medium" => "cpc", "event_type" => "ad", "referring_domain" => "facebook.com", "marketing_channel" => "social", "paid" => true}) } + ) + .to_return(status: 200, body: JSON.generate({"marketing_event" => {"id" => 1069063883, "event_type" => "ad", "remote_id" => nil, "started_at" => "2024-12-14T19:00:00-05:00", "ended_at" => nil, "scheduled_to_end_at" => nil, "budget" => nil, "currency" => nil, "manage_url" => nil, "preview_url" => nil, "utm_campaign" => "Christmas2024", "utm_source" => "facebook", "utm_medium" => "cpc", "budget_type" => nil, "description" => nil, "marketing_channel" => "social", "paid" => true, "referring_domain" => "facebook.com", "breadcrumb_id" => nil, "marketing_activity_id" => 1063897333, "admin_graphql_api_id" => "gid://shopify/MarketingEvent/1069063883", "marketed_resources" => []}}), headers: {}) + + response = marketing_event = ShopifyAPI::MarketingEvent.new + marketing_event.started_at = "2024-12-15" + marketing_event.utm_campaign = "Christmas2024" + marketing_event.utm_source = "facebook" + marketing_event.utm_medium = "cpc" + marketing_event.event_type = "ad" + marketing_event.referring_domain = "facebook.com" + marketing_event.marketing_channel = "social" + marketing_event.paid = true + marketing_event.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/marketing_events.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/marketing_events/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 1}), headers: {}) + + response = ShopifyAPI::MarketingEvent.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/marketing_events/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/marketing_events/998730532.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"marketing_event" => {"id" => 998730532, "event_type" => "post", "remote_id" => "12345678", "started_at" => "2024-10-15T10:56:18-05:00", "ended_at" => nil, "scheduled_to_end_at" => nil, "budget" => "10.11", "currency" => "GBP", "manage_url" => nil, "preview_url" => nil, "utm_campaign" => "1234567890", "utm_source" => "facebook", "utm_medium" => "facebook-post", "budget_type" => "daily", "description" => nil, "marketing_channel" => "social", "paid" => false, "referring_domain" => "facebook.com", "breadcrumb_id" => nil, "marketing_activity_id" => nil, "admin_graphql_api_id" => "gid://shopify/MarketingEvent/998730532", "marketed_resources" => []}}), headers: {}) + + response = ShopifyAPI::MarketingEvent.find( + id: 998730532, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/marketing_events/998730532.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/marketing_events/998730532.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "marketing_event" => hash_including({"remote_id" => "1000:2000", "started_at" => "2024-02-02T00:00 +00:00", "ended_at" => "2024-02-03T00:00 +00:00", "scheduled_to_end_at" => "2024-02-04T00:00 +00:00", "budget" => "11.1", "budget_type" => "daily", "currency" => "CAD", "utm_campaign" => "other", "utm_source" => "other", "utm_medium" => "other", "event_type" => "ad", "referring_domain" => "instagram.com"}) } + ) + .to_return(status: 200, body: JSON.generate({"marketing_event" => {"started_at" => "2024-02-01T19:00:00-05:00", "ended_at" => "2024-02-02T19:00:00-05:00", "scheduled_to_end_at" => "2024-02-03T19:00:00-05:00", "remote_id" => "1000:2000", "currency" => "CAD", "budget" => "11.1", "budget_type" => "daily", "id" => 998730532, "event_type" => "post", "manage_url" => nil, "preview_url" => nil, "utm_campaign" => "1234567890", "utm_source" => "facebook", "utm_medium" => "facebook-post", "description" => nil, "marketing_channel" => "social", "paid" => false, "referring_domain" => "facebook.com", "breadcrumb_id" => nil, "marketing_activity_id" => nil, "admin_graphql_api_id" => "gid://shopify/MarketingEvent/998730532", "marketed_resources" => []}}), headers: {}) + + response = marketing_event = ShopifyAPI::MarketingEvent.new + marketing_event.id = 998730532 + marketing_event.remote_id = "1000:2000" + marketing_event.started_at = "2024-02-02T00:00 +00:00" + marketing_event.ended_at = "2024-02-03T00:00 +00:00" + marketing_event.scheduled_to_end_at = "2024-02-04T00:00 +00:00" + marketing_event.budget = "11.1" + marketing_event.budget_type = "daily" + marketing_event.currency = "CAD" + marketing_event.utm_campaign = "other" + marketing_event.utm_source = "other" + marketing_event.utm_medium = "other" + marketing_event.event_type = "ad" + marketing_event.referring_domain = "instagram.com" + marketing_event.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/marketing_events/998730532.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/marketing_events/998730532.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::MarketingEvent.delete( + id: 998730532, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/marketing_events/998730532.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/marketing_events/998730532/engagements.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: hash_including({"engagements" => [{"occurred_on" => "2024-10-15", "views_count" => 0, "clicks_count" => 0, "favorites_count" => 0, "ad_spend" => 10.0, "is_cumulative" => true}, {"occurred_on" => "2024-10-16", "views_count" => 100, "clicks_count" => 50, "is_cumulative" => true}, {"occurred_on" => "2024-10-17", "views_count" => 200, "clicks_count" => 100, "is_cumulative" => true}]}) + ) + .to_return(status: 200, body: JSON.generate({"engagements" => [{"occurred_on" => "2024-10-15", "fetched_at" => nil, "views_count" => 0, "impressions_count" => nil, "clicks_count" => 0, "favorites_count" => 0, "comments_count" => nil, "shares_count" => nil, "ad_spend" => "10.0", "currency_code" => nil, "is_cumulative" => true, "unsubscribes_count" => nil, "complaints_count" => nil, "fails_count" => nil, "sends_count" => nil, "unique_views_count" => nil, "unique_clicks_count" => nil, "utc_offset" => nil}, {"occurred_on" => "2024-10-16", "fetched_at" => nil, "views_count" => 100, "impressions_count" => nil, "clicks_count" => 50, "favorites_count" => nil, "comments_count" => nil, "shares_count" => nil, "ad_spend" => nil, "currency_code" => nil, "is_cumulative" => true, "unsubscribes_count" => nil, "complaints_count" => nil, "fails_count" => nil, "sends_count" => nil, "unique_views_count" => nil, "unique_clicks_count" => nil, "utc_offset" => nil}, {"occurred_on" => "2024-10-17", "fetched_at" => nil, "views_count" => 200, "impressions_count" => nil, "clicks_count" => 100, "favorites_count" => nil, "comments_count" => nil, "shares_count" => nil, "ad_spend" => nil, "currency_code" => nil, "is_cumulative" => true, "unsubscribes_count" => nil, "complaints_count" => nil, "fails_count" => nil, "sends_count" => nil, "unique_views_count" => nil, "unique_clicks_count" => nil, "utc_offset" => nil}]}), headers: {}) + + response = marketing_event = ShopifyAPI::MarketingEvent.new + marketing_event.id = 998730532 + marketing_event.engagements( + body: {"engagements" => [{"occurred_on" => "2024-10-15", "views_count" => 0, "clicks_count" => 0, "favorites_count" => 0, "ad_spend" => 10.0, "is_cumulative" => true}, {"occurred_on" => "2024-10-16", "views_count" => 100, "clicks_count" => 50, "is_cumulative" => true}, {"occurred_on" => "2024-10-17", "views_count" => 200, "clicks_count" => 100, "is_cumulative" => true}]}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/marketing_events/998730532/engagements.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/metafield_test.rb b/test/rest/2024_10/metafield_test.rb new file mode 100644 index 00000000..2f248bfd --- /dev/null +++ b/test/rest/2024_10/metafield_test.rb @@ -0,0 +1,2267 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Metafield202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?metafield%5Bowner_id%5D=382285388&metafield%5Bowner_resource%5D=blog") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafields" => []}), headers: {}) + + response = ShopifyAPI::Metafield.all( + metafield: {"owner_id" => "382285388", "owner_resource" => "blog"}, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?metafield%5Bowner_id%5D=382285388&metafield%5Bowner_resource%5D=blog") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?metafield%5Bowner_id%5D=482865238&metafield%5Bowner_resource%5D=collection") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafields" => [{"id" => 519046726, "namespace" => "notes", "key" => "descriptionription", "value" => "Collection description", "description" => "Custom Collection notes", "owner_id" => 482865238, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "collection", "type" => "string", "admin_graphql_api_id" => "gid://shopify/Metafield/519046726"}, {"id" => 624849518, "namespace" => "global", "key" => "description_tag", "value" => "Some seo description value", "description" => nil, "owner_id" => 482865238, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "collection", "type" => "string", "admin_graphql_api_id" => "gid://shopify/Metafield/624849518"}, {"id" => 1010236510, "namespace" => "global", "key" => "title_tag", "value" => "Some seo title value", "description" => nil, "owner_id" => 482865238, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "collection", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1010236510"}]}), headers: {}) + + response = ShopifyAPI::Metafield.all( + metafield: {"owner_id" => "482865238", "owner_resource" => "collection"}, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?metafield%5Bowner_id%5D=482865238&metafield%5Bowner_resource%5D=collection") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?metafield%5Bowner_id%5D=207119551&metafield%5Bowner_resource%5D=customer") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafields" => [{"id" => 220591908, "namespace" => "discounts", "key" => "returning_customer", "value" => "no", "description" => "Customer deserves discount", "owner_id" => 207119551, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "customer", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/220591908"}]}), headers: {}) + + response = ShopifyAPI::Metafield.all( + metafield: {"owner_id" => "207119551", "owner_resource" => "customer"}, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?metafield%5Bowner_id%5D=207119551&metafield%5Bowner_resource%5D=customer") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?metafield%5Bowner_id%5D=622762746&metafield%5Bowner_resource%5D=draft_order") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafields" => [{"id" => 106172460, "namespace" => "notes", "key" => "note", "value" => "B flat", "description" => "This is for notes", "owner_id" => 622762746, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "draft_order", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/106172460"}]}), headers: {}) + + response = ShopifyAPI::Metafield.all( + metafield: {"owner_id" => "622762746", "owner_resource" => "draft_order"}, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?metafield%5Bowner_id%5D=622762746&metafield%5Bowner_resource%5D=draft_order") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?metafield%5Bowner_id%5D=131092082&metafield%5Bowner_resource%5D=page") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafields" => [{"id" => 290519330, "namespace" => "translation", "key" => "title_fr", "value" => "Le TOS", "description" => "Page French title translation", "owner_id" => 131092082, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "page", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/290519330"}]}), headers: {}) + + response = ShopifyAPI::Metafield.all( + metafield: {"owner_id" => "131092082", "owner_resource" => "page"}, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?metafield%5Bowner_id%5D=131092082&metafield%5Bowner_resource%5D=page") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?metafield%5Bowner_id%5D=632910392&metafield%5Bowner_resource%5D=product") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafields" => [{"id" => 51714266, "namespace" => "my_namespace", "key" => "my_key", "value" => "Hello", "description" => nil, "owner_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "product", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/51714266"}, {"id" => 116539875, "namespace" => "descriptors", "key" => "subtitle", "value" => "The best ipod", "description" => nil, "owner_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "product", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/116539875"}, {"id" => 263497237, "namespace" => "installments", "key" => "disable", "value" => true, "description" => nil, "owner_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "product", "type" => "boolean", "admin_graphql_api_id" => "gid://shopify/Metafield/263497237"}, {"id" => 273160493, "namespace" => "facts", "key" => "isbn", "value" => "978-0-14-004259-7", "description" => nil, "owner_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "product", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/273160493"}, {"id" => 524118066, "namespace" => "facts", "key" => "ean", "value" => "0123456789012", "description" => nil, "owner_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "product", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/524118066"}, {"id" => 543636738, "namespace" => "reviews", "key" => "rating_count", "value" => 1, "description" => nil, "owner_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "product", "type" => "number_integer", "admin_graphql_api_id" => "gid://shopify/Metafield/543636738"}, {"id" => 572384404, "namespace" => "reviews", "key" => "rating", "value" => "{\"value\": \"3.5\", \"scale_min\": \"1.0\", \"scale_max\": \"5.0\"}", "description" => nil, "owner_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "product", "type" => "rating", "admin_graphql_api_id" => "gid://shopify/Metafield/572384404"}, {"id" => 613330208, "namespace" => "shopify_filter", "key" => "display", "value" => "retina", "description" => "This field keeps track of the type of display", "owner_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "product", "type" => "string", "admin_graphql_api_id" => "gid://shopify/Metafield/613330208"}, {"id" => 779326701, "namespace" => "facts", "key" => "upc", "value" => "012345678901", "description" => nil, "owner_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "product", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/779326701"}, {"id" => 845366454, "namespace" => "translations", "key" => "title_fr", "value" => "produit", "description" => "French product title", "owner_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "product", "type" => "string", "admin_graphql_api_id" => "gid://shopify/Metafield/845366454"}, {"id" => 861799889, "namespace" => "my_other_fields", "key" => "organic", "value" => true, "description" => nil, "owner_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "product", "type" => "boolean", "admin_graphql_api_id" => "gid://shopify/Metafield/861799889"}, {"id" => 870326793, "namespace" => "descriptors", "key" => "care_guide", "value" => "Wash in cold water", "description" => nil, "owner_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "product", "type" => nil, "admin_graphql_api_id" => "gid://shopify/Metafield/870326793"}, {"id" => 908250163, "namespace" => "my_other_fields", "key" => "shipping_policy", "value" => "Ships for free in Canada", "description" => nil, "owner_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "product", "type" => "multi_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/908250163"}, {"id" => 925288667, "namespace" => "my_other_fields", "key" => "year_released", "value" => 2019, "description" => nil, "owner_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "product", "type" => "number_integer", "admin_graphql_api_id" => "gid://shopify/Metafield/925288667"}, {"id" => 1001077698, "namespace" => "my_fields", "key" => "best_for", "value" => "travel", "description" => nil, "owner_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "product", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1001077698"}, {"id" => 1029402048, "namespace" => "my_other_fields", "key" => "ingredients", "value" => "[\"apple\", \"music\", \"u2\"]", "description" => nil, "owner_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "product", "type" => "list.single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1029402048"}]}), headers: {}) + + response = ShopifyAPI::Metafield.all( + metafield: {"owner_id" => "632910392", "owner_resource" => "product"}, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?metafield%5Bowner_id%5D=632910392&metafield%5Bowner_resource%5D=product") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?metafield%5Bowner_id%5D=850703190&metafield%5Bowner_resource%5D=product_image") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafields" => [{"id" => 625663657, "namespace" => "translation", "key" => "title_fr", "value" => "tbn", "description" => "French product image title", "owner_id" => 850703190, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "product_image", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/625663657"}]}), headers: {}) + + response = ShopifyAPI::Metafield.all( + metafield: {"owner_id" => "850703190", "owner_resource" => "product_image"}, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?metafield%5Bowner_id%5D=850703190&metafield%5Bowner_resource%5D=product_image") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?metafield%5Bowner_id%5D=49148385&metafield%5Bowner_resource%5D=variants") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafields" => []}), headers: {}) + + response = ShopifyAPI::Metafield.all( + metafield: {"owner_id" => "49148385", "owner_resource" => "variants"}, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?metafield%5Bowner_id%5D=49148385&metafield%5Bowner_resource%5D=variants") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?metafield%5Bowner_id%5D=674387490&metafield%5Bowner_resource%5D=article") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafields" => []}), headers: {}) + + response = ShopifyAPI::Metafield.all( + metafield: {"owner_id" => "674387490", "owner_resource" => "article"}, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?metafield%5Bowner_id%5D=674387490&metafield%5Bowner_resource%5D=article") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?metafield%5Bowner_id%5D=450789469&metafield%5Bowner_resource%5D=order") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafields" => [{"id" => 915396079, "namespace" => "notes", "key" => "buyer", "value" => "Notes about this buyer", "description" => "This field is for buyer notes", "owner_id" => 450789469, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "order", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/915396079"}]}), headers: {}) + + response = ShopifyAPI::Metafield.all( + metafield: {"owner_id" => "450789469", "owner_resource" => "order"}, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?metafield%5Bowner_id%5D=450789469&metafield%5Bowner_resource%5D=order") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_11() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafields" => [{"id" => 721389482, "namespace" => "affiliates", "key" => "app_key", "value" => "app_key", "description" => nil, "owner_id" => 548380009, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "shop", "type" => "string", "admin_graphql_api_id" => "gid://shopify/Metafield/721389482"}]}), headers: {}) + + response = ShopifyAPI::Metafield.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_12() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?since_id=721389482") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafields" => [{"id" => 1069228974, "namespace" => "my_fields", "key" => "my_items", "value" => "{\"items\":[\"some item\"]}", "description" => nil, "owner_id" => 548380009, "created_at" => "2024-10-02T09:09:35-05:00", "updated_at" => "2024-10-02T09:09:35-05:00", "owner_resource" => "shop", "type" => "json", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228974"}]}), headers: {}) + + response = ShopifyAPI::Metafield.all( + since_id: "721389482", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json?since_id=721389482") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_13() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/382285388/metafields.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"namespace" => "my_fields", "key" => "sponsor", "type" => "single_line_text_field", "value" => "Shopify"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 1069228957, "namespace" => "my_fields", "key" => "sponsor", "value" => "Shopify", "description" => nil, "owner_id" => 382285388, "created_at" => "2024-10-02T09:08:56-05:00", "updated_at" => "2024-10-02T09:08:56-05:00", "owner_resource" => "blog", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228957"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.blog_id = 382285388 + metafield.namespace = "my_fields" + metafield.key = "sponsor" + metafield.type = "single_line_text_field" + metafield.value = "Shopify" + metafield.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/382285388/metafields.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_14() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/collections/482865238/metafields.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"namespace" => "my_fields", "key" => "discount", "type" => "single_line_text_field", "value" => "25%"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 1069228958, "namespace" => "my_fields", "key" => "discount", "value" => "25%", "description" => nil, "owner_id" => 482865238, "created_at" => "2024-10-02T09:08:58-05:00", "updated_at" => "2024-10-02T09:08:58-05:00", "owner_resource" => "collection", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228958"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.collection_id = 482865238 + metafield.namespace = "my_fields" + metafield.key = "discount" + metafield.type = "single_line_text_field" + metafield.value = "25%" + metafield.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/collections/482865238/metafields.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_15() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/metafields.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"namespace" => "discounts", "key" => "special", "value" => "yes", "type" => "single_line_text_field"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 1069228949, "namespace" => "discounts", "key" => "special", "value" => "yes", "description" => nil, "owner_id" => 207119551, "created_at" => "2024-10-02T09:08:43-05:00", "updated_at" => "2024-10-02T09:08:43-05:00", "owner_resource" => "customer", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228949"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.customer_id = 207119551 + metafield.namespace = "discounts" + metafield.key = "special" + metafield.value = "yes" + metafield.type = "single_line_text_field" + metafield.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/metafields.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_16() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/622762746/metafields.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"namespace" => "my_fields", "key" => "purchase_order", "type" => "single_line_text_field", "value" => "97453"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 1069228956, "namespace" => "my_fields", "key" => "purchase_order", "value" => "97453", "description" => nil, "owner_id" => 622762746, "created_at" => "2024-10-02T09:08:55-05:00", "updated_at" => "2024-10-02T09:08:55-05:00", "owner_resource" => "draft_order", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228956"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.draft_order_id = 622762746 + metafield.namespace = "my_fields" + metafield.key = "purchase_order" + metafield.type = "single_line_text_field" + metafield.value = "97453" + metafield.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/622762746/metafields.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_17() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082/metafields.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"namespace" => "my_fields", "key" => "subtitle", "type" => "single_line_text_field", "value" => "A subtitle for my page"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 1069228994, "namespace" => "my_fields", "key" => "subtitle", "value" => "A subtitle for my page", "description" => nil, "owner_id" => 131092082, "created_at" => "2024-10-02T09:10:22-05:00", "updated_at" => "2024-10-02T09:10:22-05:00", "owner_resource" => "page", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228994"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.page_id = 131092082 + metafield.namespace = "my_fields" + metafield.key = "subtitle" + metafield.type = "single_line_text_field" + metafield.value = "A subtitle for my page" + metafield.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082/metafields.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_18() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/metafields.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"namespace" => "inventory", "key" => "warehouse", "value" => 25, "type" => "number_integer"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 1069228955, "namespace" => "inventory", "key" => "warehouse", "value" => 25, "description" => nil, "owner_id" => 632910392, "created_at" => "2024-10-02T09:08:52-05:00", "updated_at" => "2024-10-02T09:08:52-05:00", "owner_resource" => "product", "type" => "number_integer", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228955"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.product_id = 632910392 + metafield.namespace = "inventory" + metafield.key = "warehouse" + metafield.value = 25 + metafield.type = "number_integer" + metafield.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/metafields.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_19() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/product_images/850703190/metafields.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"namespace" => "translation", "key" => "title_spanish", "type" => "single_line_text_field", "value" => "botas"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 1069228961, "namespace" => "translation", "key" => "title_spanish", "value" => "botas", "description" => nil, "owner_id" => 850703190, "created_at" => "2024-10-02T09:09:02-05:00", "updated_at" => "2024-10-02T09:09:02-05:00", "owner_resource" => "product_image", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228961"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.product_image_id = 850703190 + metafield.namespace = "translation" + metafield.key = "title_spanish" + metafield.type = "single_line_text_field" + metafield.value = "botas" + metafield.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/product_images/850703190/metafields.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_20() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/variants/49148385/metafields.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"namespace" => "my_fields", "key" => "liner_material", "type" => "single_line_text_field", "value" => "synthetic leather"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 1069228970, "namespace" => "my_fields", "key" => "liner_material", "value" => "synthetic leather", "description" => nil, "owner_id" => 49148385, "created_at" => "2024-10-02T09:09:31-05:00", "updated_at" => "2024-10-02T09:09:31-05:00", "owner_resource" => "variant", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228970"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.variant_id = 49148385 + metafield.namespace = "my_fields" + metafield.key = "liner_material" + metafield.type = "single_line_text_field" + metafield.value = "synthetic leather" + metafield.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/variants/49148385/metafields.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_21() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/articles/674387490/metafields.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"namespace" => "my_fields", "key" => "category", "type" => "single_line_text_field", "value" => "outdoors"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 1069228969, "namespace" => "my_fields", "key" => "category", "value" => "outdoors", "description" => nil, "owner_id" => 674387490, "created_at" => "2024-10-02T09:09:29-05:00", "updated_at" => "2024-10-02T09:09:29-05:00", "owner_resource" => "article", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228969"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.article_id = 674387490 + metafield.namespace = "my_fields" + metafield.key = "category" + metafield.type = "single_line_text_field" + metafield.value = "outdoors" + metafield.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/articles/674387490/metafields.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_22() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/metafields.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"namespace" => "my_fields", "key" => "purchase_order", "type" => "single_line_text_field", "value" => "123"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 1069228979, "namespace" => "my_fields", "key" => "purchase_order", "value" => "123", "description" => nil, "owner_id" => 450789469, "created_at" => "2024-10-02T09:09:45-05:00", "updated_at" => "2024-10-02T09:09:45-05:00", "owner_resource" => "order", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228979"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.order_id = 450789469 + metafield.namespace = "my_fields" + metafield.key = "purchase_order" + metafield.type = "single_line_text_field" + metafield.value = "123" + metafield.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/metafields.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_23() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"namespace" => "my_fields", "key" => "my_items", "value" => "{\"items\":[\"some item\"]}", "type" => "json"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 1069228982, "namespace" => "my_fields", "key" => "my_items", "value" => "{\"items\":[\"some item\"]}", "description" => nil, "owner_id" => 548380009, "created_at" => "2024-10-02T09:09:54-05:00", "updated_at" => "2024-10-02T09:09:54-05:00", "owner_resource" => "shop", "type" => "json", "admin_graphql_api_id" => "gid://shopify/Metafield/1069228982"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.namespace = "my_fields" + metafield.key = "my_items" + metafield.value = "{\"items\":[\"some item\"]}" + metafield.type = "json" + metafield.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/metafields.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_24() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/382285388/metafields/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 0}), headers: {}) + + response = ShopifyAPI::Metafield.count( + blog_id: 382285388, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/382285388/metafields/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_25() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collections/482865238/metafields/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 3}), headers: {}) + + response = ShopifyAPI::Metafield.count( + collection_id: 482865238, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collections/482865238/metafields/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_26() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/metafields/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 1}), headers: {}) + + response = ShopifyAPI::Metafield.count( + customer_id: 207119551, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/metafields/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_27() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/622762746/metafields/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 1}), headers: {}) + + response = ShopifyAPI::Metafield.count( + draft_order_id: 622762746, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/622762746/metafields/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_28() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082/metafields/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 1}), headers: {}) + + response = ShopifyAPI::Metafield.count( + page_id: 131092082, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082/metafields/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_29() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/metafields/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 16}), headers: {}) + + response = ShopifyAPI::Metafield.count( + product_id: 632910392, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/metafields/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_30() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/product_images/850703190/metafields/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 1}), headers: {}) + + response = ShopifyAPI::Metafield.count( + product_image_id: 850703190, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/product_images/850703190/metafields/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_31() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/variants/49148385/metafields/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 0}), headers: {}) + + response = ShopifyAPI::Metafield.count( + variant_id: 49148385, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/variants/49148385/metafields/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_32() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/articles/674387490/metafields/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 0}), headers: {}) + + response = ShopifyAPI::Metafield.count( + article_id: 674387490, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/articles/674387490/metafields/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_33() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/metafields/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 1}), headers: {}) + + response = ShopifyAPI::Metafield.count( + order_id: 450789469, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/metafields/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_34() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 1}), headers: {}) + + response = ShopifyAPI::Metafield.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_35() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/382285388/metafields/534526895.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 534526895, "namespace" => "translation", "key" => "title_fr", "value" => "Le iPod", "description" => "Blog French title translation", "owner_id" => 241253187, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "blog", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/534526895"}}), headers: {}) + + response = ShopifyAPI::Metafield.find( + blog_id: 382285388, + id: 534526895, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/382285388/metafields/534526895.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_36() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collections/482865238/metafields/1010236510.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 1010236510, "namespace" => "global", "key" => "title_tag", "value" => "Some seo title value", "description" => nil, "owner_id" => 482865238, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "collection", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1010236510"}}), headers: {}) + + response = ShopifyAPI::Metafield.find( + collection_id: 482865238, + id: 1010236510, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/collections/482865238/metafields/1010236510.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_37() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/metafields/220591908.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 220591908, "namespace" => "discounts", "key" => "returning_customer", "value" => "no", "description" => "Customer deserves discount", "owner_id" => 207119551, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "customer", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/220591908"}}), headers: {}) + + response = ShopifyAPI::Metafield.find( + customer_id: 207119551, + id: 220591908, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/metafields/220591908.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_38() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/622762746/metafields/106172460.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 106172460, "namespace" => "notes", "key" => "note", "value" => "B flat", "description" => "This is for notes", "owner_id" => 622762746, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "draft_order", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/106172460"}}), headers: {}) + + response = ShopifyAPI::Metafield.find( + draft_order_id: 622762746, + id: 106172460, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/622762746/metafields/106172460.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_39() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082/metafields/290519330.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 290519330, "namespace" => "translation", "key" => "title_fr", "value" => "Le TOS", "description" => "Page French title translation", "owner_id" => 131092082, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "page", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/290519330"}}), headers: {}) + + response = ShopifyAPI::Metafield.find( + page_id: 131092082, + id: 290519330, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082/metafields/290519330.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_40() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/metafields/1001077698.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 1001077698, "namespace" => "my_fields", "key" => "best_for", "value" => "travel", "description" => nil, "owner_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "product", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1001077698"}}), headers: {}) + + response = ShopifyAPI::Metafield.find( + product_id: 632910392, + id: 1001077698, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/metafields/1001077698.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_41() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/product_images/850703190/metafields/625663657.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 625663657, "namespace" => "translation", "key" => "title_fr", "value" => "tbn", "description" => "French product image title", "owner_id" => 850703190, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "product_image", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/625663657"}}), headers: {}) + + response = ShopifyAPI::Metafield.find( + product_image_id: 850703190, + id: 625663657, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/product_images/850703190/metafields/625663657.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_42() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/variants/49148385/metafields/323119633.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 323119633, "namespace" => "my_fields", "key" => "color", "value" => "Pink", "description" => nil, "owner_id" => 808950810, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "variant", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/323119633"}}), headers: {}) + + response = ShopifyAPI::Metafield.find( + variant_id: 49148385, + id: 323119633, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/variants/49148385/metafields/323119633.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_43() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/articles/674387490/metafields/838981074.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 838981074, "namespace" => "translation", "key" => "title_fr", "value" => "Le Article", "description" => "Article French title translation", "owner_id" => 134645308, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "article", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/838981074"}}), headers: {}) + + response = ShopifyAPI::Metafield.find( + article_id: 674387490, + id: 838981074, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/articles/674387490/metafields/838981074.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_44() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/metafields/915396079.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 915396079, "namespace" => "notes", "key" => "buyer", "value" => "Notes about this buyer", "description" => "This field is for buyer notes", "owner_id" => 450789469, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "order", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/915396079"}}), headers: {}) + + response = ShopifyAPI::Metafield.find( + order_id: 450789469, + id: 915396079, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/metafields/915396079.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_45() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields/721389482.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"id" => 721389482, "namespace" => "affiliates", "key" => "app_key", "value" => "app_key", "description" => nil, "owner_id" => 548380009, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "owner_resource" => "shop", "type" => "string", "admin_graphql_api_id" => "gid://shopify/Metafield/721389482"}}), headers: {}) + + response = ShopifyAPI::Metafield.find( + id: 721389482, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/metafields/721389482.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_46() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/382285388/metafields/534526895.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"value" => "a translated blog title", "type" => "single_line_text_field"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"value" => "a translated blog title", "owner_id" => 241253187, "namespace" => "translation", "key" => "title_fr", "id" => 534526895, "description" => "Blog French title translation", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:09:59-05:00", "owner_resource" => "blog", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/534526895"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.blog_id = 382285388 + metafield.id = 534526895 + metafield.value = "a translated blog title" + metafield.type = "single_line_text_field" + metafield.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/382285388/metafields/534526895.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_47() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/collections/482865238/metafields/1010236510.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"value" => "seo title", "type" => "single_line_text_field"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"value" => "seo title", "owner_id" => 482865238, "namespace" => "global", "key" => "title_tag", "id" => 1010236510, "description" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:09:50-05:00", "owner_resource" => "collection", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1010236510"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.collection_id = 482865238 + metafield.id = 1010236510 + metafield.value = "seo title" + metafield.type = "single_line_text_field" + metafield.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/collections/482865238/metafields/1010236510.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_48() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/metafields/220591908.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"value" => "yes", "type" => "single_line_text_field"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"value" => "yes", "owner_id" => 207119551, "namespace" => "discounts", "key" => "returning_customer", "id" => 220591908, "description" => "Customer deserves discount", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:09:43-05:00", "owner_resource" => "customer", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/220591908"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.customer_id = 207119551 + metafield.id = 220591908 + metafield.value = "yes" + metafield.type = "single_line_text_field" + metafield.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/metafields/220591908.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_49() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/622762746/metafields/106172460.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"value" => "110000", "type" => "single_line_text_field"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"value" => "110000", "owner_id" => 622762746, "namespace" => "notes", "key" => "note", "id" => 106172460, "description" => "This is for notes", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:10:05-05:00", "owner_resource" => "draft_order", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/106172460"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.draft_order_id = 622762746 + metafield.id = 106172460 + metafield.value = "110000" + metafield.type = "single_line_text_field" + metafield.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/622762746/metafields/106172460.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_50() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082/metafields/290519330.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"value" => "An updated translation", "type" => "single_line_text_field"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"value" => "An updated translation", "owner_id" => 131092082, "namespace" => "translation", "key" => "title_fr", "id" => 290519330, "description" => "Page French title translation", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:09:20-05:00", "owner_resource" => "page", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/290519330"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.page_id = 131092082 + metafield.id = 290519330 + metafield.value = "An updated translation" + metafield.type = "single_line_text_field" + metafield.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082/metafields/290519330.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_51() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/metafields/1001077698.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"value" => "having fun", "type" => "single_line_text_field"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"value" => "having fun", "owner_id" => 632910392, "namespace" => "my_fields", "key" => "best_for", "id" => 1001077698, "description" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:09:56-05:00", "owner_resource" => "product", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/1001077698"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.product_id = 632910392 + metafield.id = 1001077698 + metafield.value = "having fun" + metafield.type = "single_line_text_field" + metafield.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/metafields/1001077698.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_52() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/product_images/850703190/metafields/625663657.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"value" => "translated description", "type" => "single_line_text_field"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"value" => "translated description", "owner_id" => 850703190, "namespace" => "translation", "key" => "title_fr", "id" => 625663657, "description" => "French product image title", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:09:26-05:00", "owner_resource" => "product_image", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/625663657"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.product_image_id = 850703190 + metafield.id = 625663657 + metafield.value = "translated description" + metafield.type = "single_line_text_field" + metafield.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/product_images/850703190/metafields/625663657.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_53() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/variants/49148385/metafields/323119633.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"value" => "Red", "type" => "single_line_text_field"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"value" => "Red", "owner_id" => 808950810, "namespace" => "my_fields", "key" => "color", "id" => 323119633, "description" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:10:11-05:00", "owner_resource" => "variant", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/323119633"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.variant_id = 49148385 + metafield.id = 323119633 + metafield.value = "Red" + metafield.type = "single_line_text_field" + metafield.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/variants/49148385/metafields/323119633.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_54() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/metafields/721389482.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"value" => "[\"something new\"]", "type" => "list.single_line_text_field"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"value" => "[\"something new\"]", "owner_id" => 548380009, "namespace" => "affiliates", "key" => "app_key", "id" => 721389482, "description" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:08:44-05:00", "owner_resource" => "shop", "type" => "list.single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/721389482"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.id = 721389482 + metafield.value = "[\"something new\"]" + metafield.type = "list.single_line_text_field" + metafield.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/metafields/721389482.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_55() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/articles/674387490/metafields/838981074.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"value" => "a translated title", "type" => "single_line_text_field"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"value" => "a translated title", "owner_id" => 134645308, "namespace" => "translation", "key" => "title_fr", "id" => 838981074, "description" => "Article French title translation", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:09:07-05:00", "owner_resource" => "article", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/838981074"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.article_id = 674387490 + metafield.id = 838981074 + metafield.value = "a translated title" + metafield.type = "single_line_text_field" + metafield.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/articles/674387490/metafields/838981074.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_56() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/metafields/915396079.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "metafield" => hash_including({"value" => "Provided a discount code", "type" => "single_line_text_field"}) } + ) + .to_return(status: 200, body: JSON.generate({"metafield" => {"value" => "Provided a discount code", "owner_id" => 450789469, "namespace" => "notes", "key" => "buyer", "id" => 915396079, "description" => "This field is for buyer notes", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:08:48-05:00", "owner_resource" => "order", "type" => "single_line_text_field", "admin_graphql_api_id" => "gid://shopify/Metafield/915396079"}}), headers: {}) + + response = metafield = ShopifyAPI::Metafield.new + metafield.order_id = 450789469 + metafield.id = 915396079 + metafield.value = "Provided a discount code" + metafield.type = "single_line_text_field" + metafield.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/metafields/915396079.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_57() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/382285388/metafields/534526895.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Metafield.delete( + blog_id: 382285388, + id: 534526895, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/blogs/382285388/metafields/534526895.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_58() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/collections/482865238/metafields/1010236510.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Metafield.delete( + collection_id: 482865238, + id: 1010236510, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/collections/482865238/metafields/1010236510.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_59() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/metafields/220591908.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Metafield.delete( + customer_id: 207119551, + id: 220591908, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/customers/207119551/metafields/220591908.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_60() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/622762746/metafields/106172460.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Metafield.delete( + draft_order_id: 622762746, + id: 106172460, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/draft_orders/622762746/metafields/106172460.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_61() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082/metafields/290519330.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Metafield.delete( + page_id: 131092082, + id: 290519330, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082/metafields/290519330.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_62() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/metafields/1001077698.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Metafield.delete( + product_id: 632910392, + id: 1001077698, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/metafields/1001077698.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_63() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/product_images/850703190/metafields/625663657.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Metafield.delete( + product_image_id: 850703190, + id: 625663657, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/product_images/850703190/metafields/625663657.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_64() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/variants/49148385/metafields/323119633.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Metafield.delete( + variant_id: 49148385, + id: 323119633, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/variants/49148385/metafields/323119633.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_65() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/articles/674387490/metafields/838981074.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Metafield.delete( + article_id: 674387490, + id: 838981074, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/articles/674387490/metafields/838981074.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_66() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/metafields/915396079.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Metafield.delete( + order_id: 450789469, + id: 915396079, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/metafields/915396079.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_67() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/metafields/721389482.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Metafield.delete( + id: 721389482, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/metafields/721389482.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/mobile_platform_application_test.rb b/test/rest/2024_10/mobile_platform_application_test.rb new file mode 100644 index 00000000..b9175a64 --- /dev/null +++ b/test/rest/2024_10/mobile_platform_application_test.rb @@ -0,0 +1,282 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class MobilePlatformApplication202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/mobile_platform_applications.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"mobile_platform_applications" => [{"id" => 1066175996, "application_id" => "X1Y2.ca.domain.app", "platform" => "ios", "created_at" => "2024-10-02T09:02:51-05:00", "updated_at" => "2024-10-02T09:02:51-05:00", "sha256_cert_fingerprints" => [], "enabled_universal_or_app_links" => true, "enabled_shared_webcredentials" => true, "enabled_app_clips" => false, "app_clip_application_id" => nil}, {"id" => 1066175997, "application_id" => "com.example", "platform" => "android", "created_at" => "2024-10-02T09:02:51-05:00", "updated_at" => "2024-10-02T09:02:51-05:00", "sha256_cert_fingerprints" => ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"], "enabled_universal_or_app_links" => true, "enabled_shared_webcredentials" => false, "enabled_app_clips" => false, "app_clip_application_id" => nil}]}), headers: {}) + + response = ShopifyAPI::MobilePlatformApplication.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/mobile_platform_applications.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/mobile_platform_applications.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "mobile_platform_application" => hash_including({"platform" => "android", "application_id" => "com.example", "sha256_cert_fingerprints" => ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"], "enabled_universal_or_app_links" => true}) } + ) + .to_return(status: 200, body: JSON.generate({"mobile_platform_application" => {"id" => 1066175998, "application_id" => "com.example", "platform" => "android", "created_at" => "2024-10-02T09:02:52-05:00", "updated_at" => "2024-10-02T09:02:52-05:00", "sha256_cert_fingerprints" => ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"], "enabled_universal_or_app_links" => true, "enabled_shared_webcredentials" => false, "enabled_app_clips" => false, "app_clip_application_id" => nil}}), headers: {}) + + response = mobile_platform_application = ShopifyAPI::MobilePlatformApplication.new + mobile_platform_application.platform = "android" + mobile_platform_application.application_id = "com.example" + mobile_platform_application.sha256_cert_fingerprints = [ + "14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5" + ] + mobile_platform_application.enabled_universal_or_app_links = true + mobile_platform_application.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/mobile_platform_applications.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/mobile_platform_applications.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "mobile_platform_application" => hash_including({"platform" => "ios", "application_id" => "X1Y2.ca.domain.app", "enabled_universal_or_app_links" => true, "enabled_shared_webcredentials" => true}) } + ) + .to_return(status: 200, body: JSON.generate({"mobile_platform_application" => {"id" => 1066176003, "application_id" => "X1Y2.ca.domain.app", "platform" => "ios", "created_at" => "2024-10-02T09:02:57-05:00", "updated_at" => "2024-10-02T09:02:57-05:00", "sha256_cert_fingerprints" => [], "enabled_universal_or_app_links" => true, "enabled_shared_webcredentials" => true, "enabled_app_clips" => false, "app_clip_application_id" => nil}}), headers: {}) + + response = mobile_platform_application = ShopifyAPI::MobilePlatformApplication.new + mobile_platform_application.platform = "ios" + mobile_platform_application.application_id = "X1Y2.ca.domain.app" + mobile_platform_application.enabled_universal_or_app_links = true + mobile_platform_application.enabled_shared_webcredentials = true + mobile_platform_application.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/mobile_platform_applications.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/mobile_platform_applications/1066176001.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"mobile_platform_application" => {"id" => 1066176001, "application_id" => "X1Y2.ca.domain.app", "platform" => "ios", "created_at" => "2024-10-02T09:02:55-05:00", "updated_at" => "2024-10-02T09:02:55-05:00", "sha256_cert_fingerprints" => [], "enabled_universal_or_app_links" => true, "enabled_shared_webcredentials" => true, "enabled_app_clips" => false, "app_clip_application_id" => nil}}), headers: {}) + + response = ShopifyAPI::MobilePlatformApplication.find( + id: 1066176001, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/mobile_platform_applications/1066176001.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/mobile_platform_applications/1066175999.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "mobile_platform_application" => hash_including({"application_id" => "com.example.news.app", "platform" => "android", "created_at" => "2024-10-02T09:02:52-05:00", "updated_at" => "2024-10-02T09:02:52-05:00", "sha256_cert_fingerprints" => ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"], "enabled_universal_or_app_links" => true, "enabled_shared_webcredentials" => false, "enabled_app_clips" => false, "app_clip_application_id" => nil}) } + ) + .to_return(status: 200, body: JSON.generate({"mobile_platform_application" => {"application_id" => "com.example.news.app", "platform" => "android", "sha256_cert_fingerprints" => ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"], "enabled_universal_or_app_links" => true, "enabled_shared_webcredentials" => false, "id" => 1066175999, "created_at" => "2024-10-02T09:02:52-05:00", "updated_at" => "2024-10-02T09:02:53-05:00", "enabled_app_clips" => false, "app_clip_application_id" => nil}}), headers: {}) + + response = mobile_platform_application = ShopifyAPI::MobilePlatformApplication.new + mobile_platform_application.id = 1066175999 + mobile_platform_application.application_id = "com.example.news.app" + mobile_platform_application.platform = "android" + mobile_platform_application.created_at = "2024-10-02T09:02:52-05:00" + mobile_platform_application.updated_at = "2024-10-02T09:02:52-05:00" + mobile_platform_application.sha256_cert_fingerprints = [ + "14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5" + ] + mobile_platform_application.enabled_universal_or_app_links = true + mobile_platform_application.enabled_shared_webcredentials = false + mobile_platform_application.enabled_app_clips = false + mobile_platform_application.app_clip_application_id = nil + mobile_platform_application.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/mobile_platform_applications/1066175999.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/mobile_platform_applications/1066176002.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "mobile_platform_application" => hash_including({"application_id" => "A1B2.ca.domain.app", "platform" => "ios", "created_at" => "2024-10-02T09:02:55-05:00", "updated_at" => "2024-10-02T09:02:55-05:00", "sha256_cert_fingerprints" => [], "enabled_universal_or_app_links" => true, "enabled_shared_webcredentials" => true, "enabled_app_clips" => false, "app_clip_application_id" => nil}) } + ) + .to_return(status: 200, body: JSON.generate({"mobile_platform_application" => {"application_id" => "A1B2.ca.domain.app", "platform" => "ios", "sha256_cert_fingerprints" => [], "enabled_universal_or_app_links" => true, "enabled_shared_webcredentials" => true, "id" => 1066176002, "created_at" => "2024-10-02T09:02:55-05:00", "updated_at" => "2024-10-02T09:02:56-05:00", "enabled_app_clips" => false, "app_clip_application_id" => nil}}), headers: {}) + + response = mobile_platform_application = ShopifyAPI::MobilePlatformApplication.new + mobile_platform_application.id = 1066176002 + mobile_platform_application.application_id = "A1B2.ca.domain.app" + mobile_platform_application.platform = "ios" + mobile_platform_application.created_at = "2024-10-02T09:02:55-05:00" + mobile_platform_application.updated_at = "2024-10-02T09:02:55-05:00" + mobile_platform_application.sha256_cert_fingerprints = [] + mobile_platform_application.enabled_universal_or_app_links = true + mobile_platform_application.enabled_shared_webcredentials = true + mobile_platform_application.enabled_app_clips = false + mobile_platform_application.app_clip_application_id = nil + mobile_platform_application.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/mobile_platform_applications/1066176002.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/mobile_platform_applications/1066176000.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::MobilePlatformApplication.delete( + id: 1066176000, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/mobile_platform_applications/1066176000.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/order_risk_test.rb b/test/rest/2024_10/order_risk_test.rb new file mode 100644 index 00000000..86bdd64f --- /dev/null +++ b/test/rest/2024_10/order_risk_test.rb @@ -0,0 +1,206 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class OrderRisk202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/risks.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "risk" => hash_including({"message" => "This order came from an anonymous proxy", "recommendation" => "cancel", "score" => "1.0", "source" => "External", "cause_cancel" => true, "display" => true}) } + ) + .to_return(status: 200, body: JSON.generate({"risk" => {"id" => 1029151490, "order_id" => 450789469, "checkout_id" => 901414060, "source" => "External", "score" => "1.0", "recommendation" => "cancel", "display" => true, "cause_cancel" => true, "message" => "This order came from an anonymous proxy", "merchant_message" => "This order came from an anonymous proxy"}}), headers: {}) + + response = order_risk = ShopifyAPI::OrderRisk.new + order_risk.order_id = 450789469 + order_risk.message = "This order came from an anonymous proxy" + order_risk.recommendation = "cancel" + order_risk.score = "1.0" + order_risk.source = "External" + order_risk.cause_cancel = true + order_risk.display = true + order_risk.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/risks.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/risks.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"risks" => [{"id" => 284138680, "order_id" => 450789469, "checkout_id" => nil, "source" => "External", "score" => "1.0", "recommendation" => "cancel", "display" => true, "cause_cancel" => true, "message" => "This order was placed from a proxy IP", "merchant_message" => "This order was placed from a proxy IP"}, {"id" => 1029151489, "order_id" => 450789469, "checkout_id" => 901414060, "source" => "External", "score" => "1.0", "recommendation" => "cancel", "display" => true, "cause_cancel" => true, "message" => "This order came from an anonymous proxy", "merchant_message" => "This order came from an anonymous proxy"}]}), headers: {}) + + response = ShopifyAPI::OrderRisk.all( + order_id: 450789469, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/risks.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/risks/284138680.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"risk" => {"id" => 284138680, "order_id" => 450789469, "checkout_id" => nil, "source" => "External", "score" => "1.0", "recommendation" => "cancel", "display" => true, "cause_cancel" => true, "message" => "This order was placed from a proxy IP", "merchant_message" => "This order was placed from a proxy IP"}}), headers: {}) + + response = ShopifyAPI::OrderRisk.find( + order_id: 450789469, + id: 284138680, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/risks/284138680.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/risks/284138680.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "risk" => hash_including({"message" => "After further review, this is a legitimate order", "recommendation" => "accept", "source" => "External", "cause_cancel" => false, "score" => "0.0"}) } + ) + .to_return(status: 200, body: JSON.generate({"risk" => {"order_id" => 450789469, "cause_cancel" => false, "message" => "After further review, this is a legitimate order", "recommendation" => "accept", "score" => "0.0", "source" => "External", "id" => 284138680, "checkout_id" => nil, "display" => true, "merchant_message" => "After further review, this is a legitimate order"}}), headers: {}) + + response = order_risk = ShopifyAPI::OrderRisk.new + order_risk.order_id = 450789469 + order_risk.id = 284138680 + order_risk.message = "After further review, this is a legitimate order" + order_risk.recommendation = "accept" + order_risk.source = "External" + order_risk.cause_cancel = false + order_risk.score = "0.0" + order_risk.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/risks/284138680.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/risks/284138680.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::OrderRisk.delete( + order_id: 450789469, + id: 284138680, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/risks/284138680.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/order_test.rb b/test/rest/2024_10/order_test.rb new file mode 100644 index 00000000..cc3107fa --- /dev/null +++ b/test/rest/2024_10/order_test.rb @@ -0,0 +1,1328 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Order202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json?status=any") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"orders" => [{"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => nil, "confirmation_number" => nil, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "3.33", "current_total_discounts_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.65", "current_total_price_set" => {"shop_money" => {"amount" => "199.65", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.65", "currency_code" => "USD"}}, "current_total_tax" => "3.98", "current_total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2008-01-10T11:00:00-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T08:59:11-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-10-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-10-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => 548380009, "order_adjustments" => [], "transactions" => [{"id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => nil, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => {}, "source_name" => "web", "status" => "success", "test" => false, "user_id" => nil}], "refund_line_items" => [{"id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}]}), headers: {}) + + response = ShopifyAPI::Order.all( + status: "any", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json?status=any") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json?since_id=123") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"orders" => [{"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => nil, "confirmation_number" => nil, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "3.33", "current_total_discounts_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.65", "current_total_price_set" => {"shop_money" => {"amount" => "199.65", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.65", "currency_code" => "USD"}}, "current_total_tax" => "3.98", "current_total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2008-01-10T11:00:00-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T08:59:11-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-10-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-10-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => 548380009, "order_adjustments" => [], "transactions" => [{"id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => nil, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => {}, "source_name" => "web", "status" => "success", "test" => false, "user_id" => nil}], "refund_line_items" => [{"id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}]}), headers: {}) + + response = ShopifyAPI::Order.all( + since_id: "123", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json?since_id=123") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json?fields=created_at%2Cid%2Cname%2Ctotal-price") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"orders" => [{"id" => 450789469, "created_at" => "2008-01-10T11:00:00-05:00", "name" => "#1001", "total_price" => "598.94"}]}), headers: {}) + + response = ShopifyAPI::Order.all( + fields: "created_at,id,name,total-price", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json?fields=created_at%2Cid%2Cname%2Ctotal-price") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json?updated_at_min=2005-07-31T15%3A57%3A11-04%3A00") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"orders" => [{"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => nil, "confirmation_number" => nil, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "3.33", "current_total_discounts_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.65", "current_total_price_set" => {"shop_money" => {"amount" => "199.65", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.65", "currency_code" => "USD"}}, "current_total_tax" => "3.98", "current_total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2008-01-10T11:00:00-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T08:59:11-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-10-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-10-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => 548380009, "order_adjustments" => [], "transactions" => [{"id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => nil, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => {}, "source_name" => "web", "status" => "success", "test" => false, "user_id" => nil}], "refund_line_items" => [{"id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}]}), headers: {}) + + response = ShopifyAPI::Order.all( + updated_at_min: "2005-07-31T15:57:11-04:00", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json?updated_at_min=2005-07-31T15%3A57%3A11-04%3A00") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json?financial_status=authorized") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"orders" => [{"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => nil, "confirmation_number" => nil, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "3.33", "current_total_discounts_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.65", "current_total_price_set" => {"shop_money" => {"amount" => "199.65", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.65", "currency_code" => "USD"}}, "current_total_tax" => "3.98", "current_total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "authorized", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:04:19-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T08:59:11-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-10-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-10-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => 548380009, "order_adjustments" => [], "transactions" => [{"id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => nil, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => {}, "source_name" => "web", "status" => "success", "test" => false, "user_id" => nil}], "refund_line_items" => [{"id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}]}), headers: {}) + + response = ShopifyAPI::Order.all( + financial_status: "authorized", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json?financial_status=authorized") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json?ids=1073459972") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"orders" => [{"id" => 1073459972, "admin_graphql_api_id" => "gid://shopify/Order/1073459972", "app_id" => 755357713, "browser_ip" => nil, "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => nil, "checkout_id" => nil, "checkout_token" => nil, "client_details" => nil, "closed_at" => nil, "confirmation_number" => "MFWM2CZK8", "confirmed" => true, "contact_email" => nil, "created_at" => "2024-10-02T09:04:18-05:00", "currency" => "USD", "current_subtotal_price" => "199.00", "current_subtotal_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "0.00", "current_total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.00", "current_total_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "current_total_tax" => "0.00", "current_total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [], "email" => "", "estimated_taxes" => false, "financial_status" => "paid", "fulfillment_status" => nil, "landing_site" => nil, "landing_site_ref" => nil, "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1002", "note" => nil, "note_attributes" => [], "number" => 2, "order_number" => 1002, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/e6148b4dbdcddf58fe50af960b4aef46/authenticate?key=b0bc2568cd9e91f913293c7d4e703f1d", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => [], "phone" => nil, "po_number" => nil, "presentment_currency" => "USD", "processed_at" => "2024-10-02T09:04:18-05:00", "reference" => nil, "referring_site" => nil, "source_identifier" => nil, "source_name" => "755357713", "source_url" => nil, "subtotal_price" => "199.00", "subtotal_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [], "taxes_included" => false, "test" => false, "token" => "e6148b4dbdcddf58fe50af960b4aef46", "total_discounts" => "0.00", "total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_line_items_price" => "199.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_outstanding" => "199.00", "total_price" => "199.00", "total_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "0.00", "total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:04:18-05:00", "user_id" => nil, "billing_address" => nil, "customer" => nil, "discount_applications" => [], "fulfillments" => [], "line_items" => [{"id" => 1071823202, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823202", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "shipwire-app", "fulfillment_status" => nil, "gift_card" => false, "grams" => 567, "name" => "IPod Touch 8GB - Black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 921728736, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "taxable" => true, "title" => "IPod Touch 8GB", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 447654529, "variant_inventory_management" => "shipwire-app", "variant_title" => "Black", "vendor" => "Apple", "tax_lines" => [], "duties" => [], "discount_allocations" => []}], "payment_terms" => nil, "refunds" => [], "shipping_address" => nil, "shipping_lines" => []}]}), headers: {}) + + response = ShopifyAPI::Order.all( + ids: "1073459972", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json?ids=1073459972") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json?fields=id%2Cline_items%2Cname%2Ctotal_price") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 450789469, "name" => "#1001", "total_price" => "598.94", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}}), headers: {}) + + response = ShopifyAPI::Order.find( + id: 450789469, + fields: "id,line_items,name,total_price", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json?fields=id%2Cline_items%2Cname%2Ctotal_price") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => nil, "confirmation_number" => nil, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "3.33", "current_total_discounts_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.65", "current_total_price_set" => {"shop_money" => {"amount" => "199.65", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.65", "currency_code" => "USD"}}, "current_total_tax" => "3.98", "current_total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2008-01-10T11:00:00-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T08:59:11-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-10-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-10-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => 548380009, "order_adjustments" => [], "transactions" => [{"id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => nil, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => {}, "source_name" => "web", "status" => "success", "test" => false, "user_id" => nil}], "refund_line_items" => [{"id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}}), headers: {}) + + response = ShopifyAPI::Order.find( + id: 450789469, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/count.json?status=any") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 1}), headers: {}) + + response = ShopifyAPI::Order.count( + status: "any", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/count.json?status=any") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/count.json?financial_status=authorized") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 1}), headers: {}) + + response = ShopifyAPI::Order.count( + financial_status: "authorized", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/count.json?financial_status=authorized") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_11() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/close.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => "2024-10-02T09:04:41-05:00", "confirmation_number" => nil, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "3.33", "current_total_discounts_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.65", "current_total_price_set" => {"shop_money" => {"amount" => "199.65", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.65", "currency_code" => "USD"}}, "current_total_tax" => "3.98", "current_total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:04:41-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T08:59:11-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-10-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-10-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => 548380009, "order_adjustments" => [], "transactions" => [{"id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => nil, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => {}, "source_name" => "web", "status" => "success", "test" => false, "user_id" => nil}], "refund_line_items" => [{"id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.id = 450789469 + order.close + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/close.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_12() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/open.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => nil, "confirmation_number" => nil, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "3.33", "current_total_discounts_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.65", "current_total_price_set" => {"shop_money" => {"amount" => "199.65", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.65", "currency_code" => "USD"}}, "current_total_tax" => "3.98", "current_total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:03:49-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T08:59:11-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-10-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-10-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => 548380009, "order_adjustments" => [], "transactions" => [{"id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => nil, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => {}, "source_name" => "web", "status" => "success", "test" => false, "user_id" => nil}], "refund_line_items" => [{"id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.id = 450789469 + order.open + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/open.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_13() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/cancel.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => nil, "confirmation_number" => nil, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "3.33", "current_total_discounts_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.65", "current_total_price_set" => {"shop_money" => {"amount" => "199.65", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.65", "currency_code" => "USD"}}, "current_total_tax" => "3.98", "current_total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2008-01-10T11:00:00-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T08:59:11-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-10-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-10-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => 548380009, "order_adjustments" => [], "transactions" => [{"id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => nil, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => {}, "source_name" => "web", "status" => "success", "test" => false, "user_id" => nil}], "refund_line_items" => [{"id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}, "notice" => "Order has been canceled"}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.id = 450789469 + order.cancel + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/cancel.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_14() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/cancel.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: hash_including({"amount" => "10.00", "currency" => "USD"}) + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => nil, "confirmation_number" => nil, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "587.00", "current_subtotal_price_set" => {"shop_money" => {"amount" => "587.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "587.00", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "10.00", "current_total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "598.94", "current_total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "current_total_tax" => "11.94", "current_total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "refunded", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "598.94", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:04:02-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T08:59:11-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 929361469, "admin_graphql_api_id" => "gid://shopify/Refund/929361469", "created_at" => "2024-10-02T09:04:02-05:00", "note" => "Order canceled", "order_id" => 450789469, "processed_at" => "2024-10-02T09:04:02-05:00", "restock" => false, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => nil, "order_adjustments" => [], "transactions" => [{"id" => 1068278498, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/1068278498", "amount" => "10.00", "authorization" => nil, "created_at" => "2024-10-02T09:04:02-05:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => "Bogus Gateway: Forced success", "order_id" => 450789469, "parent_id" => 1068278497, "payment_id" => "c901414060.3", "processed_at" => "2024-10-02T09:04:02-05:00", "receipt" => {}, "source_name" => "755357713", "status" => "success", "test" => true, "user_id" => nil}], "refund_line_items" => [{"id" => 1058498313, "line_item_id" => 466157049, "location_id" => nil, "quantity" => 1, "restock_type" => "no_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 1058498314, "line_item_id" => 518995019, "location_id" => nil, "quantity" => 1, "restock_type" => "no_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 1058498315, "line_item_id" => 703073504, "location_id" => nil, "quantity" => 1, "restock_type" => "no_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}, "notice" => "Order has been canceled"}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.id = 450789469 + order.cancel( + body: {"amount" => "10.00", "currency" => "USD"}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/cancel.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_15() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/cancel.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: hash_including({"refund" => {"note" => "Customer made a mistake", "shipping" => {"full_refund" => true}, "refund_line_items" => [{"line_item_id" => 466157049, "quantity" => 1, "restock_type" => "cancel", "location_id" => 24826418}], "transactions" => [{"parent_id" => 1068278486, "amount" => "10.00", "kind" => "refund", "gateway" => "bogus"}, {"parent_id" => 1068278487, "amount" => "100.00", "kind" => "refund", "gateway" => "gift_card"}]}}) + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => nil, "confirmation_number" => nil, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "587.00", "current_subtotal_price_set" => {"shop_money" => {"amount" => "587.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "587.00", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "10.00", "current_total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "598.94", "current_total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "current_total_tax" => "11.94", "current_total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "refunded", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus", "gift_card"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "598.94", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:03:37-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T08:59:11-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 929361468, "admin_graphql_api_id" => "gid://shopify/Refund/929361468", "created_at" => "2024-10-02T09:03:37-05:00", "note" => "Order canceled", "order_id" => 450789469, "processed_at" => "2024-10-02T09:03:37-05:00", "restock" => false, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => nil, "order_adjustments" => [{"id" => 1030976843, "amount" => "89.64", "amount_set" => {"shop_money" => {"amount" => "89.64", "currency_code" => "USD"}, "presentment_money" => {"amount" => "89.64", "currency_code" => "USD"}}, "kind" => "refund_discrepancy", "order_id" => 450789469, "reason" => "Refund discrepancy", "refund_id" => 929361468, "tax_amount" => "0.00", "tax_amount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}}], "transactions" => [{"id" => 1068278488, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/1068278488", "amount" => "10.00", "authorization" => nil, "created_at" => "2024-10-02T09:03:37-05:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => "Bogus Gateway: Forced success", "order_id" => 450789469, "parent_id" => 1068278486, "payment_id" => "c901414060.4", "processed_at" => "2024-10-02T09:03:37-05:00", "receipt" => {}, "source_name" => "755357713", "status" => "success", "test" => true, "user_id" => nil}, {"id" => 1068278489, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/1068278489", "amount" => "100.00", "authorization" => nil, "created_at" => "2024-10-02T09:03:37-05:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "gift_card", "kind" => "refund", "location_id" => nil, "message" => nil, "order_id" => 450789469, "parent_id" => 1068278487, "payment_id" => "c901414060.5", "processed_at" => "2024-10-02T09:03:37-05:00", "receipt" => {"gift_card_id" => 1035197676, "gift_card_last_characters" => "0d0d"}, "source_name" => "755357713", "status" => "success", "test" => false, "user_id" => nil}], "refund_line_items" => [{"id" => 1058498312, "line_item_id" => 466157049, "location_id" => nil, "quantity" => 1, "restock_type" => "no_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}, "notice" => "Order has been canceled"}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.id = 450789469 + order.cancel( + body: {"refund" => {"note" => "Customer made a mistake", "shipping" => {"full_refund" => true}, "refund_line_items" => [{"line_item_id" => 466157049, "quantity" => 1, "restock_type" => "cancel", "location_id" => 24826418}], "transactions" => [{"parent_id" => 1068278486, "amount" => "10.00", "kind" => "refund", "gateway" => "bogus"}, {"parent_id" => 1068278487, "amount" => "100.00", "kind" => "refund", "gateway" => "gift_card"}]}}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/cancel.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_16() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "order" => hash_including({"line_items" => [{"title" => "Big Brown Bear Boots", "price" => 74.99, "grams" => "1300", "quantity" => 3, "tax_lines" => [{"price" => 13.5, "rate" => 0.06, "title" => "State tax"}]}], "transactions" => [{"kind" => "sale", "status" => "success", "amount" => 238.47}], "total_tax" => 13.5, "currency" => "EUR"}) } + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 1073459975, "admin_graphql_api_id" => "gid://shopify/Order/1073459975", "app_id" => 755357713, "browser_ip" => nil, "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => nil, "checkout_id" => nil, "checkout_token" => nil, "client_details" => nil, "closed_at" => nil, "confirmation_number" => "0ZW4V9P7W", "confirmed" => true, "contact_email" => nil, "created_at" => "2024-10-02T09:04:31-05:00", "currency" => "EUR", "current_subtotal_price" => "224.97", "current_subtotal_price_set" => {"shop_money" => {"amount" => "224.97", "currency_code" => "EUR"}, "presentment_money" => {"amount" => "224.97", "currency_code" => "EUR"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "0.00", "current_total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "EUR"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "EUR"}}, "current_total_duties_set" => nil, "current_total_price" => "238.47", "current_total_price_set" => {"shop_money" => {"amount" => "238.47", "currency_code" => "EUR"}, "presentment_money" => {"amount" => "238.47", "currency_code" => "EUR"}}, "current_total_tax" => "13.50", "current_total_tax_set" => {"shop_money" => {"amount" => "13.50", "currency_code" => "EUR"}, "presentment_money" => {"amount" => "13.50", "currency_code" => "EUR"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [], "email" => "", "estimated_taxes" => false, "financial_status" => "paid", "fulfillment_status" => nil, "landing_site" => nil, "landing_site_ref" => nil, "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1002", "note" => nil, "note_attributes" => [], "number" => 2, "order_number" => 1002, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/dd4ddd56c817e612ca849e17672417ec/authenticate?key=327b7aa85e06b1de824125bcc1421d0d", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => [""], "phone" => nil, "po_number" => nil, "presentment_currency" => "EUR", "processed_at" => "2024-10-02T09:04:31-05:00", "reference" => nil, "referring_site" => nil, "source_identifier" => nil, "source_name" => "755357713", "source_url" => nil, "subtotal_price" => "224.97", "subtotal_price_set" => {"shop_money" => {"amount" => "224.97", "currency_code" => "EUR"}, "presentment_money" => {"amount" => "224.97", "currency_code" => "EUR"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "13.50", "rate" => 0.06, "title" => "State tax", "price_set" => {"shop_money" => {"amount" => "13.50", "currency_code" => "EUR"}, "presentment_money" => {"amount" => "13.50", "currency_code" => "EUR"}}, "channel_liable" => false}], "taxes_included" => false, "test" => false, "token" => "dd4ddd56c817e612ca849e17672417ec", "total_discounts" => "0.00", "total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "EUR"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "EUR"}}, "total_line_items_price" => "224.97", "total_line_items_price_set" => {"shop_money" => {"amount" => "224.97", "currency_code" => "EUR"}, "presentment_money" => {"amount" => "224.97", "currency_code" => "EUR"}}, "total_outstanding" => "0.00", "total_price" => "238.47", "total_price_set" => {"shop_money" => {"amount" => "238.47", "currency_code" => "EUR"}, "presentment_money" => {"amount" => "238.47", "currency_code" => "EUR"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "EUR"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "EUR"}}, "total_tax" => "13.50", "total_tax_set" => {"shop_money" => {"amount" => "13.50", "currency_code" => "EUR"}, "presentment_money" => {"amount" => "13.50", "currency_code" => "EUR"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:04:31-05:00", "user_id" => nil, "billing_address" => nil, "customer" => nil, "discount_applications" => [], "fulfillments" => [], "line_items" => [{"id" => 1071823207, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823207", "current_quantity" => 3, "fulfillable_quantity" => 3, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 1300, "name" => "Big Brown Bear Boots", "price" => "74.99", "price_set" => {"shop_money" => {"amount" => "74.99", "currency_code" => "EUR"}, "presentment_money" => {"amount" => "74.99", "currency_code" => "EUR"}}, "product_exists" => false, "product_id" => nil, "properties" => [], "quantity" => 3, "requires_shipping" => true, "sku" => nil, "taxable" => true, "title" => "Big Brown Bear Boots", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "EUR"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "EUR"}}, "variant_id" => nil, "variant_inventory_management" => nil, "variant_title" => nil, "vendor" => nil, "tax_lines" => [{"channel_liable" => false, "price" => "13.50", "price_set" => {"shop_money" => {"amount" => "13.50", "currency_code" => "EUR"}, "presentment_money" => {"amount" => "13.50", "currency_code" => "EUR"}}, "rate" => 0.06, "title" => "State tax"}], "duties" => [], "discount_allocations" => []}], "payment_terms" => nil, "refunds" => [], "shipping_address" => nil, "shipping_lines" => []}}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.line_items = [ + { + "title" => "Big Brown Bear Boots", + "price" => 74.99, + "grams" => "1300", + "quantity" => 3, + "tax_lines" => [ + { + "price" => 13.5, + "rate" => 0.06, + "title" => "State tax" + } + ] + } + ] + order.transactions = [ + { + "kind" => "sale", + "status" => "success", + "amount" => 238.47 + } + ] + order.total_tax = 13.5 + order.currency = "EUR" + order.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_17() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "order" => hash_including({"line_items" => [{"variant_id" => 447654529, "quantity" => 1}], "customer" => {"first_name" => "Paul", "last_name" => "Norman", "email" => "paul.norman@example.com"}, "billing_address" => {"first_name" => "John", "last_name" => "Smith", "address1" => "123 Fake Street", "phone" => "555-555-5555", "city" => "Fakecity", "province" => "Ontario", "country" => "Canada", "zip" => "K2P 1L4"}, "shipping_address" => {"first_name" => "Jane", "last_name" => "Smith", "address1" => "123 Fake Street", "phone" => "777-777-7777", "city" => "Fakecity", "province" => "Ontario", "country" => "Canada", "zip" => "K2P 1L4"}, "email" => "jane@example.com", "transactions" => [{"kind" => "authorization", "status" => "success", "amount" => 50.0}], "financial_status" => "partially_paid"}) } + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 1073459969, "admin_graphql_api_id" => "gid://shopify/Order/1073459969", "app_id" => 755357713, "browser_ip" => nil, "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => nil, "checkout_id" => nil, "checkout_token" => nil, "client_details" => nil, "closed_at" => nil, "confirmation_number" => "X7855I5Z8", "confirmed" => true, "contact_email" => "jane@example.com", "created_at" => "2024-10-02T09:04:00-05:00", "currency" => "USD", "current_subtotal_price" => "199.00", "current_subtotal_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "0.00", "current_total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.00", "current_total_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "current_total_tax" => "0.00", "current_total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [], "email" => "jane@example.com", "estimated_taxes" => false, "financial_status" => "partially_paid", "fulfillment_status" => nil, "landing_site" => nil, "landing_site_ref" => nil, "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1002", "note" => nil, "note_attributes" => [], "number" => 2, "order_number" => 1002, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/1410b8d45683e2f551d863ce38cfa228/authenticate?key=8b5fda62dfd116d1dca9837ff81e5175", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => [""], "phone" => nil, "po_number" => nil, "presentment_currency" => "USD", "processed_at" => "2024-10-02T09:04:00-05:00", "reference" => nil, "referring_site" => nil, "source_identifier" => nil, "source_name" => "755357713", "source_url" => nil, "subtotal_price" => "199.00", "subtotal_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [], "taxes_included" => false, "test" => false, "token" => "1410b8d45683e2f551d863ce38cfa228", "total_discounts" => "0.00", "total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_line_items_price" => "199.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_outstanding" => "149.00", "total_price" => "199.00", "total_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "0.00", "total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:04:00-05:00", "user_id" => nil, "billing_address" => {"first_name" => "John", "address1" => "123 Fake Street", "phone" => "555-555-5555", "city" => "Fakecity", "zip" => "K2P 1L4", "province" => "Ontario", "country" => "Canada", "last_name" => "Smith", "address2" => nil, "company" => nil, "latitude" => nil, "longitude" => nil, "name" => "John Smith", "country_code" => "CA", "province_code" => "ON"}, "customer" => {"id" => 1073339463, "email" => "paul.norman@example.com", "created_at" => "2024-10-02T09:04:00-05:00", "updated_at" => "2024-10-02T09:04:00-05:00", "first_name" => "John", "last_name" => "Smith", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => nil, "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => nil}, "sms_marketing_consent" => nil, "tags" => "", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/1073339463", "default_address" => {"id" => 1053317293, "customer_id" => 1073339463, "first_name" => "Jane", "last_name" => "Smith", "company" => nil, "address1" => "123 Fake Street", "address2" => nil, "city" => "Fakecity", "province" => "Ontario", "country" => "Canada", "zip" => "K2P 1L4", "phone" => "777-777-7777", "name" => "Jane Smith", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true}}, "discount_applications" => [], "fulfillments" => [], "line_items" => [{"id" => 1071823199, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823199", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "shipwire-app", "fulfillment_status" => nil, "gift_card" => false, "grams" => 567, "name" => "IPod Touch 8GB - Black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 921728736, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "taxable" => true, "title" => "IPod Touch 8GB", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 447654529, "variant_inventory_management" => "shipwire-app", "variant_title" => "Black", "vendor" => "Apple", "tax_lines" => [], "duties" => [], "discount_allocations" => []}], "payment_terms" => nil, "refunds" => [], "shipping_address" => {"first_name" => "Jane", "address1" => "123 Fake Street", "phone" => "777-777-7777", "city" => "Fakecity", "zip" => "K2P 1L4", "province" => "Ontario", "country" => "Canada", "last_name" => "Smith", "address2" => nil, "company" => nil, "latitude" => nil, "longitude" => nil, "name" => "Jane Smith", "country_code" => "CA", "province_code" => "ON"}, "shipping_lines" => []}}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.line_items = [ + { + "variant_id" => 447654529, + "quantity" => 1 + } + ] + order.customer = { + "first_name" => "Paul", + "last_name" => "Norman", + "email" => "paul.norman@example.com" + } + order.billing_address = { + "first_name" => "John", + "last_name" => "Smith", + "address1" => "123 Fake Street", + "phone" => "555-555-5555", + "city" => "Fakecity", + "province" => "Ontario", + "country" => "Canada", + "zip" => "K2P 1L4" + } + order.shipping_address = { + "first_name" => "Jane", + "last_name" => "Smith", + "address1" => "123 Fake Street", + "phone" => "777-777-7777", + "city" => "Fakecity", + "province" => "Ontario", + "country" => "Canada", + "zip" => "K2P 1L4" + } + order.email = "jane@example.com" + order.transactions = [ + { + "kind" => "authorization", + "status" => "success", + "amount" => 50.0 + } + ] + order.financial_status = "partially_paid" + order.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_18() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "order" => hash_including({"line_items" => [{"variant_id" => 447654529, "quantity" => 1}], "customer" => {"id" => 207119551}, "financial_status" => "pending"}) } + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 1073459974, "admin_graphql_api_id" => "gid://shopify/Order/1073459974", "app_id" => 755357713, "browser_ip" => nil, "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => nil, "checkout_id" => nil, "checkout_token" => nil, "client_details" => nil, "closed_at" => nil, "confirmation_number" => "R1TIJIQDF", "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T09:04:27-05:00", "currency" => "USD", "current_subtotal_price" => "199.00", "current_subtotal_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "0.00", "current_total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.00", "current_total_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "current_total_tax" => "0.00", "current_total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "pending", "fulfillment_status" => nil, "landing_site" => nil, "landing_site_ref" => nil, "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1002", "note" => nil, "note_attributes" => [], "number" => 2, "order_number" => 1002, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/67087edca78728ca07684bc4a2210e57/authenticate?key=fab624a3f8689b5bf506c7063fee13ee", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => [], "phone" => nil, "po_number" => nil, "presentment_currency" => "USD", "processed_at" => "2024-10-02T09:04:27-05:00", "reference" => nil, "referring_site" => nil, "source_identifier" => nil, "source_name" => "755357713", "source_url" => nil, "subtotal_price" => "199.00", "subtotal_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [], "taxes_included" => false, "test" => false, "token" => "67087edca78728ca07684bc4a2210e57", "total_discounts" => "0.00", "total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_line_items_price" => "199.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_outstanding" => "199.00", "total_price" => "199.00", "total_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "0.00", "total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:04:27-05:00", "user_id" => nil, "billing_address" => nil, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:04:27-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [], "fulfillments" => [], "line_items" => [{"id" => 1071823206, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823206", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "shipwire-app", "fulfillment_status" => nil, "gift_card" => false, "grams" => 567, "name" => "IPod Touch 8GB - Black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 921728736, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "taxable" => true, "title" => "IPod Touch 8GB", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 447654529, "variant_inventory_management" => "shipwire-app", "variant_title" => "Black", "vendor" => "Apple", "tax_lines" => [], "duties" => [], "discount_allocations" => []}], "payment_terms" => nil, "refunds" => [], "shipping_address" => nil, "shipping_lines" => []}}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.line_items = [ + { + "variant_id" => 447654529, + "quantity" => 1 + } + ] + order.customer = { + "id" => 207119551 + } + order.financial_status = "pending" + order.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_19() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "order" => hash_including({"email" => "foo@example.com", "fulfillment_status" => "fulfilled", "fulfillments" => [{"location_id" => 24826418}], "line_items" => [{"variant_id" => 447654529, "quantity" => 1}]}) } + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 1073459965, "admin_graphql_api_id" => "gid://shopify/Order/1073459965", "app_id" => 755357713, "browser_ip" => nil, "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => nil, "checkout_id" => nil, "checkout_token" => nil, "client_details" => nil, "closed_at" => nil, "confirmation_number" => "THCEIXRIL", "confirmed" => true, "contact_email" => "foo@example.com", "created_at" => "2024-10-02T09:03:44-05:00", "currency" => "USD", "current_subtotal_price" => "199.00", "current_subtotal_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "0.00", "current_total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.00", "current_total_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "current_total_tax" => "0.00", "current_total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [], "email" => "foo@example.com", "estimated_taxes" => false, "financial_status" => "paid", "fulfillment_status" => "fulfilled", "landing_site" => nil, "landing_site_ref" => nil, "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1002", "note" => nil, "note_attributes" => [], "number" => 2, "order_number" => 1002, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/1f5645d22cb8e63a7d960147d70766c7/authenticate?key=41badde26dbc157bf732139c55c22c33", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => [], "phone" => nil, "po_number" => nil, "presentment_currency" => "USD", "processed_at" => "2024-10-02T09:03:44-05:00", "reference" => nil, "referring_site" => nil, "source_identifier" => nil, "source_name" => "755357713", "source_url" => nil, "subtotal_price" => "199.00", "subtotal_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [], "taxes_included" => false, "test" => false, "token" => "1f5645d22cb8e63a7d960147d70766c7", "total_discounts" => "0.00", "total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_line_items_price" => "199.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_outstanding" => "199.00", "total_price" => "199.00", "total_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "0.00", "total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:03:44-05:00", "user_id" => nil, "billing_address" => nil, "customer" => {"id" => 1073339460, "email" => "foo@example.com", "created_at" => "2024-10-02T09:03:44-05:00", "updated_at" => "2024-10-02T09:03:45-05:00", "first_name" => nil, "last_name" => nil, "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => nil, "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => nil}, "sms_marketing_consent" => nil, "tags" => "", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/1073339460"}, "discount_applications" => [], "fulfillments" => [{"id" => 1069019890, "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019890", "created_at" => "2024-10-02T09:03:44-05:00", "location_id" => 24826418, "name" => "#1002.1", "order_id" => 1073459965, "origin_address" => {}, "receipt" => {}, "service" => "shipwire-app", "shipment_status" => nil, "status" => "success", "tracking_company" => nil, "tracking_number" => nil, "tracking_numbers" => [], "tracking_url" => nil, "tracking_urls" => [], "updated_at" => "2024-10-02T09:03:44-05:00", "line_items" => [{"id" => 1071823195, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823195", "current_quantity" => 1, "fulfillable_quantity" => 0, "fulfillment_service" => "shipwire-app", "fulfillment_status" => "fulfilled", "gift_card" => false, "grams" => 567, "name" => "IPod Touch 8GB - Black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 921728736, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "taxable" => true, "title" => "IPod Touch 8GB", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 447654529, "variant_inventory_management" => "shipwire-app", "variant_title" => "Black", "vendor" => "Apple", "tax_lines" => [], "duties" => [], "discount_allocations" => []}]}], "line_items" => [{"id" => 1071823195, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823195", "current_quantity" => 1, "fulfillable_quantity" => 0, "fulfillment_service" => "shipwire-app", "fulfillment_status" => "fulfilled", "gift_card" => false, "grams" => 567, "name" => "IPod Touch 8GB - Black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 921728736, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "taxable" => true, "title" => "IPod Touch 8GB", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 447654529, "variant_inventory_management" => "shipwire-app", "variant_title" => "Black", "vendor" => "Apple", "tax_lines" => [], "duties" => [], "discount_allocations" => []}], "payment_terms" => nil, "refunds" => [], "shipping_address" => nil, "shipping_lines" => []}}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.email = "foo@example.com" + order.fulfillment_status = "fulfilled" + order.fulfillments = [ + { + "location_id" => 24826418 + } + ] + order.line_items = [ + { + "variant_id" => 447654529, + "quantity" => 1 + } + ] + order.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_20() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "order" => hash_including({"line_items" => [{"variant_id" => 447654529, "quantity" => 1}]}) } + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 1073459984, "admin_graphql_api_id" => "gid://shopify/Order/1073459984", "app_id" => 755357713, "browser_ip" => nil, "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => nil, "checkout_id" => nil, "checkout_token" => nil, "client_details" => nil, "closed_at" => nil, "confirmation_number" => "YQKT8VFVE", "confirmed" => true, "contact_email" => nil, "created_at" => "2024-10-02T09:04:55-05:00", "currency" => "USD", "current_subtotal_price" => "199.00", "current_subtotal_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "0.00", "current_total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.00", "current_total_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "current_total_tax" => "0.00", "current_total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [], "email" => "", "estimated_taxes" => false, "financial_status" => "paid", "fulfillment_status" => nil, "landing_site" => nil, "landing_site_ref" => nil, "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1002", "note" => nil, "note_attributes" => [], "number" => 2, "order_number" => 1002, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/dd72f73e4b3adafc686efb63314bcc47/authenticate?key=f36a4ef195e4d2ba262760e912f81b62", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => [], "phone" => nil, "po_number" => nil, "presentment_currency" => "USD", "processed_at" => "2024-10-02T09:04:55-05:00", "reference" => nil, "referring_site" => nil, "source_identifier" => nil, "source_name" => "755357713", "source_url" => nil, "subtotal_price" => "199.00", "subtotal_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [], "taxes_included" => false, "test" => false, "token" => "dd72f73e4b3adafc686efb63314bcc47", "total_discounts" => "0.00", "total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_line_items_price" => "199.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_outstanding" => "199.00", "total_price" => "199.00", "total_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "0.00", "total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:04:55-05:00", "user_id" => nil, "billing_address" => nil, "customer" => nil, "discount_applications" => [], "fulfillments" => [], "line_items" => [{"id" => 1071823214, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823214", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "shipwire-app", "fulfillment_status" => nil, "gift_card" => false, "grams" => 567, "name" => "IPod Touch 8GB - Black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 921728736, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "taxable" => true, "title" => "IPod Touch 8GB", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 447654529, "variant_inventory_management" => "shipwire-app", "variant_title" => "Black", "vendor" => "Apple", "tax_lines" => [], "duties" => [], "discount_allocations" => []}], "payment_terms" => nil, "refunds" => [], "shipping_address" => nil, "shipping_lines" => []}}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.line_items = [ + { + "variant_id" => 447654529, + "quantity" => 1 + } + ] + order.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_21() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "order" => hash_including({"email" => "foo@example.com", "fulfillment_status" => "fulfilled", "line_items" => [{"variant_id" => 447654529, "quantity" => 1}]}) } + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 1073459964, "admin_graphql_api_id" => "gid://shopify/Order/1073459964", "app_id" => 755357713, "browser_ip" => nil, "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => nil, "checkout_id" => nil, "checkout_token" => nil, "client_details" => nil, "closed_at" => nil, "confirmation_number" => "JNUA8GGE7", "confirmed" => true, "contact_email" => "foo@example.com", "created_at" => "2024-10-02T09:03:41-05:00", "currency" => "USD", "current_subtotal_price" => "199.00", "current_subtotal_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "0.00", "current_total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.00", "current_total_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "current_total_tax" => "0.00", "current_total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [], "email" => "foo@example.com", "estimated_taxes" => false, "financial_status" => "paid", "fulfillment_status" => "fulfilled", "landing_site" => nil, "landing_site_ref" => nil, "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1002", "note" => nil, "note_attributes" => [], "number" => 2, "order_number" => 1002, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/7065e08289ab835723267728a976ecc7/authenticate?key=5beab51ad4cc281e7cc47ba519c71aa9", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => [], "phone" => nil, "po_number" => nil, "presentment_currency" => "USD", "processed_at" => "2024-10-02T09:03:41-05:00", "reference" => nil, "referring_site" => nil, "source_identifier" => nil, "source_name" => "755357713", "source_url" => nil, "subtotal_price" => "199.00", "subtotal_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [], "taxes_included" => false, "test" => false, "token" => "7065e08289ab835723267728a976ecc7", "total_discounts" => "0.00", "total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_line_items_price" => "199.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_outstanding" => "199.00", "total_price" => "199.00", "total_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "0.00", "total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:03:41-05:00", "user_id" => nil, "billing_address" => nil, "customer" => {"id" => 1073339459, "email" => "foo@example.com", "created_at" => "2024-10-02T09:03:41-05:00", "updated_at" => "2024-10-02T09:03:41-05:00", "first_name" => nil, "last_name" => nil, "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => nil, "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => nil}, "sms_marketing_consent" => nil, "tags" => "", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/1073339459"}, "discount_applications" => [], "fulfillments" => [], "line_items" => [{"id" => 1071823194, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823194", "current_quantity" => 1, "fulfillable_quantity" => 0, "fulfillment_service" => "shipwire-app", "fulfillment_status" => nil, "gift_card" => false, "grams" => 567, "name" => "IPod Touch 8GB - Black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 921728736, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "taxable" => true, "title" => "IPod Touch 8GB", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 447654529, "variant_inventory_management" => "shipwire-app", "variant_title" => "Black", "vendor" => "Apple", "tax_lines" => [], "duties" => [], "discount_allocations" => []}], "payment_terms" => nil, "refunds" => [], "shipping_address" => nil, "shipping_lines" => []}}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.email = "foo@example.com" + order.fulfillment_status = "fulfilled" + order.line_items = [ + { + "variant_id" => 447654529, + "quantity" => 1 + } + ] + order.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_22() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "order" => hash_including({"email" => "foo@example.com", "fulfillment_status" => "fulfilled", "send_receipt" => true, "send_fulfillment_receipt" => true, "line_items" => [{"variant_id" => 457924702, "quantity" => 1}]}) } + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 1073459978, "admin_graphql_api_id" => "gid://shopify/Order/1073459978", "app_id" => 755357713, "browser_ip" => nil, "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => nil, "checkout_id" => nil, "checkout_token" => nil, "client_details" => nil, "closed_at" => nil, "confirmation_number" => "CX8G0E4H7", "confirmed" => true, "contact_email" => "foo@example.com", "created_at" => "2024-10-02T09:04:38-05:00", "currency" => "USD", "current_subtotal_price" => "199.00", "current_subtotal_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "0.00", "current_total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.00", "current_total_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "current_total_tax" => "0.00", "current_total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [], "email" => "foo@example.com", "estimated_taxes" => false, "financial_status" => "paid", "fulfillment_status" => "fulfilled", "landing_site" => nil, "landing_site_ref" => nil, "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1002", "note" => nil, "note_attributes" => [], "number" => 2, "order_number" => 1002, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/0094cb3cab56374f0e187d9286cec300/authenticate?key=797bf39cee2c897036ad3202b2862bc9", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => [], "phone" => nil, "po_number" => nil, "presentment_currency" => "USD", "processed_at" => "2024-10-02T09:04:38-05:00", "reference" => nil, "referring_site" => nil, "source_identifier" => nil, "source_name" => "755357713", "source_url" => nil, "subtotal_price" => "199.00", "subtotal_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [], "taxes_included" => false, "test" => false, "token" => "0094cb3cab56374f0e187d9286cec300", "total_discounts" => "0.00", "total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_line_items_price" => "199.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_outstanding" => "199.00", "total_price" => "199.00", "total_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "0.00", "total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:04:38-05:00", "user_id" => nil, "billing_address" => nil, "customer" => {"id" => 1073339465, "email" => "foo@example.com", "created_at" => "2024-10-02T09:04:38-05:00", "updated_at" => "2024-10-02T09:04:38-05:00", "first_name" => nil, "last_name" => nil, "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => nil, "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => nil}, "sms_marketing_consent" => nil, "tags" => "", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/1073339465"}, "discount_applications" => [], "fulfillments" => [{"id" => 1069019892, "admin_graphql_api_id" => "gid://shopify/Fulfillment/1069019892", "created_at" => "2024-10-02T09:04:38-05:00", "location_id" => 487838322, "name" => "#1002.1", "order_id" => 1073459978, "origin_address" => {}, "receipt" => {}, "service" => "manual", "shipment_status" => nil, "status" => "success", "tracking_company" => nil, "tracking_number" => nil, "tracking_numbers" => [], "tracking_url" => nil, "tracking_urls" => [], "updated_at" => "2024-10-02T09:04:38-05:00", "line_items" => [{"id" => 1071823209, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823209", "current_quantity" => 1, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => "fulfilled", "gift_card" => false, "grams" => 567, "name" => "IPod Nano - 8GB - Black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8GB", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "Black", "vendor" => "Apple", "tax_lines" => [], "duties" => [], "discount_allocations" => []}]}], "line_items" => [{"id" => 1071823209, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823209", "current_quantity" => 1, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => "fulfilled", "gift_card" => false, "grams" => 567, "name" => "IPod Nano - 8GB - Black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8GB", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "Black", "vendor" => "Apple", "tax_lines" => [], "duties" => [], "discount_allocations" => []}], "payment_terms" => nil, "refunds" => [], "shipping_address" => nil, "shipping_lines" => []}}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.email = "foo@example.com" + order.fulfillment_status = "fulfilled" + order.send_receipt = true + order.send_fulfillment_receipt = true + order.line_items = [ + { + "variant_id" => 457924702, + "quantity" => 1 + } + ] + order.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_23() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "order" => hash_including({"line_items" => [{"variant_id" => 447654529, "quantity" => 1}], "email" => "jane@example.com", "phone" => "18885551234", "billing_address" => {"first_name" => "John", "last_name" => "Smith", "address1" => "123 Fake Street", "phone" => "555-555-5555", "city" => "Fakecity", "province" => "Ontario", "country" => "Canada", "zip" => "K2P 1L4"}, "shipping_address" => {"first_name" => "Jane", "last_name" => "Smith", "address1" => "123 Fake Street", "phone" => "777-777-7777", "city" => "Fakecity", "province" => "Ontario", "country" => "Canada", "zip" => "K2P 1L4"}, "transactions" => [{"kind" => "sale", "status" => "success", "amount" => 50.0}], "financial_status" => "paid", "discount_codes" => [{"code" => "FAKE30", "amount" => "9.00", "type" => "percentage"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 1073459981, "admin_graphql_api_id" => "gid://shopify/Order/1073459981", "app_id" => 755357713, "browser_ip" => nil, "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => nil, "checkout_id" => nil, "checkout_token" => nil, "client_details" => nil, "closed_at" => nil, "confirmation_number" => "82C04VDXX", "confirmed" => true, "contact_email" => "jane@example.com", "created_at" => "2024-10-02T09:04:43-05:00", "currency" => "USD", "current_subtotal_price" => "181.09", "current_subtotal_price_set" => {"shop_money" => {"amount" => "181.09", "currency_code" => "USD"}, "presentment_money" => {"amount" => "181.09", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "17.91", "current_total_discounts_set" => {"shop_money" => {"amount" => "17.91", "currency_code" => "USD"}, "presentment_money" => {"amount" => "17.91", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "181.09", "current_total_price_set" => {"shop_money" => {"amount" => "181.09", "currency_code" => "USD"}, "presentment_money" => {"amount" => "181.09", "currency_code" => "USD"}}, "current_total_tax" => "0.00", "current_total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "FAKE30", "amount" => "17.91", "type" => "percentage"}], "email" => "jane@example.com", "estimated_taxes" => false, "financial_status" => "paid", "fulfillment_status" => nil, "landing_site" => nil, "landing_site_ref" => nil, "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1002", "note" => nil, "note_attributes" => [], "number" => 2, "order_number" => 1002, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/9fd15e7c469e1906e365f0589e5a02d9/authenticate?key=26f47355e74d44c6e49c3854c2dc7be0", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => [""], "phone" => "+18885551234", "po_number" => nil, "presentment_currency" => "USD", "processed_at" => "2024-10-02T09:04:43-05:00", "reference" => nil, "referring_site" => nil, "source_identifier" => nil, "source_name" => "755357713", "source_url" => nil, "subtotal_price" => "181.09", "subtotal_price_set" => {"shop_money" => {"amount" => "181.09", "currency_code" => "USD"}, "presentment_money" => {"amount" => "181.09", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [], "taxes_included" => false, "test" => false, "token" => "9fd15e7c469e1906e365f0589e5a02d9", "total_discounts" => "17.91", "total_discounts_set" => {"shop_money" => {"amount" => "17.91", "currency_code" => "USD"}, "presentment_money" => {"amount" => "17.91", "currency_code" => "USD"}}, "total_line_items_price" => "199.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_outstanding" => "131.09", "total_price" => "181.09", "total_price_set" => {"shop_money" => {"amount" => "181.09", "currency_code" => "USD"}, "presentment_money" => {"amount" => "181.09", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "0.00", "total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:04:43-05:00", "user_id" => nil, "billing_address" => {"first_name" => "John", "address1" => "123 Fake Street", "phone" => "555-555-5555", "city" => "Fakecity", "zip" => "K2P 1L4", "province" => "Ontario", "country" => "Canada", "last_name" => "Smith", "address2" => nil, "company" => nil, "latitude" => nil, "longitude" => nil, "name" => "John Smith", "country_code" => "CA", "province_code" => "ON"}, "customer" => {"id" => 1073339467, "email" => "jane@example.com", "created_at" => "2024-10-02T09:04:43-05:00", "updated_at" => "2024-10-02T09:04:43-05:00", "first_name" => "John", "last_name" => "Smith", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => nil, "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => nil}, "sms_marketing_consent" => nil, "tags" => "", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/1073339467", "default_address" => {"id" => 1053317297, "customer_id" => 1073339467, "first_name" => "Jane", "last_name" => "Smith", "company" => nil, "address1" => "123 Fake Street", "address2" => nil, "city" => "Fakecity", "province" => "Ontario", "country" => "Canada", "zip" => "K2P 1L4", "phone" => "777-777-7777", "name" => "Jane Smith", "province_code" => "ON", "country_code" => "CA", "country_name" => "Canada", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "manual", "value" => "9.0", "value_type" => "percentage", "allocation_method" => "across", "target_selection" => "all", "title" => "FAKE30", "description" => "FAKE30"}], "fulfillments" => [], "line_items" => [{"id" => 1071823212, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823212", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "shipwire-app", "fulfillment_status" => nil, "gift_card" => false, "grams" => 567, "name" => "IPod Touch 8GB - Black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 921728736, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "taxable" => true, "title" => "IPod Touch 8GB", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 447654529, "variant_inventory_management" => "shipwire-app", "variant_title" => "Black", "vendor" => "Apple", "tax_lines" => [], "duties" => [], "discount_allocations" => [{"amount" => "17.91", "amount_set" => {"shop_money" => {"amount" => "17.91", "currency_code" => "USD"}, "presentment_money" => {"amount" => "17.91", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [], "shipping_address" => {"first_name" => "Jane", "address1" => "123 Fake Street", "phone" => "777-777-7777", "city" => "Fakecity", "zip" => "K2P 1L4", "province" => "Ontario", "country" => "Canada", "last_name" => "Smith", "address2" => nil, "company" => nil, "latitude" => nil, "longitude" => nil, "name" => "Jane Smith", "country_code" => "CA", "province_code" => "ON"}, "shipping_lines" => []}}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.line_items = [ + { + "variant_id" => 447654529, + "quantity" => 1 + } + ] + order.email = "jane@example.com" + order.phone = "18885551234" + order.billing_address = { + "first_name" => "John", + "last_name" => "Smith", + "address1" => "123 Fake Street", + "phone" => "555-555-5555", + "city" => "Fakecity", + "province" => "Ontario", + "country" => "Canada", + "zip" => "K2P 1L4" + } + order.shipping_address = { + "first_name" => "Jane", + "last_name" => "Smith", + "address1" => "123 Fake Street", + "phone" => "777-777-7777", + "city" => "Fakecity", + "province" => "Ontario", + "country" => "Canada", + "zip" => "K2P 1L4" + } + order.transactions = [ + { + "kind" => "sale", + "status" => "success", + "amount" => 50.0 + } + ] + order.financial_status = "paid" + order.discount_codes = [ + { + "code" => "FAKE30", + "amount" => "9.00", + "type" => "percentage" + } + ] + order.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_24() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "order" => hash_including({"line_items" => [{"title" => "Red Leather Coat", "price" => 129.99, "grams" => "1700", "quantity" => 1}, {"title" => "Blue Suede Shoes", "price" => 85.95, "grams" => "750", "quantity" => 1, "taxable" => false}, {"title" => "Raspberry Beret", "price" => 19.99, "grams" => "320", "quantity" => 2}], "tax_lines" => [{"price" => 10.2, "rate" => 0.06, "title" => "State tax"}, {"price" => 4.25, "rate" => 0.025, "title" => "County tax"}], "total_tax" => 14.45}) } + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 1073459962, "admin_graphql_api_id" => "gid://shopify/Order/1073459962", "app_id" => 755357713, "browser_ip" => nil, "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => nil, "checkout_id" => nil, "checkout_token" => nil, "client_details" => nil, "closed_at" => nil, "confirmation_number" => "WRJK6R1YK", "confirmed" => true, "contact_email" => nil, "created_at" => "2024-10-02T09:03:29-05:00", "currency" => "USD", "current_subtotal_price" => "255.92", "current_subtotal_price_set" => {"shop_money" => {"amount" => "255.92", "currency_code" => "USD"}, "presentment_money" => {"amount" => "255.92", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "0.00", "current_total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "270.37", "current_total_price_set" => {"shop_money" => {"amount" => "270.37", "currency_code" => "USD"}, "presentment_money" => {"amount" => "270.37", "currency_code" => "USD"}}, "current_total_tax" => "14.45", "current_total_tax_set" => {"shop_money" => {"amount" => "14.45", "currency_code" => "USD"}, "presentment_money" => {"amount" => "14.45", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [], "email" => "", "estimated_taxes" => false, "financial_status" => "paid", "fulfillment_status" => nil, "landing_site" => nil, "landing_site_ref" => nil, "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1002", "note" => nil, "note_attributes" => [], "number" => 2, "order_number" => 1002, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/068b09bb4f214d81f02b7debbf3b8071/authenticate?key=0f49ccebf2dfc5652e1cbc1a95efcd64", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => [], "phone" => nil, "po_number" => nil, "presentment_currency" => "USD", "processed_at" => "2024-10-02T09:03:29-05:00", "reference" => nil, "referring_site" => nil, "source_identifier" => nil, "source_name" => "755357713", "source_url" => nil, "subtotal_price" => "255.92", "subtotal_price_set" => {"shop_money" => {"amount" => "255.92", "currency_code" => "USD"}, "presentment_money" => {"amount" => "255.92", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "10.20", "rate" => 0.06, "title" => "State tax", "price_set" => {"shop_money" => {"amount" => "10.20", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.20", "currency_code" => "USD"}}, "channel_liable" => false}, {"price" => "4.25", "rate" => 0.025, "title" => "County tax", "price_set" => {"shop_money" => {"amount" => "4.25", "currency_code" => "USD"}, "presentment_money" => {"amount" => "4.25", "currency_code" => "USD"}}, "channel_liable" => false}], "taxes_included" => false, "test" => false, "token" => "068b09bb4f214d81f02b7debbf3b8071", "total_discounts" => "0.00", "total_discounts_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_line_items_price" => "255.92", "total_line_items_price_set" => {"shop_money" => {"amount" => "255.92", "currency_code" => "USD"}, "presentment_money" => {"amount" => "255.92", "currency_code" => "USD"}}, "total_outstanding" => "270.37", "total_price" => "270.37", "total_price_set" => {"shop_money" => {"amount" => "270.37", "currency_code" => "USD"}, "presentment_money" => {"amount" => "270.37", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "14.45", "total_tax_set" => {"shop_money" => {"amount" => "14.45", "currency_code" => "USD"}, "presentment_money" => {"amount" => "14.45", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:03:29-05:00", "user_id" => nil, "billing_address" => nil, "customer" => nil, "discount_applications" => [], "fulfillments" => [], "line_items" => [{"id" => 1071823190, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823190", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 1700, "name" => "Red Leather Coat", "price" => "129.99", "price_set" => {"shop_money" => {"amount" => "129.99", "currency_code" => "USD"}, "presentment_money" => {"amount" => "129.99", "currency_code" => "USD"}}, "product_exists" => false, "product_id" => nil, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => nil, "taxable" => true, "title" => "Red Leather Coat", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => nil, "variant_inventory_management" => nil, "variant_title" => nil, "vendor" => nil, "tax_lines" => [{"channel_liable" => false, "price" => "7.81", "price_set" => {"shop_money" => {"amount" => "7.81", "currency_code" => "USD"}, "presentment_money" => {"amount" => "7.81", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State tax"}, {"channel_liable" => false, "price" => "3.26", "price_set" => {"shop_money" => {"amount" => "3.26", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.26", "currency_code" => "USD"}}, "rate" => 0.025, "title" => "County tax"}], "duties" => [], "discount_allocations" => []}, {"id" => 1071823191, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823191", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 750, "name" => "Blue Suede Shoes", "price" => "85.95", "price_set" => {"shop_money" => {"amount" => "85.95", "currency_code" => "USD"}, "presentment_money" => {"amount" => "85.95", "currency_code" => "USD"}}, "product_exists" => false, "product_id" => nil, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => nil, "taxable" => false, "title" => "Blue Suede Shoes", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => nil, "variant_inventory_management" => nil, "variant_title" => nil, "vendor" => nil, "tax_lines" => [], "duties" => [], "discount_allocations" => []}, {"id" => 1071823192, "admin_graphql_api_id" => "gid://shopify/LineItem/1071823192", "current_quantity" => 2, "fulfillable_quantity" => 2, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 320, "name" => "Raspberry Beret", "price" => "19.99", "price_set" => {"shop_money" => {"amount" => "19.99", "currency_code" => "USD"}, "presentment_money" => {"amount" => "19.99", "currency_code" => "USD"}}, "product_exists" => false, "product_id" => nil, "properties" => [], "quantity" => 2, "requires_shipping" => true, "sku" => nil, "taxable" => true, "title" => "Raspberry Beret", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => nil, "variant_inventory_management" => nil, "variant_title" => nil, "vendor" => nil, "tax_lines" => [{"channel_liable" => false, "price" => "2.39", "price_set" => {"shop_money" => {"amount" => "2.39", "currency_code" => "USD"}, "presentment_money" => {"amount" => "2.39", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State tax"}, {"channel_liable" => false, "price" => "0.99", "price_set" => {"shop_money" => {"amount" => "0.99", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.99", "currency_code" => "USD"}}, "rate" => 0.025, "title" => "County tax"}], "duties" => [], "discount_allocations" => []}], "payment_terms" => nil, "refunds" => [], "shipping_address" => nil, "shipping_lines" => []}}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.line_items = [ + { + "title" => "Red Leather Coat", + "price" => 129.99, + "grams" => "1700", + "quantity" => 1 + }, + { + "title" => "Blue Suede Shoes", + "price" => 85.95, + "grams" => "750", + "quantity" => 1, + "taxable" => false + }, + { + "title" => "Raspberry Beret", + "price" => 19.99, + "grams" => "320", + "quantity" => 2 + } + ] + order.tax_lines = [ + { + "price" => 10.2, + "rate" => 0.06, + "title" => "State tax" + }, + { + "price" => 4.25, + "rate" => 0.025, + "title" => "County tax" + } + ] + order.total_tax = 14.45 + order.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_25() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "order" => hash_including({"metafields" => [{"key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => nil, "confirmation_number" => nil, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "3.33", "current_total_discounts_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.65", "current_total_price_set" => {"shop_money" => {"amount" => "199.65", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.65", "currency_code" => "USD"}}, "current_total_tax" => "3.98", "current_total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:03:40-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T08:59:11-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-10-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-10-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => 548380009, "order_adjustments" => [], "transactions" => [{"id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => nil, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => {}, "source_name" => "web", "status" => "success", "test" => false, "user_id" => nil}], "refund_line_items" => [{"id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.id = 450789469 + order.metafields = [ + { + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + } + ] + order.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_26() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "order" => hash_including({"note" => "Customer contacted us about a custom engraving on this iPod"}) } + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => nil, "confirmation_number" => nil, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "3.33", "current_total_discounts_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.65", "current_total_price_set" => {"shop_money" => {"amount" => "199.65", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.65", "currency_code" => "USD"}}, "current_total_tax" => "3.98", "current_total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => "Customer contacted us about a custom engraving on this iPod", "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:03:39-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T08:59:11-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-10-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-10-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => 548380009, "order_adjustments" => [], "transactions" => [{"id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => nil, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => {}, "source_name" => "web", "status" => "success", "test" => false, "user_id" => nil}], "refund_line_items" => [{"id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.id = 450789469 + order.note = "Customer contacted us about a custom engraving on this iPod" + order.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_27() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "order" => hash_including({"note_attributes" => [{"name" => "colour", "value" => "red"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => nil, "confirmation_number" => nil, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "3.33", "current_total_discounts_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.65", "current_total_price_set" => {"shop_money" => {"amount" => "199.65", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.65", "currency_code" => "USD"}}, "current_total_tax" => "3.98", "current_total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => nil, "note_attributes" => [{"name" => "colour", "value" => "red"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:03:51-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T08:59:11-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-10-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-10-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => 548380009, "order_adjustments" => [], "transactions" => [{"id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => nil, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => {}, "source_name" => "web", "status" => "success", "test" => false, "user_id" => nil}], "refund_line_items" => [{"id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.id = 450789469 + order.note_attributes = [ + { + "name" => "colour", + "value" => "red" + } + ] + order.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_28() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "order" => hash_including({"email" => "a-different@email.com"}) } + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => nil, "confirmation_number" => nil, "confirmed" => true, "contact_email" => "a-different@email.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "3.33", "current_total_discounts_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.65", "current_total_price_set" => {"shop_money" => {"amount" => "199.65", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.65", "currency_code" => "USD"}}, "current_total_tax" => "3.98", "current_total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "a-different@email.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:04:45-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T08:59:11-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-10-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-10-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => 548380009, "order_adjustments" => [], "transactions" => [{"id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => nil, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => {}, "source_name" => "web", "status" => "success", "test" => false, "user_id" => nil}], "refund_line_items" => [{"id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.id = 450789469 + order.email = "a-different@email.com" + order.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_29() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "order" => hash_including({"phone" => "+15145556677"}) } + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => nil, "confirmation_number" => nil, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "3.33", "current_total_discounts_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.65", "current_total_price_set" => {"shop_money" => {"amount" => "199.65", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.65", "currency_code" => "USD"}}, "current_total_tax" => "3.98", "current_total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus"], "phone" => "+15145556677", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:03:59-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T08:59:11-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-10-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-10-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => 548380009, "order_adjustments" => [], "transactions" => [{"id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => nil, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => {}, "source_name" => "web", "status" => "success", "test" => false, "user_id" => nil}], "refund_line_items" => [{"id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.id = 450789469 + order.phone = "+15145556677" + order.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_30() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "order" => hash_including({"buyer_accepts_marketing" => true}) } + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => true, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => nil, "confirmation_number" => nil, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "3.33", "current_total_discounts_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.65", "current_total_price_set" => {"shop_money" => {"amount" => "199.65", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.65", "currency_code" => "USD"}}, "current_total_tax" => "3.98", "current_total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:04:36-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T08:59:11-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-10-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-10-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => 548380009, "order_adjustments" => [], "transactions" => [{"id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => nil, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => {}, "source_name" => "web", "status" => "success", "test" => false, "user_id" => nil}], "refund_line_items" => [{"id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.id = 450789469 + order.buyer_accepts_marketing = true + order.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_31() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "order" => hash_including({"customer" => nil}) } + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => nil, "confirmation_number" => nil, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "3.33", "current_total_discounts_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.65", "current_total_price_set" => {"shop_money" => {"amount" => "199.65", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.65", "currency_code" => "USD"}}, "current_total_tax" => "3.98", "current_total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:04:25-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => nil, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T08:59:11-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-10-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-10-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => 548380009, "order_adjustments" => [], "transactions" => [{"id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => nil, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => {}, "source_name" => "web", "status" => "success", "test" => false, "user_id" => nil}], "refund_line_items" => [{"id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.id = 450789469 + order.customer = nil + order.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_32() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "order" => hash_including({"tags" => "External, Inbound, Outbound"}) } + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => nil, "confirmation_number" => nil, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "3.33", "current_total_discounts_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.65", "current_total_price_set" => {"shop_money" => {"amount" => "199.65", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.65", "currency_code" => "USD"}}, "current_total_tax" => "3.98", "current_total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "External, Inbound, Outbound", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:04:54-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T08:59:11-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-10-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-10-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => 548380009, "order_adjustments" => [], "transactions" => [{"id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => nil, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => {}, "source_name" => "web", "status" => "success", "test" => false, "user_id" => nil}], "refund_line_items" => [{"id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.id = 450789469 + order.tags = "External, Inbound, Outbound" + order.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_33() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "order" => hash_including({"shipping_address" => {"address1" => "123 Ship Street", "city" => "Shipsville"}}) } + ) + .to_return(status: 200, body: JSON.generate({"order" => {"id" => 450789469, "admin_graphql_api_id" => "gid://shopify/Order/450789469", "app_id" => nil, "browser_ip" => "0.0.0.0", "buyer_accepts_marketing" => false, "cancel_reason" => nil, "cancelled_at" => nil, "cart_token" => "68778783ad298f1c80c3bafcddeea02f", "checkout_id" => 901414060, "checkout_token" => "bd5a8aa1ecd019dd3520ff791ee3a24c", "client_details" => {"accept_language" => nil, "browser_height" => nil, "browser_ip" => "0.0.0.0", "browser_width" => nil, "session_hash" => nil, "user_agent" => nil}, "closed_at" => nil, "confirmation_number" => nil, "confirmed" => true, "contact_email" => "bob.norman@mail.example.com", "created_at" => "2008-01-10T11:00:00-05:00", "currency" => "USD", "current_subtotal_price" => "195.67", "current_subtotal_price_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "current_total_additional_fees_set" => nil, "current_total_discounts" => "3.33", "current_total_discounts_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "current_total_duties_set" => nil, "current_total_price" => "199.65", "current_total_price_set" => {"shop_money" => {"amount" => "199.65", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.65", "currency_code" => "USD"}}, "current_total_tax" => "3.98", "current_total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "customer_locale" => nil, "device_id" => nil, "discount_codes" => [{"code" => "TENOFF", "amount" => "10.00", "type" => "fixed_amount"}], "email" => "bob.norman@mail.example.com", "estimated_taxes" => false, "financial_status" => "partially_refunded", "fulfillment_status" => nil, "landing_site" => "http://www.example.com?source=abc", "landing_site_ref" => "abc", "location_id" => nil, "merchant_of_record_app_id" => nil, "name" => "#1001", "note" => nil, "note_attributes" => [{"name" => "custom engraving", "value" => "Happy Birthday"}, {"name" => "colour", "value" => "green"}], "number" => 1, "order_number" => 1001, "order_status_url" => "https://jsmith.myshopify.com/548380009/orders/b1946ac92492d2347c6235b4d2611184/authenticate?key=imasecretipod", "original_total_additional_fees_set" => nil, "original_total_duties_set" => nil, "payment_gateway_names" => ["bogus"], "phone" => "+557734881234", "po_number" => "ABC123", "presentment_currency" => "USD", "processed_at" => "2008-01-10T11:00:00-05:00", "reference" => "fhwdgads", "referring_site" => "http://www.otherexample.com", "source_identifier" => "fhwdgads", "source_name" => "web", "source_url" => nil, "subtotal_price" => "597.00", "subtotal_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "tags" => "", "tax_exempt" => false, "tax_lines" => [{"price" => "11.94", "rate" => 0.06, "title" => "State Tax", "price_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "channel_liable" => nil}], "taxes_included" => false, "test" => false, "token" => "b1946ac92492d2347c6235b4d2611184", "total_discounts" => "10.00", "total_discounts_set" => {"shop_money" => {"amount" => "10.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "10.00", "currency_code" => "USD"}}, "total_line_items_price" => "597.00", "total_line_items_price_set" => {"shop_money" => {"amount" => "597.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "597.00", "currency_code" => "USD"}}, "total_outstanding" => "0.00", "total_price" => "598.94", "total_price_set" => {"shop_money" => {"amount" => "598.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "598.94", "currency_code" => "USD"}}, "total_shipping_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax" => "11.94", "total_tax_set" => {"shop_money" => {"amount" => "11.94", "currency_code" => "USD"}, "presentment_money" => {"amount" => "11.94", "currency_code" => "USD"}}, "total_tip_received" => "0.00", "total_weight" => 0, "updated_at" => "2024-10-02T09:03:53-05:00", "user_id" => nil, "billing_address" => {"first_name" => "Bob", "address1" => "Chestnut Street 92", "phone" => "+1(502)-459-2181", "city" => "Louisville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "customer" => {"id" => 207119551, "email" => "bob.norman@mail.example.com", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "first_name" => "Bob", "last_name" => "Norman", "state" => "disabled", "note" => nil, "verified_email" => true, "multipass_identifier" => nil, "tax_exempt" => false, "phone" => "+16136120707", "email_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => nil, "consent_updated_at" => "2004-06-13T11:57:11-04:00"}, "sms_marketing_consent" => {"state" => "not_subscribed", "opt_in_level" => "single_opt_in", "consent_updated_at" => "2024-10-02T08:59:11-05:00", "consent_collected_from" => "OTHER"}, "tags" => "L\u00E9on, No\u00EBl", "currency" => "USD", "tax_exemptions" => [], "admin_graphql_api_id" => "gid://shopify/Customer/207119551", "default_address" => {"id" => 207119551, "customer_id" => 207119551, "first_name" => nil, "last_name" => nil, "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "country" => "United States", "zip" => "40202", "phone" => "555-625-1199", "name" => "", "province_code" => "KY", "country_code" => "US", "country_name" => "United States", "default" => true}}, "discount_applications" => [{"target_type" => "line_item", "type" => "discount_code", "value" => "10.0", "value_type" => "fixed_amount", "allocation_method" => "across", "target_selection" => "all", "code" => "TENOFF"}], "fulfillments" => [{"id" => 255858046, "admin_graphql_api_id" => "gid://shopify/Fulfillment/255858046", "created_at" => "2024-10-02T08:59:11-05:00", "location_id" => 655441491, "name" => "#1001.0", "order_id" => 450789469, "origin_address" => {}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "service" => "manual", "shipment_status" => nil, "status" => "failure", "tracking_company" => "USPS", "tracking_number" => "1Z2345", "tracking_numbers" => ["1Z2345"], "tracking_url" => "https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345", "tracking_urls" => ["https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=1Z2345"], "updated_at" => "2024-10-02T08:59:11-05:00", "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}]}], "line_items" => [{"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 518995019, "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "current_quantity" => 1, "fulfillable_quantity" => 1, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - red", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008RED", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 49148385, "variant_inventory_management" => "shopify", "variant_title" => "red", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}, {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}], "payment_terms" => nil, "refunds" => [{"id" => 509562969, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "created_at" => "2024-10-02T08:59:11-05:00", "note" => "it broke during shipping", "order_id" => 450789469, "processed_at" => "2024-10-02T08:59:11-05:00", "restock" => true, "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "user_id" => 548380009, "order_adjustments" => [], "transactions" => [{"id" => 179259969, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969", "amount" => "209.00", "authorization" => "authorization-key", "created_at" => "2005-08-05T12:59:12-04:00", "currency" => "USD", "device_id" => nil, "error_code" => nil, "gateway" => "bogus", "kind" => "refund", "location_id" => nil, "message" => nil, "order_id" => 450789469, "parent_id" => 801038806, "payment_id" => "#1001.3", "processed_at" => "2005-08-05T12:59:12-04:00", "receipt" => {}, "source_name" => "web", "status" => "success", "test" => false, "user_id" => nil}], "refund_line_items" => [{"id" => 104689539, "line_item_id" => 703073504, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.66, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - black", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 457924702, "variant_inventory_management" => "shopify", "variant_title" => "black", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.33", "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}, {"id" => 709875399, "line_item_id" => 466157049, "location_id" => 487838322, "quantity" => 1, "restock_type" => "legacy_restock", "subtotal" => 195.67, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax" => 3.98, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "current_quantity" => 0, "fulfillable_quantity" => 0, "fulfillment_service" => "manual", "fulfillment_status" => nil, "gift_card" => false, "grams" => 200, "name" => "IPod Nano - 8gb - green", "price" => "199.00", "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "product_exists" => true, "product_id" => 632910392, "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "quantity" => 1, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "taxable" => true, "title" => "IPod Nano - 8gb", "total_discount" => "0.00", "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "variant_id" => 39072856, "variant_inventory_management" => "shopify", "variant_title" => "green", "vendor" => nil, "tax_lines" => [{"channel_liable" => nil, "price" => "3.98", "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "rate" => 0.06, "title" => "State Tax"}], "duties" => [], "discount_allocations" => [{"amount" => "3.34", "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}, "discount_application_index" => 0}]}}], "duties" => [], "additional_fees" => []}], "shipping_address" => {"first_name" => "Bob", "address1" => "123 Ship Street", "phone" => "+1(502)-459-2181", "city" => "Shipsville", "zip" => "40202", "province" => "Kentucky", "country" => "United States", "last_name" => "Norman", "address2" => "", "company" => nil, "latitude" => 45.41634, "longitude" => -75.6868, "name" => "Bob Norman", "country_code" => "US", "province_code" => "KY"}, "shipping_lines" => [{"id" => 369256396, "carrier_identifier" => nil, "code" => "Free Shipping", "discounted_price" => "0.00", "discounted_price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "phone" => nil, "price" => "0.00", "price_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "requested_fulfillment_service_id" => nil, "source" => "shopify", "title" => "Free Shipping", "tax_lines" => [], "discount_allocations" => []}]}}), headers: {}) + + response = order = ShopifyAPI::Order.new + order.id = 450789469 + order.shipping_address = { + "address1" => "123 Ship Street", + "city" => "Shipsville" + } + order.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_34() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Order.delete( + id: 450789469, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/page_test.rb b/test/rest/2024_10/page_test.rb new file mode 100644 index 00000000..d293a19f --- /dev/null +++ b/test/rest/2024_10/page_test.rb @@ -0,0 +1,471 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Page202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/pages.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"pages" => [{"id" => 108828309, "title" => "Sample Page", "shop_id" => 548380009, "handle" => "sample", "body_html" => "

this is a sample page.

", "author" => "Dennis", "created_at" => "2008-07-15T20:00:00-04:00", "updated_at" => "2008-07-16T20:00:00-04:00", "published_at" => nil, "template_suffix" => nil, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/108828309"}, {"id" => 169524623, "title" => "Store hours", "shop_id" => 548380009, "handle" => "store-hours", "body_html" => "

We never close.

", "author" => "Jobs", "created_at" => "2013-12-31T19:00:00-05:00", "updated_at" => "2013-12-31T19:00:00-05:00", "published_at" => "2014-02-01T19:00:00-05:00", "template_suffix" => nil, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/169524623"}, {"id" => 322471, "title" => "Support", "shop_id" => 548380009, "handle" => "support", "body_html" => "

Come in store for support.

", "author" => "Dennis", "created_at" => "2009-07-15T20:00:00-04:00", "updated_at" => "2009-07-16T20:00:00-04:00", "published_at" => nil, "template_suffix" => nil, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/322471"}, {"id" => 131092082, "title" => "Terms of Services", "shop_id" => 548380009, "handle" => "tos", "body_html" => "

We make perfect stuff, we don't need a warranty.

", "author" => "Dennis", "created_at" => "2008-07-15T20:00:00-04:00", "updated_at" => "2008-07-16T20:00:00-04:00", "published_at" => "2008-07-15T20:00:00-04:00", "template_suffix" => nil, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/131092082"}]}), headers: {}) + + response = ShopifyAPI::Page.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/pages.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/pages.json?since_id=108828309") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"pages" => [{"id" => 131092082, "title" => "Terms of Services", "shop_id" => 548380009, "handle" => "tos", "body_html" => "

We make perfect stuff, we don't need a warranty.

", "author" => "Dennis", "created_at" => "2008-07-15T20:00:00-04:00", "updated_at" => "2008-07-16T20:00:00-04:00", "published_at" => "2008-07-15T20:00:00-04:00", "template_suffix" => nil, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/131092082"}, {"id" => 169524623, "title" => "Store hours", "shop_id" => 548380009, "handle" => "store-hours", "body_html" => "

We never close.

", "author" => "Jobs", "created_at" => "2013-12-31T19:00:00-05:00", "updated_at" => "2013-12-31T19:00:00-05:00", "published_at" => "2014-02-01T19:00:00-05:00", "template_suffix" => nil, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/169524623"}]}), headers: {}) + + response = ShopifyAPI::Page.all( + since_id: "108828309", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/pages.json?since_id=108828309") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/pages.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "page" => hash_including({"title" => "Warranty information", "body_html" => "

Warranty

\n

Returns accepted if we receive items 30 days after purchase.

"}) } + ) + .to_return(status: 200, body: JSON.generate({"page" => {"id" => 1025371371, "title" => "Warranty information", "shop_id" => 548380009, "handle" => "warranty-information", "body_html" => "

Warranty

\n

Returns accepted if we receive items 30 days after purchase.

", "author" => "Shopify API", "created_at" => "2024-10-02T09:31:40-05:00", "updated_at" => "2024-10-02T09:31:40-05:00", "published_at" => "2024-10-02T09:31:40-05:00", "template_suffix" => nil, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/1025371371"}}), headers: {}) + + response = page = ShopifyAPI::Page.new + page.title = "Warranty information" + page.body_html = "

Warranty

\n

Returns accepted if we receive items 30 days after purchase.

" + page.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/pages.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/pages.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "page" => hash_including({"title" => "Warranty information", "body_html" => "

Warranty

\n

Returns accepted if we receive items 30 days after purchase.

", "metafields" => [{"key" => "new", "value" => "new value", "type" => "single_line_text_field", "namespace" => "global"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"page" => {"id" => 1025371374, "title" => "Warranty information", "shop_id" => 548380009, "handle" => "warranty-information", "body_html" => "

Warranty

\n

Returns accepted if we receive items 30 days after purchase.

", "author" => "Shopify API", "created_at" => "2024-10-02T09:31:45-05:00", "updated_at" => "2024-10-02T09:31:45-05:00", "published_at" => "2024-10-02T09:31:45-05:00", "template_suffix" => nil, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/1025371374"}}), headers: {}) + + response = page = ShopifyAPI::Page.new + page.title = "Warranty information" + page.body_html = "

Warranty

\n

Returns accepted if we receive items 30 days after purchase.

" + page.metafields = [ + { + "key" => "new", + "value" => "new value", + "type" => "single_line_text_field", + "namespace" => "global" + } + ] + page.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/pages.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/pages.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "page" => hash_including({"title" => "Warranty information", "body_html" => "

Warranty

\n

Returns accepted if we receive items 30 days after purchase.

", "published" => false}) } + ) + .to_return(status: 200, body: JSON.generate({"page" => {"id" => 1025371372, "title" => "Warranty information", "shop_id" => 548380009, "handle" => "warranty-information", "body_html" => "

Warranty

\n

Returns accepted if we receive items 30 days after purchase.

", "author" => "Shopify API", "created_at" => "2024-10-02T09:31:41-05:00", "updated_at" => "2024-10-02T09:31:41-05:00", "published_at" => nil, "template_suffix" => nil, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/1025371372"}}), headers: {}) + + response = page = ShopifyAPI::Page.new + page.title = "Warranty information" + page.body_html = "

Warranty

\n

Returns accepted if we receive items 30 days after purchase.

" + page.published = false + page.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/pages.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/pages/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 4}), headers: {}) + + response = ShopifyAPI::Page.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/pages/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"page" => {"id" => 131092082, "title" => "Terms of Services", "shop_id" => 548380009, "handle" => "tos", "body_html" => "

We make perfect stuff, we don't need a warranty.

", "author" => "Dennis", "created_at" => "2008-07-15T20:00:00-04:00", "updated_at" => "2008-07-16T20:00:00-04:00", "published_at" => "2008-07-15T20:00:00-04:00", "template_suffix" => nil, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/131092082"}}), headers: {}) + + response = ShopifyAPI::Page.find( + id: 131092082, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "page" => hash_including({"metafields" => [{"key" => "new", "value" => "new value", "type" => "single_line_text_field", "namespace" => "global"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"page" => {"shop_id" => 548380009, "title" => "Terms of Services", "handle" => "tos", "body_html" => "

We make perfect stuff, we don't need a warranty.

", "id" => 131092082, "author" => "Dennis", "created_at" => "2008-07-15T20:00:00-04:00", "updated_at" => "2008-07-16T20:00:00-04:00", "published_at" => "2008-07-15T20:00:00-04:00", "template_suffix" => nil, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/131092082"}}), headers: {}) + + response = page = ShopifyAPI::Page.new + page.id = 131092082 + page.metafields = [ + { + "key" => "new", + "value" => "new value", + "type" => "single_line_text_field", + "namespace" => "global" + } + ] + page.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "page" => hash_including({"published" => false}) } + ) + .to_return(status: 200, body: JSON.generate({"page" => {"shop_id" => 548380009, "published_at" => nil, "title" => "Terms of Services", "handle" => "tos", "body_html" => "

We make perfect stuff, we don't need a warranty.

", "id" => 131092082, "author" => "Dennis", "created_at" => "2008-07-15T20:00:00-04:00", "updated_at" => "2024-10-02T09:31:34-05:00", "template_suffix" => nil, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/131092082"}}), headers: {}) + + response = page = ShopifyAPI::Page.new + page.id = 131092082 + page.published = false + page.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "page" => hash_including({"published" => true}) } + ) + .to_return(status: 200, body: JSON.generate({"page" => {"shop_id" => 548380009, "published_at" => "2024-10-02T09:31:31-05:00", "title" => "Terms of Services", "handle" => "tos", "body_html" => "

We make perfect stuff, we don't need a warranty.

", "id" => 131092082, "author" => "Dennis", "created_at" => "2008-07-15T20:00:00-04:00", "updated_at" => "2024-10-02T09:31:31-05:00", "template_suffix" => nil, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/131092082"}}), headers: {}) + + response = page = ShopifyAPI::Page.new + page.id = 131092082 + page.published = true + page.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_11() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "page" => hash_including({"body_html" => "

Returns accepted if we receive the items 14 days after purchase.

", "author" => "Christopher Gorski", "title" => "New warranty", "handle" => "new-warranty"}) } + ) + .to_return(status: 200, body: JSON.generate({"page" => {"shop_id" => 548380009, "author" => "Christopher Gorski", "body_html" => "

Returns accepted if we receive the items 14 days after purchase.

", "handle" => "new-warranty", "title" => "New warranty", "id" => 131092082, "created_at" => "2008-07-15T20:00:00-04:00", "updated_at" => "2024-10-02T09:31:42-05:00", "published_at" => "2008-07-15T20:00:00-04:00", "template_suffix" => nil, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/131092082"}}), headers: {}) + + response = page = ShopifyAPI::Page.new + page.id = 131092082 + page.body_html = "

Returns accepted if we receive the items 14 days after purchase.

" + page.author = "Christopher Gorski" + page.title = "New warranty" + page.handle = "new-warranty" + page.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_12() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "page" => hash_including({"body_html" => "

Returns accepted if we receive the items 14 days after purchase.

"}) } + ) + .to_return(status: 200, body: JSON.generate({"page" => {"shop_id" => 548380009, "body_html" => "

Returns accepted if we receive the items 14 days after purchase.

", "title" => "Terms of Services", "handle" => "tos", "id" => 131092082, "author" => "Dennis", "created_at" => "2008-07-15T20:00:00-04:00", "updated_at" => "2024-10-02T09:31:43-05:00", "published_at" => "2008-07-15T20:00:00-04:00", "template_suffix" => nil, "admin_graphql_api_id" => "gid://shopify/OnlineStorePage/131092082"}}), headers: {}) + + response = page = ShopifyAPI::Page.new + page.id = 131092082 + page.body_html = "

Returns accepted if we receive the items 14 days after purchase.

" + page.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_13() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Page.delete( + id: 131092082, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/pages/131092082.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/payment_gateway_test.rb b/test/rest/2024_10/payment_gateway_test.rb new file mode 100644 index 00000000..c058acde --- /dev/null +++ b/test/rest/2024_10/payment_gateway_test.rb @@ -0,0 +1,224 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class PaymentGateway202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/payment_gateways.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"payment_gateways" => [{"disabled" => true, "id" => 170508070, "name" => "Cash on Delivery (COD)", "provider_id" => 140, "sandbox" => false, "supports_network_tokenization" => nil, "type" => "ManualPaymentGateway", "enabled_card_brands" => [], "processing_method" => "manual", "service_name" => "Cash on Delivery (COD)", "metadata" => {}, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00"}, {"disabled" => false, "id" => 431363653, "name" => "shopify_payments", "provider_id" => 87, "sandbox" => false, "supports_network_tokenization" => nil, "type" => "DirectPaymentGateway", "enabled_card_brands" => ["visa", "master", "american_express", "discover", "diners_club"], "processing_method" => "direct", "service_name" => "Shopify Payments", "metadata" => {"google_pay_merchant_id" => 548380009}, "created_at" => "2011-12-31T19:00:00-05:00", "updated_at" => "2024-10-02T09:02:13-05:00", "credential4" => nil, "attachment" => nil}]}), headers: {}) + + response = ShopifyAPI::PaymentGateway.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/payment_gateways.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/payment_gateways.json?disabled=false") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"payment_gateways" => [{"disabled" => false, "id" => 431363653, "name" => "shopify_payments", "provider_id" => 87, "sandbox" => false, "supports_network_tokenization" => nil, "type" => "DirectPaymentGateway", "enabled_card_brands" => ["visa", "master", "american_express", "discover", "diners_club"], "processing_method" => "direct", "service_name" => "Shopify Payments", "metadata" => {"google_pay_merchant_id" => 548380009}, "created_at" => "2011-12-31T19:00:00-05:00", "updated_at" => "2024-10-02T09:02:10-05:00", "credential4" => nil, "attachment" => nil}]}), headers: {}) + + response = ShopifyAPI::PaymentGateway.all( + disabled: "false", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/payment_gateways.json?disabled=false") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/payment_gateways.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "payment_gateway" => hash_including({"credential1" => "someone@example.com", "provider_id" => 7}) } + ) + .to_return(status: 200, body: JSON.generate({"payment_gateway" => {"disabled" => false, "id" => 1070028413, "name" => "authorize_net", "provider_id" => 7, "sandbox" => false, "supports_network_tokenization" => nil, "type" => "DirectPaymentGateway", "enabled_card_brands" => ["visa", "master", "american_express", "discover", "diners_club", "jcb"], "processing_method" => "direct", "service_name" => "Authorize.net", "metadata" => {}, "created_at" => "2024-10-02T09:02:15-05:00", "updated_at" => "2024-10-02T09:02:15-05:00", "credential1" => "someone@example.com", "credential3" => nil, "credential4" => nil, "attachment" => nil}}), headers: {}) + + response = payment_gateway = ShopifyAPI::PaymentGateway.new + payment_gateway.credential1 = "someone@example.com" + payment_gateway.provider_id = 7 + payment_gateway.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/payment_gateways.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/payment_gateways/431363653.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"payment" => {"disabled" => false, "id" => 431363653, "name" => "shopify_payments", "provider_id" => 87, "sandbox" => false, "supports_network_tokenization" => nil, "type" => "DirectPaymentGateway", "enabled_card_brands" => ["visa", "master", "american_express", "discover", "diners_club"], "processing_method" => "direct", "service_name" => "Shopify Payments", "metadata" => {"google_pay_merchant_id" => 548380009}, "created_at" => "2011-12-31T19:00:00-05:00", "updated_at" => "2024-10-02T09:02:14-05:00", "credential4" => nil, "attachment" => nil}}), headers: {}) + + response = ShopifyAPI::PaymentGateway.find( + id: 431363653, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/payment_gateways/431363653.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/payment_gateways/170508070.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "payment_gateway" => hash_including({"sandbox" => true}) } + ) + .to_return(status: 200, body: JSON.generate({"payment_gateway" => {"disabled" => false, "id" => 170508070, "name" => "Cash on Delivery (COD)", "provider_id" => 140, "sandbox" => true, "supports_network_tokenization" => nil, "type" => "ManualPaymentGateway", "enabled_card_brands" => [], "processing_method" => "manual", "service_name" => "Cash on Delivery (COD)", "metadata" => {}, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:02:13-05:00"}}), headers: {}) + + response = payment_gateway = ShopifyAPI::PaymentGateway.new + payment_gateway.id = 170508070 + payment_gateway.sandbox = true + payment_gateway.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/payment_gateways/170508070.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/payment_gateways/170508070.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::PaymentGateway.delete( + id: 170508070, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/payment_gateways/170508070.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/payment_test.rb b/test/rest/2024_10/payment_test.rb new file mode 100644 index 00000000..b2856801 --- /dev/null +++ b/test/rest/2024_10/payment_test.rb @@ -0,0 +1,202 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Payment202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x/payments.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "payment" => hash_including({"request_details" => {"ip_address" => "123.1.1.1", "accept_language" => "en-US,en;q=0.8,fr;q=0.6", "user_agent" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36"}, "amount" => "398.00", "session_id" => "global-d1c544a220fe3e0f", "unique_token" => "client-side-idempotency-token"}) } + ) + .to_return(status: 200, body: JSON.generate({"payment" => {"id" => 1071573807, "unique_token" => "client-side-idempotency-token", "payment_processing_error_message" => nil, "next_action" => {"redirect_url" => nil}, "fraudulent" => false, "transaction" => nil, "credit_card" => {"first_name" => "Bob", "last_name" => "Norman", "first_digits" => "424242", "last_digits" => "4242", "brand" => "bogus", "expiry_month" => 9, "expiry_year" => 2025, "customer_id" => 207119551}, "checkout" => {"completed_at" => nil, "created_at" => "2012-10-12T07:05:27-04:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 207119551, "customer_locale" => "en", "device_id" => nil, "discount_code" => nil, "discount_codes" => [], "email" => "bob.norman@mail.example.com", "legal_notice_url" => nil, "location_id" => nil, "name" => "#446514532", "note" => "", "note_attributes" => {"custom engraving" => "Happy Birthday", "colour" => "green"}, "order_id" => nil, "order_status_url" => nil, "order" => nil, "payment_due" => "398.00", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [{"id" => 25428999, "unique_token" => "e01e661f4a99acd9dcdg6f1422d0d6f7", "payment_processing_error_message" => nil, "fraudulent" => false, "transaction" => {"amount" => "598.94", "amount_in" => nil, "amount_out" => nil, "amount_rounding" => nil, "authorization" => "authorization-key", "created_at" => "2005-08-01T11:57:11-04:00", "currency" => "USD", "error_code" => nil, "parent_id" => nil, "gateway" => "bogus", "id" => 389404469, "kind" => "authorization", "message" => nil, "status" => "success", "test" => false, "receipt" => {"testcase" => true, "authorization" => "123456"}, "location_id" => nil, "user_id" => nil, "transaction_group_id" => nil, "device_id" => nil, "payment_details" => {"credit_card_bin" => nil, "avs_result_code" => nil, "cvv_result_code" => nil, "credit_card_number" => "\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 4242", "credit_card_company" => "Visa", "buyer_action_info" => nil, "credit_card_name" => nil, "credit_card_wallet" => nil, "credit_card_expiration_month" => nil, "credit_card_expiration_year" => nil, "payment_method_name" => "visa"}}, "credit_card" => nil}, {"id" => 1071573807, "unique_token" => "client-side-idempotency-token", "payment_processing_error_message" => nil, "fraudulent" => false, "transaction" => nil, "credit_card" => {"first_name" => "Bob", "last_name" => "Norman", "first_digits" => "424242", "last_digits" => "4242", "brand" => "bogus", "expiry_month" => 9, "expiry_year" => 2025, "customer_id" => 207119551}}], "phone" => nil, "shopify_payments_account_id" => nil, "privacy_policy_url" => nil, "refund_policy_url" => nil, "requires_shipping" => true, "reservation_time_left" => 0, "reservation_time" => nil, "source_identifier" => nil, "source_name" => "web", "source_url" => nil, "subscription_policy_url" => nil, "subtotal_price" => "398.00", "shipping_policy_url" => nil, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => nil, "terms_of_service_url" => nil, "token" => "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", "total_price" => "398.00", "total_tax" => "0.00", "total_tip_received" => "0.00", "total_line_items_price" => "398.00", "updated_at" => "2024-10-02T09:29:09-05:00", "user_id" => nil, "web_url" => "https://checkout.local/548380009/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", "total_duties" => nil, "total_additional_fees" => nil, "line_items" => [{"id" => "a654694372b627dc", "key" => "a654694372b627dc", "product_id" => 632910392, "variant_id" => 49148385, "sku" => "IPOD2008RED", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Red", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704205723", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => nil, "line_price" => "199.00", "properties" => {}, "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []}, {"id" => "d9dfc83829f91759", "key" => "d9dfc83829f91759", "product_id" => 632910392, "variant_id" => 808950810, "sku" => "IPOD2008PINK", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Pink", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704205723", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => nil, "line_price" => "199.00", "properties" => {}, "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []}], "gift_cards" => [], "tax_lines" => [], "tax_manipulations" => [], "shipping_line" => {"handle" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping", "tax_lines" => []}, "shipping_rate" => {"id" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping"}, "shipping_address" => {"id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"}, "credit_card" => {"first_name" => "Bob", "last_name" => "Norman", "first_digits" => "424242", "last_digits" => "4242", "brand" => "bogus", "expiry_month" => 9, "expiry_year" => 2025, "customer_id" => 207119551}, "billing_address" => {"id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"}, "applied_discount" => nil, "applied_discounts" => [], "discount_violations" => []}}}), headers: {}) + + response = payment = ShopifyAPI::Payment.new + payment.checkout_id = "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x" + payment.request_details = { + "ip_address" => "123.1.1.1", + "accept_language" => "en-US,en;q=0.8,fr;q=0.6", + "user_agent" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36" + } + payment.amount = "398.00" + payment.session_id = "global-d1c544a220fe3e0f" + payment.unique_token = "client-side-idempotency-token" + payment.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x/payments.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x/payments.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"payments" => [{"id" => 25428999, "unique_token" => "e01e661f4a99acd9dcdg6f1422d0d6f7", "payment_processing_error_message" => nil, "transaction" => {"amount" => "598.94", "amount_in" => nil, "amount_out" => nil, "amount_rounding" => nil, "authorization" => "authorization-key", "created_at" => "2005-08-01T11:57:11-04:00", "currency" => "USD", "error_code" => nil, "parent_id" => nil, "gateway" => "bogus", "id" => 389404469, "kind" => "authorization", "message" => nil, "status" => "success", "test" => false}, "credit_card" => nil, "checkout" => {"completed_at" => nil, "created_at" => "2012-10-12T07:05:27-04:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 207119551, "customer_locale" => "en", "device_id" => nil, "discount_code" => nil, "discount_codes" => [], "email" => "bob.norman@mail.example.com", "legal_notice_url" => nil, "location_id" => nil, "name" => "#446514532", "note" => "", "note_attributes" => {"custom engraving" => "Happy Birthday", "colour" => "green"}, "order_id" => nil, "order_status_url" => nil, "order" => nil, "payment_due" => "419.49", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [{"id" => 25428999, "unique_token" => "e01e661f4a99acd9dcdg6f1422d0d6f7", "payment_processing_error_message" => nil, "transaction" => {"amount" => "598.94", "amount_in" => nil, "amount_out" => nil, "amount_rounding" => nil, "authorization" => "authorization-key", "created_at" => "2005-08-01T11:57:11-04:00", "currency" => "USD", "error_code" => nil, "parent_id" => nil, "gateway" => "bogus", "id" => 389404469, "kind" => "authorization", "message" => nil, "status" => "success", "test" => false}, "credit_card" => nil}], "phone" => nil, "shopify_payments_account_id" => nil, "privacy_policy_url" => nil, "refund_policy_url" => nil, "requires_shipping" => true, "reservation_time_left" => 0, "reservation_time" => nil, "source_identifier" => nil, "source_name" => "web", "source_url" => nil, "subscription_policy_url" => nil, "subtotal_price" => "398.00", "shipping_policy_url" => nil, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => nil, "terms_of_service_url" => nil, "token" => "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", "total_price" => "419.49", "total_tax" => "21.49", "total_tip_received" => "0.00", "total_line_items_price" => "398.00", "updated_at" => "2012-10-12T07:05:27-04:00", "user_id" => nil, "web_url" => "https://checkout.local/548380009/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", "total_duties" => nil, "total_additional_fees" => nil, "line_items" => [{"id" => "a654694372b627dc", "key" => "a654694372b627dc", "product_id" => 632910392, "variant_id" => 49148385, "sku" => "IPOD2008RED", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Red", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704205723", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => nil, "line_price" => "199.00", "properties" => {}, "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []}, {"id" => "d9dfc83829f91759", "key" => "d9dfc83829f91759", "product_id" => 632910392, "variant_id" => 808950810, "sku" => "IPOD2008PINK", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Pink", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704205723", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => nil, "line_price" => "199.00", "properties" => {}, "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []}], "gift_cards" => [], "tax_lines" => [{"price" => "21.49", "rate" => 0.06, "title" => "State Tax", "compare_at" => 0.06}], "tax_manipulations" => [], "shipping_line" => {"handle" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping", "tax_lines" => []}, "shipping_rate" => {"id" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping"}, "shipping_address" => {"id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"}, "credit_card" => {"first_name" => "Bob", "last_name" => "Norman", "first_digits" => "1", "last_digits" => "1", "brand" => "bogus", "expiry_month" => 8, "expiry_year" => 2042, "customer_id" => nil}, "billing_address" => {"id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"}, "applied_discount" => nil, "applied_discounts" => [], "discount_violations" => []}}]}), headers: {}) + + response = ShopifyAPI::Payment.all( + checkout_id: "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x/payments.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x/payments/25428999.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"payment" => {"id" => 25428999, "unique_token" => "e01e661f4a99acd9dcdg6f1422d0d6f7", "payment_processing_error_message" => nil, "next_action" => {"redirect_url" => nil}, "fraudulent" => false, "transaction" => {"amount" => "419.49", "amount_in" => nil, "amount_out" => nil, "amount_rounding" => nil, "authorization" => nil, "created_at" => "2024-10-02T09:29:10-05:00", "currency" => "USD", "error_code" => nil, "parent_id" => nil, "gateway" => "bogus", "id" => 1068278521, "kind" => "authorization", "message" => nil, "status" => "failure", "test" => false, "receipt" => {}, "location_id" => nil, "user_id" => nil, "transaction_group_id" => nil, "device_id" => nil, "payment_details" => nil}, "credit_card" => nil, "checkout" => {"completed_at" => nil, "created_at" => "2012-10-12T07:05:27-04:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 207119551, "customer_locale" => "en", "device_id" => nil, "discount_code" => nil, "discount_codes" => [], "email" => "bob.norman@mail.example.com", "legal_notice_url" => nil, "location_id" => nil, "name" => "#446514532", "note" => "", "note_attributes" => {"custom engraving" => "Happy Birthday", "colour" => "green"}, "order_id" => nil, "order_status_url" => nil, "order" => nil, "payment_due" => "419.49", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [{"id" => 25428999, "unique_token" => "e01e661f4a99acd9dcdg6f1422d0d6f7", "payment_processing_error_message" => nil, "fraudulent" => false, "transaction" => {"amount" => "419.49", "amount_in" => nil, "amount_out" => nil, "amount_rounding" => nil, "authorization" => nil, "created_at" => "2024-10-02T09:29:10-05:00", "currency" => "USD", "error_code" => nil, "parent_id" => nil, "gateway" => "bogus", "id" => 1068278521, "kind" => "authorization", "message" => nil, "status" => "failure", "test" => false, "receipt" => {}, "location_id" => nil, "user_id" => nil, "transaction_group_id" => nil, "device_id" => nil, "payment_details" => nil}, "credit_card" => nil}], "phone" => nil, "shopify_payments_account_id" => nil, "privacy_policy_url" => nil, "refund_policy_url" => nil, "requires_shipping" => true, "reservation_time_left" => 0, "reservation_time" => nil, "source_identifier" => nil, "source_name" => "web", "source_url" => nil, "subscription_policy_url" => nil, "subtotal_price" => "398.00", "shipping_policy_url" => nil, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => nil, "terms_of_service_url" => nil, "token" => "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", "total_price" => "419.49", "total_tax" => "21.49", "total_tip_received" => "0.00", "total_line_items_price" => "398.00", "updated_at" => "2012-10-12T07:05:27-04:00", "user_id" => nil, "web_url" => "https://checkout.local/548380009/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", "total_duties" => nil, "total_additional_fees" => nil, "line_items" => [{"id" => "a654694372b627dc", "key" => "a654694372b627dc", "product_id" => 632910392, "variant_id" => 49148385, "sku" => "IPOD2008RED", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Red", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704205723", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => nil, "line_price" => "199.00", "properties" => {}, "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []}, {"id" => "d9dfc83829f91759", "key" => "d9dfc83829f91759", "product_id" => 632910392, "variant_id" => 808950810, "sku" => "IPOD2008PINK", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Pink", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704205723", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => nil, "line_price" => "199.00", "properties" => {}, "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []}], "gift_cards" => [], "tax_lines" => [{"price" => "21.49", "rate" => 0.06, "title" => "State Tax", "compare_at" => 0.06}], "tax_manipulations" => [], "shipping_line" => {"handle" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping", "tax_lines" => []}, "shipping_rate" => {"id" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping"}, "shipping_address" => {"id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"}, "credit_card" => {"first_name" => "Bob", "last_name" => "Norman", "first_digits" => "1", "last_digits" => "1", "brand" => "bogus", "expiry_month" => 8, "expiry_year" => 2042, "customer_id" => nil}, "billing_address" => {"id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"}, "applied_discount" => nil, "applied_discounts" => [], "discount_violations" => []}}}), headers: {}) + + response = ShopifyAPI::Payment.find( + checkout_id: "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", + id: 25428999, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x/payments/25428999.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x/payments/25428999.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"payment" => {"id" => 25428999, "unique_token" => "e01e661f4a99acd9dcdg6f1422d0d6f7", "payment_processing_error_message" => nil, "next_action" => {"redirect_url" => nil}, "fraudulent" => false, "transaction" => {"amount" => "419.49", "amount_in" => nil, "amount_out" => nil, "amount_rounding" => nil, "authorization" => nil, "created_at" => "2024-10-02T09:29:06-05:00", "currency" => "USD", "error_code" => nil, "parent_id" => nil, "gateway" => "bogus", "id" => 1068278520, "kind" => "authorization", "message" => nil, "status" => "success", "test" => false, "receipt" => {}, "location_id" => nil, "user_id" => nil, "transaction_group_id" => nil, "device_id" => nil, "payment_details" => nil}, "credit_card" => nil, "checkout" => {"completed_at" => nil, "created_at" => "2012-10-12T07:05:27-04:00", "currency" => "USD", "presentment_currency" => "USD", "customer_id" => 207119551, "customer_locale" => "en", "device_id" => nil, "discount_code" => nil, "discount_codes" => [], "email" => "bob.norman@mail.example.com", "legal_notice_url" => nil, "location_id" => nil, "name" => "#446514532", "note" => "", "note_attributes" => {"custom engraving" => "Happy Birthday", "colour" => "green"}, "order_id" => nil, "order_status_url" => nil, "order" => nil, "payment_due" => "419.49", "payment_url" => "https://app.local/cardserver/sessions", "payments" => [{"id" => 25428999, "unique_token" => "e01e661f4a99acd9dcdg6f1422d0d6f7", "payment_processing_error_message" => nil, "fraudulent" => false, "transaction" => {"amount" => "419.49", "amount_in" => nil, "amount_out" => nil, "amount_rounding" => nil, "authorization" => nil, "created_at" => "2024-10-02T09:29:06-05:00", "currency" => "USD", "error_code" => nil, "parent_id" => nil, "gateway" => "bogus", "id" => 1068278520, "kind" => "authorization", "message" => nil, "status" => "success", "test" => false, "receipt" => {}, "location_id" => nil, "user_id" => nil, "transaction_group_id" => nil, "device_id" => nil, "payment_details" => nil}, "credit_card" => nil}], "phone" => nil, "shopify_payments_account_id" => nil, "privacy_policy_url" => nil, "refund_policy_url" => nil, "requires_shipping" => true, "reservation_time_left" => 0, "reservation_time" => nil, "source_identifier" => nil, "source_name" => "web", "source_url" => nil, "subscription_policy_url" => nil, "subtotal_price" => "398.00", "shipping_policy_url" => nil, "tax_exempt" => false, "taxes_included" => false, "terms_of_sale_url" => nil, "terms_of_service_url" => nil, "token" => "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", "total_price" => "419.49", "total_tax" => "21.49", "total_tip_received" => "0.00", "total_line_items_price" => "398.00", "updated_at" => "2012-10-12T07:05:27-04:00", "user_id" => nil, "web_url" => "https://checkout.local/548380009/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", "total_duties" => nil, "total_additional_fees" => nil, "line_items" => [{"id" => "a654694372b627dc", "key" => "a654694372b627dc", "product_id" => 632910392, "variant_id" => 49148385, "sku" => "IPOD2008RED", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Red", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704205723", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => nil, "line_price" => "199.00", "properties" => {}, "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []}, {"id" => "d9dfc83829f91759", "key" => "d9dfc83829f91759", "product_id" => 632910392, "variant_id" => 808950810, "sku" => "IPOD2008PINK", "vendor" => "Apple", "title" => "IPod Nano - 8GB", "variant_title" => "Pink", "image_url" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704205723", "taxable" => true, "requires_shipping" => true, "gift_card" => false, "price" => "199.00", "compare_at_price" => nil, "line_price" => "199.00", "properties" => {}, "quantity" => 1, "grams" => 200, "fulfillment_service" => "manual", "applied_discounts" => [], "discount_allocations" => [], "tax_lines" => []}], "gift_cards" => [], "tax_lines" => [{"price" => "21.49", "rate" => 0.06, "title" => "State Tax", "compare_at" => 0.06}], "tax_manipulations" => [], "shipping_line" => {"handle" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping", "tax_lines" => []}, "shipping_rate" => {"id" => "shopify-Free%20Shipping-0.00", "price" => "0.00", "title" => "Free Shipping"}, "shipping_address" => {"id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"}, "credit_card" => {"first_name" => "Bob", "last_name" => "Norman", "first_digits" => "1", "last_digits" => "1", "brand" => "bogus", "expiry_month" => 8, "expiry_year" => 2042, "customer_id" => nil}, "billing_address" => {"id" => 550558813, "first_name" => "Bob", "last_name" => "Norman", "phone" => "+1(502)-459-2181", "company" => nil, "address1" => "Chestnut Street 92", "address2" => "", "city" => "Louisville", "province" => "Kentucky", "province_code" => "KY", "country" => "United States", "country_code" => "US", "zip" => "40202"}, "applied_discount" => nil, "applied_discounts" => [], "discount_violations" => []}}}), headers: {}) + + response = ShopifyAPI::Payment.find( + checkout_id: "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", + id: 25428999, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x/payments/25428999.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x/payments/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 1}), headers: {}) + + response = ShopifyAPI::Payment.count( + checkout_id: "7yjf4v2we7gamku6a6h7tvm8h3mmvs4x", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/checkouts/7yjf4v2we7gamku6a6h7tvm8h3mmvs4x/payments/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/payment_transaction_test.rb b/test/rest/2024_10/payment_transaction_test.rb new file mode 100644 index 00000000..7672c2db --- /dev/null +++ b/test/rest/2024_10/payment_transaction_test.rb @@ -0,0 +1,64 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class PaymentTransaction202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/balance/transactions.json?payout_id=623721858") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"transactions" => [{"id" => 699519475, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-50.00", "fee" => "0.00", "net" => "-50.00", "source_id" => 460709370, "source_type" => "adjustment", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2024-10-03T09:28:43-05:00", "adjustment_order_transactions" => []}, {"id" => 77412310, "type" => "credit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "50.00", "fee" => "0.00", "net" => "50.00", "source_id" => 374511569, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2024-10-03T09:28:43-05:00", "adjustment_order_transactions" => nil}, {"id" => 1006917261, "type" => "refund", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-3.45", "fee" => "0.00", "net" => "-3.45", "source_id" => 1006917261, "source_type" => "Payments::Refund", "source_order_id" => 217130470, "source_order_transaction_id" => 1006917261, "processed_at" => "2024-10-02T09:28:43-05:00", "adjustment_order_transactions" => nil}, {"id" => 777128868, "type" => "refund", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-8.05", "fee" => "0.00", "net" => "-8.05", "source_id" => 777128868, "source_type" => "Payments::Refund", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2024-10-02T09:28:43-05:00", "adjustment_order_transactions" => nil}, {"id" => 758509248, "type" => "adjustment", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-1.50", "fee" => "-0.25", "net" => "-1.75", "source_id" => 764194150, "source_type" => "charge", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2024-10-02T09:28:43-05:00", "adjustment_order_transactions" => nil}, {"id" => 746296004, "type" => "charge", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "10.00", "fee" => "2.00", "net" => "8.00", "source_id" => 746296004, "source_type" => "charge", "source_order_id" => 625362839, "source_order_transaction_id" => 890672011, "processed_at" => "2024-10-02T09:28:43-05:00", "adjustment_order_transactions" => nil}, {"id" => 515523000, "type" => "charge", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "11.50", "fee" => "0.65", "net" => "10.85", "source_id" => 1006917261, "source_type" => "Payments::Refund", "source_order_id" => 217130470, "source_order_transaction_id" => 1006917261, "processed_at" => "2024-10-02T09:28:43-05:00", "adjustment_order_transactions" => nil}, {"id" => 482793472, "type" => "adjustment", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "0.45", "fee" => "0.00", "net" => "0.45", "source_id" => 204289877, "source_type" => "charge", "source_order_id" => 217130470, "source_order_transaction_id" => 567994517, "processed_at" => "2024-10-02T09:28:43-05:00", "adjustment_order_transactions" => nil}, {"id" => 382557793, "type" => "adjustment", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "0.20", "fee" => "0.00", "net" => "0.20", "source_id" => 204289877, "source_type" => "charge", "source_order_id" => 217130470, "source_order_transaction_id" => 567994517, "processed_at" => "2024-10-02T09:28:43-05:00", "adjustment_order_transactions" => nil}, {"id" => 365577382, "type" => "adjustment", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-3.45", "fee" => "0.00", "net" => "-3.45", "source_id" => 1006917261, "source_type" => "Payments::Refund", "source_order_id" => 217130470, "source_order_transaction_id" => 1006917261, "processed_at" => "2024-10-02T09:28:43-05:00", "adjustment_order_transactions" => nil}, {"id" => 201521674, "type" => "refund", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-2.00", "fee" => "0.00", "net" => "-2.00", "source_id" => 971443537, "source_type" => "charge", "source_order_id" => 625362839, "source_order_transaction_id" => 461790020, "processed_at" => "2024-10-02T09:28:43-05:00", "adjustment_order_transactions" => nil}, {"id" => 188711209, "type" => "capture", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-11.37", "fee" => "0.00", "net" => "-11.37", "source_id" => 188711209, "source_type" => "charge", "source_order_id" => 923751907, "source_order_transaction_id" => 972637531, "processed_at" => "2024-10-02T09:28:43-05:00", "adjustment_order_transactions" => nil}, {"id" => 977134221, "type" => "dispute", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-100.00", "fee" => "15.00", "net" => "-115.00", "source_id" => 297752803, "source_type" => "Payments::Dispute", "source_order_id" => 625362839, "source_order_transaction_id" => 897736458, "processed_at" => "2023-12-23T09:28:43-05:00", "adjustment_order_transactions" => nil}, {"id" => 774282320, "type" => "dispute", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-100.00", "fee" => "15.00", "net" => "-115.00", "source_id" => 46484353, "source_type" => "Payments::Dispute", "source_order_id" => 625362839, "source_order_transaction_id" => 897736458, "processed_at" => "2023-12-23T09:28:43-05:00", "adjustment_order_transactions" => nil}, {"id" => 726130462, "type" => "dispute", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-11.50", "fee" => "15.00", "net" => "-26.50", "source_id" => 598735659, "source_type" => "Payments::Dispute", "source_order_id" => 625362839, "source_order_transaction_id" => 897736458, "processed_at" => "2023-12-23T09:28:43-05:00", "adjustment_order_transactions" => nil}, {"id" => 590656313, "type" => "dispute", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-100.00", "fee" => "15.00", "net" => "-115.00", "source_id" => 297752803, "source_type" => "Payments::Dispute", "source_order_id" => 625362839, "source_order_transaction_id" => 897736458, "processed_at" => "2023-12-23T09:28:43-05:00", "adjustment_order_transactions" => nil}, {"id" => 585267611, "type" => "dispute", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-50.00", "fee" => "0.00", "net" => "-50.00", "source_id" => 46484353, "source_type" => "Payments::Dispute", "source_order_id" => 625362839, "source_order_transaction_id" => 897736458, "processed_at" => "2023-12-23T09:28:43-05:00", "adjustment_order_transactions" => nil}, {"id" => 295058327, "type" => "dispute", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "100.00", "fee" => "-15.00", "net" => "115.00", "source_id" => 297752803, "source_type" => "Payments::Dispute", "source_order_id" => 625362839, "source_order_transaction_id" => 897736458, "processed_at" => "2023-12-23T09:28:43-05:00", "adjustment_order_transactions" => nil}, {"id" => 144665135, "type" => "dispute", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "2.83", "fee" => "-15.00", "net" => "17.83", "source_id" => 297752803, "source_type" => "Payments::Dispute", "source_order_id" => 625362839, "source_order_transaction_id" => 897736458, "processed_at" => "2023-12-23T09:28:43-05:00", "adjustment_order_transactions" => nil}, {"id" => 1039379438, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-10.00", "fee" => "0.00", "net" => "-10.00", "source_id" => 98265485, "source_type" => "adjustment", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => []}, {"id" => 996672915, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-100.00", "fee" => "0.00", "net" => "-100.00", "source_id" => 996672915, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => nil}, {"id" => 911614749, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "100.00", "fee" => "0.00", "net" => "100.00", "source_id" => 31693764, "source_type" => "adjustment", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => []}, {"id" => 843310825, "type" => "charge", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "11.50", "fee" => "0.63", "net" => "10.87", "source_id" => 843310825, "source_type" => "charge", "source_order_id" => 625362839, "source_order_transaction_id" => 897736458, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => nil}, {"id" => 841651232, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-100.00", "fee" => "0.00", "net" => "-100.00", "source_id" => 841651232, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => nil}, {"id" => 777723124, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-100.00", "fee" => "0.00", "net" => "-100.00", "source_id" => 777723124, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => nil}, {"id" => 744334347, "type" => "credit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "100.00", "fee" => "0.00", "net" => "100.00", "source_id" => 14450113, "source_type" => "adjustment", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => [{"id" => 348327371, "amount" => "11.50", "order" => {"id" => 625362839, "name" => "#1001"}}]}, {"id" => 717600021, "type" => "credit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "100.00", "fee" => "0.00", "net" => "100.00", "source_id" => 717600021, "source_type" => "adjustment", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => []}, {"id" => 645292099, "type" => "credit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "100.00", "fee" => "0.00", "net" => "100.00", "source_id" => 717600021, "source_type" => "adjustment", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => []}, {"id" => 637679484, "type" => "SHOPIFY_COLLECTIVE_DEBIT_REVERSAL", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "1.00", "fee" => "0.00", "net" => "1.00", "source_id" => 637679484, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => nil}, {"id" => 620327031, "type" => "charge", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "11.50", "fee" => "0.63", "net" => "10.87", "source_id" => 620327031, "source_type" => "charge", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => nil}, {"id" => 524892362, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-100.00", "fee" => "0.00", "net" => "-100.00", "source_id" => 87730317, "source_type" => "adjustment", "source_order_id" => 625362839, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => [{"id" => 348327371, "amount" => "11.50", "order" => {"id" => 625362839, "name" => "#1001"}}]}, {"id" => 510004917, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "100.00", "fee" => "0.00", "net" => "100.00", "source_id" => 504962724, "source_type" => "adjustment", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => []}, {"id" => 504303358, "type" => "seller_protection_credit_reversal", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-100.00", "fee" => "0.00", "net" => "-100.00", "source_id" => 504303358, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => nil}, {"id" => 459441379, "type" => "credit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "100.00", "fee" => "0.00", "net" => "100.00", "source_id" => 14450113, "source_type" => "adjustment", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => [{"id" => 348327371, "amount" => "11.50", "order" => {"id" => 625362839, "name" => "#1001"}}]}, {"id" => 427940661, "type" => "credit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "150.00", "fee" => "0.00", "net" => "150.00", "source_id" => 427940661, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => nil}, {"id" => 400852343, "type" => "reserve", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-42.00", "fee" => "0.00", "net" => "-42.00", "source_id" => nil, "source_type" => nil, "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => nil}, {"id" => 381560291, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-150.00", "fee" => "0.00", "net" => "-150.00", "source_id" => 381560291, "source_type" => "adjustment", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => []}, {"id" => 357948134, "type" => "charge", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "10.00", "fee" => "0.46", "net" => "9.54", "source_id" => 971443537, "source_type" => "charge", "source_order_id" => 625362839, "source_order_transaction_id" => 461790020, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => nil}, {"id" => 344667176, "type" => "credit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "100.50", "fee" => "0.50", "net" => "100.00", "source_id" => 291591126, "source_type" => "adjustment", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => []}, {"id" => 316417004, "type" => "charge", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "11.50", "fee" => "0.50", "net" => "11.00", "source_id" => 316417004, "source_type" => "charge", "source_order_id" => 753768948, "source_order_transaction_id" => 316417004, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => nil}, {"id" => 294868963, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-100.00", "fee" => "0.00", "net" => "-100.00", "source_id" => 294868963, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => nil}, {"id" => 268738895, "type" => "credit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "1000.00", "fee" => "0.00", "net" => "1000.00", "source_id" => 60315799, "source_type" => "adjustment", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => []}, {"id" => 250467535, "type" => "reserve", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "42.00", "fee" => "0.00", "net" => "42.00", "source_id" => nil, "source_type" => nil, "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => nil}, {"id" => 217609728, "type" => "charge", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "11.50", "fee" => "0.00", "net" => "11.50", "source_id" => 930299385, "source_type" => "charge", "source_order_id" => 625362839, "source_order_transaction_id" => 348327371, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => nil}, {"id" => 193054836, "type" => "charge", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "11.50", "fee" => "0.50", "net" => "11.00", "source_id" => 193054836, "source_type" => "charge", "source_order_id" => 753768948, "source_order_transaction_id" => 192808135, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => nil}, {"id" => 138130604, "type" => "credit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "150.00", "fee" => "0.00", "net" => "150.00", "source_id" => 138130604, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => nil}, {"id" => 117567798, "type" => "SHOPIFY_COLLECTIVE_DEBIT_REVERSAL", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "1.00", "fee" => "0.00", "net" => "1.00", "source_id" => 117567798, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => nil}, {"id" => 105879119, "type" => "credit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "100.00", "fee" => "0.00", "net" => "100.00", "source_id" => 105879119, "source_type" => "adjustment", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => []}, {"id" => 103606837, "type" => "debit", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "-100.00", "fee" => "0.00", "net" => "-100.00", "source_id" => 103606837, "source_type" => "Payments::Balance::AdjustmentReversal", "source_order_id" => nil, "source_order_transaction_id" => nil, "processed_at" => "2016-08-04T18:07:57-04:00", "adjustment_order_transactions" => nil}, {"id" => 567994517, "type" => "charge", "test" => false, "payout_id" => 623721858, "payout_status" => "paid", "currency" => "USD", "amount" => "11.50", "fee" => "0.65", "net" => "10.85", "source_id" => 204289877, "source_type" => "charge", "source_order_id" => 217130470, "source_order_transaction_id" => 567994517, "processed_at" => "2014-01-21T13:05:38-05:00", "adjustment_order_transactions" => nil}]}), headers: {}) + + response = ShopifyAPI::PaymentTransaction.transactions( + payout_id: "623721858", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/balance/transactions.json?payout_id=623721858") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/payout_test.rb b/test/rest/2024_10/payout_test.rb new file mode 100644 index 00000000..418b4c91 --- /dev/null +++ b/test/rest/2024_10/payout_test.rb @@ -0,0 +1,126 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Payout202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/payouts.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"payouts" => [{"id" => 512467833, "status" => "failed", "date" => "2013-12-01", "currency" => "USD", "amount" => "43.12", "summary" => {"adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "45.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"}}, {"id" => 39438702, "status" => "in_transit", "date" => "2013-11-01", "currency" => "USD", "amount" => "43.12", "summary" => {"adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "45.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"}}, {"id" => 917000993, "status" => "failed", "date" => "2012-11-13", "currency" => "USD", "amount" => "41.90", "summary" => {"adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"}}, {"id" => 867808544, "status" => "paid", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => {"adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"}}, {"id" => 725076685, "status" => "paid", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => {"adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"}}, {"id" => 714327683, "status" => "failed", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => {"adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"}}, {"id" => 631321250, "status" => "scheduled", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => {"adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"}}, {"id" => 623721858, "status" => "paid", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => {"adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"}}]}), headers: {}) + + response = ShopifyAPI::Payout.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/payouts.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/payouts.json?date_max=2012-11-12") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"payouts" => [{"id" => 867808544, "status" => "paid", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => {"adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"}}, {"id" => 725076685, "status" => "paid", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => {"adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"}}, {"id" => 714327683, "status" => "failed", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => {"adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"}}, {"id" => 631321250, "status" => "scheduled", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => {"adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"}}, {"id" => 623721858, "status" => "paid", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => {"adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"}}]}), headers: {}) + + response = ShopifyAPI::Payout.all( + date_max: "2012-11-12", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/payouts.json?date_max=2012-11-12") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/payouts/623721858.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"payout" => {"id" => 623721858, "status" => "paid", "date" => "2012-11-12", "currency" => "USD", "amount" => "41.90", "summary" => {"adjustments_fee_amount" => "0.12", "adjustments_gross_amount" => "2.13", "charges_fee_amount" => "1.32", "charges_gross_amount" => "44.52", "refunds_fee_amount" => "-0.23", "refunds_gross_amount" => "-3.54", "reserved_funds_fee_amount" => "0.00", "reserved_funds_gross_amount" => "0.00", "retried_payouts_fee_amount" => "0.00", "retried_payouts_gross_amount" => "0.00"}}}), headers: {}) + + response = ShopifyAPI::Payout.find( + id: 623721858, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shopify_payments/payouts/623721858.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/policy_test.rb b/test/rest/2024_10/policy_test.rb new file mode 100644 index 00000000..bfd1a0d7 --- /dev/null +++ b/test/rest/2024_10/policy_test.rb @@ -0,0 +1,62 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Policy202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/policies.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"policies" => [{"body" => "You have 30 days to get a refund", "created_at" => "2024-10-02T08:58:20-05:00", "updated_at" => "2024-10-02T08:58:20-05:00", "handle" => "refund-policy", "title" => "Refund policy", "url" => "https://jsmith.myshopify.com/548380009/policies/997884056"}]}), headers: {}) + + response = ShopifyAPI::Policy.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/policies.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/price_rule_test.rb b/test/rest/2024_10/price_rule_test.rb new file mode 100644 index 00000000..f965def3 --- /dev/null +++ b/test/rest/2024_10/price_rule_test.rb @@ -0,0 +1,395 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class PriceRule202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "price_rule" => hash_including({"title" => "Buy2iPodsGetiPodTouchForFree", "value_type" => "percentage", "value" => "-100.0", "customer_selection" => "all", "target_type" => "line_item", "target_selection" => "entitled", "allocation_method" => "each", "starts_at" => "2018-03-22T00:00:00-00:00", "prerequisite_collection_ids" => [841564295], "entitled_product_ids" => [921728736], "prerequisite_to_entitlement_quantity_ratio" => {"prerequisite_quantity" => 2, "entitled_quantity" => 1}, "allocation_limit" => 3}) } + ) + .to_return(status: 200, body: JSON.generate({"price_rule" => {"id" => 996606716, "value_type" => "percentage", "value" => "-100.0", "customer_selection" => "all", "target_type" => "line_item", "target_selection" => "entitled", "allocation_method" => "each", "allocation_limit" => 3, "once_per_customer" => false, "usage_limit" => nil, "starts_at" => "2018-03-21T20:00:00-04:00", "ends_at" => nil, "created_at" => "2024-10-02T09:11:05-05:00", "updated_at" => "2024-10-02T09:11:05-05:00", "entitled_product_ids" => [921728736], "entitled_variant_ids" => [], "entitled_collection_ids" => [], "entitled_country_ids" => [], "prerequisite_product_ids" => [], "prerequisite_variant_ids" => [], "prerequisite_collection_ids" => [841564295], "customer_segment_prerequisite_ids" => [], "prerequisite_customer_ids" => [], "prerequisite_subtotal_range" => nil, "prerequisite_quantity_range" => nil, "prerequisite_shipping_price_range" => nil, "prerequisite_to_entitlement_quantity_ratio" => {"prerequisite_quantity" => 2, "entitled_quantity" => 1}, "prerequisite_to_entitlement_purchase" => {"prerequisite_amount" => nil}, "title" => "Buy2iPodsGetiPodTouchForFree", "admin_graphql_api_id" => "gid://shopify/PriceRule/996606716"}}), headers: {}) + + response = price_rule = ShopifyAPI::PriceRule.new + price_rule.title = "Buy2iPodsGetiPodTouchForFree" + price_rule.value_type = "percentage" + price_rule.value = "-100.0" + price_rule.customer_selection = "all" + price_rule.target_type = "line_item" + price_rule.target_selection = "entitled" + price_rule.allocation_method = "each" + price_rule.starts_at = "2018-03-22T00:00:00-00:00" + price_rule.prerequisite_collection_ids = [ + 841564295 + ] + price_rule.entitled_product_ids = [ + 921728736 + ] + price_rule.prerequisite_to_entitlement_quantity_ratio = { + "prerequisite_quantity" => 2, + "entitled_quantity" => 1 + } + price_rule.allocation_limit = 3 + price_rule.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "price_rule" => hash_including({"title" => "SUMMERSALE10OFF", "target_type" => "line_item", "target_selection" => "all", "allocation_method" => "across", "value_type" => "fixed_amount", "value" => "-10.0", "customer_selection" => "all", "starts_at" => "2017-01-19T17:59:10Z"}) } + ) + .to_return(status: 200, body: JSON.generate({"price_rule" => {"id" => 996606713, "value_type" => "fixed_amount", "value" => "-10.0", "customer_selection" => "all", "target_type" => "line_item", "target_selection" => "all", "allocation_method" => "across", "allocation_limit" => nil, "once_per_customer" => false, "usage_limit" => nil, "starts_at" => "2017-01-19T12:59:10-05:00", "ends_at" => nil, "created_at" => "2024-10-02T09:11:01-05:00", "updated_at" => "2024-10-02T09:11:01-05:00", "entitled_product_ids" => [], "entitled_variant_ids" => [], "entitled_collection_ids" => [], "entitled_country_ids" => [], "prerequisite_product_ids" => [], "prerequisite_variant_ids" => [], "prerequisite_collection_ids" => [], "customer_segment_prerequisite_ids" => [], "prerequisite_customer_ids" => [], "prerequisite_subtotal_range" => nil, "prerequisite_quantity_range" => nil, "prerequisite_shipping_price_range" => nil, "prerequisite_to_entitlement_quantity_ratio" => {"prerequisite_quantity" => nil, "entitled_quantity" => nil}, "prerequisite_to_entitlement_purchase" => {"prerequisite_amount" => nil}, "title" => "SUMMERSALE10OFF", "admin_graphql_api_id" => "gid://shopify/PriceRule/996606713"}}), headers: {}) + + response = price_rule = ShopifyAPI::PriceRule.new + price_rule.title = "SUMMERSALE10OFF" + price_rule.target_type = "line_item" + price_rule.target_selection = "all" + price_rule.allocation_method = "across" + price_rule.value_type = "fixed_amount" + price_rule.value = "-10.0" + price_rule.customer_selection = "all" + price_rule.starts_at = "2017-01-19T17:59:10Z" + price_rule.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "price_rule" => hash_including({"title" => "15OFFCOLLECTION", "target_type" => "line_item", "target_selection" => "entitled", "allocation_method" => "across", "value_type" => "percentage", "value" => "-15.0", "customer_selection" => "all", "entitled_collection_ids" => [841564295], "starts_at" => "2017-01-19T17:59:10Z"}) } + ) + .to_return(status: 200, body: JSON.generate({"price_rule" => {"id" => 996606715, "value_type" => "percentage", "value" => "-15.0", "customer_selection" => "all", "target_type" => "line_item", "target_selection" => "entitled", "allocation_method" => "across", "allocation_limit" => nil, "once_per_customer" => false, "usage_limit" => nil, "starts_at" => "2017-01-19T12:59:10-05:00", "ends_at" => nil, "created_at" => "2024-10-02T09:11:03-05:00", "updated_at" => "2024-10-02T09:11:03-05:00", "entitled_product_ids" => [], "entitled_variant_ids" => [], "entitled_collection_ids" => [841564295], "entitled_country_ids" => [], "prerequisite_product_ids" => [], "prerequisite_variant_ids" => [], "prerequisite_collection_ids" => [], "customer_segment_prerequisite_ids" => [], "prerequisite_customer_ids" => [], "prerequisite_subtotal_range" => nil, "prerequisite_quantity_range" => nil, "prerequisite_shipping_price_range" => nil, "prerequisite_to_entitlement_quantity_ratio" => {"prerequisite_quantity" => nil, "entitled_quantity" => nil}, "prerequisite_to_entitlement_purchase" => {"prerequisite_amount" => nil}, "title" => "15OFFCOLLECTION", "admin_graphql_api_id" => "gid://shopify/PriceRule/996606715"}}), headers: {}) + + response = price_rule = ShopifyAPI::PriceRule.new + price_rule.title = "15OFFCOLLECTION" + price_rule.target_type = "line_item" + price_rule.target_selection = "entitled" + price_rule.allocation_method = "across" + price_rule.value_type = "percentage" + price_rule.value = "-15.0" + price_rule.customer_selection = "all" + price_rule.entitled_collection_ids = [ + 841564295 + ] + price_rule.starts_at = "2017-01-19T17:59:10Z" + price_rule.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "price_rule" => hash_including({"title" => "FREESHIPPING", "target_type" => "shipping_line", "target_selection" => "all", "allocation_method" => "each", "value_type" => "percentage", "value" => "-100.0", "usage_limit" => 20, "customer_selection" => "all", "prerequisite_subtotal_range" => {"greater_than_or_equal_to" => "50.0"}, "starts_at" => "2017-01-19T17:59:10Z"}) } + ) + .to_return(status: 200, body: JSON.generate({"price_rule" => {"id" => 996606714, "value_type" => "percentage", "value" => "-100.0", "customer_selection" => "all", "target_type" => "shipping_line", "target_selection" => "all", "allocation_method" => "each", "allocation_limit" => nil, "once_per_customer" => false, "usage_limit" => 20, "starts_at" => "2017-01-19T12:59:10-05:00", "ends_at" => nil, "created_at" => "2024-10-02T09:11:02-05:00", "updated_at" => "2024-10-02T09:11:02-05:00", "entitled_product_ids" => [], "entitled_variant_ids" => [], "entitled_collection_ids" => [], "entitled_country_ids" => [], "prerequisite_product_ids" => [], "prerequisite_variant_ids" => [], "prerequisite_collection_ids" => [], "customer_segment_prerequisite_ids" => [], "prerequisite_customer_ids" => [], "prerequisite_subtotal_range" => {"greater_than_or_equal_to" => "50.0"}, "prerequisite_quantity_range" => nil, "prerequisite_shipping_price_range" => nil, "prerequisite_to_entitlement_quantity_ratio" => {"prerequisite_quantity" => nil, "entitled_quantity" => nil}, "prerequisite_to_entitlement_purchase" => {"prerequisite_amount" => nil}, "title" => "FREESHIPPING", "admin_graphql_api_id" => "gid://shopify/PriceRule/996606714"}}), headers: {}) + + response = price_rule = ShopifyAPI::PriceRule.new + price_rule.title = "FREESHIPPING" + price_rule.target_type = "shipping_line" + price_rule.target_selection = "all" + price_rule.allocation_method = "each" + price_rule.value_type = "percentage" + price_rule.value = "-100.0" + price_rule.usage_limit = 20 + price_rule.customer_selection = "all" + price_rule.prerequisite_subtotal_range = { + "greater_than_or_equal_to" => "50.0" + } + price_rule.starts_at = "2017-01-19T17:59:10Z" + price_rule.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"price_rules" => [{"id" => 507328175, "value_type" => "fixed_amount", "value" => "-10.0", "customer_selection" => "all", "target_type" => "line_item", "target_selection" => "all", "allocation_method" => "across", "allocation_limit" => nil, "once_per_customer" => false, "usage_limit" => nil, "starts_at" => "2023-12-27T08:59:11-05:00", "ends_at" => "2024-10-08T08:59:11-05:00", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "entitled_product_ids" => [], "entitled_variant_ids" => [], "entitled_collection_ids" => [], "entitled_country_ids" => [], "prerequisite_product_ids" => [], "prerequisite_variant_ids" => [], "prerequisite_collection_ids" => [], "customer_segment_prerequisite_ids" => [], "prerequisite_customer_ids" => [], "prerequisite_subtotal_range" => nil, "prerequisite_quantity_range" => nil, "prerequisite_shipping_price_range" => nil, "prerequisite_to_entitlement_quantity_ratio" => {"prerequisite_quantity" => nil, "entitled_quantity" => nil}, "prerequisite_to_entitlement_purchase" => {"prerequisite_amount" => nil}, "title" => "SUMMERSALE10OFF", "admin_graphql_api_id" => "gid://shopify/PriceRule/507328175"}, {"id" => 106886544, "value_type" => "fixed_amount", "value" => "-10.0", "customer_selection" => "all", "target_type" => "line_item", "target_selection" => "all", "allocation_method" => "across", "allocation_limit" => nil, "once_per_customer" => false, "usage_limit" => nil, "starts_at" => "2023-12-31T08:59:11-05:00", "ends_at" => "2024-10-04T08:59:11-05:00", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "entitled_product_ids" => [], "entitled_variant_ids" => [], "entitled_collection_ids" => [], "entitled_country_ids" => [], "prerequisite_product_ids" => [], "prerequisite_variant_ids" => [], "prerequisite_collection_ids" => [], "customer_segment_prerequisite_ids" => [], "prerequisite_customer_ids" => [], "prerequisite_subtotal_range" => nil, "prerequisite_quantity_range" => nil, "prerequisite_shipping_price_range" => nil, "prerequisite_to_entitlement_quantity_ratio" => {"prerequisite_quantity" => nil, "entitled_quantity" => nil}, "prerequisite_to_entitlement_purchase" => {"prerequisite_amount" => nil}, "title" => "TENOFF", "admin_graphql_api_id" => "gid://shopify/PriceRule/106886544"}]}), headers: {}) + + response = ShopifyAPI::PriceRule.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules.json?since_id=106886545") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"price_rules" => [{"id" => 507328175, "value_type" => "fixed_amount", "value" => "-10.0", "customer_selection" => "all", "target_type" => "line_item", "target_selection" => "all", "allocation_method" => "across", "allocation_limit" => nil, "once_per_customer" => false, "usage_limit" => nil, "starts_at" => "2023-12-27T08:59:11-05:00", "ends_at" => "2024-10-08T08:59:11-05:00", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "entitled_product_ids" => [], "entitled_variant_ids" => [], "entitled_collection_ids" => [], "entitled_country_ids" => [], "prerequisite_product_ids" => [], "prerequisite_variant_ids" => [], "prerequisite_collection_ids" => [], "customer_segment_prerequisite_ids" => [], "prerequisite_customer_ids" => [], "prerequisite_subtotal_range" => nil, "prerequisite_quantity_range" => nil, "prerequisite_shipping_price_range" => nil, "prerequisite_to_entitlement_quantity_ratio" => {"prerequisite_quantity" => nil, "entitled_quantity" => nil}, "prerequisite_to_entitlement_purchase" => {"prerequisite_amount" => nil}, "title" => "SUMMERSALE10OFF", "admin_graphql_api_id" => "gid://shopify/PriceRule/507328175"}]}), headers: {}) + + response = ShopifyAPI::PriceRule.all( + since_id: "106886545", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules.json?since_id=106886545") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "price_rule" => hash_including({"title" => "WINTER SALE"}) } + ) + .to_return(status: 200, body: JSON.generate({"price_rule" => {"id" => 507328175, "value_type" => "fixed_amount", "value" => "-10.0", "customer_selection" => "all", "target_type" => "line_item", "target_selection" => "all", "allocation_method" => "across", "allocation_limit" => nil, "once_per_customer" => false, "usage_limit" => nil, "starts_at" => "2023-12-27T08:59:11-05:00", "ends_at" => "2024-10-08T08:59:11-05:00", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:11:00-05:00", "entitled_product_ids" => [], "entitled_variant_ids" => [], "entitled_collection_ids" => [], "entitled_country_ids" => [], "prerequisite_product_ids" => [], "prerequisite_variant_ids" => [], "prerequisite_collection_ids" => [], "customer_segment_prerequisite_ids" => [], "prerequisite_customer_ids" => [], "prerequisite_subtotal_range" => nil, "prerequisite_quantity_range" => nil, "prerequisite_shipping_price_range" => nil, "prerequisite_to_entitlement_quantity_ratio" => {"prerequisite_quantity" => nil, "entitled_quantity" => nil}, "prerequisite_to_entitlement_purchase" => {"prerequisite_amount" => nil}, "title" => "WINTER SALE", "admin_graphql_api_id" => "gid://shopify/PriceRule/507328175"}}), headers: {}) + + response = price_rule = ShopifyAPI::PriceRule.new + price_rule.id = 507328175 + price_rule.title = "WINTER SALE" + price_rule.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"price_rule" => {"id" => 507328175, "value_type" => "fixed_amount", "value" => "-10.0", "customer_selection" => "all", "target_type" => "line_item", "target_selection" => "all", "allocation_method" => "across", "allocation_limit" => nil, "once_per_customer" => false, "usage_limit" => nil, "starts_at" => "2023-12-27T08:59:11-05:00", "ends_at" => "2024-10-08T08:59:11-05:00", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "entitled_product_ids" => [], "entitled_variant_ids" => [], "entitled_collection_ids" => [], "entitled_country_ids" => [], "prerequisite_product_ids" => [], "prerequisite_variant_ids" => [], "prerequisite_collection_ids" => [], "customer_segment_prerequisite_ids" => [], "prerequisite_customer_ids" => [], "prerequisite_subtotal_range" => nil, "prerequisite_quantity_range" => nil, "prerequisite_shipping_price_range" => nil, "prerequisite_to_entitlement_quantity_ratio" => {"prerequisite_quantity" => nil, "entitled_quantity" => nil}, "prerequisite_to_entitlement_purchase" => {"prerequisite_amount" => nil}, "title" => "SUMMERSALE10OFF", "admin_graphql_api_id" => "gid://shopify/PriceRule/507328175"}}), headers: {}) + + response = ShopifyAPI::PriceRule.find( + id: 507328175, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::PriceRule.delete( + id: 507328175, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/507328175.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 2}), headers: {}) + + response = ShopifyAPI::PriceRule.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/price_rules/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/product_listing_test.rb b/test/rest/2024_10/product_listing_test.rb new file mode 100644 index 00000000..163cabfd --- /dev/null +++ b/test/rest/2024_10/product_listing_test.rb @@ -0,0 +1,218 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class ProductListing202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/product_listings.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"product_listings" => [{"product_id" => 632910392, "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.

", "handle" => "ipod-nano", "product_type" => "Cult Products", "title" => "IPod Nano - 8GB", "vendor" => "Apple", "available" => true, "tags" => "Emotive, Flash Memory, MP3, Music", "published_at" => "2017-08-31T20:00:00-04:00", "variants" => [{"id" => 808950810, "title" => "Pink", "option_values" => [{"option_id" => 594680422, "name" => "Color", "value" => "Pink"}], "price" => "199.00", "formatted_price" => "$199.00", "compare_at_price" => nil, "grams" => 567, "requires_shipping" => true, "sku" => "IPOD2008PINK", "barcode" => "1234_pink", "taxable" => true, "position" => 1, "available" => true, "inventory_policy" => "continue", "inventory_quantity" => 10, "inventory_management" => "shopify", "fulfillment_service" => "manual", "weight" => 1.25, "weight_unit" => "lb", "image_id" => 562641783, "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00"}, {"id" => 49148385, "title" => "Red", "option_values" => [{"option_id" => 594680422, "name" => "Color", "value" => "Red"}], "price" => "199.00", "formatted_price" => "$199.00", "compare_at_price" => nil, "grams" => 567, "requires_shipping" => true, "sku" => "IPOD2008RED", "barcode" => "1234_red", "taxable" => true, "position" => 2, "available" => true, "inventory_policy" => "continue", "inventory_quantity" => 20, "inventory_management" => "shopify", "fulfillment_service" => "manual", "weight" => 1.25, "weight_unit" => "lb", "image_id" => nil, "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00"}, {"id" => 39072856, "title" => "Green", "option_values" => [{"option_id" => 594680422, "name" => "Color", "value" => "Green"}], "price" => "199.00", "formatted_price" => "$199.00", "compare_at_price" => nil, "grams" => 567, "requires_shipping" => true, "sku" => "IPOD2008GREEN", "barcode" => "1234_green", "taxable" => true, "position" => 3, "available" => true, "inventory_policy" => "continue", "inventory_quantity" => 30, "inventory_management" => "shopify", "fulfillment_service" => "manual", "weight" => 1.25, "weight_unit" => "lb", "image_id" => nil, "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00"}, {"id" => 457924702, "title" => "Black", "option_values" => [{"option_id" => 594680422, "name" => "Color", "value" => "Black"}], "price" => "199.00", "formatted_price" => "$199.00", "compare_at_price" => nil, "grams" => 567, "requires_shipping" => true, "sku" => "IPOD2008BLACK", "barcode" => "1234_black", "taxable" => true, "position" => 4, "available" => true, "inventory_policy" => "continue", "inventory_quantity" => 40, "inventory_management" => "shopify", "fulfillment_service" => "manual", "weight" => 1.25, "weight_unit" => "lb", "image_id" => nil, "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00"}], "images" => [{"id" => 850703190, "created_at" => "2024-10-02T09:28:43-05:00", "position" => 1, "updated_at" => "2024-10-02T09:28:43-05:00", "product_id" => 632910392, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704205723", "variant_ids" => [], "width" => 123, "height" => 456}, {"id" => 562641783, "created_at" => "2024-10-02T09:28:43-05:00", "position" => 2, "updated_at" => "2024-10-02T09:28:43-05:00", "product_id" => 632910392, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704205723", "variant_ids" => [808950810], "width" => 123, "height" => 456}, {"id" => 378407906, "created_at" => "2024-10-02T09:28:43-05:00", "position" => 3, "updated_at" => "2024-10-02T09:28:43-05:00", "product_id" => 632910392, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704205723", "variant_ids" => [], "width" => 123, "height" => 456}], "options" => [{"id" => 594680422, "name" => "Color", "product_id" => 632910392, "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]}]}, {"product_id" => 921728736, "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00", "body_html" => "

The iPod Touch has the iPhone's multi-touch interface, with a physical home button off the touch screen. The home screen has a list of buttons for the available applications.

", "handle" => "ipod-touch", "product_type" => "Cult Products", "title" => "IPod Touch 8GB", "vendor" => "Apple", "available" => true, "tags" => "", "published_at" => "2017-08-31T20:00:00-04:00", "variants" => [{"id" => 447654529, "title" => "Black", "option_values" => [{"option_id" => 891236591, "name" => "Title", "value" => "Black"}], "price" => "199.00", "formatted_price" => "$199.00", "compare_at_price" => nil, "grams" => 567, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "barcode" => "1234_black", "taxable" => true, "position" => 1, "available" => true, "inventory_policy" => "continue", "inventory_quantity" => 13, "inventory_management" => "shipwire-app", "fulfillment_service" => "shipwire-app", "weight" => 1.25, "weight_unit" => "lb", "image_id" => nil, "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00"}], "images" => [], "options" => [{"id" => 891236591, "name" => "Title", "product_id" => 921728736, "position" => 1, "values" => ["Black"]}]}]}), headers: {}) + + response = ShopifyAPI::ProductListing.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/product_listings.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/product_listings/product_ids.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"product_ids" => [921728736, 632910392]}), headers: {}) + + response = ShopifyAPI::ProductListing.product_ids + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/product_listings/product_ids.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/product_listings/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 2}), headers: {}) + + response = ShopifyAPI::ProductListing.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/product_listings/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/product_listings/921728736.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"product_listing" => {"product_id" => 921728736, "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00", "body_html" => "

The iPod Touch has the iPhone's multi-touch interface, with a physical home button off the touch screen. The home screen has a list of buttons for the available applications.

", "handle" => "ipod-touch", "product_type" => "Cult Products", "title" => "IPod Touch 8GB", "vendor" => "Apple", "available" => true, "tags" => "", "published_at" => "2017-08-31T20:00:00-04:00", "variants" => [{"id" => 447654529, "title" => "Black", "option_values" => [{"option_id" => 891236591, "name" => "Title", "value" => "Black"}], "price" => "199.00", "formatted_price" => "$199.00", "compare_at_price" => nil, "grams" => 567, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "barcode" => "1234_black", "taxable" => true, "position" => 1, "available" => true, "inventory_policy" => "continue", "inventory_quantity" => 13, "inventory_management" => "shipwire-app", "fulfillment_service" => "shipwire-app", "weight" => 1.25, "weight_unit" => "lb", "image_id" => nil, "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00"}], "images" => [], "options" => [{"id" => 891236591, "name" => "Title", "product_id" => 921728736, "position" => 1, "values" => ["Black"]}]}}), headers: {}) + + response = ShopifyAPI::ProductListing.find( + product_id: 921728736, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/product_listings/921728736.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/product_listings/921728736.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product_listing" => hash_including({}) } + ) + .to_return(status: 200, body: JSON.generate({"product_listing" => {"product_id" => 921728736, "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00", "body_html" => "

The iPod Touch has the iPhone's multi-touch interface, with a physical home button off the touch screen. The home screen has a list of buttons for the available applications.

", "handle" => "ipod-touch", "product_type" => "Cult Products", "title" => "IPod Touch 8GB", "vendor" => "Apple", "available" => true, "tags" => "", "published_at" => "2017-08-31T20:00:00-04:00", "variants" => [{"id" => 447654529, "title" => "Black", "option_values" => [{"option_id" => 891236591, "name" => "Title", "value" => "Black"}], "price" => "199.00", "formatted_price" => "$199.00", "compare_at_price" => nil, "grams" => 567, "requires_shipping" => true, "sku" => "IPOD2009BLACK", "barcode" => "1234_black", "taxable" => true, "position" => 1, "available" => true, "inventory_policy" => "continue", "inventory_quantity" => 13, "inventory_management" => "shipwire-app", "fulfillment_service" => "shipwire-app", "weight" => 1.25, "weight_unit" => "lb", "image_id" => nil, "created_at" => "2024-10-02T09:28:43-05:00", "updated_at" => "2024-10-02T09:28:43-05:00"}], "images" => [], "options" => [{"id" => 891236591, "name" => "Title", "product_id" => 921728736, "position" => 1, "values" => ["Black"]}]}}), headers: {}) + + response = product_listing = ShopifyAPI::ProductListing.new + product_listing.product_id = 921728736 + product_listing.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/product_listings/921728736.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/product_listings/921728736.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::ProductListing.delete( + product_id: 921728736, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/product_listings/921728736.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/product_resource_feedback_test.rb b/test/rest/2024_10/product_resource_feedback_test.rb new file mode 100644 index 00000000..05fa200f --- /dev/null +++ b/test/rest/2024_10/product_resource_feedback_test.rb @@ -0,0 +1,137 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class ProductResourceFeedback202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/resource_feedback.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "resource_feedback" => hash_including({"state" => "requires_action", "messages" => ["Needs at least one image."], "resource_updated_at" => "2024-10-02T17:13:35-05:00", "feedback_generated_at" => "2024-10-02T22:14:47.628840Z"}) } + ) + .to_return(status: 200, body: JSON.generate({"resource_feedback" => {"created_at" => "2024-10-02T17:14:48-05:00", "updated_at" => "2024-10-02T17:14:48-05:00", "resource_id" => 632910392, "resource_type" => "Product", "resource_updated_at" => "2024-10-02T17:13:35-05:00", "messages" => ["Needs at least one image."], "feedback_generated_at" => "2024-10-02T17:14:47-05:00", "state" => "requires_action"}}), headers: {}) + + response = product_resource_feedback = ShopifyAPI::ProductResourceFeedback.new + product_resource_feedback.product_id = 632910392 + product_resource_feedback.state = "requires_action" + product_resource_feedback.messages = [ + "Needs at least one image." + ] + product_resource_feedback.resource_updated_at = "2024-10-02T17:13:35-05:00" + product_resource_feedback.feedback_generated_at = "2024-10-02T22:14:47.628840Z" + product_resource_feedback.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/resource_feedback.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/resource_feedback.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "resource_feedback" => hash_including({"state" => "success", "resource_updated_at" => "2024-10-02T17:13:35-05:00", "feedback_generated_at" => "2024-10-02T22:14:40.429446Z"}) } + ) + .to_return(status: 200, body: JSON.generate({"resource_feedback" => {"created_at" => "2024-10-02T17:14:44-05:00", "updated_at" => "2024-10-02T17:14:44-05:00", "resource_id" => 632910392, "resource_type" => "Product", "resource_updated_at" => "2024-10-02T17:13:35-05:00", "messages" => [], "feedback_generated_at" => "2024-10-02T17:14:40-05:00", "state" => "success"}}), headers: {}) + + response = product_resource_feedback = ShopifyAPI::ProductResourceFeedback.new + product_resource_feedback.product_id = 632910392 + product_resource_feedback.state = "success" + product_resource_feedback.resource_updated_at = "2024-10-02T17:13:35-05:00" + product_resource_feedback.feedback_generated_at = "2024-10-02T22:14:40.429446Z" + product_resource_feedback.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/resource_feedback.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/resource_feedback.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"resource_feedback" => [{"created_at" => "2024-10-02T17:14:48-05:00", "updated_at" => "2024-10-02T17:14:48-05:00", "resource_id" => 632910392, "resource_type" => "Product", "resource_updated_at" => "2024-10-02T17:13:35-05:00", "messages" => ["Needs at least one image."], "feedback_generated_at" => "2024-10-02T16:14:48-05:00", "state" => "requires_action"}]}), headers: {}) + + response = ShopifyAPI::ProductResourceFeedback.all( + product_id: 632910392, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/resource_feedback.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/product_test.rb b/test/rest/2024_10/product_test.rb new file mode 100644 index 00000000..dac4ee5d --- /dev/null +++ b/test/rest/2024_10/product_test.rb @@ -0,0 +1,1220 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Product202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products.json?ids=632910392%2C921728736") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"products" => [{"id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-10-02T08:59:11-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => nil, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [{"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}, {"id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"}, {"id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"}, {"id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"}], "options" => [{"id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]}], "images" => [{"id" => 850703190, "alt" => nil, "position" => 1, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []}, {"id" => 562641783, "alt" => nil, "position" => 2, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810]}, {"id" => 378407906, "alt" => nil, "position" => 3, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []}], "image" => {"id" => 850703190, "alt" => nil, "position" => 1, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []}}, {"id" => 921728736, "title" => "IPod Touch 8GB", "body_html" => "

The iPod Touch has the iPhone's multi-touch interface, with a physical home button off the touch screen. The home screen has a list of buttons for the available applications.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-touch", "updated_at" => "2024-10-02T08:59:11-05:00", "published_at" => "2008-09-25T20:00:00-04:00", "template_suffix" => nil, "published_scope" => "web", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/921728736", "variants" => [{"id" => 447654529, "product_id" => 921728736, "title" => "Black", "price" => "199.00", "sku" => "IPOD2009BLACK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "shipwire-app", "inventory_management" => "shipwire-app", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 447654529, "inventory_quantity" => 13, "old_inventory_quantity" => 13, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/447654529"}], "options" => [{"id" => 891236591, "product_id" => 921728736, "name" => "Title", "position" => 1, "values" => ["Black"]}], "images" => [], "image" => nil}]}), headers: {}) + + response = ShopifyAPI::Product.all( + ids: "632910392,921728736", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products.json?ids=632910392%2C921728736") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"products" => [{"id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-10-02T08:59:11-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => nil, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [{"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}, {"id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"}, {"id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"}, {"id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"}], "options" => [{"id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]}], "images" => [{"id" => 850703190, "alt" => nil, "position" => 1, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []}, {"id" => 562641783, "alt" => nil, "position" => 2, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810]}, {"id" => 378407906, "alt" => nil, "position" => 3, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []}], "image" => {"id" => 850703190, "alt" => nil, "position" => 1, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []}}, {"id" => 921728736, "title" => "IPod Touch 8GB", "body_html" => "

The iPod Touch has the iPhone's multi-touch interface, with a physical home button off the touch screen. The home screen has a list of buttons for the available applications.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-touch", "updated_at" => "2024-10-02T08:59:11-05:00", "published_at" => "2008-09-25T20:00:00-04:00", "template_suffix" => nil, "published_scope" => "web", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/921728736", "variants" => [{"id" => 447654529, "product_id" => 921728736, "title" => "Black", "price" => "199.00", "sku" => "IPOD2009BLACK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "shipwire-app", "inventory_management" => "shipwire-app", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 447654529, "inventory_quantity" => 13, "old_inventory_quantity" => 13, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/447654529"}], "options" => [{"id" => 891236591, "product_id" => 921728736, "name" => "Title", "position" => 1, "values" => ["Black"]}], "images" => [], "image" => nil}]}), headers: {}) + + response = ShopifyAPI::Product.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products.json?since_id=632910392") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"products" => [{"id" => 921728736, "title" => "IPod Touch 8GB", "body_html" => "

The iPod Touch has the iPhone's multi-touch interface, with a physical home button off the touch screen. The home screen has a list of buttons for the available applications.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-touch", "updated_at" => "2024-10-02T08:59:11-05:00", "published_at" => "2008-09-25T20:00:00-04:00", "template_suffix" => nil, "published_scope" => "web", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/921728736", "variants" => [{"id" => 447654529, "product_id" => 921728736, "title" => "Black", "price" => "199.00", "sku" => "IPOD2009BLACK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "shipwire-app", "inventory_management" => "shipwire-app", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 447654529, "inventory_quantity" => 13, "old_inventory_quantity" => 13, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/447654529"}], "options" => [{"id" => 891236591, "product_id" => 921728736, "name" => "Title", "position" => 1, "values" => ["Black"]}], "images" => [], "image" => nil}]}), headers: {}) + + response = ShopifyAPI::Product.all( + since_id: "632910392", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products.json?since_id=632910392") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products.json?collection_id=841564295") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"products" => [{"id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-10-02T08:59:11-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => nil, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [{"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}, {"id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"}, {"id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"}, {"id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"}], "options" => [{"id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]}], "images" => [{"id" => 850703190, "alt" => nil, "position" => 1, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []}, {"id" => 562641783, "alt" => nil, "position" => 2, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810]}, {"id" => 378407906, "alt" => nil, "position" => 3, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []}], "image" => {"id" => 850703190, "alt" => nil, "position" => 1, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []}}]}), headers: {}) + + response = ShopifyAPI::Product.all( + collection_id: "841564295", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products.json?collection_id=841564295") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products.json?presentment_currencies=USD") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"products" => [{"id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-10-02T08:59:11-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => nil, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [{"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}, {"id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"}, {"id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"}, {"id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"}], "options" => [{"id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]}], "images" => [{"id" => 850703190, "alt" => nil, "position" => 1, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []}, {"id" => 562641783, "alt" => nil, "position" => 2, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810]}, {"id" => 378407906, "alt" => nil, "position" => 3, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []}], "image" => {"id" => 850703190, "alt" => nil, "position" => 1, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []}}, {"id" => 921728736, "title" => "IPod Touch 8GB", "body_html" => "

The iPod Touch has the iPhone's multi-touch interface, with a physical home button off the touch screen. The home screen has a list of buttons for the available applications.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-touch", "updated_at" => "2024-10-02T08:59:11-05:00", "published_at" => "2008-09-25T20:00:00-04:00", "template_suffix" => nil, "published_scope" => "web", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/921728736", "variants" => [{"id" => 447654529, "product_id" => 921728736, "title" => "Black", "price" => "199.00", "sku" => "IPOD2009BLACK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "shipwire-app", "inventory_management" => "shipwire-app", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 447654529, "inventory_quantity" => 13, "old_inventory_quantity" => 13, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/447654529"}], "options" => [{"id" => 891236591, "product_id" => 921728736, "name" => "Title", "position" => 1, "values" => ["Black"]}], "images" => [], "image" => nil}]}), headers: {}) + + response = ShopifyAPI::Product.all( + presentment_currencies: "USD", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products.json?presentment_currencies=USD") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products.json?fields=id%2Cimages%2Ctitle") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"products" => [{"id" => 632910392, "title" => "IPod Nano - 8GB", "images" => [{"id" => 850703190, "alt" => nil, "position" => 1, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []}, {"id" => 562641783, "alt" => nil, "position" => 2, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810]}, {"id" => 378407906, "alt" => nil, "position" => 3, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []}]}, {"id" => 921728736, "title" => "IPod Touch 8GB", "images" => []}]}), headers: {}) + + response = ShopifyAPI::Product.all( + fields: "id,images,title", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products.json?fields=id%2Cimages%2Ctitle") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 2}), headers: {}) + + response = ShopifyAPI::Product.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/count.json?collection_id=841564295") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 1}), headers: {}) + + response = ShopifyAPI::Product.count( + collection_id: "841564295", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/count.json?collection_id=841564295") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-10-02T08:59:11-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => nil, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [{"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}, {"id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"}, {"id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"}, {"id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"}], "options" => [{"id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]}], "images" => [{"id" => 850703190, "alt" => nil, "position" => 1, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []}, {"id" => 562641783, "alt" => nil, "position" => 2, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810]}, {"id" => 378407906, "alt" => nil, "position" => 3, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []}], "image" => {"id" => 850703190, "alt" => nil, "position" => 1, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []}}}), headers: {}) + + response = ShopifyAPI::Product.find( + id: 632910392, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json?fields=id%2Cimages%2Ctitle") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 632910392, "title" => "IPod Nano - 8GB", "images" => [{"id" => 850703190, "alt" => nil, "position" => 1, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []}, {"id" => 562641783, "alt" => nil, "position" => 2, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810]}, {"id" => 378407906, "alt" => nil, "position" => 3, "product_id" => 632910392, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => []}]}}), headers: {}) + + response = ShopifyAPI::Product.find( + id: 632910392, + fields: "id,images,title", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json?fields=id%2Cimages%2Ctitle") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_11() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"metafields" => [{"key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-10-02T08:59:37-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => nil, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [{"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}, {"id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"}, {"id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"}, {"id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"}], "options" => [{"id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]}], "images" => [{"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}, {"id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"}, {"id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"}], "image" => {"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.id = 632910392 + product.metafields = [ + { + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + } + ] + product.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_12() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"published" => false}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-10-02T08:59:47-05:00", "published_at" => nil, "template_suffix" => nil, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [{"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}, {"id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"}, {"id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"}, {"id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"}], "options" => [{"id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]}], "images" => [{"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}, {"id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"}, {"id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"}], "image" => {"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.id = 632910392 + product.published = false + product.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_13() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"published" => true}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-10-02T09:00:12-05:00", "published_at" => "2024-10-02T09:00:12-05:00", "template_suffix" => nil, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [{"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}, {"id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"}, {"id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"}, {"id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"}], "options" => [{"id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]}], "images" => [{"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}, {"id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"}, {"id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"}], "image" => {"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.id = 632910392 + product.published = true + product.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_14() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"title" => "Updated Product Title", "variants" => [{"id" => 808950810, "price" => "2000.00", "sku" => "Updating the Product SKU"}, {"id" => 49148385}, {"id" => 39072856}, {"id" => 457924702}]}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 632910392, "title" => "Updated Product Title", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-10-02T09:00:15-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => nil, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [{"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "2000.00", "sku" => "Updating the Product SKU", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:00:15-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "2000.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}, {"id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"}, {"id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"}, {"id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"}], "options" => [{"id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]}], "images" => [{"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}, {"id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"}, {"id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"}], "image" => {"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.id = 632910392 + product.title = "Updated Product Title" + product.variants = [ + { + "id" => 808950810, + "price" => "2000.00", + "sku" => "Updating the Product SKU" + }, + { + "id" => 49148385 + }, + { + "id" => 39072856 + }, + { + "id" => 457924702 + } + ] + product.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_15() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"images" => [{"id" => 850703190}, {"id" => 562641783}, {"id" => 378407906}, {"src" => "http://example.com/rails_logo.gif"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-10-02T09:00:11-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => nil, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [{"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}, {"id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"}, {"id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"}, {"id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"}], "options" => [{"id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]}], "images" => [{"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}, {"id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"}, {"id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"}, {"id" => 1001473903, "product_id" => 632910392, "position" => 4, "created_at" => "2024-10-02T09:00:11-05:00", "updated_at" => "2024-10-02T09:00:11-05:00", "alt" => nil, "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/rails_logo20241002-28582-50v17p.gif?v=1704204011", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473903"}], "image" => {"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.id = 632910392 + product.images = [ + { + "id" => 850703190 + }, + { + "id" => 562641783 + }, + { + "id" => 378407906 + }, + { + "src" => "http://example.com/rails_logo.gif" + } + ] + product.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_16() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"images" => []}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-10-02T09:00:03-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => nil, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [{"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:00:03-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}, {"id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"}, {"id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"}, {"id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"}], "options" => [{"id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]}], "images" => [], "image" => nil}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.id = 632910392 + product.images = [] + product.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_17() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"images" => [{"id" => 850703190, "position" => 3}, {"id" => 562641783, "position" => 2}, {"id" => 378407906, "position" => 1}]}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-10-02T08:59:56-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => nil, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [{"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}, {"id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"}, {"id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"}, {"id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"}], "options" => [{"id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]}], "images" => [{"id" => 378407906, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:56-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203996", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"}, {"id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"}, {"id" => 850703190, "product_id" => 632910392, "position" => 3, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:56-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203996", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}], "image" => {"id" => 378407906, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:56-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203996", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"}}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.id = 632910392 + product.images = [ + { + "id" => 850703190, + "position" => 3 + }, + { + "id" => 562641783, + "position" => 2 + }, + { + "id" => 378407906, + "position" => 1 + } + ] + product.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_18() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"variants" => [{"id" => 457924702}, {"id" => 39072856}, {"id" => 49148385}, {"id" => 808950810}]}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-10-02T09:00:08-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => nil, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [{"id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:00:08-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"}, {"id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:00:08-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"}, {"id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:00:08-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"}, {"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:00:08-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}], "options" => [{"id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Black", "Green", "Red", "Pink"]}], "images" => [{"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}, {"id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"}, {"id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"}], "image" => {"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.id = 632910392 + product.variants = [ + { + "id" => 457924702 + }, + { + "id" => 39072856 + }, + { + "id" => 49148385 + }, + { + "id" => 808950810 + } + ] + product.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_19() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"metafields_global_title_tag" => "Brand new title", "metafields_global_description_tag" => "Brand new description"}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-10-02T08:59:11-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => nil, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [{"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}, {"id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"}, {"id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"}, {"id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"}], "options" => [{"id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]}], "images" => [{"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}, {"id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"}, {"id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"}], "image" => {"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.id = 632910392 + product.metafields_global_title_tag = "Brand new title" + product.metafields_global_description_tag = "Brand new description" + product.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_20() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"status" => "draft"}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-10-02T08:59:48-05:00", "published_at" => nil, "template_suffix" => nil, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "draft", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [{"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}, {"id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"}, {"id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"}, {"id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"}], "options" => [{"id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]}], "images" => [{"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}, {"id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"}, {"id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"}], "image" => {"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.id = 632910392 + product.status = "draft" + product.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_21() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"tags" => "Barnes & Noble, John's Fav"}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 632910392, "title" => "IPod Nano - 8GB", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-10-02T09:00:24-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => nil, "published_scope" => "web", "tags" => "Barnes & Noble, John's Fav", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [{"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}, {"id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"}, {"id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"}, {"id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"}], "options" => [{"id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]}], "images" => [{"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}, {"id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"}, {"id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"}], "image" => {"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.id = 632910392 + product.tags = "Barnes & Noble, John's Fav" + product.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_22() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"title" => "New product title"}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 632910392, "title" => "New product title", "body_html" => "

It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.

", "vendor" => "Apple", "product_type" => "Cult Products", "created_at" => "2024-10-02T08:59:11-05:00", "handle" => "ipod-nano", "updated_at" => "2024-10-02T08:59:43-05:00", "published_at" => "2007-12-31T19:00:00-05:00", "template_suffix" => nil, "published_scope" => "web", "tags" => "Emotive, Flash Memory, MP3, Music", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/632910392", "variants" => [{"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}, {"id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"}, {"id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"}, {"id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"}], "options" => [{"id" => 594680422, "product_id" => 632910392, "name" => "Color", "position" => 1, "values" => ["Pink", "Red", "Green", "Black"]}], "images" => [{"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}, {"id" => 562641783, "product_id" => 632910392, "position" => 2, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano-2.png?v=1704203951", "variant_ids" => [808950810], "admin_graphql_api_id" => "gid://shopify/ProductImage/562641783"}, {"id" => 378407906, "product_id" => 632910392, "position" => 3, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/378407906"}], "image" => {"id" => 850703190, "product_id" => 632910392, "position" => 1, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "alt" => nil, "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/ipod-nano.png?v=1704203951", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/850703190"}}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.id = 632910392 + product.title = "New product title" + product.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_23() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Product.delete( + id: 632910392, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_24() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "status" => "draft"}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 1072481042, "title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "created_at" => "2024-10-02T08:59:32-05:00", "handle" => "burton-custom-freestyle-151", "updated_at" => "2024-10-02T08:59:32-05:00", "published_at" => nil, "template_suffix" => nil, "published_scope" => "web", "tags" => "", "status" => "draft", "admin_graphql_api_id" => "gid://shopify/Product/1072481042", "variants" => [{"id" => 1070325019, "product_id" => 1072481042, "title" => "Default Title", "price" => "0.00", "sku" => "", "position" => 1, "inventory_policy" => "deny", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => nil, "option1" => "Default Title", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:32-05:00", "updated_at" => "2024-10-02T08:59:32-05:00", "taxable" => true, "barcode" => nil, "grams" => 0, "image_id" => nil, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325019, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [{"price" => {"amount" => "0.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325019"}], "options" => [{"id" => 1064576481, "product_id" => 1072481042, "name" => "Title", "position" => 1, "values" => ["Default Title"]}], "images" => [], "image" => nil}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.title = "Burton Custom Freestyle 151" + product.body_html = "Good snowboard!" + product.vendor = "Burton" + product.product_type = "Snowboard" + product.status = "draft" + product.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_25() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "variants" => [{"option1" => "First", "price" => "10.00", "sku" => "123"}, {"option1" => "Second", "price" => "20.00", "sku" => "123"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 1072481044, "title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "created_at" => "2024-10-02T08:59:36-05:00", "handle" => "burton-custom-freestyle-151", "updated_at" => "2024-10-02T08:59:36-05:00", "published_at" => "2024-10-02T08:59:36-05:00", "template_suffix" => nil, "published_scope" => "global", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/1072481044", "variants" => [{"id" => 1070325021, "product_id" => 1072481044, "title" => "First", "price" => "10.00", "sku" => "123", "position" => 1, "inventory_policy" => "deny", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => nil, "option1" => "First", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:36-05:00", "updated_at" => "2024-10-02T08:59:36-05:00", "taxable" => true, "barcode" => nil, "grams" => 0, "image_id" => nil, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325021, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [{"price" => {"amount" => "10.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325021"}, {"id" => 1070325022, "product_id" => 1072481044, "title" => "Second", "price" => "20.00", "sku" => "123", "position" => 2, "inventory_policy" => "deny", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => nil, "option1" => "Second", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:36-05:00", "updated_at" => "2024-10-02T08:59:36-05:00", "taxable" => true, "barcode" => nil, "grams" => 0, "image_id" => nil, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325022, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [{"price" => {"amount" => "20.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325022"}], "options" => [{"id" => 1064576485, "product_id" => 1072481044, "name" => "Title", "position" => 1, "values" => ["First", "Second"]}], "images" => [], "image" => nil}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.title = "Burton Custom Freestyle 151" + product.body_html = "Good snowboard!" + product.vendor = "Burton" + product.product_type = "Snowboard" + product.variants = [ + { + "option1" => "First", + "price" => "10.00", + "sku" => "123" + }, + { + "option1" => "Second", + "price" => "20.00", + "sku" => "123" + } + ] + product.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_26() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "variants" => [{"option1" => "Blue", "option2" => "155"}, {"option1" => "Black", "option2" => "159"}], "options" => [{"name" => "Color", "values" => ["Blue", "Black"]}, {"name" => "Size", "values" => ["155", "159"]}]}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 1072481048, "title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "created_at" => "2024-10-02T08:59:53-05:00", "handle" => "burton-custom-freestyle-151", "updated_at" => "2024-10-02T08:59:54-05:00", "published_at" => "2024-10-02T08:59:53-05:00", "template_suffix" => nil, "published_scope" => "global", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/1072481048", "variants" => [{"id" => 1070325026, "product_id" => 1072481048, "title" => "Blue / 155", "price" => "0.00", "sku" => "", "position" => 1, "inventory_policy" => "deny", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => nil, "option1" => "Blue", "option2" => "155", "option3" => nil, "created_at" => "2024-10-02T08:59:53-05:00", "updated_at" => "2024-10-02T08:59:53-05:00", "taxable" => true, "barcode" => nil, "grams" => 0, "image_id" => nil, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325026, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [{"price" => {"amount" => "0.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325026"}, {"id" => 1070325027, "product_id" => 1072481048, "title" => "Black / 159", "price" => "0.00", "sku" => "", "position" => 2, "inventory_policy" => "deny", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => nil, "option1" => "Black", "option2" => "159", "option3" => nil, "created_at" => "2024-10-02T08:59:53-05:00", "updated_at" => "2024-10-02T08:59:53-05:00", "taxable" => true, "barcode" => nil, "grams" => 0, "image_id" => nil, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325027, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [{"price" => {"amount" => "0.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325027"}], "options" => [{"id" => 1064576492, "product_id" => 1072481048, "name" => "Color", "position" => 1, "values" => ["Blue", "Black"]}, {"id" => 1064576493, "product_id" => 1072481048, "name" => "Size", "position" => 2, "values" => ["155", "159"]}], "images" => [], "image" => nil}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.title = "Burton Custom Freestyle 151" + product.body_html = "Good snowboard!" + product.vendor = "Burton" + product.product_type = "Snowboard" + product.variants = [ + { + "option1" => "Blue", + "option2" => "155" + }, + { + "option1" => "Black", + "option2" => "159" + } + ] + product.options = [ + { + "name" => "Color", + "values" => [ + "Blue", + "Black" + ] + }, + { + "name" => "Size", + "values" => [ + "155", + "159" + ] + } + ] + product.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_27() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "tags" => ["Barnes & Noble", "Big Air", "John's Fav"]}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 1072481050, "title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "created_at" => "2024-10-02T08:59:58-05:00", "handle" => "burton-custom-freestyle-151", "updated_at" => "2024-10-02T08:59:58-05:00", "published_at" => "2024-10-02T08:59:58-05:00", "template_suffix" => nil, "published_scope" => "global", "tags" => "Barnes & Noble, Big Air, John's Fav", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/1072481050", "variants" => [{"id" => 1070325029, "product_id" => 1072481050, "title" => "Default Title", "price" => "0.00", "sku" => "", "position" => 1, "inventory_policy" => "deny", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => nil, "option1" => "Default Title", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:58-05:00", "updated_at" => "2024-10-02T08:59:58-05:00", "taxable" => true, "barcode" => nil, "grams" => 0, "image_id" => nil, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325029, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [{"price" => {"amount" => "0.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325029"}], "options" => [{"id" => 1064576495, "product_id" => 1072481050, "name" => "Title", "position" => 1, "values" => ["Default Title"]}], "images" => [], "image" => nil}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.title = "Burton Custom Freestyle 151" + product.body_html = "Good snowboard!" + product.vendor = "Burton" + product.product_type = "Snowboard" + product.tags = [ + "Barnes & Noble", + "Big Air", + "John's Fav" + ] + product.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_28() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "images" => [{"src" => "http://example.com/rails_logo.gif"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 1072481053, "title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "created_at" => "2024-10-02T09:00:09-05:00", "handle" => "burton-custom-freestyle-151", "updated_at" => "2024-10-02T09:00:10-05:00", "published_at" => "2024-10-02T09:00:09-05:00", "template_suffix" => nil, "published_scope" => "global", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/1072481053", "variants" => [{"id" => 1070325033, "product_id" => 1072481053, "title" => "Default Title", "price" => "0.00", "sku" => "", "position" => 1, "inventory_policy" => "deny", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => nil, "option1" => "Default Title", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T09:00:09-05:00", "updated_at" => "2024-10-02T09:00:09-05:00", "taxable" => true, "barcode" => nil, "grams" => 0, "image_id" => nil, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325033, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [{"price" => {"amount" => "0.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325033"}], "options" => [{"id" => 1064576499, "product_id" => 1072481053, "name" => "Title", "position" => 1, "values" => ["Default Title"]}], "images" => [{"id" => 1001473902, "product_id" => 1072481053, "position" => 1, "created_at" => "2024-10-02T09:00:09-05:00", "updated_at" => "2024-10-02T09:00:09-05:00", "alt" => nil, "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/rails_logo20241002-28582-q9zyr0.gif?v=1704204009", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473902"}], "image" => {"id" => 1001473902, "product_id" => 1072481053, "position" => 1, "created_at" => "2024-10-02T09:00:09-05:00", "updated_at" => "2024-10-02T09:00:09-05:00", "alt" => nil, "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/rails_logo20241002-28582-q9zyr0.gif?v=1704204009", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473902"}}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.title = "Burton Custom Freestyle 151" + product.body_html = "Good snowboard!" + product.vendor = "Burton" + product.product_type = "Snowboard" + product.images = [ + { + "src" => "http://example.com/rails_logo.gif" + } + ] + product.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_29() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "images" => [{"attachment" => "R0lGODlhAQABAIAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\n"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 1072481054, "title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "created_at" => "2024-10-02T09:00:19-05:00", "handle" => "burton-custom-freestyle-151", "updated_at" => "2024-10-02T09:00:20-05:00", "published_at" => "2024-10-02T09:00:19-05:00", "template_suffix" => nil, "published_scope" => "global", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/1072481054", "variants" => [{"id" => 1070325034, "product_id" => 1072481054, "title" => "Default Title", "price" => "0.00", "sku" => "", "position" => 1, "inventory_policy" => "deny", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => nil, "option1" => "Default Title", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T09:00:19-05:00", "updated_at" => "2024-10-02T09:00:19-05:00", "taxable" => true, "barcode" => nil, "grams" => 0, "image_id" => nil, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325034, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [{"price" => {"amount" => "0.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325034"}], "options" => [{"id" => 1064576500, "product_id" => 1072481054, "name" => "Title", "position" => 1, "values" => ["Default Title"]}], "images" => [{"id" => 1001473904, "product_id" => 1072481054, "position" => 1, "created_at" => "2024-10-02T09:00:19-05:00", "updated_at" => "2024-10-02T09:00:19-05:00", "alt" => nil, "width" => 1, "height" => 1, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/df3e567d6f16d040326c7a0ea29a4f41.gif?v=1704204019", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473904"}], "image" => {"id" => 1001473904, "product_id" => 1072481054, "position" => 1, "created_at" => "2024-10-02T09:00:19-05:00", "updated_at" => "2024-10-02T09:00:19-05:00", "alt" => nil, "width" => 1, "height" => 1, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/products/df3e567d6f16d040326c7a0ea29a4f41.gif?v=1704204019", "variant_ids" => [], "admin_graphql_api_id" => "gid://shopify/ProductImage/1001473904"}}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.title = "Burton Custom Freestyle 151" + product.body_html = "Good snowboard!" + product.vendor = "Burton" + product.product_type = "Snowboard" + product.images = [ + { + "attachment" => "R0lGODlhAQABAIAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\n" + } + ] + product.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_30() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "published" => false}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 1072481047, "title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "created_at" => "2024-10-02T08:59:46-05:00", "handle" => "burton-custom-freestyle-151", "updated_at" => "2024-10-02T08:59:46-05:00", "published_at" => nil, "template_suffix" => nil, "published_scope" => "global", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/1072481047", "variants" => [{"id" => 1070325025, "product_id" => 1072481047, "title" => "Default Title", "price" => "0.00", "sku" => "", "position" => 1, "inventory_policy" => "deny", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => nil, "option1" => "Default Title", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:46-05:00", "updated_at" => "2024-10-02T08:59:46-05:00", "taxable" => true, "barcode" => nil, "grams" => 0, "image_id" => nil, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325025, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [{"price" => {"amount" => "0.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325025"}], "options" => [{"id" => 1064576491, "product_id" => 1072481047, "name" => "Title", "position" => 1, "values" => ["Default Title"]}], "images" => [], "image" => nil}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.title = "Burton Custom Freestyle 151" + product.body_html = "Good snowboard!" + product.vendor = "Burton" + product.product_type = "Snowboard" + product.published = false + product.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_31() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "metafields" => [{"key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 1072481052, "title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "created_at" => "2024-10-02T09:00:00-05:00", "handle" => "burton-custom-freestyle-151", "updated_at" => "2024-10-02T09:00:00-05:00", "published_at" => "2024-10-02T09:00:00-05:00", "template_suffix" => nil, "published_scope" => "global", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/1072481052", "variants" => [{"id" => 1070325030, "product_id" => 1072481052, "title" => "Default Title", "price" => "0.00", "sku" => "", "position" => 1, "inventory_policy" => "deny", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => nil, "option1" => "Default Title", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T09:00:00-05:00", "updated_at" => "2024-10-02T09:00:00-05:00", "taxable" => true, "barcode" => nil, "grams" => 0, "image_id" => nil, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325030, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [{"price" => {"amount" => "0.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325030"}], "options" => [{"id" => 1064576498, "product_id" => 1072481052, "name" => "Title", "position" => 1, "values" => ["Default Title"]}], "images" => [], "image" => nil}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.title = "Burton Custom Freestyle 151" + product.body_html = "Good snowboard!" + product.vendor = "Burton" + product.product_type = "Snowboard" + product.metafields = [ + { + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + } + ] + product.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_32() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "product" => hash_including({"title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "metafields_global_title_tag" => "Product SEO Title", "metafields_global_description_tag" => "Product SEO Description"}) } + ) + .to_return(status: 200, body: JSON.generate({"product" => {"id" => 1072481049, "title" => "Burton Custom Freestyle 151", "body_html" => "Good snowboard!", "vendor" => "Burton", "product_type" => "Snowboard", "created_at" => "2024-10-02T08:59:57-05:00", "handle" => "burton-custom-freestyle-151", "updated_at" => "2024-10-02T08:59:57-05:00", "published_at" => "2024-10-02T08:59:57-05:00", "template_suffix" => nil, "published_scope" => "global", "tags" => "", "status" => "active", "admin_graphql_api_id" => "gid://shopify/Product/1072481049", "variants" => [{"id" => 1070325028, "product_id" => 1072481049, "title" => "Default Title", "price" => "0.00", "sku" => "", "position" => 1, "inventory_policy" => "deny", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => nil, "option1" => "Default Title", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:57-05:00", "updated_at" => "2024-10-02T08:59:57-05:00", "taxable" => true, "barcode" => nil, "grams" => 0, "image_id" => nil, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325028, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [{"price" => {"amount" => "0.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325028"}], "options" => [{"id" => 1064576494, "product_id" => 1072481049, "name" => "Title", "position" => 1, "values" => ["Default Title"]}], "images" => [], "image" => nil}}), headers: {}) + + response = product = ShopifyAPI::Product.new + product.title = "Burton Custom Freestyle 151" + product.body_html = "Good snowboard!" + product.vendor = "Burton" + product.product_type = "Snowboard" + product.metafields_global_title_tag = "Product SEO Title" + product.metafields_global_description_tag = "Product SEO Description" + product.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/province_test.rb b/test/rest/2024_10/province_test.rb new file mode 100644 index 00000000..dec94685 --- /dev/null +++ b/test/rest/2024_10/province_test.rb @@ -0,0 +1,196 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Province202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/countries/879921427/provinces.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"provinces" => [{"id" => 205434194, "country_id" => 879921427, "name" => "Alberta", "code" => "AB", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.08, "tax_percentage" => 8.0}, {"id" => 170405627, "country_id" => 879921427, "name" => "British Columbia", "code" => "BC", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.07, "tax_percentage" => 7.0}, {"id" => 342345110, "country_id" => 879921427, "name" => "Manitoba", "code" => "MB", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.07, "tax_percentage" => 7.0}, {"id" => 92264567, "country_id" => 879921427, "name" => "New Brunswick", "code" => "NB", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.15, "tax_percentage" => 15.0}, {"id" => 243284171, "country_id" => 879921427, "name" => "Newfoundland", "code" => "NL", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.15, "tax_percentage" => 15.0}, {"id" => 439598329, "country_id" => 879921427, "name" => "Northwest Territories", "code" => "NT", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.0, "tax_percentage" => 0.0}, {"id" => 448070559, "country_id" => 879921427, "name" => "Nova Scotia", "code" => "NS", "tax_name" => nil, "tax_type" => "harmonized", "shipping_zone_id" => nil, "tax" => 0.15, "tax_percentage" => 15.0}, {"id" => 670206421, "country_id" => 879921427, "name" => "Nunavut", "code" => "NU", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.0, "tax_percentage" => 0.0}, {"id" => 702530425, "country_id" => 879921427, "name" => "Ontario", "code" => "ON", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.08, "tax_percentage" => 8.0}, {"id" => 570891722, "country_id" => 879921427, "name" => "Prince Edward Island", "code" => "PE", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.1, "tax_percentage" => 10.0}, {"id" => 224293623, "country_id" => 879921427, "name" => "Quebec", "code" => "QC", "tax_name" => "HST", "tax_type" => "compounded", "shipping_zone_id" => nil, "tax" => 0.09, "tax_percentage" => 9.0}, {"id" => 473391800, "country_id" => 879921427, "name" => "Saskatchewan", "code" => "SK", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.09, "tax_percentage" => 9.0}, {"id" => 1005264686, "country_id" => 879921427, "name" => "Yukon", "code" => "YT", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.0, "tax_percentage" => 0.0}]}), headers: {}) + + response = ShopifyAPI::Province.all( + country_id: 879921427, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/countries/879921427/provinces.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/countries/879921427/provinces.json?since_id=536137098") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"provinces" => [{"id" => 570891722, "country_id" => 879921427, "name" => "Prince Edward Island", "code" => "PE", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.1, "tax_percentage" => 10.0}, {"id" => 670206421, "country_id" => 879921427, "name" => "Nunavut", "code" => "NU", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.0, "tax_percentage" => 0.0}, {"id" => 702530425, "country_id" => 879921427, "name" => "Ontario", "code" => "ON", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.08, "tax_percentage" => 8.0}, {"id" => 1005264686, "country_id" => 879921427, "name" => "Yukon", "code" => "YT", "tax_name" => nil, "tax_type" => nil, "shipping_zone_id" => nil, "tax" => 0.0, "tax_percentage" => 0.0}]}), headers: {}) + + response = ShopifyAPI::Province.all( + country_id: 879921427, + since_id: "536137098", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/countries/879921427/provinces.json?since_id=536137098") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/countries/879921427/provinces/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 13}), headers: {}) + + response = ShopifyAPI::Province.count( + country_id: 879921427, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/countries/879921427/provinces/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/countries/879921427/provinces/224293623.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"province" => {"id" => 224293623, "country_id" => 879921427, "name" => "Quebec", "code" => "QC", "tax_name" => "HST", "tax_type" => "compounded", "shipping_zone_id" => nil, "tax" => 0.09, "tax_percentage" => 9.0}}), headers: {}) + + response = ShopifyAPI::Province.find( + country_id: 879921427, + id: 224293623, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/countries/879921427/provinces/224293623.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/countries/879921427/provinces/224293623.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "province" => hash_including({"tax" => 0.09}) } + ) + .to_return(status: 200, body: JSON.generate({"province" => {"country_id" => 879921427, "id" => 224293623, "name" => "Quebec", "code" => "QC", "tax_name" => "HST", "tax_type" => "compounded", "shipping_zone_id" => nil, "tax" => 0.09, "tax_percentage" => 9.0}}), headers: {}) + + response = province = ShopifyAPI::Province.new + province.country_id = 879921427 + province.id = 224293623 + province.tax = 0.09 + province.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/countries/879921427/provinces/224293623.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/recurring_application_charge_test.rb b/test/rest/2024_10/recurring_application_charge_test.rb new file mode 100644 index 00000000..5bfe14f3 --- /dev/null +++ b/test/rest/2024_10/recurring_application_charge_test.rb @@ -0,0 +1,354 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class RecurringApplicationCharge202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "recurring_application_charge" => hash_including({"name" => "Super Duper Plan", "price" => 10.0, "return_url" => "http://super-duper.shopifyapps.com", "trial_days" => 5}) } + ) + .to_return(status: 200, body: JSON.generate({"recurring_application_charge" => {"id" => 1029266950, "name" => "Super Duper Plan", "price" => "10.00", "billing_on" => nil, "status" => "pending", "created_at" => "2024-10-02T09:03:13-05:00", "updated_at" => "2024-10-02T09:03:13-05:00", "activated_on" => nil, "return_url" => "http://super-duper.shopifyapps.com/", "test" => nil, "cancelled_on" => nil, "trial_days" => 5, "trial_ends_on" => nil, "api_client_id" => 755357713, "decorated_return_url" => "http://super-duper.shopifyapps.com/?charge_id=1029266950", "confirmation_url" => "https://jsmith.myshopify.com/admin/charges/755357713/1029266950/RecurringApplicationCharge/confirm_recurring_application_charge?signature=BAh7BzoHaWRpBAZeWT06EmF1dG9fYWN0aXZhdGVU--10e4cc794e258a92ce408a14d56159396a4a7e62", "currency" => "USD"}}), headers: {}) + + response = recurring_application_charge = ShopifyAPI::RecurringApplicationCharge.new + recurring_application_charge.name = "Super Duper Plan" + recurring_application_charge.price = 10.0 + recurring_application_charge.return_url = "http://super-duper.shopifyapps.com" + recurring_application_charge.trial_days = 5 + recurring_application_charge.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "recurring_application_charge" => hash_including({"name" => "Super Duper Plan", "price" => 10.0, "return_url" => "http://super-duper.shopifyapps.com", "capped_amount" => 100, "terms" => "$1 for 1000 emails"}) } + ) + .to_return(status: 200, body: JSON.generate({"recurring_application_charge" => {"id" => 1029266949, "name" => "Super Duper Plan", "price" => "10.00", "billing_on" => nil, "status" => "pending", "created_at" => "2024-10-02T09:03:11-05:00", "updated_at" => "2024-10-02T09:03:11-05:00", "activated_on" => nil, "return_url" => "http://super-duper.shopifyapps.com/", "test" => nil, "cancelled_on" => nil, "trial_days" => 0, "trial_ends_on" => nil, "api_client_id" => 755357713, "decorated_return_url" => "http://super-duper.shopifyapps.com/?charge_id=1029266949", "capped_amount" => "100.00", "balance_used" => 0.0, "balance_remaining" => 100.0, "risk_level" => 0, "confirmation_url" => "https://jsmith.myshopify.com/admin/charges/755357713/1029266949/RecurringApplicationCharge/confirm_recurring_application_charge?signature=BAh7BzoHaWRpBAVeWT06EmF1dG9fYWN0aXZhdGVU--ec2463fef56abcad97cd87a24c39ee695c4aeb22", "currency" => "USD"}}), headers: {}) + + response = recurring_application_charge = ShopifyAPI::RecurringApplicationCharge.new + recurring_application_charge.name = "Super Duper Plan" + recurring_application_charge.price = 10.0 + recurring_application_charge.return_url = "http://super-duper.shopifyapps.com" + recurring_application_charge.capped_amount = 100 + recurring_application_charge.terms = "$1 for 1000 emails" + recurring_application_charge.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "recurring_application_charge" => hash_including({"name" => "Super Duper Plan", "price" => 10.0, "return_url" => "http://super-duper.shopifyapps.com"}) } + ) + .to_return(status: 200, body: JSON.generate({"recurring_application_charge" => {"id" => 1029266948, "name" => "Super Duper Plan", "price" => "10.00", "billing_on" => nil, "status" => "pending", "created_at" => "2024-10-02T09:03:10-05:00", "updated_at" => "2024-10-02T09:03:10-05:00", "activated_on" => nil, "return_url" => "http://super-duper.shopifyapps.com/", "test" => nil, "cancelled_on" => nil, "trial_days" => 0, "trial_ends_on" => nil, "api_client_id" => 755357713, "decorated_return_url" => "http://super-duper.shopifyapps.com/?charge_id=1029266948", "confirmation_url" => "https://jsmith.myshopify.com/admin/charges/755357713/1029266948/RecurringApplicationCharge/confirm_recurring_application_charge?signature=BAh7BzoHaWRpBAReWT06EmF1dG9fYWN0aXZhdGVU--de081eb5ef1fe3012eb6b7f43057870467729a4f", "currency" => "USD"}}), headers: {}) + + response = recurring_application_charge = ShopifyAPI::RecurringApplicationCharge.new + recurring_application_charge.name = "Super Duper Plan" + recurring_application_charge.price = 10.0 + recurring_application_charge.return_url = "http://super-duper.shopifyapps.com" + recurring_application_charge.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "recurring_application_charge" => hash_including({"name" => "Super Duper Plan", "price" => 10.0, "return_url" => "http://super-duper.shopifyapps.com", "test" => true}) } + ) + .to_return(status: 200, body: JSON.generate({"recurring_application_charge" => {"id" => 1029266953, "name" => "Super Duper Plan", "price" => "10.00", "billing_on" => nil, "status" => "pending", "created_at" => "2024-10-02T09:03:19-05:00", "updated_at" => "2024-10-02T09:03:19-05:00", "activated_on" => nil, "return_url" => "http://super-duper.shopifyapps.com/", "test" => true, "cancelled_on" => nil, "trial_days" => 0, "trial_ends_on" => nil, "api_client_id" => 755357713, "decorated_return_url" => "http://super-duper.shopifyapps.com/?charge_id=1029266953", "confirmation_url" => "https://jsmith.myshopify.com/admin/charges/755357713/1029266953/RecurringApplicationCharge/confirm_recurring_application_charge?signature=BAh7BzoHaWRpBAleWT06EmF1dG9fYWN0aXZhdGVU--5878008de70662d012993dbb8875bfcf1b0b327b", "currency" => "USD"}}), headers: {}) + + response = recurring_application_charge = ShopifyAPI::RecurringApplicationCharge.new + recurring_application_charge.name = "Super Duper Plan" + recurring_application_charge.price = 10.0 + recurring_application_charge.return_url = "http://super-duper.shopifyapps.com" + recurring_application_charge.test = true + recurring_application_charge.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"recurring_application_charges" => [{"id" => 455696195, "name" => "Super Mega Plan", "price" => "15.00", "billing_on" => "2024-10-02", "status" => "accepted", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:03:16-05:00", "activated_on" => nil, "return_url" => "http://yourapp.example.org", "test" => nil, "cancelled_on" => nil, "trial_days" => 0, "trial_ends_on" => nil, "api_client_id" => 755357713, "decorated_return_url" => "http://yourapp.example.org?charge_id=455696195", "currency" => "USD"}]}), headers: {}) + + response = ShopifyAPI::RecurringApplicationCharge.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges.json?since_id=455696195") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"recurring_application_charges" => [{"id" => 1029266952, "name" => "Super Duper Plan", "price" => "10.00", "billing_on" => nil, "status" => "pending", "created_at" => "2024-10-02T09:03:16-05:00", "updated_at" => "2024-10-02T09:03:16-05:00", "activated_on" => nil, "return_url" => "http://super-duper.shopifyapps.com/", "test" => nil, "cancelled_on" => nil, "trial_days" => 0, "trial_ends_on" => nil, "api_client_id" => 755357713, "decorated_return_url" => "http://super-duper.shopifyapps.com/?charge_id=1029266952", "confirmation_url" => "https://jsmith.myshopify.com/admin/charges/755357713/1029266952/RecurringApplicationCharge/confirm_recurring_application_charge?signature=BAh7BzoHaWRpBAheWT06EmF1dG9fYWN0aXZhdGVU--1f06bad6088a1df145a6f064bdef65096748a768", "currency" => "USD"}]}), headers: {}) + + response = ShopifyAPI::RecurringApplicationCharge.all( + since_id: "455696195", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges.json?since_id=455696195") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges/455696195.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"recurring_application_charge" => {"id" => 455696195, "name" => "Super Mega Plan", "price" => "15.00", "billing_on" => "2024-10-02", "status" => "pending", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "activated_on" => nil, "return_url" => "http://yourapp.example.org", "test" => nil, "cancelled_on" => nil, "trial_days" => 0, "trial_ends_on" => nil, "api_client_id" => 755357713, "decorated_return_url" => "http://yourapp.example.org?charge_id=455696195", "confirmation_url" => "https://jsmith.myshopify.com/admin/charges/755357713/455696195/RecurringApplicationCharge/confirm_recurring_application_charge?signature=BAh7BzoHaWRpBENfKRs6EmF1dG9fYWN0aXZhdGVU--b5f90d04779cc5242b396e4054f2e650c5dace1c", "currency" => "USD"}}), headers: {}) + + response = ShopifyAPI::RecurringApplicationCharge.find( + id: 455696195, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges/455696195.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges/455696195.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::RecurringApplicationCharge.delete( + id: 455696195, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges/455696195.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges/455696195/customize.json?recurring_application_charge%5Bcapped_amount%5D=200") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"recurring_application_charge" => {"id" => 455696195, "name" => "Super Mega Plan", "price" => "15.00", "billing_on" => nil, "status" => "active", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:03:10-05:00", "activated_on" => "2024-10-02", "return_url" => "http://yourapp.example.org", "test" => nil, "cancelled_on" => nil, "trial_days" => 0, "trial_ends_on" => "2024-10-02", "api_client_id" => 755357713, "decorated_return_url" => "http://yourapp.example.org?charge_id=455696195", "capped_amount" => "100.00", "balance_used" => 0.0, "balance_remaining" => 100.0, "risk_level" => 0, "update_capped_amount_url" => "https://jsmith.myshopify.com/admin/charges/755357713/455696195/RecurringApplicationCharge/confirm_update_capped_amount?signature=BAh7BzoHaWRpBENfKRs6EmF1dG9fYWN0aXZhdGVG--6f69b8fcb4b3c7b73ce45ab3a9543b35b026b1b5", "currency" => "USD"}}), headers: {}) + + response = recurring_application_charge = ShopifyAPI::RecurringApplicationCharge.new + recurring_application_charge.id = 455696195 + recurring_application_charge.customize( + recurring_application_charge: {"capped_amount" => "200"}, + ) + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges/455696195/customize.json?recurring_application_charge%5Bcapped_amount%5D=200") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_current() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"recurring_application_charges" => [ + {"id" => 455696195, "name" => "Super Mega Plan", "price" => "15.00", "billing_on" => "2024-10-02", "status" => "accepted", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:03:16-05:00", "activated_on" => nil, "return_url" => "http://yourapp.example.org", "test" => nil, "cancelled_on" => nil, "trial_days" => 0, "trial_ends_on" => nil, "api_client_id" => 755357713, "decorated_return_url" => "http://yourapp.example.org?charge_id=455696195", "currency" => "USD"}, + {"id" => 455696196, "name" => "Super Mega Plan", "price" => "15.00", "billing_on" => "2024-10-10", "status" => "active", "created_at" => "2024-10-10T08:59:11-05:00", "updated_at" => "2024-10-10T09:03:16-05:00", "activated_on" => nil, "return_url" => "http://yourapp.example.org", "test" => nil, "cancelled_on" => nil, "trial_days" => 0, "trial_ends_on" => nil, "api_client_id" => 755357714, "decorated_return_url" => "http://yourapp.example.org?charge_id=455696196", "currency" => "USD"}, + ]}), headers: {}) + + charge = ShopifyAPI::RecurringApplicationCharge.current + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges.json") + + assert_equal(455696196, charge.id) + assert_equal("active", charge.status) + end + +end diff --git a/test/rest/2024_10/redirect_test.rb b/test/rest/2024_10/redirect_test.rb new file mode 100644 index 00000000..b4cb11b9 --- /dev/null +++ b/test/rest/2024_10/redirect_test.rb @@ -0,0 +1,354 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Redirect202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/redirects.json?since_id=668809255") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"redirects" => [{"id" => 950115854, "path" => "/ibook", "target" => "/products/macbook"}]}), headers: {}) + + response = ShopifyAPI::Redirect.all( + since_id: "668809255", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/redirects.json?since_id=668809255") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/redirects.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"redirects" => [{"id" => 304339089, "path" => "/products.php", "target" => "/products"}, {"id" => 668809255, "path" => "/leopard", "target" => "/pages/macosx"}, {"id" => 950115854, "path" => "/ibook", "target" => "/products/macbook"}]}), headers: {}) + + response = ShopifyAPI::Redirect.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/redirects.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/redirects/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 3}), headers: {}) + + response = ShopifyAPI::Redirect.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/redirects/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/redirects/668809255.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"redirect" => {"id" => 668809255, "path" => "/leopard", "target" => "/pages/macosx"}}), headers: {}) + + response = ShopifyAPI::Redirect.find( + id: 668809255, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/redirects/668809255.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/redirects/950115854.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "redirect" => hash_including({"path" => "/powermac", "target" => "/pages/macpro"}) } + ) + .to_return(status: 200, body: JSON.generate({"redirect" => {"path" => "/powermac", "target" => "/pages/macpro", "id" => 950115854}}), headers: {}) + + response = redirect = ShopifyAPI::Redirect.new + redirect.id = 950115854 + redirect.path = "/powermac" + redirect.target = "/pages/macpro" + redirect.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/redirects/950115854.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/redirects/668809255.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "redirect" => hash_including({"path" => "/tiger"}) } + ) + .to_return(status: 200, body: JSON.generate({"redirect" => {"path" => "/tiger", "target" => "/pages/macosx", "id" => 668809255}}), headers: {}) + + response = redirect = ShopifyAPI::Redirect.new + redirect.id = 668809255 + redirect.path = "/tiger" + redirect.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/redirects/668809255.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/redirects/668809255.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "redirect" => hash_including({"target" => "/pages/macpro"}) } + ) + .to_return(status: 200, body: JSON.generate({"redirect" => {"target" => "/pages/macpro", "path" => "/leopard", "id" => 668809255}}), headers: {}) + + response = redirect = ShopifyAPI::Redirect.new + redirect.id = 668809255 + redirect.target = "/pages/macpro" + redirect.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/redirects/668809255.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/redirects/668809255.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Redirect.delete( + id: 668809255, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/redirects/668809255.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/redirects.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "redirect" => hash_including({"path" => "/ipod", "target" => "/pages/itunes"}) } + ) + .to_return(status: 200, body: JSON.generate({"redirect" => {"id" => 984542200, "path" => "/ipod", "target" => "/pages/itunes"}}), headers: {}) + + response = redirect = ShopifyAPI::Redirect.new + redirect.path = "/ipod" + redirect.target = "/pages/itunes" + redirect.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/redirects.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/redirects.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "redirect" => hash_including({"path" => "http://www.apple.com/forums", "target" => "http://forums.apple.com"}) } + ) + .to_return(status: 200, body: JSON.generate({"redirect" => {"id" => 984542199, "path" => "/forums", "target" => "http://forums.apple.com/"}}), headers: {}) + + response = redirect = ShopifyAPI::Redirect.new + redirect.path = "http://www.apple.com/forums" + redirect.target = "http://forums.apple.com" + redirect.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/redirects.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/refund_test.rb b/test/rest/2024_10/refund_test.rb new file mode 100644 index 00000000..1be58af0 --- /dev/null +++ b/test/rest/2024_10/refund_test.rb @@ -0,0 +1,297 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Refund202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/refunds.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"refunds" => [{"id" => 509562969, "order_id" => 450789469, "created_at" => "2024-10-02T08:59:11-05:00", "note" => "it broke during shipping", "user_id" => 548380009, "processed_at" => "2024-10-02T08:59:11-05:00", "restock" => true, "duties" => [], "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "additional_fees" => [], "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "return" => nil, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "refund_line_items" => [{"id" => 104689539, "quantity" => 1, "line_item_id" => 703073504, "location_id" => 487838322, "restock_type" => "legacy_restock", "subtotal" => 195.66, "total_tax" => 3.98, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "variant_id" => 457924702, "title" => "IPod Nano - 8gb", "quantity" => 1, "sku" => "IPOD2008BLACK", "variant_title" => "black", "vendor" => nil, "fulfillment_service" => "manual", "product_id" => 632910392, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "IPod Nano - 8gb - black", "variant_inventory_management" => "shopify", "properties" => [], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 200, "price" => "199.00", "total_discount" => "0.00", "fulfillment_status" => nil, "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "discount_allocations" => [{"amount" => "3.33", "discount_application_index" => 0, "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}}], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "tax_lines" => [{"title" => "State Tax", "price" => "3.98", "rate" => 0.06, "channel_liable" => nil, "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}}]}}, {"id" => 709875399, "quantity" => 1, "line_item_id" => 466157049, "location_id" => 487838322, "restock_type" => "legacy_restock", "subtotal" => 195.67, "total_tax" => 3.98, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "variant_id" => 39072856, "title" => "IPod Nano - 8gb", "quantity" => 1, "sku" => "IPOD2008GREEN", "variant_title" => "green", "vendor" => nil, "fulfillment_service" => "manual", "product_id" => 632910392, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "IPod Nano - 8gb - green", "variant_inventory_management" => "shopify", "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 200, "price" => "199.00", "total_discount" => "0.00", "fulfillment_status" => nil, "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "discount_allocations" => [{"amount" => "3.34", "discount_application_index" => 0, "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}}], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "tax_lines" => [{"title" => "State Tax", "price" => "3.98", "rate" => 0.06, "channel_liable" => nil, "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}}]}}], "transactions" => [{"id" => 179259969, "order_id" => 450789469, "kind" => "refund", "gateway" => "bogus", "status" => "success", "message" => nil, "created_at" => "2005-08-05T12:59:12-04:00", "test" => false, "authorization" => "authorization-key", "location_id" => nil, "user_id" => nil, "parent_id" => 801038806, "processed_at" => "2005-08-05T12:59:12-04:00", "device_id" => nil, "error_code" => nil, "source_name" => "web", "receipt" => {}, "amount" => "209.00", "currency" => "USD", "payment_id" => "#1001.3", "total_unsettled_set" => {"presentment_money" => {"amount" => "348.0", "currency" => "USD"}, "shop_money" => {"amount" => "348.0", "currency" => "USD"}}, "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969"}], "order_adjustments" => []}]}), headers: {}) + + response = ShopifyAPI::Refund.all( + order_id: 450789469, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/refunds.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/refunds.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "refund" => hash_including({"currency" => "USD", "notify" => true, "note" => "wrong size", "shipping" => {"full_refund" => true}, "refund_line_items" => [{"line_item_id" => 518995019, "quantity" => 1, "restock_type" => "return", "location_id" => 487838322}], "transactions" => [{"parent_id" => 801038806, "amount" => 41.94, "kind" => "refund", "gateway" => "bogus"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"refund" => {"id" => 929361466, "order_id" => 450789469, "created_at" => "2024-10-02T09:01:02-05:00", "note" => "wrong size", "user_id" => nil, "processed_at" => "2024-10-02T09:01:02-05:00", "restock" => false, "duties" => [], "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "additional_fees" => [], "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "return" => nil, "admin_graphql_api_id" => "gid://shopify/Refund/929361466", "refund_line_items" => [{"location_id" => nil, "restock_type" => "no_restock", "quantity" => 1, "id" => 1058498311, "line_item_id" => 518995019, "subtotal" => 0.0, "total_tax" => 0.0, "subtotal_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "line_item" => {"id" => 518995019, "variant_id" => 49148385, "title" => "IPod Nano - 8gb", "quantity" => 1, "sku" => "IPOD2008RED", "variant_title" => "red", "vendor" => nil, "fulfillment_service" => "manual", "product_id" => 632910392, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "IPod Nano - 8gb - red", "variant_inventory_management" => "shopify", "properties" => [], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 200, "price" => "199.00", "total_discount" => "0.00", "fulfillment_status" => nil, "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "discount_allocations" => [{"amount" => "3.33", "discount_application_index" => 0, "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}}], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/518995019", "tax_lines" => [{"title" => "State Tax", "price" => "3.98", "rate" => 0.06, "channel_liable" => nil, "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}}]}}], "transactions" => [{"id" => 1068278483, "order_id" => 450789469, "kind" => "refund", "gateway" => "bogus", "status" => "success", "message" => "Bogus Gateway: Forced success", "created_at" => "2024-10-02T09:01:02-05:00", "test" => true, "authorization" => nil, "location_id" => nil, "user_id" => nil, "parent_id" => 801038806, "processed_at" => "2024-10-02T09:01:02-05:00", "device_id" => nil, "error_code" => nil, "source_name" => "755357713", "receipt" => {}, "amount" => "41.94", "currency" => "USD", "payment_id" => "c901414060.1", "total_unsettled_set" => {"presentment_money" => {"amount" => "348.0", "currency" => "USD"}, "shop_money" => {"amount" => "348.0", "currency" => "USD"}}, "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/1068278483"}], "order_adjustments" => []}}), headers: {}) + + response = refund = ShopifyAPI::Refund.new + refund.order_id = 450789469 + refund.currency = "USD" + refund.notify = true + refund.note = "wrong size" + refund.shipping = { + "full_refund" => true + } + refund.refund_line_items = [ + { + "line_item_id" => 518995019, + "quantity" => 1, + "restock_type" => "return", + "location_id" => 487838322 + } + ] + refund.transactions = [ + { + "parent_id" => 801038806, + "amount" => 41.94, + "kind" => "refund", + "gateway" => "bogus" + } + ] + refund.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/refunds.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/refunds.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "refund" => hash_including({"currency" => "USD", "shipping" => {"amount" => 5.0}, "transactions" => [{"parent_id" => 801038806, "amount" => 5.0, "kind" => "refund", "gateway" => "bogus"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"refund" => {"id" => 929361467, "order_id" => 450789469, "created_at" => "2024-10-02T09:01:05-05:00", "note" => nil, "user_id" => nil, "processed_at" => "2024-10-02T09:01:05-05:00", "restock" => false, "duties" => [], "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "additional_fees" => [], "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "return" => nil, "admin_graphql_api_id" => "gid://shopify/Refund/929361467", "refund_line_items" => [], "transactions" => [{"id" => 1068278484, "order_id" => 450789469, "kind" => "refund", "gateway" => "bogus", "status" => "success", "message" => "Bogus Gateway: Forced success", "created_at" => "2024-10-02T09:01:05-05:00", "test" => true, "authorization" => nil, "location_id" => nil, "user_id" => nil, "parent_id" => 801038806, "processed_at" => "2024-10-02T09:01:05-05:00", "device_id" => nil, "error_code" => nil, "source_name" => "755357713", "receipt" => {}, "amount" => "5.00", "currency" => "USD", "payment_id" => "c901414060.1", "total_unsettled_set" => {"presentment_money" => {"amount" => "348.0", "currency" => "USD"}, "shop_money" => {"amount" => "348.0", "currency" => "USD"}}, "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/1068278484"}], "order_adjustments" => [{"id" => 1030976842, "order_id" => 450789469, "refund_id" => 929361467, "amount" => "-5.00", "tax_amount" => "0.00", "kind" => "shipping_refund", "reason" => "Shipping refund", "amount_set" => {"shop_money" => {"amount" => "-5.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "-5.00", "currency_code" => "USD"}}, "tax_amount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}}]}}), headers: {}) + + response = refund = ShopifyAPI::Refund.new + refund.order_id = 450789469 + refund.currency = "USD" + refund.shipping = { + "amount" => 5.0 + } + refund.transactions = [ + { + "parent_id" => 801038806, + "amount" => 5.0, + "kind" => "refund", + "gateway" => "bogus" + } + ] + refund.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/refunds.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/refunds/509562969.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"refund" => {"id" => 509562969, "order_id" => 450789469, "created_at" => "2024-10-02T08:59:11-05:00", "note" => "it broke during shipping", "user_id" => 548380009, "processed_at" => "2024-10-02T08:59:11-05:00", "restock" => true, "duties" => [], "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "additional_fees" => [], "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "return" => nil, "admin_graphql_api_id" => "gid://shopify/Refund/509562969", "refund_line_items" => [{"id" => 104689539, "quantity" => 1, "line_item_id" => 703073504, "location_id" => 487838322, "restock_type" => "legacy_restock", "subtotal" => 195.66, "total_tax" => 3.98, "subtotal_set" => {"shop_money" => {"amount" => "195.66", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.66", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 703073504, "variant_id" => 457924702, "title" => "IPod Nano - 8gb", "quantity" => 1, "sku" => "IPOD2008BLACK", "variant_title" => "black", "vendor" => nil, "fulfillment_service" => "manual", "product_id" => 632910392, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "IPod Nano - 8gb - black", "variant_inventory_management" => "shopify", "properties" => [], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 200, "price" => "199.00", "total_discount" => "0.00", "fulfillment_status" => nil, "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "discount_allocations" => [{"amount" => "3.33", "discount_application_index" => 0, "amount_set" => {"shop_money" => {"amount" => "3.33", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.33", "currency_code" => "USD"}}}], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/703073504", "tax_lines" => [{"title" => "State Tax", "price" => "3.98", "rate" => 0.06, "channel_liable" => nil, "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}}]}}, {"id" => 709875399, "quantity" => 1, "line_item_id" => 466157049, "location_id" => 487838322, "restock_type" => "legacy_restock", "subtotal" => 195.67, "total_tax" => 3.98, "subtotal_set" => {"shop_money" => {"amount" => "195.67", "currency_code" => "USD"}, "presentment_money" => {"amount" => "195.67", "currency_code" => "USD"}}, "total_tax_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}, "line_item" => {"id" => 466157049, "variant_id" => 39072856, "title" => "IPod Nano - 8gb", "quantity" => 1, "sku" => "IPOD2008GREEN", "variant_title" => "green", "vendor" => nil, "fulfillment_service" => "manual", "product_id" => 632910392, "requires_shipping" => true, "taxable" => true, "gift_card" => false, "name" => "IPod Nano - 8gb - green", "variant_inventory_management" => "shopify", "properties" => [{"name" => "Custom Engraving Front", "value" => "Happy Birthday"}, {"name" => "Custom Engraving Back", "value" => "Merry Christmas"}], "product_exists" => true, "fulfillable_quantity" => 1, "grams" => 200, "price" => "199.00", "total_discount" => "0.00", "fulfillment_status" => nil, "price_set" => {"shop_money" => {"amount" => "199.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "199.00", "currency_code" => "USD"}}, "total_discount_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "discount_allocations" => [{"amount" => "3.34", "discount_application_index" => 0, "amount_set" => {"shop_money" => {"amount" => "3.34", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.34", "currency_code" => "USD"}}}], "duties" => [], "admin_graphql_api_id" => "gid://shopify/LineItem/466157049", "tax_lines" => [{"title" => "State Tax", "price" => "3.98", "rate" => 0.06, "channel_liable" => nil, "price_set" => {"shop_money" => {"amount" => "3.98", "currency_code" => "USD"}, "presentment_money" => {"amount" => "3.98", "currency_code" => "USD"}}}]}}], "transactions" => [{"id" => 179259969, "order_id" => 450789469, "kind" => "refund", "gateway" => "bogus", "status" => "success", "message" => nil, "created_at" => "2005-08-05T12:59:12-04:00", "test" => false, "authorization" => "authorization-key", "location_id" => nil, "user_id" => nil, "parent_id" => 801038806, "processed_at" => "2005-08-05T12:59:12-04:00", "device_id" => nil, "error_code" => nil, "source_name" => "web", "receipt" => {}, "amount" => "209.00", "currency" => "USD", "payment_id" => "#1001.3", "total_unsettled_set" => {"presentment_money" => {"amount" => "348.0", "currency" => "USD"}, "shop_money" => {"amount" => "348.0", "currency" => "USD"}}, "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969"}], "order_adjustments" => []}}), headers: {}) + + response = ShopifyAPI::Refund.find( + order_id: 450789469, + id: 509562969, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/refunds/509562969.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/refunds/calculate.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "refund" => hash_including({"currency" => "USD", "shipping" => {"amount" => 2.0}}) } + ) + .to_return(status: 200, body: JSON.generate({"refund" => {"shipping" => {"amount" => "2.00", "tax" => "0.00", "maximum_refundable" => "5.00"}, "duties" => [], "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "additional_fees" => [], "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "return" => nil, "refund_line_items" => [], "transactions" => [{"order_id" => 450789469, "kind" => "suggested_refund", "gateway" => "bogus", "parent_id" => 801038806, "amount" => "2.00", "currency" => "USD", "maximum_refundable" => "41.94"}], "currency" => "USD"}}), headers: {}) + + response = refund = ShopifyAPI::Refund.new + refund.order_id = 450789469 + refund.calculate( + body: {"refund" => {"currency" => "USD", "shipping" => {"amount" => 2.0}}}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/refunds/calculate.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/refunds/calculate.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "refund" => hash_including({"currency" => "USD", "shipping" => {"full_refund" => true}, "refund_line_items" => [{"line_item_id" => 518995019, "quantity" => 1, "restock_type" => "no_restock"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"refund" => {"shipping" => {"amount" => "5.00", "tax" => "0.00", "maximum_refundable" => "5.00"}, "duties" => [], "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "additional_fees" => [], "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "return" => nil, "refund_line_items" => [{"quantity" => 1, "line_item_id" => 518995019, "location_id" => nil, "restock_type" => "no_restock", "price" => "199.00", "subtotal" => "195.67", "total_tax" => "3.98", "discounted_price" => "199.00", "discounted_total_price" => "199.00", "total_cart_discount_amount" => "3.33"}], "transactions" => [{"order_id" => 450789469, "kind" => "suggested_refund", "gateway" => "bogus", "parent_id" => 801038806, "amount" => "41.94", "currency" => "USD", "maximum_refundable" => "41.94"}], "currency" => "USD"}}), headers: {}) + + response = refund = ShopifyAPI::Refund.new + refund.order_id = 450789469 + refund.calculate( + body: {"refund" => {"currency" => "USD", "shipping" => {"full_refund" => true}, "refund_line_items" => [{"line_item_id" => 518995019, "quantity" => 1, "restock_type" => "no_restock"}]}}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/refunds/calculate.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/refunds/calculate.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "refund" => hash_including({"shipping" => {"full_refund" => true}, "refund_line_items" => [{"line_item_id" => 518995019, "quantity" => 1, "restock_type" => "no_restock"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"refund" => {"shipping" => {"amount" => "5.00", "tax" => "0.00", "maximum_refundable" => "5.00"}, "duties" => [], "total_duties_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "additional_fees" => [], "total_additional_fees_set" => {"shop_money" => {"amount" => "0.00", "currency_code" => "USD"}, "presentment_money" => {"amount" => "0.00", "currency_code" => "USD"}}, "return" => nil, "refund_line_items" => [{"quantity" => 1, "line_item_id" => 518995019, "location_id" => nil, "restock_type" => "no_restock", "price" => "199.00", "subtotal" => "195.67", "total_tax" => "3.98", "discounted_price" => "199.00", "discounted_total_price" => "199.00", "total_cart_discount_amount" => "3.33"}], "transactions" => [{"order_id" => 450789469, "kind" => "suggested_refund", "gateway" => "bogus", "parent_id" => 801038806, "amount" => "41.94", "currency" => "USD", "maximum_refundable" => "41.94"}], "currency" => "USD"}}), headers: {}) + + response = refund = ShopifyAPI::Refund.new + refund.order_id = 450789469 + refund.calculate( + body: {"refund" => {"shipping" => {"full_refund" => true}, "refund_line_items" => [{"line_item_id" => 518995019, "quantity" => 1, "restock_type" => "no_restock"}]}}, + ) + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/refunds/calculate.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/resource_feedback_test.rb b/test/rest/2024_10/resource_feedback_test.rb new file mode 100644 index 00000000..50073611 --- /dev/null +++ b/test/rest/2024_10/resource_feedback_test.rb @@ -0,0 +1,131 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class ResourceFeedback202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/resource_feedback.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "resource_feedback" => hash_including({"state" => "requires_action", "messages" => ["is not connected. Connect your account to use this sales channel."], "feedback_generated_at" => "2024-10-02T22:14:15.870447Z"}) } + ) + .to_return(status: 200, body: JSON.generate({"resource_feedback" => {"created_at" => "2024-10-02T17:14:16-05:00", "updated_at" => "2024-10-02T17:14:16-05:00", "resource_id" => 548380009, "resource_type" => "Shop", "resource_updated_at" => nil, "messages" => ["is not connected. Connect your account to use this sales channel."], "feedback_generated_at" => "2024-10-02T17:14:15-05:00", "state" => "requires_action"}}), headers: {}) + + response = resource_feedback = ShopifyAPI::ResourceFeedback.new + resource_feedback.state = "requires_action" + resource_feedback.messages = [ + "is not connected. Connect your account to use this sales channel." + ] + resource_feedback.feedback_generated_at = "2024-10-02T22:14:15.870447Z" + resource_feedback.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/resource_feedback.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/resource_feedback.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "resource_feedback" => hash_including({"state" => "success", "feedback_generated_at" => "2024-10-02T22:14:14.748024Z"}) } + ) + .to_return(status: 200, body: JSON.generate({"resource_feedback" => {"created_at" => "2024-10-02T17:14:15-05:00", "updated_at" => "2024-10-02T17:14:15-05:00", "resource_id" => 548380009, "resource_type" => "Shop", "resource_updated_at" => nil, "messages" => [], "feedback_generated_at" => "2024-10-02T17:14:14-05:00", "state" => "success"}}), headers: {}) + + response = resource_feedback = ShopifyAPI::ResourceFeedback.new + resource_feedback.state = "success" + resource_feedback.feedback_generated_at = "2024-10-02T22:14:14.748024Z" + resource_feedback.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/resource_feedback.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/resource_feedback.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"resource_feedback" => [{"created_at" => "2024-10-02T17:14:15-05:00", "updated_at" => "2024-10-02T17:14:15-05:00", "resource_id" => 548380009, "resource_type" => "Shop", "resource_updated_at" => nil, "messages" => ["is not connected. Connect your account to use this sales channel."], "feedback_generated_at" => "2024-10-02T16:14:15-05:00", "state" => "requires_action"}]}), headers: {}) + + response = ShopifyAPI::ResourceFeedback.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/resource_feedback.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/script_tag_test.rb b/test/rest/2024_10/script_tag_test.rb new file mode 100644 index 00000000..e7fd13de --- /dev/null +++ b/test/rest/2024_10/script_tag_test.rb @@ -0,0 +1,286 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class ScriptTag202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/script_tags.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"script_tags" => [{"id" => 421379493, "src" => "https://js.example.org/bar.js", "event" => "onload", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "display_scope" => "all", "cache" => false}, {"id" => 596726825, "src" => "https://js.example.org/foo.js", "event" => "onload", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "display_scope" => "all", "cache" => false}]}), headers: {}) + + response = ShopifyAPI::ScriptTag.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/script_tags.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/script_tags.json?since_id=421379493") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"script_tags" => [{"id" => 596726825, "src" => "https://js.example.org/foo.js", "event" => "onload", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "display_scope" => "all", "cache" => false}]}), headers: {}) + + response = ShopifyAPI::ScriptTag.all( + since_id: "421379493", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/script_tags.json?since_id=421379493") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/script_tags.json?src=https%3A%2F%2Fjs.example.org%2Ffoo.js") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"script_tags" => [{"id" => 596726825, "src" => "https://js.example.org/foo.js", "event" => "onload", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "display_scope" => "all", "cache" => false}]}), headers: {}) + + response = ShopifyAPI::ScriptTag.all( + src: "https://js.example.org/foo.js", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/script_tags.json?src=https%3A%2F%2Fjs.example.org%2Ffoo.js") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/script_tags.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "script_tag" => hash_including({"event" => "onload", "src" => "https://example.com/my_script.js"}) } + ) + .to_return(status: 200, body: JSON.generate({"script_tag" => {"id" => 870402687, "src" => "https://example.com/my_script.js", "event" => "onload", "created_at" => "2024-10-02T09:08:32-05:00", "updated_at" => "2024-10-02T09:08:32-05:00", "display_scope" => "all", "cache" => false}}), headers: {}) + + response = script_tag = ShopifyAPI::ScriptTag.new + script_tag.event = "onload" + script_tag.src = "https://example.com/my_script.js" + script_tag.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/script_tags.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/script_tags/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 2}), headers: {}) + + response = ShopifyAPI::ScriptTag.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/script_tags/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/script_tags/596726825.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"script_tag" => {"id" => 596726825, "src" => "https://js.example.org/foo.js", "event" => "onload", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "display_scope" => "all", "cache" => false}}), headers: {}) + + response = ShopifyAPI::ScriptTag.find( + id: 596726825, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/script_tags/596726825.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/script_tags/596726825.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "script_tag" => hash_including({"src" => "https://somewhere-else.com/another.js"}) } + ) + .to_return(status: 200, body: JSON.generate({"script_tag" => {"src" => "https://somewhere-else.com/another.js", "cache" => false, "id" => 596726825, "event" => "onload", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:08:37-05:00", "display_scope" => "all"}}), headers: {}) + + response = script_tag = ShopifyAPI::ScriptTag.new + script_tag.id = 596726825 + script_tag.src = "https://somewhere-else.com/another.js" + script_tag.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/script_tags/596726825.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/script_tags/596726825.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::ScriptTag.delete( + id: 596726825, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/script_tags/596726825.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/shipping_zone_test.rb b/test/rest/2024_10/shipping_zone_test.rb new file mode 100644 index 00000000..600b430f --- /dev/null +++ b/test/rest/2024_10/shipping_zone_test.rb @@ -0,0 +1,62 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class ShippingZone202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shipping_zones.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"shipping_zones" => [{"id" => 44570466, "name" => "Downtown Ottawa", "profile_id" => "gid://shopify/DeliveryProfile/690933842", "location_group_id" => "gid://shopify/DeliveryLocationGroup/694323328", "admin_graphql_api_id" => "gid://shopify/DeliveryZone/44570466", "countries" => [{"id" => 359115488, "name" => "Colombia", "tax" => 0.15, "code" => "CO", "tax_name" => "VAT", "shipping_zone_id" => 44570466, "provinces" => []}, {"id" => 879921427, "name" => "Canada", "tax" => 0.05, "code" => "CA", "tax_name" => "GST", "shipping_zone_id" => 44570466, "provinces" => [{"id" => 224293623, "country_id" => 879921427, "name" => "Quebec", "code" => "QC", "tax" => 0.09, "tax_name" => "HST", "tax_type" => "compounded", "tax_percentage" => 9.0, "shipping_zone_id" => 44570466}, {"id" => 702530425, "country_id" => 879921427, "name" => "Ontario", "code" => "ON", "tax" => 0.08, "tax_name" => nil, "tax_type" => nil, "tax_percentage" => 8.0, "shipping_zone_id" => 44570466}]}, {"id" => 817138619, "name" => "United States", "tax" => 0.0, "code" => "US", "tax_name" => "Federal Tax", "shipping_zone_id" => 44570466, "provinces" => [{"id" => 9350860, "country_id" => 817138619, "name" => "Massachusetts", "code" => "MA", "tax" => 0.065, "tax_name" => nil, "tax_type" => nil, "tax_percentage" => 6.5, "shipping_zone_id" => 44570466}, {"id" => 1013111685, "country_id" => 817138619, "name" => "New York", "code" => "NY", "tax" => 0.04, "tax_name" => nil, "tax_type" => nil, "tax_percentage" => 4.0, "shipping_zone_id" => 44570466}]}], "weight_based_shipping_rates" => [{"id" => 522512552, "name" => "Free Under 5kg", "price" => "0.00", "shipping_zone_id" => 44570466, "weight_low" => 0.0, "weight_high" => 5.0}], "price_based_shipping_rates" => [{"id" => 64051, "name" => "Free Shipping", "price" => "0.00", "shipping_zone_id" => 44570466, "min_order_subtotal" => nil, "max_order_subtotal" => "450"}], "carrier_shipping_rate_providers" => [{"id" => 615128020, "carrier_service_id" => 260046840, "flat_modifier" => "", "percent_modifier" => nil, "service_filter" => {"*" => "+"}, "shipping_zone_id" => 44570466}]}]}), headers: {}) + + response = ShopifyAPI::ShippingZone.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shipping_zones.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/shop_test.rb b/test/rest/2024_10/shop_test.rb new file mode 100644 index 00000000..2c2ef13d --- /dev/null +++ b/test/rest/2024_10/shop_test.rb @@ -0,0 +1,111 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Shop202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shop.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"shop" => {"id" => 548380009, "name" => "John Smith Test Store", "email" => "j.smith@example.com", "domain" => "shop.apple.com", "province" => "California", "country" => "US", "address1" => "1 Infinite Loop", "zip" => "95014", "city" => "Cupertino", "source" => nil, "phone" => "1231231234", "latitude" => 45.45, "longitude" => -75.43, "primary_locale" => "en", "address2" => "Suite 100", "created_at" => "2007-12-31T19:00:00-05:00", "updated_at" => "2024-10-02T09:00:54-05:00", "country_code" => "US", "country_name" => "United States", "currency" => "USD", "customer_email" => "customers@apple.com", "timezone" => "(GMT-05:00) Eastern Time (US & Canada)", "iana_timezone" => "America/New_York", "shop_owner" => "John Smith", "money_format" => "${{amount}}", "money_with_currency_format" => "${{amount}} USD", "weight_unit" => "lb", "province_code" => "CA", "taxes_included" => nil, "auto_configure_tax_inclusivity" => nil, "tax_shipping" => nil, "county_taxes" => true, "plan_display_name" => "Shopify Plus", "plan_name" => "enterprise", "has_discounts" => true, "has_gift_cards" => true, "myshopify_domain" => "jsmith.myshopify.com", "google_apps_domain" => nil, "google_apps_login_enabled" => nil, "money_in_emails_format" => "${{amount}}", "money_with_currency_in_emails_format" => "${{amount}} USD", "eligible_for_payments" => true, "requires_extra_payments_agreement" => false, "password_enabled" => false, "has_storefront" => true, "finances" => true, "primary_location_id" => 655441491, "checkout_api_supported" => true, "multi_location_enabled" => true, "setup_required" => false, "pre_launch_enabled" => false, "enabled_presentment_currencies" => ["USD"], "transactional_sms_disabled" => false, "marketing_sms_consent_enabled_at_checkout" => false}}), headers: {}) + + response = ShopifyAPI::Shop.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shop.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shop.json?fields=address1%2Caddress2%2Ccity%2Cprovince%2Ccountry") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"shop" => {"province" => "California", "country" => "US", "address1" => "1 Infinite Loop", "city" => "Cupertino", "address2" => "Suite 100"}}), headers: {}) + + response = ShopifyAPI::Shop.all( + fields: "address1,address2,city,province,country", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shop.json?fields=address1%2Caddress2%2Ccity%2Cprovince%2Ccountry") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_current + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shop.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"shop" => {"province" => "California", "country" => "US", "address1" => "1 Infinite Loop", "city" => "Cupertino", "address2" => "Suite 100"}}), headers: {}) + + shop = ShopifyAPI::Shop.current + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/shop.json") + + assert_equal(shop.province, "California") + end +end diff --git a/test/rest/2024_10/smart_collection_test.rb b/test/rest/2024_10/smart_collection_test.rb new file mode 100644 index 00000000..194f860c --- /dev/null +++ b/test/rest/2024_10/smart_collection_test.rb @@ -0,0 +1,776 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class SmartCollection202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections.json?since_id=482865238") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"smart_collections" => [{"id" => 1063001321, "handle" => "ipods-1", "title" => "IPods", "updated_at" => "2024-10-02T09:29:35-05:00", "body_html" => nil, "published_at" => "2024-10-02T09:29:35-05:00", "sort_order" => "best-selling", "template_suffix" => nil, "disjunctive" => false, "rules" => [{"column" => "title", "relation" => "starts_with", "condition" => "iPod"}], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001321"}]}), headers: {}) + + response = ShopifyAPI::SmartCollection.all( + since_id: "482865238", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections.json?since_id=482865238") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"smart_collections" => [{"id" => 482865238, "handle" => "smart-ipods", "title" => "Smart iPods", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "disjunctive" => false, "rules" => [{"column" => "type", "relation" => "equals", "condition" => "Cult Products"}], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238", "image" => {"created_at" => "2024-10-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"}}]}), headers: {}) + + response = ShopifyAPI::SmartCollection.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections.json?product_id=632910392") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"smart_collections" => [{"id" => 482865238, "handle" => "smart-ipods", "title" => "Smart iPods", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "disjunctive" => false, "rules" => [{"column" => "type", "relation" => "equals", "condition" => "Cult Products"}], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238", "image" => {"created_at" => "2024-10-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"}}]}), headers: {}) + + response = ShopifyAPI::SmartCollection.all( + product_id: "632910392", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections.json?product_id=632910392") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections.json?ids=482865238%2C1063001316") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"smart_collections" => [{"id" => 1063001316, "handle" => "macbooks", "title" => "Macbooks", "updated_at" => "2024-10-02T09:29:25-05:00", "body_html" => nil, "published_at" => "2024-10-02T09:29:25-05:00", "sort_order" => "best-selling", "template_suffix" => nil, "disjunctive" => false, "rules" => [{"column" => "vendor", "relation" => "equals", "condition" => "Apple"}], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001316"}, {"id" => 482865238, "handle" => "smart-ipods", "title" => "Smart iPods", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "disjunctive" => false, "rules" => [{"column" => "type", "relation" => "equals", "condition" => "Cult Products"}], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238", "image" => {"created_at" => "2024-10-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"}}]}), headers: {}) + + response = ShopifyAPI::SmartCollection.all( + ids: "482865238,1063001316", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections.json?ids=482865238%2C1063001316") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 1}), headers: {}) + + response = ShopifyAPI::SmartCollection.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/count.json?product_id=632910392") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 1}), headers: {}) + + response = ShopifyAPI::SmartCollection.count( + product_id: "632910392", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/count.json?product_id=632910392") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/482865238.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"smart_collection" => {"id" => 482865238, "handle" => "smart-ipods", "title" => "Smart iPods", "updated_at" => "2008-02-01T19:00:00-05:00", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "products_count" => 2, "disjunctive" => false, "rules" => [{"column" => "type", "relation" => "equals", "condition" => "Cult Products"}], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238", "image" => {"created_at" => "2024-10-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"}}}), headers: {}) + + response = ShopifyAPI::SmartCollection.find( + id: 482865238, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/482865238.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/482865238.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "smart_collection" => hash_including({"published" => false}) } + ) + .to_return(status: 200, body: JSON.generate({"smart_collection" => {"title" => "Smart iPods", "handle" => "smart-ipods", "body_html" => "

The best selling ipod ever

", "id" => 482865238, "published_at" => nil, "updated_at" => "2024-10-02T09:29:34-05:00", "sort_order" => "manual", "template_suffix" => nil, "disjunctive" => false, "rules" => [{"column" => "type", "relation" => "equals", "condition" => "Cult Products"}], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238", "image" => {"created_at" => "2024-10-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"}}}), headers: {}) + + response = smart_collection = ShopifyAPI::SmartCollection.new + smart_collection.id = 482865238 + smart_collection.published = false + smart_collection.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/482865238.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/482865238.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "smart_collection" => hash_including({"published" => true}) } + ) + .to_return(status: 200, body: JSON.generate({"smart_collection" => {"title" => "Smart iPods", "handle" => "smart-ipods", "body_html" => "

The best selling ipod ever

", "id" => 482865238, "published_at" => "2024-10-02T09:29:21-05:00", "updated_at" => "2024-10-02T09:29:21-05:00", "sort_order" => "manual", "template_suffix" => nil, "disjunctive" => false, "rules" => [{"column" => "type", "relation" => "equals", "condition" => "Cult Products"}], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238", "image" => {"created_at" => "2024-10-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"}}}), headers: {}) + + response = smart_collection = ShopifyAPI::SmartCollection.new + smart_collection.id = 482865238 + smart_collection.published = true + smart_collection.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/482865238.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/482865238.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "smart_collection" => hash_including({"image" => "", "updated_at" => "2024-10-02T09:29:28-05:00", "title" => "Smart iPods", "handle" => "smart-ipods", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "disjunctive" => false, "rules" => [{"column" => "type", "relation" => "equals", "condition" => "Cult Products"}], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238"}) } + ) + .to_return(status: 200, body: JSON.generate({"smart_collection" => {"body_html" => "

The best selling ipod ever

", "handle" => "smart-ipods", "updated_at" => "2024-10-02T09:29:29-05:00", "id" => 482865238, "sort_order" => "manual", "title" => "Smart iPods", "disjunctive" => false, "template_suffix" => nil, "published_at" => "2008-02-01T19:00:00-05:00", "rules" => [{"column" => "type", "relation" => "equals", "condition" => "Cult Products"}], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238"}}), headers: {}) + + response = smart_collection = ShopifyAPI::SmartCollection.new + smart_collection.id = 482865238 + smart_collection.image = "" + smart_collection.updated_at = "2024-10-02T09:29:28-05:00" + smart_collection.title = "Smart iPods" + smart_collection.handle = "smart-ipods" + smart_collection.body_html = "

The best selling ipod ever

" + smart_collection.published_at = "2008-02-01T19:00:00-05:00" + smart_collection.sort_order = "manual" + smart_collection.template_suffix = nil + smart_collection.disjunctive = false + smart_collection.rules = [ + { + "column" => "type", + "relation" => "equals", + "condition" => "Cult Products" + } + ] + smart_collection.published_scope = "web" + smart_collection.admin_graphql_api_id = "gid://shopify/Collection/482865238" + smart_collection.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/482865238.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_11() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/482865238.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "smart_collection" => hash_including({"image" => {"attachment" => "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\n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\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n", "alt" => "Rails logo"}}) } + ) + .to_return(status: 200, body: JSON.generate({"smart_collection" => {"updated_at" => "2024-10-02T09:29:45-05:00", "id" => 482865238, "title" => "Smart iPods", "handle" => "smart-ipods", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "disjunctive" => false, "rules" => [{"column" => "type", "relation" => "equals", "condition" => "Cult Products"}], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238", "image" => {"created_at" => "2024-10-02T09:29:45-05:00", "alt" => "Rails logo", "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/fd43f2c8883f6e9b680e3295fd990d2c.gif?v=1704205785"}}}), headers: {}) + + response = smart_collection = ShopifyAPI::SmartCollection.new + smart_collection.id = 482865238 + smart_collection.image = { + "attachment" => "R0lGODlhbgCMAPf/APbr48VySrxTO7IgKt2qmKQdJeK8lsFjROG5p/nz7Zg3\nMNmnd7Q1MLNVS9GId71hSJMZIuzTu4UtKbeEeakhKMl8U8WYjfr18YQaIbAf\nKKwhKdKzqpQtLebFortOOejKrOjZ1Mt7aMNpVbAqLLV7bsNqR+3WwMqEWenN\nsZYxL/Ddy/Pm2e7ZxLlUQrIjNPXp3bU5MbhENbEtLtqhj5ZQTfHh0bMxL7Ip\nNsNyUYkZIrZJPcqGdYIUHb5aPKkeJnoUHd2yiJkiLKYiKLRFOsyJXKVDO8up\nosFaS+TBnK4kKti5sNaYg/z49aqYl5kqLrljUtORfMOlo/36+H4ZH8yDYq0f\nKKFYTaU9MrY8MrZBNXwXHpgaIdGVYu/byLZNP9SaZLIyOuXCtHkpJst+Wpcm\nLMyCa8BfP9GMb9KQdPDd1PPk1sd5VP79/L5dQZ0bI9+ymqssK9WcfIoXHdzG\nxdWWfteib79lSr1YP86MYurQxKdcUKdMQr5ZSfPs6YEZH8uhl4oWIenMuurQ\nttmejaqoqsqBVaAcJLlJN5kvMLlZRMNsSL5fRak0LbdQQMVvSPjw6cJnRpkf\nKtmjhvfu5cJtT7IuOMVvWLY/M/37+o0YH9ibhtSYdObErc6HarM9NnYSGNGR\navLi09unje3WyeO8rsVrT7tdRtK3uffu6NWeaL9pTJIjJrM4NPbx8cdyX7M7\nPYYVHu7j4KgoNJAYIKtkV5o9MsOcldicis+RYNutfrhFOZ0hJbqinZ8bI8h5\nUObFuOfItJsfJrJfUOfIqc+PXqQtK8RnSbA4Mcd3Tm0SGbpXQ8aqp7RLNs+s\novHfzpVhV9iggMd1TLtbRKUdKXEQFsd4XrZRPLIgMZUeJ+jKvrAlK6AhJ65A\nMpMpKuC3j5obIsRwS7hAN8l/YtvDvnYXHbAoLI47SIUsOMenorF4gO/m4+fH\npo4vLZ8oKMukqp0cJbhVSMV2UuPR0bAfMLIrLrg/OcJwT8h+Vt+wn8eurLlh\nQrIfKHQOHHQOHf///////yH5BAEAAP8ALAAAAABuAIwAAAj/AP8JHDhQXjpz\n/PopXNiPn0OHDRMmbKhQIsOJFS1SxAhxI8SHFzVeDBnx48iNBAeeOkcxokeX\nFRdOnAlSokaaLXNujJkxo8iYHRkKtWkzZSsaOXkAWsoUECynsHgoqEW1qtVa\nU7Mq2Mq1K9cUW8GKTUG2rNkUHNByWMuWLdWva7t1W7UKG4S7eO/ycEhQHgaK\nsL4VGGyocGE3br5929KuxQFFkEtIlgypsuUDmDMfWGRmUZvPoEHfGU36jgDT\nLQSoVt3IQ2sPsL0IUNZGlZ0H0lo00jEkCytWMspdGzBgn/F9EBIWnKIQlqHB\nhA0bQpx48Z7UAkoEcMTdUeTJJSxf/4akOTNnzqHb3GkjrUdp0gKwq77jWdod\nO7dNKWvhRUcWT6zYQI82xB03AAQNCdTKX/xAAB10hfVCnRtbVIhIAy14oJoZ\nAXS4XXfdQaYIeOGJRx555Z1nRnrqqUeaMtIYY8dmn7Vg2yK57TYEgAzIQGBx\nxyXHj0A0OOTggxFKSN1iWwTTAIYanpYdMtFE4+GVIHrn3XeUmVhZeWiIMoOY\nnVQDGiTgKALJjIssIsADt0mjjI6+AXcDgQYi2M8/7ijEwzRIFmBIL9NVV+EW\nVzyZ4Wqj9RBABchQWeWkV3aY5ZYjjgieeKL446mnjxwAiZVpliAjZqblt19/\n/7HCwIAFGv+X3J4s9fMckoYhphiTQTwJ5Wqn9dDDAWuMUUEFviTrS6STVlmp\npVmKqCkOn34aB6TIBAAOJeHZAYl6ptixSCL8edGbq8HFeqBDcygEyIOCGqYk\nkxUW4euiq7knbA/gUDHGv//ec2wFayQbaQWinOCslVhmSUq1/gCDLJXacgtJ\nCYu4J66cjbAKoA3CxapnOgm9g+ughdK7xYX3Rinlvj2YYcYanVBBhTg2Axzw\nG4/4k4bBzDZbKRUQP1LIsRSX6sgBZtwhzQP68ccbj7AWty4/5igEoaC9dK3r\noVtgs4evvzKqb8wyQ0JFJzXXbDMVcQBQLTDGVmCssstKGs09oPT/jQcRoBw9\nMamKgEOeeg/gqBtvdVZSDnHFIQgRD4RxXWhiYEOQKNn4zncHzDIzHc0ZpHdy\nRicIQOypKDf7q3Pd96ABzSab+E1EIYIvS2o0ijA92gPZiCB1qwL+iJxL78Z7\n2NeHQrAK2YrCZva+bcgcujFUQIEG6WigonoCdLT9tr9UbIIAMMCEkkYacvvT\nxSgsBPKGJKBEAw4yjhx+hyn+PAJFfztyVdWOt5B3RehyimneFuwFvQxFyTSf\n25f1zCAqSFACDXTQ3gwSoDoElI5tZyBAINqnuhJ+Kg9vOIOaVnSHT5ECHucK\n0OMiBxJAPCdXmGseBLoBvei5rFEStB5m/yBhjFJUIw50oIMoLvCpFRAADduj\nwxvUYMIqmvARCBiDeiwRBk+lQQTEq5qQ3CWdJSkGAlu4y9h66EBgAbF6QhSV\nMUpQilKcQRNLwIenfpFEJebBioC0ohrQQJ8QhMIfSwhgj2YouYTYUEmGqhBe\nFNBDH5otgmgLnRyLWMdq0GEGCMCHJjSBjzQE8pSChMLTCJBI4pXDBeuiiA1T\nprK7PK+SUPphsIQ1wSEag5OUKIUlyiAmAowClci0YizKILUAFi+WDQEEJOmF\nxlnMYnOVbOP0gkjBTdZRmDiwhCuywcRkmtOEpHjC1DzBABto4xqN5AcgdEXN\nNO4Ql0+CB2xctv9LM2SSgpXhZB0t0QlT+iMUkzinQquFihD452P0gGdGAPGN\nHKYxjbOAwBpxqU9+ApGXQgyoQDWRgASwoAMGMMAHDrnQhc5AkQPSU0NgYVF7\nQmAWKcBnPvc5HwGcbUVxJCInEfACQXQACUhFQkqRwAIOttScv9ABO21wA8k1\np5Z3mYXYdNqAjvLzbHDUpFCNIQoUdGAdHUhrUg2gVAOg4AXmvEAaOPEGaCCA\nAASQxBtIYYIq5kEHAaKHVfsRGB3eNBPYxKdXGVWGUnAzdOSxgyg+MIxhoDWt\nal3rUlXABEBeYBQIiMMm0AAKPBBAE1A4nTjWEIAzvGEFqsvDEHqEjZj/wMKw\n1rwlVxerGkv4AxVoAOkEmXGMOKDgA8i1LFrRioSjKrWtKRVEQlXHBBSKQhLQ\nEG3tCHCLJaSWClD0zgHO8LBqDeIYNsDGTG4ryZtak4G7lZ6G2sBSfyCAaTK7\nAzfgQIEzoOC/yKVsZS+bWeim1BsdqEG10oCANxDgDZwIRHa3O4hbaA91nlKB\nKA7QBhHo0VPwCFBtAdNea86CZVztKk8FUN5PjQIHxKWABihQBkHY+L/HTa5l\nMetcAxvAG94wQAQAkA1SIIAUBvUHdkVLgBkMwrvkPSEkVtSCJ/yCAJ5gZ20l\nwgObziITGk3xTqUHhWoxYQVdAIYINMBmO0TA/8aCwHGOBbwOAvc4pXj2RieY\nIY69ttgfpJBEHOLQ5ArTAQ2SaPAb4lAC33XsoaxYhUx4kFVrZoKSYlYxbOzg\nPX8kAM1d6AILOuEDDQzBBCaIwJvhjOMAU7bOmE0qdMUhhFozQhVxiMWnuiAJ\nQTfZyahFQydWGwA1cbiZAJL0Qiht6UzoVsxetUQaJhEKZzhDBdh+A5s9AQxU\nq3rVN241ne0sa1rXWgjbqLUd3uqPUYhCFNDAxwzm3d3vjgF/vTvAHegUaYbw\nwMSZyAR8oX0I2BwiC2eoQQ2srYJA6IDNb2ABqr39bVYDWMfkRgIVzs1xdEOD\nCjhQ4nXlPe9BaOLQNf+rRjQc0eg2DM8TyvZTs3mY6Xwy4xI2YLMGdIAAhTvD\nFWzuhKhZIHGKq9riF381rDtQho53/Bjpboc1OiEJktMbtaplrbHboCOYT9rS\nOdhopocwgiRowOw6L0MNCKCBKjwA26IW9cRTXfE4i1vAlpUEHJze8XTXehvc\n2AQ05k3vDHaiDGNYeaPNoAzGxbwf/86EHDCd4kbsyBMySII2NH92nevg4TbI\nA7ZVEGqiF93ocLb7nIdhgGMIoROW4Dvft2GHOqQiDoM3+YWJnT8O7yYL3fgI\nDwK+CrFX0lwBctUxtLH55qNd5xkYxMKvDffSn/7b4L47JYQgjnW0XvZOv0L/\nKmz/BS5sIg5QvtkavDPlO/Am+FzOBCBqgU8veEJA9LCBDRjQznIw3/lJEIBs\n5gqhUIALN3rWR3QTh31IFwcUkAiV1QEOCH4ddw8LkAqpUH5cgAtnIGzikHgs\nxzSW1w3+Jgc0Bz32Rw8DoA3lQA8yIAP6xwoj4H//B4BJYAOjoAZqYIDWRn0J\nuIB1Z3fHQAGdgHeJQIEcxwwLQH5csIHEQARE4C9aRx49oAPw5ydyIHaANUPE\nwXwtmH/6Vw5iKIb/F4DaoAGisAIroIM7WG0MR3pDd3qoJwjVQAEUAAdvEGAG\nsHcUgITFgAtLmIFNiAtQeAInMAa+UGwiyAEW8QMc//AkgKUNx7EPkLOCLOiC\nNiADIzCDY0iDm2cHLxCKbNiGPueDcVh02McJ/GWHjfABxyUJdigEfUiB+pAL\ndVAHX1B+uPCERHAChSAw8QAOHMaIE6EF3MAKkjiJxlGJljgC+UcPm7iJnch8\nDJAHoRiKaqiDBRgK01d9LDB0QFiHdmiH1YACSDCE4ziLsscIdRCIGriLhfiL\naxAPOKAKtbARPFAFQKKMywg5XuiC9ACN0TiNOwAAAHCNL5CN2siN3QiHcYhq\nwCAD6WiHomAJEzmO4LcGueCOG4gLf2OIAjOPOHCPEEFT/KiMzKgNLigDABmN\nnKgL02aQB3mNCkmKB+iNCv+IBjI2Y+O4ihcZi063DcywkReYi04Yj/ewBmuA\nAyRYEbAAAVVwkv3oj9rwgizJks4okCMwCI+ACqgwCQaJkGq4hm3IjW8YakPn\nCWxmhzz5kxfJd3iwkUx4lL0ojw/QlAnxlG4glQYCOStplS8YkJuoCwnwCIY5\nCYgZljRJlqTYg9WnbTq3lm3plrGojrVWixuJgRpIDB95AgLTCCRYkjeVAXw5\nlfqXiVa5ks64QSVlmF8JljO5mAtplj4IdJE5YzpHmenYcXCwAHKJi7rIi74Y\nD7oQms1xU71QmpQ4AOVwmvoHmAH5ABcwna3pmompmAnJmDzIcGp5m2upmxMp\ni+f/Zg9AIJeCeJSG+ACHAH8OwWyzoJyUCIOnCYOAKQP4wATTeQElVZio8AiI\nCZtiSZbbuHAIUAXemZu5CZ4YyQ250KAXeJ6c2YsCYIUYwWyZUADK6QoEwAfO\nOZ8yoANSwAT4SZ37eZjXGZtjOZshoAFQ8HAHOo6TCZ5CgAfluYS4OIhPGA8C\n4AXBtxBP+WXvWZrZ4ClhYAkdmokzgAkhKqIjqp+GaaIyGaAL+XDOEAEueqC4\nGaNuKQTWAAQ1OpceCQktcAgcYFuHJQc+wJfhADFpsAPhcJpewAZKKgVL2qTV\n2ZUnKptqMApJ8ADVZqVYKpkKaodwEAflaYvAuYFE4HIe/8CIEWGhchCkJ7kE\nJQQAHGoDZcYGckqnTGqnhWmiALqYS5AEdGCAVmqgBvqiMqagquANX3qe8cCo\njpqX1iQHsAALaWogx5FkEBMO7URCmjqnTJqfJQql2LkClpAEwNCGahABapmq\nqqqgjAAE3uCgTFgC6tEIZVoRzCYHckBpJ+kBJoQA+xcCqrOpdeqpT/qf2JkF\nSQAPOdiGLoqq0QqeVOCqDUp+RMBh+7atDgELX+atPJCPKOkAJmQJ7fRH54oJ\nc7qk+amfn+qfsAkAKqB5SeAFo7CGwBCo3smWlMkMQPaqyAAJi2AaKTBpECB5\nUdFlKJk6qoMK/McHVsSwdFqnxP9aUv3JrgRghhcbCCswqp0XmdAamTtJmXHg\nqjWaCmqCIwJwsg/RrSvLA6R5HDIAAyJAAJ3mKQQAAwxwC4Akp8Iqog9bna+5\nA2V4g+kUgM/HZlUwtB2rparwYzWKB/nzAG3QtBVaq1HxA5+wl8cBA1iABTCg\nCyGgsK7Af1lrReiariTKn6ggAmTIfDfIAJuntt7pth2bjnAABHKbC74ADi13\nByfLrQG7sp/AA8dBD4EruIILAy0ABboAA66ATMHKqcMKsZ/aCNMouWrbu2vb\nthw7kdUgt3VgP41WsinwEPzwb7NgqzzwA3xrCMYBuKu7ujBwvTBAAOYEtrbr\nqQkwg5z/GLmVa7GWy7EJmo7ccGB4gAxp8i3SMLoNEXnOywOf8AmwsA/aUL3V\ni726QELJtLi3W1ICWQ7SGLm+67tCi6UeSwGb8GOFkC1L+74uAbAq+7z1Sw0F\nwACXcAmBy8H6O7sLxb22O52k4IwD2Yk0SL69a763KWOJgAQLACnFBgl267Qy\nV8H0+wnUgAEb3MMbrL/a+1SaWrNMSgpYqZUEPIY1qMICyMJtCQSB4wv2czjw\nC3mla8E6nAzcEA4+jAU/HLiJG8IAbMRW6ZLgq8S8e8BOPGM4cDtSDLqboQD4\neMV8m8VXkAV47MMeDMJP9SmLiw82oAOpicThm8IHXL6BSgEn/4AHhbAsaRLH\nMSG/e3vBjojHWRADeowFg9DHEMO9DmADDjAK1ZCaLknAhZzGaoyl3IALXHAC\nMry0cjwR8juwz0sN1OBs3HDJlpwFl8DLvMrJnqKpUADKIUoKD1DGpVzAZ3vI\nWKoIxNDKr0yysRy/dKzDP3BTChADunzJlxAOygDMJkQANlAGmMCk+CDI0KiV\nBYzGh9zEOmcDRPCEjEwlI3IACtARkmzB1JBRs9AN3KDN2mzJZQDOJRQGNmAH\nDSuiyhCYL2jGKIzKCMxmdwCFRMDIb9xo07y8V1y/14wXVxADIA3QWRDEBF0t\nBi0CAOwKgDkCmmjGpzy+anwPvbjIJ//gyBitvLNswRmVVewQ0iL9yyVt0PVA\nAIsLBfVJytK4zuXQzknADIZoiIVABNEsx8vWvN/6vJRmU6vw0T4tsyWtOvxn\nA+EABQCgpID8gqh5lQ6dxGR4yIrgi78o01MdyVY9sJ+QCd+ARlmVzT490F8N\nMTEQ1gwQDiGwPh260i2dzJ3Yu8eAO/fw2BVwD408w7UAEv9mqyubQBe1Q/98\nCCA9A38NMSLAf4JtAyFw2Gnd0Il9wmKotm0Q10o5j41svFQtc/M7CwmU1/ZU\nC559CLrwC6FdLSFA2sR9pB5anw4dvlUZDyE5j/SINKBb2RRx2ZldHUxyFxwQ\nA70d3NUCBa7/QtyljdrIvdZj6AFKGQ/oTY84YA8PnCb3ON11PQv0dN0QgA1X\noAuH4Fvc7SkIwABcC97hfdiIvdrgSwnOrd72QAkGDsHSnRDD57wS0g4NcAVb\ncN1bkAKHcAh+vd95cL3+DeABPp+pjcybeAnojQMobg8JTgmqQAlSrAjSHb8q\nOwvT0QDocOMTQAJ6UARk4M+HANr77SnY6+Egrn/tdKTjHY2LkOIqruCq8OR2\n8MYk6ScqSyiGQAI3fuNRsOVRMAEKcAjAHeT+cARD/t8g3k5HLuJHLQMMYA/r\nreAsbhv48QCUYD8NDnmSR+MF0At/YARGoOXoEAW8QAscMARhHNwh/1DmHm7m\nxZ3mxw2Y1rDicY4ft/EAlp4tlS3LkndD3ODnfp7lW14EW7AHYu4pg9C6Zc5/\njE7a+4fkad3iTy7nlW4KtC4N9hAAU47nR1IAwtAMno4Of77labQHrVDqYWC9\nis61qx7i83kIsU7plk7rppAI1G4K0UCSDp4JbgAdJNAMvv7pOL4YViAPpe4P\n+pvsy87qrT6ftQHtiUPr1K4M+9EC9nDnlOYDg+EDf+Dt3/7n6EALi0EL+VDu\nD4DsqI69ql7kjo4F7r4IpiAN8T7vjdAIdmDv74DvPsAN/O7tv14EiUECUQAC\npV4G+ovsqf7hAH6a1jDr8E7tLaAbE+8FMv//3n6S79MwBDuw7xzv6e2gGBMQ\nBadQ6gSABQ5AAA4gAodg8kOe8GduCu8O8S7/8jHfH5/HDiWRDH6QA9hwK4PB\nDfbyBLRAAtPxDbaw5X0g5mlwCXzsMwgABUdw8Aif7ocg7fEu9VP/eUPwCmDw\nAzPxA+TgBxgQ+BBgMpUjKNQR6FEwB6WuDJdw6AAQuMnO9KQNI3UP8x0DQHoP\nBmBABnuxEH4f+KAP+LitPNNRDFq+DCN/CSQt3Psb+fyXBZU/8ZevA5mv+Zqf\nAz/AED+gBeQA+r4f+DkAAShTBKAu8kFOAOFQDQV97oqu6o0g8TFP+7Vv+5Ug\nC9+q+1PQ+7//+1n/DwFF4O/osAFiDgB4DNT+UPDWC/lljgV23zF5b/vwXwny\njw3f+hE/kP1TsP36/wxNABBNeEVBp87fQYQJFS5k2NBOjGoEwvxKSOASFowZ\nscDgyHFIo0ZehrwCU9JkyUopK8nKlIkHP379+P2YMoUcBpw5deZ8RohQE6Cn\nGg4lOnRGDKRZsoS7pMPSA6YXNWLsKJLkSZOVwKhMGSTTrJf9ZNKcomXKTrQY\nevr02cSIvKJxi6aJkaVuXaZMs1ziO5UqPawnuXK9AWEW2Jhja9pMuzMd27YW\nLNga10fuZYUPkdZdqpTv575YbJQbkCHw1sEpb9wQMstwWLFkbfppjJPc/wTI\nhHhJ5r0BBGbMRzfb7ez5MwwbpTMsx5pa9eob2CBM5yETpmzGtTE8hrybN29b\nc1oBn6trc9K7nhmUy6BcOUrn0KHLcr0FQvWYMxdnb3w7t/fvwFMiFvKG0uw8\n4kRLYjkGG0RtMPlWc+GGdyCwbwtYrOsHu7K0a+K/AEO04K0CF8InBvPOg2GE\nKpZTrsHSUotwwgnnmW4LHGGBKbb9bMqhsSly082CW0QMkDLLSvQHFQFiOESX\nLGzQpkUY22swA8Lko9EFLqfBEcdvMhRrwx610OLHtJ5Rc01ahHnCzTeFkXNO\nOfWQkwQ6NNFzTz2X0GQJQAMVdJEYsBhBAyrbK/9tgBcbrCTCG7bkkstvvvwm\nzPzI7JEcNLXDCYICQhXVkAIMMdWQd0x1Y9VdiuHGA1hjhfWQQzyg9dZDYmBg\nyioSVfRKFwfYZ8ZIJ3XhGhe83OLSSwEZU78ea+pUO2wK8MFaUUMl9dReDOll\n1VXbuYIZWWOl1dZDLpGhV3YZXLTR9vZhUMJijUX2mmveYRZcQDLlsCZOp21s\nCx+uLTjbbE/11ttv3diFkSHKRReGcthtN1hgrdxH2Awk5fJefK+ZZ9lvVvXW\n2cT+ZSwHgdHCpmCYDb4WYVNL7baXbsN9FdYYbKDA4otddBdYeffZx9iPjw35\nmmlKNtnUfmXSNNqAW9b/6eWYY8YWYW0V7tYQhxWAwwege61y6OXkbdDoSUFe\nWuR3wP3akKhjUtlHlqklG+YqsjaY620VNgQDMcQQouwrX3zR6KKFZfttyKtw\n+utQnRUL2mjLYjnvtLDpu9e9/ZYZ8FK3maLwwn8OmlF3lWNc7df3gfzteaZZ\n+NTKx5y6RxJ69/333mvBwHOLQ/fhiR2SV34HS47hmnAafJ9gh3AaDMcB7LE/\nIoPY441dhOzDz94VN3DPNmoeM5drAyfK7lWH34baYetVCidBIT6C5UMhB4r2\nn3FheSANRVGCwhBmObtlbgqXyYYNyuYFAMQFCtPwQf3spxAraGBRR+Af91wX\n/zsPoCIuCCAV13yAMsWo7zIOaJHFSHEZHZABdWK4X0JoIAENLIeDCXFA2rgX\nuwG8MC6kKGGoZuaDTEhtd/vBTBoyYLYqeAEzFpihGCagEBqIQQJVGMAOEdLD\n2L0uHJdBAMIOhsTELHExwLnS/i6zAQlIQItWxKIccejGL/4wjPvw4kHSQApA\nBhKQUDCiEWE2C93dTSEW2EMjaWABhbgnA3g8SAj4cElK+kMJWoyjBK6YECtw\nUgKZ7N8ejdZHfzjgGgNY5SpnZsisJXFHikwICTLBskzUECFtxJ/FFKKETmrx\nkwixQiclYAX+mfKUCpnBEZzpzHpkS2Yxm0ViMNcjhf+QABs5uKUuD9KoTOaP\nQb80picxaExk8lCZfIxLNuBhrWnurZpjoiVCbAkBbnrTH2pbTjgZVAVyGnOY\nBylmJ9P5xXWOUS6WEB3ZqgmTazLxMk40WntQub3lbIOc7OjkQP1RUI4e9CCl\nfJ3jjCbEogDAE6KrAiKlVs+4gJF7GUDlDLLnUWCyg6Ps8GgxdyrSVK5zH/WI\noARjZjFEQhSmRCEFg9SGSqIoQadT7alOJcAOoJJUmeFA6VBIETqk+ssPKizK\nDorxwx9CdShSvapOqzpVoO7ApMocgAdcIb74HeSroEOqEn8w1mgVRR0KyEEw\nKqoctTZEquzggFsVooepskP/DwqZAAfmakpGvc4HXSXF54CWVLthALASRYhB\nFpmDd4QxsQxRQmNd61HITnWyCVHC9MTnCsY9U7dH4AM8spGQvVrsiRB4Fg/8\ncFxsJmQDHvUHLQyhWsy01rXs2MFj2ZGC6862KKRgHGY6K9zlEPdyP8AJcteo\n3ClsQCHq0AF0QdkN+HbjlxygL31hO13tMrW7lwkB0BiUoR3x4EfmrYlCNjAF\nCRAoIWmwQexQqQcyxHe+9eXAfVOQAg7k16v7jQsAHGi2Bv0gUzyQQ05Ga+Cy\n0MBEDsZgN8gQ4QnXt7oJ0QOGOZACDTeEu0aTCwC80EKhDcAHMDGHWATMsuMC\nFsVl/9GnP0Jg0kw24MUv/qUTOGDlCj8WETfGsVx2vI+UzsATIFZUaTIRk3QY\n+ZYlFq0Ce5QJHBXgdU+MRCSwEYlVBCHPQZhyn7vhhD9fWdAc2DKhKXxhRCc6\n0Yi4LOPcl6hGVUFqc4gJLGaxufKO1s2VkrOj63znOkciCKMedZ+n7ARUp1rQ\niLAyIlyNYURcONaInrWs9ci4JyJOaFYawDzP8Q+ZwAICLckbgd08i290eh9V\nCIadQw3qO5Oa1H1GNRlSjeorO2HLruZ2rLudAm+Dm9Gxcx/GXmSIMbnjH5W2\nzy2RbOzM+cENBRAWs0N9b3zXWdp8pra1r61tbXdb4N/2Nv8i5gzeIJd5Gjui\nwT+AzQ9YVGrYnNO0Agm27GBkvNnNzje+921qf/+b1QEfuMDFPe5lk/lspUG3\nWKbQCofLBBBuwNEs3C3aikcrB2TTeM81HgmOd3zf/PZ3yFPNaqSXfODF0EDK\nE9e6liZmCvJwOLD7AQhU2efSbG6zm7VgiG1ofBc+//nGgZ7vbYw67aVux4v/\nfXSSK53by/HVrzIwDZTBBANUrzpMeAAIWASeB4P/AQ9+cHjEJx7xWgDE5nLQ\neMdHXvKbg/zkMZ23H/1oFRjYPOc9v3nQ58Aw0xn9LACvO7HQAOZVf/jl0ii1\nHcXe9bPX3euftaPL5R71tIf97nsy7/o0WlP2r4/JOU7B+r5nqva7jz1EdZ97\n4qNe+bonfvCfVXvly1762beOOdLBd+Q7PCAAOw==\n", + "alt" => "Rails logo" + } + smart_collection.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/482865238.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_12() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/482865238.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "smart_collection" => hash_including({"image" => {"alt" => "Rails logo"}}) } + ) + .to_return(status: 200, body: JSON.generate({"smart_collection" => {"updated_at" => "2024-10-02T09:29:43-05:00", "id" => 482865238, "title" => "Smart iPods", "handle" => "smart-ipods", "body_html" => "

The best selling ipod ever

", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "disjunctive" => false, "rules" => [{"column" => "type", "relation" => "equals", "condition" => "Cult Products"}], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238", "image" => {"alt" => "Rails logo", "created_at" => "2024-10-02T09:29:42-05:00", "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/rails_logo20241002-28582-qpb548.gif?v=1704205783"}}}), headers: {}) + + response = smart_collection = ShopifyAPI::SmartCollection.new + smart_collection.id = 482865238 + smart_collection.image = { + "alt" => "Rails logo" + } + smart_collection.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/482865238.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_13() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/482865238.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "smart_collection" => hash_including({"body_html" => "

5000 songs in your pocket

"}) } + ) + .to_return(status: 200, body: JSON.generate({"smart_collection" => {"body_html" => "

5000 songs in your pocket

", "title" => "Smart iPods", "handle" => "smart-ipods", "id" => 482865238, "updated_at" => "2024-10-02T09:29:43-05:00", "published_at" => "2008-02-01T19:00:00-05:00", "sort_order" => "manual", "template_suffix" => nil, "disjunctive" => false, "rules" => [{"column" => "type", "relation" => "equals", "condition" => "Cult Products"}], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/482865238", "image" => {"created_at" => "2024-10-02T09:28:43-05:00", "alt" => "MP3 Player 8gb", "width" => 123, "height" => 456, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/ipod_nano_8gb.jpg?v=1704205723"}}}), headers: {}) + + response = smart_collection = ShopifyAPI::SmartCollection.new + smart_collection.id = 482865238 + smart_collection.body_html = "

5000 songs in your pocket

" + smart_collection.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/482865238.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_14() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/482865238.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::SmartCollection.delete( + id: 482865238, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/482865238.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_15() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "smart_collection" => hash_including({"title" => "Macbooks", "rules" => [{"column" => "vendor", "relation" => "equals", "condition" => "Apple"}], "image" => {"attachment" => "R0lGODlhAQABAIAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\n", "alt" => "iPod"}}) } + ) + .to_return(status: 200, body: JSON.generate({"smart_collection" => {"id" => 1063001311, "handle" => "macbooks", "title" => "Macbooks", "updated_at" => "2024-10-02T09:29:19-05:00", "body_html" => nil, "published_at" => "2024-10-02T09:29:19-05:00", "sort_order" => "best-selling", "template_suffix" => nil, "disjunctive" => false, "rules" => [{"column" => "vendor", "relation" => "equals", "condition" => "Apple"}], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001311", "image" => {"created_at" => "2024-10-02T09:29:19-05:00", "alt" => "iPod", "width" => 1, "height" => 1, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/df3e567d6f16d040326c7a0ea29a4f41.gif?v=1704205759"}}}), headers: {}) + + response = smart_collection = ShopifyAPI::SmartCollection.new + smart_collection.title = "Macbooks" + smart_collection.rules = [ + { + "column" => "vendor", + "relation" => "equals", + "condition" => "Apple" + } + ] + smart_collection.image = { + "attachment" => "R0lGODlhAQABAIAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\n", + "alt" => "iPod" + } + smart_collection.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_16() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "smart_collection" => hash_including({"title" => "Macbooks", "rules" => [{"column" => "vendor", "relation" => "equals", "condition" => "Apple"}], "image" => {"src" => "http://example.com/rails_logo.gif", "alt" => "Rails Logo"}}) } + ) + .to_return(status: 200, body: JSON.generate({"smart_collection" => {"id" => 1063001327, "handle" => "macbooks", "title" => "Macbooks", "updated_at" => "2024-10-02T09:29:48-05:00", "body_html" => nil, "published_at" => "2024-10-02T09:29:48-05:00", "sort_order" => "best-selling", "template_suffix" => nil, "disjunctive" => false, "rules" => [{"column" => "vendor", "relation" => "equals", "condition" => "Apple"}], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001327", "image" => {"created_at" => "2024-10-02T09:29:48-05:00", "alt" => "Rails Logo", "width" => 110, "height" => 140, "src" => "https://cdn.shopify.com/s/files/1/0005/4838/0009/collections/rails_logo20241002-28582-5fqs02.gif?v=1704205788"}}}), headers: {}) + + response = smart_collection = ShopifyAPI::SmartCollection.new + smart_collection.title = "Macbooks" + smart_collection.rules = [ + { + "column" => "vendor", + "relation" => "equals", + "condition" => "Apple" + } + ] + smart_collection.image = { + "src" => "http://example.com/rails_logo.gif", + "alt" => "Rails Logo" + } + smart_collection.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_17() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "smart_collection" => hash_including({"title" => "Macbooks", "rules" => [{"column" => "vendor", "relation" => "equals", "condition" => "Apple"}], "published" => false}) } + ) + .to_return(status: 200, body: JSON.generate({"smart_collection" => {"id" => 1063001326, "handle" => "macbooks", "title" => "Macbooks", "updated_at" => "2024-10-02T09:29:46-05:00", "body_html" => nil, "published_at" => nil, "sort_order" => "best-selling", "template_suffix" => nil, "disjunctive" => false, "rules" => [{"column" => "vendor", "relation" => "equals", "condition" => "Apple"}], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001326"}}), headers: {}) + + response = smart_collection = ShopifyAPI::SmartCollection.new + smart_collection.title = "Macbooks" + smart_collection.rules = [ + { + "column" => "vendor", + "relation" => "equals", + "condition" => "Apple" + } + ] + smart_collection.published = false + smart_collection.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_18() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "smart_collection" => hash_including({"title" => "IPods", "rules" => [{"column" => "title", "relation" => "starts_with", "condition" => "iPod"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"smart_collection" => {"id" => 1063001313, "handle" => "ipods-1", "title" => "IPods", "updated_at" => "2024-10-02T09:29:21-05:00", "body_html" => nil, "published_at" => "2024-10-02T09:29:21-05:00", "sort_order" => "best-selling", "template_suffix" => nil, "disjunctive" => false, "rules" => [{"column" => "title", "relation" => "starts_with", "condition" => "iPod"}], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001313"}}), headers: {}) + + response = smart_collection = ShopifyAPI::SmartCollection.new + smart_collection.title = "IPods" + smart_collection.rules = [ + { + "column" => "title", + "relation" => "starts_with", + "condition" => "iPod" + } + ] + smart_collection.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_19() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "smart_collection" => hash_including({"title" => "Macbooks", "rules" => [{"column" => "vendor", "relation" => "equals", "condition" => "Apple"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"smart_collection" => {"id" => 1063001325, "handle" => "macbooks", "title" => "Macbooks", "updated_at" => "2024-10-02T09:29:41-05:00", "body_html" => nil, "published_at" => "2024-10-02T09:29:41-05:00", "sort_order" => "best-selling", "template_suffix" => nil, "disjunctive" => false, "rules" => [{"column" => "vendor", "relation" => "equals", "condition" => "Apple"}], "published_scope" => "web", "admin_graphql_api_id" => "gid://shopify/Collection/1063001325"}}), headers: {}) + + response = smart_collection = ShopifyAPI::SmartCollection.new + smart_collection.title = "Macbooks" + smart_collection.rules = [ + { + "column" => "vendor", + "relation" => "equals", + "condition" => "Apple" + } + ] + smart_collection.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_20() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/482865238/order.json?products%5B%5D=921728736&products%5B%5D=632910392") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = smart_collection = ShopifyAPI::SmartCollection.new + smart_collection.id = 482865238 + smart_collection.order( + products: ["921728736", "632910392"], + ) + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/482865238/order.json?products%5B%5D=921728736&products%5B%5D=632910392") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_21() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/482865238/order.json?sort_order=alpha-desc") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = smart_collection = ShopifyAPI::SmartCollection.new + smart_collection.id = 482865238 + smart_collection.order( + sort_order: "alpha-desc", + ) + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/smart_collections/482865238/order.json?sort_order=alpha-desc") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/storefront_access_token_test.rb b/test/rest/2024_10/storefront_access_token_test.rb new file mode 100644 index 00000000..99a4cad9 --- /dev/null +++ b/test/rest/2024_10/storefront_access_token_test.rb @@ -0,0 +1,126 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class StorefrontAccessToken202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/storefront_access_tokens.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "storefront_access_token" => hash_including({"title" => "Test"}) } + ) + .to_return(status: 200, body: JSON.generate({"storefront_access_token" => {"access_token" => "7090105cc04395f77b17ccb255355d0d", "access_scope" => "unauthenticated_read_product_listings", "created_at" => "2024-10-02T09:30:10-05:00", "id" => 1003304090, "admin_graphql_api_id" => "gid://shopify/StorefrontAccessToken/1003304090", "title" => "Test"}}), headers: {}) + + response = storefront_access_token = ShopifyAPI::StorefrontAccessToken.new + storefront_access_token.title = "Test" + storefront_access_token.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/storefront_access_tokens.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/storefront_access_tokens.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"storefront_access_tokens" => [{"access_token" => "378d95641257a4ab3feff967ee234f4d", "access_scope" => "unauthenticated_read_product_listings", "created_at" => "2024-10-02T09:28:43-05:00", "id" => 755357713, "admin_graphql_api_id" => "gid://shopify/StorefrontAccessToken/755357713", "title" => "API Client Extension"}]}), headers: {}) + + response = ShopifyAPI::StorefrontAccessToken.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/storefront_access_tokens.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/storefront_access_tokens/755357713.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::StorefrontAccessToken.delete( + id: 755357713, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/storefront_access_tokens/755357713.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/tender_transaction_test.rb b/test/rest/2024_10/tender_transaction_test.rb new file mode 100644 index 00000000..f1baf093 --- /dev/null +++ b/test/rest/2024_10/tender_transaction_test.rb @@ -0,0 +1,222 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class TenderTransaction202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/tender_transactions.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"tender_transactions" => [{"id" => 1011222837, "order_id" => 450789469, "amount" => "250.94", "currency" => "USD", "user_id" => nil, "test" => false, "processed_at" => "2005-08-07T10:22:51-04:00", "remote_reference" => "authorization-key", "payment_details" => nil, "payment_method" => "credit_card"}, {"id" => 1011222836, "order_id" => 450789469, "amount" => "250.94", "currency" => "USD", "user_id" => nil, "test" => false, "processed_at" => "2005-08-05T10:22:51-04:00", "remote_reference" => "authorization-key", "payment_details" => nil, "payment_method" => "credit_card"}]}), headers: {}) + + response = ShopifyAPI::TenderTransaction.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/tender_transactions.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/tender_transactions.json?since_id=1011222828") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"tender_transactions" => [{"id" => 1011222829, "order_id" => 450789469, "amount" => "250.94", "currency" => "USD", "user_id" => nil, "test" => false, "processed_at" => "2005-08-07T10:22:51-04:00", "remote_reference" => "authorization-key", "payment_details" => nil, "payment_method" => "credit_card"}]}), headers: {}) + + response = ShopifyAPI::TenderTransaction.all( + since_id: "1011222828", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/tender_transactions.json?since_id=1011222828") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/tender_transactions.json?order=processed_at+ASC") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"tender_transactions" => [{"id" => 1011222830, "order_id" => 450789469, "amount" => "250.94", "currency" => "USD", "user_id" => nil, "test" => false, "processed_at" => "2005-08-05T10:22:51-04:00", "remote_reference" => "authorization-key", "payment_details" => nil, "payment_method" => "credit_card"}, {"id" => 1011222831, "order_id" => 450789469, "amount" => "250.94", "currency" => "USD", "user_id" => nil, "test" => false, "processed_at" => "2005-08-07T10:22:51-04:00", "remote_reference" => "authorization-key", "payment_details" => nil, "payment_method" => "credit_card"}]}), headers: {}) + + response = ShopifyAPI::TenderTransaction.all( + order: "processed_at ASC", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/tender_transactions.json?order=processed_at+ASC") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/tender_transactions.json?processed_at_min=2005-08-06+10%3A22%3A51+-0400") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"tender_transactions" => [{"id" => 1011222833, "order_id" => 450789469, "amount" => "250.94", "currency" => "USD", "user_id" => nil, "test" => false, "processed_at" => "2005-08-07T10:22:51-04:00", "remote_reference" => "authorization-key", "payment_details" => nil, "payment_method" => "credit_card"}]}), headers: {}) + + response = ShopifyAPI::TenderTransaction.all( + processed_at_min: "2005-08-06 10:22:51 -0400", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/tender_transactions.json?processed_at_min=2005-08-06+10%3A22%3A51+-0400") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/tender_transactions.json?processed_at_max=2005-08-06+10%3A22%3A51+-0400") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"tender_transactions" => [{"id" => 1011222826, "order_id" => 450789469, "amount" => "250.94", "currency" => "USD", "user_id" => nil, "test" => false, "processed_at" => "2005-08-05T10:22:51-04:00", "remote_reference" => "authorization-key", "payment_details" => nil, "payment_method" => "credit_card"}]}), headers: {}) + + response = ShopifyAPI::TenderTransaction.all( + processed_at_max: "2005-08-06 10:22:51 -0400", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/tender_transactions.json?processed_at_max=2005-08-06+10%3A22%3A51+-0400") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/tender_transactions.json?processed_at_max=2005-08-05+10%3A22%3A51+-0400") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"tender_transactions" => [{"id" => 1011222834, "order_id" => 450789469, "amount" => "250.94", "currency" => "USD", "user_id" => nil, "test" => false, "processed_at" => "2005-08-05T10:22:51-04:00", "remote_reference" => "authorization-key", "payment_details" => nil, "payment_method" => "credit_card"}]}), headers: {}) + + response = ShopifyAPI::TenderTransaction.all( + processed_at_max: "2005-08-05 10:22:51 -0400", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/tender_transactions.json?processed_at_max=2005-08-05+10%3A22%3A51+-0400") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/theme_test.rb b/test/rest/2024_10/theme_test.rb new file mode 100644 index 00000000..8e813739 --- /dev/null +++ b/test/rest/2024_10/theme_test.rb @@ -0,0 +1,226 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Theme202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/themes.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"themes" => [{"id" => 828155753, "name" => "Comfort", "created_at" => "2024-10-02T08:56:04-05:00", "updated_at" => "2024-10-02T08:56:04-05:00", "role" => "main", "theme_store_id" => nil, "previewable" => true, "processing" => false, "admin_graphql_api_id" => "gid://shopify/Theme/828155753"}, {"id" => 976877075, "name" => "Preview of Parallax", "created_at" => "2024-10-02T08:56:04-05:00", "updated_at" => "2024-10-02T08:56:04-05:00", "role" => "demo", "theme_store_id" => 688, "previewable" => true, "processing" => false, "admin_graphql_api_id" => "gid://shopify/Theme/976877075"}, {"id" => 752253240, "name" => "Sandbox", "created_at" => "2024-10-02T08:56:04-05:00", "updated_at" => "2024-10-02T08:56:04-05:00", "role" => "unpublished", "theme_store_id" => nil, "previewable" => true, "processing" => false, "admin_graphql_api_id" => "gid://shopify/Theme/752253240"}]}), headers: {}) + + response = ShopifyAPI::Theme.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/themes.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/themes.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "theme" => hash_including({"name" => "Lemongrass", "src" => "http://themes.shopify.com/theme.zip", "role" => "main"}) } + ) + .to_return(status: 200, body: JSON.generate({"theme" => {"id" => 1049083723, "name" => "Lemongrass", "created_at" => "2024-10-02T08:58:34-05:00", "updated_at" => "2024-10-02T08:58:34-05:00", "role" => "unpublished", "theme_store_id" => nil, "previewable" => false, "processing" => true, "admin_graphql_api_id" => "gid://shopify/Theme/1049083723"}}), headers: {}) + + response = theme = ShopifyAPI::Theme.new + theme.name = "Lemongrass" + theme.src = "http://themes.shopify.com/theme.zip" + theme.role = "main" + theme.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/themes.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/themes/828155753.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"theme" => {"id" => 828155753, "name" => "Comfort", "created_at" => "2024-10-02T08:56:04-05:00", "updated_at" => "2024-10-02T08:56:04-05:00", "role" => "main", "theme_store_id" => nil, "previewable" => true, "processing" => false, "admin_graphql_api_id" => "gid://shopify/Theme/828155753"}}), headers: {}) + + response = ShopifyAPI::Theme.find( + id: 828155753, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/themes/828155753.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/themes/752253240.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "theme" => hash_including({"role" => "main"}) } + ) + .to_return(status: 200, body: JSON.generate({"theme" => {"role" => "main", "id" => 752253240, "name" => "Sandbox", "created_at" => "2024-10-02T08:56:04-05:00", "updated_at" => "2024-10-02T08:58:30-05:00", "theme_store_id" => nil, "previewable" => true, "processing" => false, "admin_graphql_api_id" => "gid://shopify/Theme/752253240"}}), headers: {}) + + response = theme = ShopifyAPI::Theme.new + theme.id = 752253240 + theme.role = "main" + theme.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/themes/752253240.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/themes/752253240.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "theme" => hash_including({"name" => "Experimental"}) } + ) + .to_return(status: 200, body: JSON.generate({"theme" => {"name" => "Experimental", "role" => "unpublished", "id" => 752253240, "created_at" => "2024-10-02T08:56:04-05:00", "updated_at" => "2024-10-02T08:58:31-05:00", "theme_store_id" => nil, "previewable" => true, "processing" => false, "admin_graphql_api_id" => "gid://shopify/Theme/752253240"}}), headers: {}) + + response = theme = ShopifyAPI::Theme.new + theme.id = 752253240 + theme.name = "Experimental" + theme.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/themes/752253240.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/themes/752253240.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"id" => 752253240, "name" => "Sandbox", "created_at" => "2024-10-02T08:56:04-05:00", "updated_at" => "2024-10-02T08:56:04-05:00", "role" => "unpublished", "theme_store_id" => nil, "previewable" => true, "processing" => false, "admin_graphql_api_id" => "gid://shopify/Theme/752253240"}), headers: {}) + + response = ShopifyAPI::Theme.delete( + id: 752253240, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/themes/752253240.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/transaction_test.rb b/test/rest/2024_10/transaction_test.rb new file mode 100644 index 00000000..81c41155 --- /dev/null +++ b/test/rest/2024_10/transaction_test.rb @@ -0,0 +1,305 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Transaction202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/transactions.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"transactions" => [{"id" => 179259969, "order_id" => 450789469, "kind" => "refund", "gateway" => "bogus", "status" => "success", "message" => nil, "created_at" => "2005-08-05T12:59:12-04:00", "test" => false, "authorization" => "authorization-key", "location_id" => nil, "user_id" => nil, "parent_id" => 801038806, "processed_at" => "2005-08-05T12:59:12-04:00", "device_id" => nil, "error_code" => nil, "source_name" => "web", "receipt" => {}, "currency_exchange_adjustment" => nil, "amount" => "209.00", "currency" => "USD", "payment_id" => "#1001.3", "total_unsettled_set" => {"presentment_money" => {"amount" => "348.0", "currency" => "USD"}, "shop_money" => {"amount" => "348.0", "currency" => "USD"}}, "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/179259969"}, {"id" => 389404469, "order_id" => 450789469, "kind" => "authorization", "gateway" => "bogus", "status" => "success", "message" => nil, "created_at" => "2005-08-01T11:57:11-04:00", "test" => false, "authorization" => "authorization-key", "location_id" => nil, "user_id" => nil, "parent_id" => nil, "processed_at" => "2005-08-01T11:57:11-04:00", "device_id" => nil, "error_code" => nil, "source_name" => "web", "payment_details" => {"credit_card_bin" => nil, "avs_result_code" => nil, "cvv_result_code" => nil, "credit_card_number" => "\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 4242", "credit_card_company" => "Visa", "buyer_action_info" => nil, "credit_card_name" => nil, "credit_card_wallet" => nil, "credit_card_expiration_month" => nil, "credit_card_expiration_year" => nil, "payment_method_name" => "visa"}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "currency_exchange_adjustment" => nil, "amount" => "598.94", "currency" => "USD", "payment_id" => "#1001.1", "total_unsettled_set" => {"presentment_money" => {"amount" => "348.0", "currency" => "USD"}, "shop_money" => {"amount" => "348.0", "currency" => "USD"}}, "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/389404469"}, {"id" => 801038806, "order_id" => 450789469, "kind" => "capture", "gateway" => "bogus", "status" => "success", "message" => nil, "created_at" => "2005-08-05T10:22:51-04:00", "test" => false, "authorization" => "authorization-key", "location_id" => nil, "user_id" => nil, "parent_id" => 389404469, "processed_at" => "2005-08-05T10:22:51-04:00", "device_id" => nil, "error_code" => nil, "source_name" => "web", "receipt" => {}, "currency_exchange_adjustment" => nil, "amount" => "250.94", "currency" => "USD", "payment_id" => "#1001.2", "total_unsettled_set" => {"presentment_money" => {"amount" => "348.0", "currency" => "USD"}, "shop_money" => {"amount" => "348.0", "currency" => "USD"}}, "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/801038806"}]}), headers: {}) + + response = ShopifyAPI::Transaction.all( + order_id: 450789469, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/transactions.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/transactions.json?since_id=801038806") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"transactions" => [{"id" => 1068278466, "order_id" => 450789469, "kind" => "capture", "gateway" => "bogus", "status" => "success", "message" => "Bogus Gateway: Forced success", "created_at" => "2024-10-02T08:57:35-05:00", "test" => true, "authorization" => nil, "location_id" => nil, "user_id" => nil, "parent_id" => 389404469, "processed_at" => "2024-10-02T08:57:35-05:00", "device_id" => nil, "error_code" => nil, "source_name" => "755357713", "payment_details" => {"credit_card_bin" => nil, "avs_result_code" => nil, "cvv_result_code" => nil, "credit_card_number" => "\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 4242", "credit_card_company" => "Visa", "buyer_action_info" => nil, "credit_card_name" => nil, "credit_card_wallet" => nil, "credit_card_expiration_month" => nil, "credit_card_expiration_year" => nil, "payment_method_name" => "visa"}, "receipt" => {}, "currency_exchange_adjustment" => nil, "amount" => "10.00", "currency" => "USD", "payment_id" => "c901414060.1", "total_unsettled_set" => {"presentment_money" => {"amount" => "338.0", "currency" => "USD"}, "shop_money" => {"amount" => "338.0", "currency" => "USD"}}, "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/1068278466"}]}), headers: {}) + + response = ShopifyAPI::Transaction.all( + order_id: 450789469, + since_id: "801038806", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/transactions.json?since_id=801038806") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/transactions.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "transaction" => hash_including({"currency" => "USD", "amount" => "10.00", "kind" => "capture", "parent_id" => 389404469}) } + ) + .to_return(status: 200, body: JSON.generate({"transaction" => {"id" => 1068278465, "order_id" => 450789469, "kind" => "capture", "gateway" => "bogus", "status" => "success", "message" => "Bogus Gateway: Forced success", "created_at" => "2024-10-02T08:57:35-05:00", "test" => true, "authorization" => nil, "location_id" => nil, "user_id" => nil, "parent_id" => 389404469, "processed_at" => "2024-10-02T08:57:35-05:00", "device_id" => nil, "error_code" => nil, "source_name" => "755357713", "payment_details" => {"credit_card_bin" => nil, "avs_result_code" => nil, "cvv_result_code" => nil, "credit_card_number" => "\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 4242", "credit_card_company" => "Visa", "buyer_action_info" => nil, "credit_card_name" => nil, "credit_card_wallet" => nil, "credit_card_expiration_month" => nil, "credit_card_expiration_year" => nil, "payment_method_name" => "visa"}, "receipt" => {}, "currency_exchange_adjustment" => nil, "amount" => "10.00", "currency" => "USD", "payment_id" => "c901414060.1", "total_unsettled_set" => {"presentment_money" => {"amount" => "588.94", "currency" => "USD"}, "shop_money" => {"amount" => "588.94", "currency" => "USD"}}, "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/1068278465"}}), headers: {}) + + response = transaction = ShopifyAPI::Transaction.new + transaction.order_id = 450789469 + transaction.currency = "USD" + transaction.amount = "10.00" + transaction.kind = "capture" + transaction.parent_id = 389404469 + transaction.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/transactions.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/transactions.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "transaction" => hash_including({"kind" => "capture", "authorization" => "authorization-key"}) } + ) + .to_return(status: 200, body: JSON.generate({"transaction" => {"id" => 1068278482, "order_id" => 450789469, "kind" => "capture", "gateway" => "bogus", "status" => "success", "message" => "Bogus Gateway: Forced success", "created_at" => "2024-10-02T08:57:55-05:00", "test" => true, "authorization" => nil, "location_id" => nil, "user_id" => nil, "parent_id" => 389404469, "processed_at" => "2024-10-02T08:57:55-05:00", "device_id" => nil, "error_code" => nil, "source_name" => "755357713", "payment_details" => {"credit_card_bin" => nil, "avs_result_code" => nil, "cvv_result_code" => nil, "credit_card_number" => "\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 4242", "credit_card_company" => "Visa", "buyer_action_info" => nil, "credit_card_name" => nil, "credit_card_wallet" => nil, "credit_card_expiration_month" => nil, "credit_card_expiration_year" => nil, "payment_method_name" => "visa"}, "receipt" => {}, "currency_exchange_adjustment" => nil, "amount" => "598.94", "currency" => "USD", "payment_id" => "c901414060.1", "total_unsettled_set" => {"presentment_money" => {"amount" => "0.0", "currency" => "USD"}, "shop_money" => {"amount" => "0.0", "currency" => "USD"}}, "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/1068278482"}}), headers: {}) + + response = transaction = ShopifyAPI::Transaction.new + transaction.order_id = 450789469 + transaction.kind = "capture" + transaction.authorization = "authorization-key" + transaction.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/transactions.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/transactions.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "transaction" => hash_including({"currency" => "USD", "amount" => "10.00", "kind" => "capture", "parent_id" => 389404469, "test" => true}) } + ) + .to_return(status: 200, body: JSON.generate({"transaction" => {"id" => 1068278479, "order_id" => 450789469, "kind" => "capture", "gateway" => "bogus", "status" => "success", "message" => "Bogus Gateway: Forced success", "created_at" => "2024-10-02T08:57:52-05:00", "test" => true, "authorization" => nil, "location_id" => nil, "user_id" => nil, "parent_id" => 389404469, "processed_at" => "2024-10-02T08:57:52-05:00", "device_id" => nil, "error_code" => nil, "source_name" => "755357713", "payment_details" => {"credit_card_bin" => nil, "avs_result_code" => nil, "cvv_result_code" => nil, "credit_card_number" => "\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 4242", "credit_card_company" => "Visa", "buyer_action_info" => nil, "credit_card_name" => nil, "credit_card_wallet" => nil, "credit_card_expiration_month" => nil, "credit_card_expiration_year" => nil, "payment_method_name" => "visa"}, "receipt" => {}, "currency_exchange_adjustment" => nil, "amount" => "10.00", "currency" => "USD", "payment_id" => "c901414060.1", "total_unsettled_set" => {"presentment_money" => {"amount" => "588.94", "currency" => "USD"}, "shop_money" => {"amount" => "588.94", "currency" => "USD"}}, "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/1068278479"}}), headers: {}) + + response = transaction = ShopifyAPI::Transaction.new + transaction.order_id = 450789469 + transaction.currency = "USD" + transaction.amount = "10.00" + transaction.kind = "capture" + transaction.parent_id = 389404469 + transaction.test = true + transaction.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/transactions.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/transactions.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "transaction" => hash_including({"currency" => "USD", "amount" => "10.00", "kind" => "void", "parent_id" => 389404469}) } + ) + .to_return(status: 200, body: JSON.generate({"transaction" => {"id" => 1068278475, "order_id" => 450789469, "kind" => "void", "gateway" => "bogus", "status" => "success", "message" => "Bogus Gateway: Forced success", "created_at" => "2024-10-02T08:57:48-05:00", "test" => true, "authorization" => nil, "location_id" => nil, "user_id" => nil, "parent_id" => 389404469, "processed_at" => "2024-10-02T08:57:48-05:00", "device_id" => nil, "error_code" => nil, "source_name" => "755357713", "payment_details" => {"credit_card_bin" => nil, "avs_result_code" => nil, "cvv_result_code" => nil, "credit_card_number" => "\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 4242", "credit_card_company" => "Visa", "buyer_action_info" => nil, "credit_card_name" => nil, "credit_card_wallet" => nil, "credit_card_expiration_month" => nil, "credit_card_expiration_year" => nil, "payment_method_name" => "visa"}, "receipt" => {}, "currency_exchange_adjustment" => nil, "amount" => "0.00", "currency" => "USD", "payment_id" => "c901414060.1", "total_unsettled_set" => {"presentment_money" => {"amount" => "0.0", "currency" => "USD"}, "shop_money" => {"amount" => "0.0", "currency" => "USD"}}, "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/1068278475"}}), headers: {}) + + response = transaction = ShopifyAPI::Transaction.new + transaction.order_id = 450789469 + transaction.currency = "USD" + transaction.amount = "10.00" + transaction.kind = "void" + transaction.parent_id = 389404469 + transaction.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/transactions.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/transactions/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 3}), headers: {}) + + response = ShopifyAPI::Transaction.count( + order_id: 450789469, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/transactions/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/transactions/389404469.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"transaction" => {"id" => 389404469, "order_id" => 450789469, "kind" => "authorization", "gateway" => "bogus", "status" => "success", "message" => nil, "created_at" => "2005-08-01T11:57:11-04:00", "test" => false, "authorization" => "authorization-key", "location_id" => nil, "user_id" => nil, "parent_id" => nil, "processed_at" => "2005-08-01T11:57:11-04:00", "device_id" => nil, "error_code" => nil, "source_name" => "web", "payment_details" => {"credit_card_bin" => nil, "avs_result_code" => nil, "cvv_result_code" => nil, "credit_card_number" => "\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 4242", "credit_card_company" => "Visa", "buyer_action_info" => nil, "credit_card_name" => nil, "credit_card_wallet" => nil, "credit_card_expiration_month" => nil, "credit_card_expiration_year" => nil, "payment_method_name" => "visa"}, "receipt" => {"testcase" => true, "authorization" => "123456"}, "currency_exchange_adjustment" => nil, "amount" => "598.94", "currency" => "USD", "authorization_expires_at" => nil, "extended_authorization_attributes" => {}, "payment_id" => "#1001.1", "total_unsettled_set" => {"presentment_money" => {"amount" => "348.0", "currency" => "USD"}, "shop_money" => {"amount" => "348.0", "currency" => "USD"}}, "manual_payment_gateway" => false, "admin_graphql_api_id" => "gid://shopify/OrderTransaction/389404469"}}), headers: {}) + + response = ShopifyAPI::Transaction.find( + order_id: 450789469, + id: 389404469, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/orders/450789469/transactions/389404469.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/usage_charge_test.rb b/test/rest/2024_10/usage_charge_test.rb new file mode 100644 index 00000000..9f4e4a88 --- /dev/null +++ b/test/rest/2024_10/usage_charge_test.rb @@ -0,0 +1,131 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class UsageCharge202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges/455696195/usage_charges.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "usage_charge" => hash_including({"description" => "Super Mega Plan 1000 emails", "price" => "1.00"}) } + ) + .to_return(status: 200, body: JSON.generate({"usage_charge" => {"id" => 1034618213, "description" => "Super Mega Plan 1000 emails", "price" => "1.00", "created_at" => "2024-10-02T09:31:50-05:00", "currency" => "USD", "balance_used" => 11.0, "balance_remaining" => 89.0, "risk_level" => 0}}), headers: {}) + + response = usage_charge = ShopifyAPI::UsageCharge.new + usage_charge.recurring_application_charge_id = 455696195 + usage_charge.description = "Super Mega Plan 1000 emails" + usage_charge.price = "1.00" + usage_charge.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges/455696195/usage_charges.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges/455696195/usage_charges.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"usage_charges" => [{"id" => 1034618206, "description" => "Super Mega Plan Add-ons", "price" => "10.00", "created_at" => "2024-10-02T09:31:46-05:00", "currency" => "USD", "balance_used" => 10.0, "balance_remaining" => 90.0, "risk_level" => 0}]}), headers: {}) + + response = ShopifyAPI::UsageCharge.all( + recurring_application_charge_id: 455696195, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges/455696195/usage_charges.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges/455696195/usage_charges/1034618211.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"usage_charge" => {"id" => 1034618211, "description" => "Super Mega Plan Add-ons", "price" => "10.00", "created_at" => "2024-10-02T09:31:49-05:00", "currency" => "USD", "balance_used" => 10.0, "balance_remaining" => 90.0, "risk_level" => 0}}), headers: {}) + + response = ShopifyAPI::UsageCharge.find( + recurring_application_charge_id: 455696195, + id: 1034618211, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/recurring_application_charges/455696195/usage_charges/1034618211.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/user_test.rb b/test/rest/2024_10/user_test.rb new file mode 100644 index 00000000..0beeb8df --- /dev/null +++ b/test/rest/2024_10/user_test.rb @@ -0,0 +1,124 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class User202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/users.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"users" => [{"id" => 548380009, "first_name" => "John", "email" => "j.smith@example.com", "url" => "www.example.com", "im" => nil, "screen_name" => nil, "phone" => nil, "last_name" => "Smith", "account_owner" => true, "receive_announcements" => 1, "bio" => nil, "permissions" => ["applications", "beacons", "billing_application_charges", "channels", "content", "content_entries_delete", "content_entries_edit", "content_entries_view", "content_models_delete", "content_models_edit", "content_models_view", "create_store_credit_account_transactions", "custom_pixels_management", "custom_pixels_view", "customers", "dashboard", "delete_products", "domains", "draft_orders", "create_and_edit_draft_orders", "apply_discounts_to_draft_orders", "mark_draft_orders_as_paid", "set_payment_terms_for_draft_orders", "delete_draft_orders", "edit_orders", "edit_private_apps", "edit_product_cost", "edit_product_price", "edit_theme_code", "gift_cards", "links", "locations", "manage_delivery_settings", "manage_inventory", "manage_policies", "manage_product_tags", "manage_products", "manage_store_credit_settings", "manage_taxes_settings", "marketing", "marketing_section", "metaobjects_delete", "metaobjects_edit", "metaobjects_view", "metaobject_definitions_delete", "metaobject_definitions_edit", "metaobject_definitions_view", "merge_customers", "orders", "overviews", "pages", "pay_draft_orders_by_credit_card", "pay_orders_by_credit_card", "pay_orders_by_vaulted_card", "preferences", "products", "refund_orders", "reports", "translations", "themes", "view_all_shopify_credit_transactions", "view_balance_bank_accounts", "view_private_apps", "view_product_costs", "view_store_credit_account_transactions", "apply_discounts_to_orders", "fulfill_and_ship_orders", "buy_shipping_labels", "return_orders", "manage_abandoned_checkouts", "cancel_orders", "delete_orders", "manage_orders_information", "set_payment_terms_for_orders", "mark_orders_as_paid", "capture_payments_for_orders", "view_companies", "create_and_edit_companies", "delete_companies", "manage_company_location_assignments", "third_party_money_movement", "export_customers", "export_draft_orders", "export_orders", "export_products", "shopify_payments_accounts", "shopify_payments_transfers", "staff_audit_log_view", "staff_management_update", "applications_billing", "attestation_authority", "authentication_management", "balance_bank_accounts_management", "billing_charges", "billing_invoices_pay", "billing_invoices_view", "billing_payment_methods_manage", "billing_payment_methods_view", "billing_settings", "billing_subscriptions", "capital", "customer_private_data", "erase_customer_data", "request_customer_data", "domains_management", "domains_transfer_out", "enable_private_apps", "experiments_management", "manage_all_shopify_credit_cards", "manage_tap_to_pay", "payment_settings", "upgrade_to_plus_plan", "shopify_payments", "sqlite_bulk_data_transfer", "staff_api_permission_management", "staff_management", "staff_management_activation", "staff_management_create", "staff_management_delete", "support_methods", "collaborator_request_management", "collaborator_request_settings", "view_price_lists", "delete_price_lists", "create_and_edit_price_lists", "view_catalogs", "delete_catalogs", "create_and_edit_catalogs"], "locale" => "en", "user_type" => "regular", "admin_graphql_api_id" => "gid://shopify/AdminUserSerializer/548380009", "tfa_enabled?" => false}, {"id" => 930143300, "first_name" => "John", "email" => "j.limited@example.com", "url" => "www.example.com", "im" => nil, "screen_name" => nil, "phone" => nil, "last_name" => "Limited", "account_owner" => false, "receive_announcements" => 1, "bio" => nil, "permissions" => [], "locale" => "en", "user_type" => "regular", "admin_graphql_api_id" => "gid://shopify/AdminUserSerializer/930143300", "tfa_enabled?" => false}]}), headers: {}) + + response = ShopifyAPI::User.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/users.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/users/548380009.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"user" => {"id" => 548380009, "first_name" => "John", "email" => "j.smith@example.com", "url" => "www.example.com", "im" => nil, "screen_name" => nil, "phone" => nil, "last_name" => "Smith", "account_owner" => true, "receive_announcements" => 1, "bio" => nil, "permissions" => ["applications", "beacons", "billing_application_charges", "channels", "content", "content_entries_delete", "content_entries_edit", "content_entries_view", "content_models_delete", "content_models_edit", "content_models_view", "create_store_credit_account_transactions", "custom_pixels_management", "custom_pixels_view", "customers", "dashboard", "delete_products", "domains", "draft_orders", "create_and_edit_draft_orders", "apply_discounts_to_draft_orders", "mark_draft_orders_as_paid", "set_payment_terms_for_draft_orders", "delete_draft_orders", "edit_orders", "edit_private_apps", "edit_product_cost", "edit_product_price", "edit_theme_code", "gift_cards", "links", "locations", "manage_delivery_settings", "manage_inventory", "manage_policies", "manage_product_tags", "manage_products", "manage_store_credit_settings", "manage_taxes_settings", "marketing", "marketing_section", "metaobjects_delete", "metaobjects_edit", "metaobjects_view", "metaobject_definitions_delete", "metaobject_definitions_edit", "metaobject_definitions_view", "merge_customers", "orders", "overviews", "pages", "pay_draft_orders_by_credit_card", "pay_orders_by_credit_card", "pay_orders_by_vaulted_card", "preferences", "products", "refund_orders", "reports", "translations", "themes", "view_all_shopify_credit_transactions", "view_balance_bank_accounts", "view_private_apps", "view_product_costs", "view_store_credit_account_transactions", "apply_discounts_to_orders", "fulfill_and_ship_orders", "buy_shipping_labels", "return_orders", "manage_abandoned_checkouts", "cancel_orders", "delete_orders", "manage_orders_information", "set_payment_terms_for_orders", "mark_orders_as_paid", "capture_payments_for_orders", "view_companies", "create_and_edit_companies", "delete_companies", "manage_company_location_assignments", "third_party_money_movement", "export_customers", "export_draft_orders", "export_orders", "export_products", "shopify_payments_accounts", "shopify_payments_transfers", "staff_audit_log_view", "staff_management_update", "applications_billing", "attestation_authority", "authentication_management", "balance_bank_accounts_management", "billing_charges", "billing_invoices_pay", "billing_invoices_view", "billing_payment_methods_manage", "billing_payment_methods_view", "billing_settings", "billing_subscriptions", "capital", "customer_private_data", "erase_customer_data", "request_customer_data", "domains_management", "domains_transfer_out", "enable_private_apps", "experiments_management", "manage_all_shopify_credit_cards", "manage_tap_to_pay", "payment_settings", "upgrade_to_plus_plan", "shopify_payments", "sqlite_bulk_data_transfer", "staff_api_permission_management", "staff_management", "staff_management_activation", "staff_management_create", "staff_management_delete", "support_methods", "collaborator_request_management", "collaborator_request_settings", "view_price_lists", "delete_price_lists", "create_and_edit_price_lists", "view_catalogs", "delete_catalogs", "create_and_edit_catalogs"], "locale" => "en", "user_type" => "regular", "admin_graphql_api_id" => "gid://shopify/AdminUserSerializer/548380009", "tfa_enabled?" => false}}), headers: {}) + + response = ShopifyAPI::User.find( + id: 548380009, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/users/548380009.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/users/current.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"user" => {"id" => 548380009, "first_name" => "John", "email" => "j.smith@example.com", "url" => "www.example.com", "im" => nil, "screen_name" => nil, "phone" => nil, "last_name" => "Smith", "account_owner" => true, "receive_announcements" => 1, "bio" => nil, "permissions" => ["applications", "beacons", "billing_application_charges", "channels", "content", "content_entries_delete", "content_entries_edit", "content_entries_view", "content_models_delete", "content_models_edit", "content_models_view", "create_store_credit_account_transactions", "custom_pixels_management", "custom_pixels_view", "customers", "dashboard", "delete_products", "domains", "draft_orders", "create_and_edit_draft_orders", "apply_discounts_to_draft_orders", "mark_draft_orders_as_paid", "set_payment_terms_for_draft_orders", "delete_draft_orders", "edit_orders", "edit_private_apps", "edit_product_cost", "edit_product_price", "edit_theme_code", "gift_cards", "links", "locations", "manage_delivery_settings", "manage_inventory", "manage_policies", "manage_product_tags", "manage_products", "manage_store_credit_settings", "manage_taxes_settings", "marketing", "marketing_section", "metaobjects_delete", "metaobjects_edit", "metaobjects_view", "metaobject_definitions_delete", "metaobject_definitions_edit", "metaobject_definitions_view", "merge_customers", "orders", "overviews", "pages", "pay_draft_orders_by_credit_card", "pay_orders_by_credit_card", "pay_orders_by_vaulted_card", "preferences", "products", "refund_orders", "reports", "translations", "themes", "view_all_shopify_credit_transactions", "view_balance_bank_accounts", "view_private_apps", "view_product_costs", "view_store_credit_account_transactions", "apply_discounts_to_orders", "fulfill_and_ship_orders", "buy_shipping_labels", "return_orders", "manage_abandoned_checkouts", "cancel_orders", "delete_orders", "manage_orders_information", "set_payment_terms_for_orders", "mark_orders_as_paid", "capture_payments_for_orders", "view_companies", "create_and_edit_companies", "delete_companies", "manage_company_location_assignments", "third_party_money_movement", "export_customers", "export_draft_orders", "export_orders", "export_products", "shopify_payments_accounts", "shopify_payments_transfers", "staff_audit_log_view", "staff_management_update", "applications_billing", "attestation_authority", "authentication_management", "balance_bank_accounts_management", "billing_charges", "billing_invoices_pay", "billing_invoices_view", "billing_payment_methods_manage", "billing_payment_methods_view", "billing_settings", "billing_subscriptions", "capital", "customer_private_data", "erase_customer_data", "request_customer_data", "domains_management", "domains_transfer_out", "enable_private_apps", "experiments_management", "manage_all_shopify_credit_cards", "manage_tap_to_pay", "payment_settings", "upgrade_to_plus_plan", "shopify_payments", "sqlite_bulk_data_transfer", "staff_api_permission_management", "staff_management", "staff_management_activation", "staff_management_create", "staff_management_delete", "support_methods", "collaborator_request_management", "collaborator_request_settings", "view_price_lists", "delete_price_lists", "create_and_edit_price_lists", "view_catalogs", "delete_catalogs", "create_and_edit_catalogs"], "locale" => "en", "user_type" => "regular", "admin_graphql_api_id" => "gid://shopify/AdminUserSerializer/548380009", "tfa_enabled?" => false}}), headers: {}) + + response = ShopifyAPI::User.current + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/users/current.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/variant_test.rb b/test/rest/2024_10/variant_test.rb new file mode 100644 index 00000000..dd095978 --- /dev/null +++ b/test/rest/2024_10/variant_test.rb @@ -0,0 +1,443 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Variant202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/variants.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"variants" => [{"id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"}, {"id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"}, {"id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"}, {"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}]}), headers: {}) + + response = ShopifyAPI::Variant.all( + product_id: 632910392, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/variants.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/variants.json?since_id=49148385") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"variants" => [{"id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"}, {"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}]}), headers: {}) + + response = ShopifyAPI::Variant.all( + product_id: 632910392, + since_id: "49148385", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/variants.json?since_id=49148385") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/variants.json?presentment_currencies=USD%2CCAD") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"variants" => [{"id" => 39072856, "product_id" => 632910392, "title" => "Green", "price" => "199.00", "sku" => "IPOD2008GREEN", "position" => 3, "inventory_policy" => "continue", "compare_at_price" => "249.00", "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Green", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_green", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 39072856, "inventory_quantity" => 30, "old_inventory_quantity" => 30, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => {"amount" => "249.00", "currency_code" => "USD"}}, {"price" => {"amount" => "249.00", "currency_code" => "CAD"}, "compare_at_price" => {"amount" => "312.00", "currency_code" => "CAD"}}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/39072856"}, {"id" => 49148385, "product_id" => 632910392, "title" => "Red", "price" => "199.00", "sku" => "IPOD2008RED", "position" => 2, "inventory_policy" => "continue", "compare_at_price" => "249.00", "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Red", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_red", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 49148385, "inventory_quantity" => 20, "old_inventory_quantity" => 20, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => {"amount" => "249.00", "currency_code" => "USD"}}, {"price" => {"amount" => "249.00", "currency_code" => "CAD"}, "compare_at_price" => {"amount" => "312.00", "currency_code" => "CAD"}}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/49148385"}, {"id" => 457924702, "product_id" => 632910392, "title" => "Black", "price" => "199.00", "sku" => "IPOD2008BLACK", "position" => 4, "inventory_policy" => "continue", "compare_at_price" => "249.00", "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Black", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_black", "grams" => 567, "image_id" => nil, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 457924702, "inventory_quantity" => 40, "old_inventory_quantity" => 40, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => {"amount" => "249.00", "currency_code" => "USD"}}, {"price" => {"amount" => "249.00", "currency_code" => "CAD"}, "compare_at_price" => {"amount" => "312.00", "currency_code" => "CAD"}}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/457924702"}, {"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => "249.00", "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => {"amount" => "249.00", "currency_code" => "USD"}}, {"price" => {"amount" => "249.00", "currency_code" => "CAD"}, "compare_at_price" => {"amount" => "312.00", "currency_code" => "CAD"}}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}]}), headers: {}) + + response = ShopifyAPI::Variant.all( + product_id: 632910392, + presentment_currencies: "USD,CAD", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/variants.json?presentment_currencies=USD%2CCAD") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/variants.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "variant" => hash_including({"option1" => "Yellow", "price" => "1.00"}) } + ) + .to_return(status: 200, body: JSON.generate({"variant" => {"id" => 1070325039, "product_id" => 632910392, "title" => "Yellow", "price" => "1.00", "sku" => "", "position" => 5, "inventory_policy" => "deny", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Yellow", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T09:12:05-05:00", "updated_at" => "2024-10-02T09:12:05-05:00", "taxable" => true, "barcode" => nil, "grams" => 0, "image_id" => nil, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325039, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [{"price" => {"amount" => "1.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325039"}}), headers: {}) + + response = variant = ShopifyAPI::Variant.new + variant.product_id = 632910392 + variant.option1 = "Yellow" + variant.price = "1.00" + variant.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/variants.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/variants.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "variant" => hash_including({"option1" => "Blue", "metafields" => [{"key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"variant" => {"id" => 1070325040, "product_id" => 632910392, "title" => "Blue", "price" => "0.00", "sku" => "", "position" => 5, "inventory_policy" => "deny", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Blue", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T09:12:09-05:00", "updated_at" => "2024-10-02T09:12:09-05:00", "taxable" => true, "barcode" => nil, "grams" => 0, "image_id" => nil, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325040, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [{"price" => {"amount" => "0.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325040"}}), headers: {}) + + response = variant = ShopifyAPI::Variant.new + variant.product_id = 632910392 + variant.option1 = "Blue" + variant.metafields = [ + { + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + } + ] + variant.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/variants.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/variants.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "variant" => hash_including({"image_id" => 850703190, "option1" => "Purple"}) } + ) + .to_return(status: 200, body: JSON.generate({"variant" => {"id" => 1070325042, "product_id" => 632910392, "title" => "Purple", "price" => "0.00", "sku" => "", "position" => 5, "inventory_policy" => "deny", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Purple", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T09:12:12-05:00", "updated_at" => "2024-10-02T09:12:12-05:00", "taxable" => true, "barcode" => nil, "grams" => 0, "image_id" => 850703190, "weight" => 0.0, "weight_unit" => "lb", "inventory_item_id" => 1070325042, "inventory_quantity" => 0, "old_inventory_quantity" => 0, "presentment_prices" => [{"price" => {"amount" => "0.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/1070325042"}}), headers: {}) + + response = variant = ShopifyAPI::Variant.new + variant.product_id = 632910392 + variant.image_id = 850703190 + variant.option1 = "Purple" + variant.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/variants.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/variants/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 4}), headers: {}) + + response = ShopifyAPI::Variant.count( + product_id: 632910392, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/variants/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/variants/808950810.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"variant" => {"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "tax_code" => "DA040000", "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}}), headers: {}) + + response = ShopifyAPI::Variant.find( + id: 808950810, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/variants/808950810.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/variants/808950810.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "variant" => hash_including({"metafields" => [{"key" => "new", "value" => "newvalue", "type" => "single_line_text_field", "namespace" => "global"}]}) } + ) + .to_return(status: 200, body: JSON.generate({"variant" => {"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}}), headers: {}) + + response = variant = ShopifyAPI::Variant.new + variant.id = 808950810 + variant.metafields = [ + { + "key" => "new", + "value" => "newvalue", + "type" => "single_line_text_field", + "namespace" => "global" + } + ] + variant.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/variants/808950810.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/variants/808950810.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "variant" => hash_including({"image_id" => 562641783}) } + ) + .to_return(status: 200, body: JSON.generate({"variant" => {"id" => 808950810, "product_id" => 632910392, "title" => "Pink", "price" => "199.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:12:07-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "199.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}}), headers: {}) + + response = variant = ShopifyAPI::Variant.new + variant.id = 808950810 + variant.image_id = 562641783 + variant.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/variants/808950810.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_11() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/variants/808950810.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "variant" => hash_including({"option1" => "Not Pink", "price" => "99.00"}) } + ) + .to_return(status: 200, body: JSON.generate({"variant" => {"id" => 808950810, "product_id" => 632910392, "title" => "Not Pink", "price" => "99.00", "sku" => "IPOD2008PINK", "position" => 1, "inventory_policy" => "continue", "compare_at_price" => nil, "fulfillment_service" => "manual", "inventory_management" => "shopify", "option1" => "Not Pink", "option2" => nil, "option3" => nil, "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:12:15-05:00", "taxable" => true, "barcode" => "1234_pink", "grams" => 567, "image_id" => 562641783, "weight" => 1.25, "weight_unit" => "lb", "inventory_item_id" => 808950810, "inventory_quantity" => 10, "old_inventory_quantity" => 10, "presentment_prices" => [{"price" => {"amount" => "99.00", "currency_code" => "USD"}, "compare_at_price" => nil}], "requires_shipping" => true, "admin_graphql_api_id" => "gid://shopify/ProductVariant/808950810"}}), headers: {}) + + response = variant = ShopifyAPI::Variant.new + variant.id = 808950810 + variant.option1 = "Not Pink" + variant.price = "99.00" + variant.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/variants/808950810.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_12() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/variants/808950810.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Variant.delete( + product_id: 632910392, + id: 808950810, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/products/632910392/variants/808950810.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end diff --git a/test/rest/2024_10/webhook_test.rb b/test/rest/2024_10/webhook_test.rb new file mode 100644 index 00000000..e1459290 --- /dev/null +++ b/test/rest/2024_10/webhook_test.rb @@ -0,0 +1,359 @@ +# typed: strict +# frozen_string_literal: true + +######################################################################################################################## +# This file is auto-generated. If you have an issue, please create a GitHub issue. # +######################################################################################################################## + +$VERBOSE = nil +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "minitest/autorun" +require "webmock/minitest" + +require "shopify_api" +require_relative "../../test_helper" + +class Webhook202410Test < Test::Unit::TestCase + def setup + super + + test_session = ShopifyAPI::Auth::Session.new(id: "id", shop: "test-shop.myshopify.io", access_token: "this_is_a_test_token") + ShopifyAPI::Context.activate_session(test_session) + modify_context(api_version: "2024-10") + end + + def teardown + super + + ShopifyAPI::Context.deactivate_session + end + + sig do + void + end + def test_1() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/webhooks.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"webhooks" => [{"id" => 4759306, "address" => "https://apple.com", "topic" => "orders/create", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "format" => "json", "fields" => [], "metafield_namespaces" => [], "api_version" => "unstable", "private_metafield_namespaces" => []}, {"id" => 892403750, "address" => "https://example.org/fully_loaded_1", "topic" => "orders/cancelled", "created_at" => "2021-12-01T05:23:43-05:00", "updated_at" => "2021-12-01T05:23:43-05:00", "format" => "json", "fields" => [], "metafield_namespaces" => [], "api_version" => "unstable", "private_metafield_namespaces" => []}, {"id" => 901431826, "address" => "https://apple.com/uninstall", "topic" => "app/uninstalled", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "format" => "json", "fields" => [], "metafield_namespaces" => [], "api_version" => "unstable", "private_metafield_namespaces" => []}, {"id" => 1014196360, "address" => "https://example.org/app_uninstalled", "topic" => "app/uninstalled", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "format" => "json", "fields" => [], "metafield_namespaces" => [], "api_version" => "unstable", "private_metafield_namespaces" => []}]}), headers: {}) + + response = ShopifyAPI::Webhook.all + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/webhooks.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_2() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/webhooks.json?since_id=901431826") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"webhooks" => [{"id" => 1014196360, "address" => "https://example.org/app_uninstalled", "topic" => "app/uninstalled", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "format" => "json", "fields" => [], "metafield_namespaces" => [], "api_version" => "unstable", "private_metafield_namespaces" => []}]}), headers: {}) + + response = ShopifyAPI::Webhook.all( + since_id: "901431826", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/webhooks.json?since_id=901431826") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_3() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/webhooks.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "webhook" => hash_including({"address" => "pubsub://projectName:topicName", "topic" => "customers/update", "format" => "json"}) } + ) + .to_return(status: 200, body: JSON.generate({"webhook" => {"id" => 6883828544, "address" => "pubsub://projectName:topicName", "topic" => "customers/update", "created_at" => "2024-10-02T09:06:06-05:00", "updated_at" => "2024-10-02T09:06:06-05:00", "format" => "json", "fields" => [], "metafield_namespaces" => [], "api_version" => "unstable", "private_metafield_namespaces" => []}}), headers: {}) + + response = webhook = ShopifyAPI::Webhook.new + webhook.address = "pubsub://projectName:topicName" + webhook.topic = "customers/update" + webhook.format = "json" + webhook.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/webhooks.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_4() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/webhooks.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "webhook" => hash_including({"address" => "arn:aws:events:us-east-1::event-source/aws.partner/shopify.com/755357713/example-event-source", "topic" => "customers/update", "format" => "json"}) } + ) + .to_return(status: 200, body: JSON.generate({"webhook" => {"id" => 6883828534, "address" => "arn:aws:events:us-east-1::event-source/aws.partner/shopify.com/755357713/example-event-source", "topic" => "customers/update", "created_at" => "2024-10-02T09:05:41-05:00", "updated_at" => "2024-10-02T09:05:41-05:00", "format" => "json", "fields" => [], "metafield_namespaces" => [], "api_version" => "unstable", "private_metafield_namespaces" => []}}), headers: {}) + + response = webhook = ShopifyAPI::Webhook.new + webhook.address = "arn:aws:events:us-east-1::event-source/aws.partner/shopify.com/755357713/example-event-source" + webhook.topic = "customers/update" + webhook.format = "json" + webhook.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/webhooks.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_5() + stub_request(:post, "https://test-shop.myshopify.io/admin/api/2024-10/webhooks.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "webhook" => hash_including({"topic" => "orders/create", "address" => "https://example.hostname.com/", "format" => "json", "fields" => ["id", "note"]}) } + ) + .to_return(status: 200, body: JSON.generate({"webhook" => {"id" => 6883828554, "address" => "https://example.hostname.com/", "topic" => "orders/create", "created_at" => "2024-10-02T09:06:30-05:00", "updated_at" => "2024-10-02T09:06:30-05:00", "format" => "json", "fields" => ["id", "note"], "metafield_namespaces" => [], "api_version" => "unstable", "private_metafield_namespaces" => []}}), headers: {}) + + response = webhook = ShopifyAPI::Webhook.new + webhook.topic = "orders/create" + webhook.address = "https://example.hostname.com/" + webhook.format = "json" + webhook.fields = [ + "id", + "note" + ] + webhook.save + + assert_requested(:post, "https://test-shop.myshopify.io/admin/api/2024-10/webhooks.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_6() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/webhooks/count.json?topic=orders%2Fcreate") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 1}), headers: {}) + + response = ShopifyAPI::Webhook.count( + topic: "orders/create", + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/webhooks/count.json?topic=orders%2Fcreate") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_7() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/webhooks/count.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"count" => 4}), headers: {}) + + response = ShopifyAPI::Webhook.count + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/webhooks/count.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_8() + stub_request(:get, "https://test-shop.myshopify.io/admin/api/2024-10/webhooks/4759306.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({"webhook" => {"id" => 4759306, "address" => "https://apple.com", "topic" => "orders/create", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T08:59:11-05:00", "format" => "json", "fields" => [], "metafield_namespaces" => [], "api_version" => "unstable", "private_metafield_namespaces" => []}}), headers: {}) + + response = ShopifyAPI::Webhook.find( + id: 4759306, + ) + + assert_requested(:get, "https://test-shop.myshopify.io/admin/api/2024-10/webhooks/4759306.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_9() + stub_request(:put, "https://test-shop.myshopify.io/admin/api/2024-10/webhooks/4759306.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json", "Content-Type"=>"application/json"}, + body: { "webhook" => hash_including({"address" => "https://somewhere-else.com/"}) } + ) + .to_return(status: 200, body: JSON.generate({"webhook" => {"id" => 4759306, "address" => "https://somewhere-else.com/", "topic" => "orders/create", "created_at" => "2024-10-02T08:59:11-05:00", "updated_at" => "2024-10-02T09:08:15-05:00", "format" => "json", "fields" => [], "metafield_namespaces" => [], "api_version" => "unstable", "private_metafield_namespaces" => []}}), headers: {}) + + response = webhook = ShopifyAPI::Webhook.new + webhook.id = 4759306 + webhook.address = "https://somewhere-else.com/" + webhook.save + + assert_requested(:put, "https://test-shop.myshopify.io/admin/api/2024-10/webhooks/4759306.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + + sig do + void + end + def test_10() + stub_request(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/webhooks/4759306.json") + .with( + headers: {"X-Shopify-Access-Token"=>"this_is_a_test_token", "Accept"=>"application/json"}, + body: {} + ) + .to_return(status: 200, body: JSON.generate({}), headers: {}) + + response = ShopifyAPI::Webhook.delete( + id: 4759306, + ) + + assert_requested(:delete, "https://test-shop.myshopify.io/admin/api/2024-10/webhooks/4759306.json") + + response = response.first if response.respond_to?(:first) + + # Assert attributes are correctly typed preventing Sorbet errors downstream + if response.respond_to?(:original_state) + response&.original_state&.each do |key, value| + begin + response.send(key) + rescue TypeError => error + fail TypeError.new("#{self.class}##{key} is mistyped: #{error.message}") + end + response.send(key) + end + end + end + +end