diff --git a/lib/whatsapp_sdk/api/business_profile.rb b/lib/whatsapp_sdk/api/business_profile.rb index 053f3f1..59effcc 100644 --- a/lib/whatsapp_sdk/api/business_profile.rb +++ b/lib/whatsapp_sdk/api/business_profile.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require_relative "request" -require_relative "response" require_relative "../resource/business_profile" module WhatsappSdk diff --git a/lib/whatsapp_sdk/api/medias.rb b/lib/whatsapp_sdk/api/medias.rb index 60b4ef8..baff1bf 100644 --- a/lib/whatsapp_sdk/api/medias.rb +++ b/lib/whatsapp_sdk/api/medias.rb @@ -4,7 +4,6 @@ require "faraday/multipart" require_relative "request" -require_relative "response" require_relative '../resource/media_types' module WhatsappSdk @@ -102,7 +101,7 @@ def upload(sender_id:, file_path:, type:, headers: {}) multipart: true ) - return Api::Responses::IdResponse.new(response["id"]) + Api::Responses::IdResponse.new(response["id"]) end # Delete a Media by ID. diff --git a/lib/whatsapp_sdk/api/messages.rb b/lib/whatsapp_sdk/api/messages.rb index e508f2b..1ec4319 100644 --- a/lib/whatsapp_sdk/api/messages.rb +++ b/lib/whatsapp_sdk/api/messages.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require_relative "request" -require_relative "response" module WhatsappSdk module Api diff --git a/lib/whatsapp_sdk/api/phone_numbers.rb b/lib/whatsapp_sdk/api/phone_numbers.rb index dabbb87..651482d 100644 --- a/lib/whatsapp_sdk/api/phone_numbers.rb +++ b/lib/whatsapp_sdk/api/phone_numbers.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require_relative "request" -require_relative "response" module WhatsappSdk module Api diff --git a/lib/whatsapp_sdk/api/response.rb b/lib/whatsapp_sdk/api/response.rb deleted file mode 100644 index f92fc07..0000000 --- a/lib/whatsapp_sdk/api/response.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -require_relative "responses/message_data_response" - -module WhatsappSdk - module Api - class Response - attr_accessor :error, :data, :raw_response - - def initialize(response:, data_class_type:, error_class_type: Responses::GenericErrorResponse) - @raw_response = response - @data = data_class_type.build_from_response(response: response) - @error = error_class_type.build_from_response(response: response) - end - - # @return [Boolean] Whether or not the response is successful. - def ok? - @error.nil? - end - - # @return [Boolean] Whether or not the response has an error. - def error? - !!@error - end - end - end -end diff --git a/lib/whatsapp_sdk/api/responses/data_response.rb b/lib/whatsapp_sdk/api/responses/data_response.rb deleted file mode 100644 index e115d76..0000000 --- a/lib/whatsapp_sdk/api/responses/data_response.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module WhatsappSdk - module Api - module Responses - class DataResponse - attr_reader :raw_data_response - - def initialize(response) - @raw_data_response = response - end - - def self.build_from_response(response:); end - end - end - end -end diff --git a/lib/whatsapp_sdk/api/responses/error_response.rb b/lib/whatsapp_sdk/api/responses/error_response.rb deleted file mode 100644 index f628c05..0000000 --- a/lib/whatsapp_sdk/api/responses/error_response.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -require_relative "data_response" - -module WhatsappSdk - module Api - module Responses - class ErrorResponse < DataResponse - attr_accessor :error, :status - - def initialize(response:) - @error = response["error"] - @status = response["status"] - super(response) - end - - def self.build_from_response(response:) - return unless response["error"] - - new(response: response) - end - end - end - end -end diff --git a/lib/whatsapp_sdk/api/responses/generic_error_response.rb b/lib/whatsapp_sdk/api/responses/generic_error_response.rb index 244410b..04712f0 100644 --- a/lib/whatsapp_sdk/api/responses/generic_error_response.rb +++ b/lib/whatsapp_sdk/api/responses/generic_error_response.rb @@ -1,11 +1,9 @@ # frozen_string_literal: true -require_relative "error_response" - module WhatsappSdk module Api module Responses - class GenericErrorResponse < ErrorResponse + class GenericErrorResponse attr_reader :code, :subcode, :message, :type, :data, :fbtrace_id def initialize(response:) @@ -15,8 +13,6 @@ def initialize(response:) @type = response["type"] @data = response["data"] @fbtrace_id = response["fbtrace_id"] - - super(response: response) end def self.response_error?(response:) diff --git a/lib/whatsapp_sdk/api/responses/http_response_error.rb b/lib/whatsapp_sdk/api/responses/http_response_error.rb index 951ba0a..fa161a1 100644 --- a/lib/whatsapp_sdk/api/responses/http_response_error.rb +++ b/lib/whatsapp_sdk/api/responses/http_response_error.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require_relative "data_response" - module WhatsappSdk module Api module Responses diff --git a/lib/whatsapp_sdk/api/responses/id_response.rb b/lib/whatsapp_sdk/api/responses/id_response.rb index 99c03dc..281fe98 100644 --- a/lib/whatsapp_sdk/api/responses/id_response.rb +++ b/lib/whatsapp_sdk/api/responses/id_response.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require_relative "data_response" - module WhatsappSdk module Api module Responses diff --git a/lib/whatsapp_sdk/api/responses/pagination_records.rb b/lib/whatsapp_sdk/api/responses/pagination_records.rb index 74eb483..db2fcba 100644 --- a/lib/whatsapp_sdk/api/responses/pagination_records.rb +++ b/lib/whatsapp_sdk/api/responses/pagination_records.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require_relative "data_response" - module WhatsappSdk module Api module Responses diff --git a/lib/whatsapp_sdk/api/responses/success_response.rb b/lib/whatsapp_sdk/api/responses/success_response.rb index c278f01..4fc1b2c 100644 --- a/lib/whatsapp_sdk/api/responses/success_response.rb +++ b/lib/whatsapp_sdk/api/responses/success_response.rb @@ -1,29 +1,12 @@ # frozen_string_literal: true -require_relative "data_response" - module WhatsappSdk module Api module Responses - class SuccessResponse < DataResponse - def initialize(response:) - @success = response["success"] - super(response) - end - + class SuccessResponse def self.success_response?(response:) response["success"] == true end - - def self.build_from_response(response:) - return unless response["success"] - - new(response: response) - end - - def success? - @success - end end end end diff --git a/lib/whatsapp_sdk/api/templates.rb b/lib/whatsapp_sdk/api/templates.rb index 4427c7f..2fb2788 100644 --- a/lib/whatsapp_sdk/api/templates.rb +++ b/lib/whatsapp_sdk/api/templates.rb @@ -1,9 +1,6 @@ # frozen_string_literal: true require_relative "request" -require_relative "response" -require_relative 'responses/success_response' -require_relative 'responses/generic_error_response' require_relative "../resource/languages" module WhatsappSdk diff --git a/lib/whatsapp_sdk/resource/business_profile.rb b/lib/whatsapp_sdk/resource/business_profile.rb index e37a0dc..13b3ddb 100644 --- a/lib/whatsapp_sdk/resource/business_profile.rb +++ b/lib/whatsapp_sdk/resource/business_profile.rb @@ -9,7 +9,7 @@ class BusinessProfile ].freeze attr_accessor :about, :address, :description, :email, :messaging_product, - :profile_picture_url, :vertical, :websites + :profile_picture_url, :vertical, :websites def self.from_hash(hash) business_profile = BusinessProfile.new @@ -26,14 +26,14 @@ def self.from_hash(hash) end def ==(other) - self.about == other.about && - self.address == other.address && - self.description == other.description && - self.email == other.email && - self.messaging_product == other.messaging_product && - self.profile_picture_url == other.profile_picture_url && - self.vertical == other.vertical && - self.websites == other.websites + about == other.about && + address == other.address && + description == other.description && + email == other.email && + messaging_product == other.messaging_product && + profile_picture_url == other.profile_picture_url && + vertical == other.vertical && + websites == other.websites end end end diff --git a/lib/whatsapp_sdk/resource/media.rb b/lib/whatsapp_sdk/resource/media.rb index 8e83094..b1fef64 100644 --- a/lib/whatsapp_sdk/resource/media.rb +++ b/lib/whatsapp_sdk/resource/media.rb @@ -25,12 +25,12 @@ def self.from_hash(hash) end def ==(other) - self.id == other.id && - self.file_size == other.file_size && - self.messaging_product == other.messaging_product && - self.mime_type == other.mime_type && - self.sha256 == other.sha256 && - self.url == other.url + id == other.id && + file_size == other.file_size && + messaging_product == other.messaging_product && + mime_type == other.mime_type && + sha256 == other.sha256 && + url == other.url end end end diff --git a/lib/whatsapp_sdk/resource/phone_number.rb b/lib/whatsapp_sdk/resource/phone_number.rb index fbba7a6..6c4dda2 100644 --- a/lib/whatsapp_sdk/resource/phone_number.rb +++ b/lib/whatsapp_sdk/resource/phone_number.rb @@ -3,11 +3,10 @@ module WhatsappSdk module Resource class PhoneNumber - attr_accessor :id, :verified_name, :display_phone_number, :quality_rating, :is_pin_enabled, - :is_official_business_account, :account_mode, :certificate, :code_verification_status, - :eligibility_for_api_business_global_search, :name_status, :new_name_status, :status, - :search_visibility, :messaging_limit_tier # , :phone, :wa_id, :type + :is_official_business_account, :account_mode, :certificate, :code_verification_status, + :eligibility_for_api_business_global_search, :name_status, :new_name_status, :status, + :search_visibility, :messaging_limit_tier # , :phone, :wa_id, :type def self.from_hash(hash) phone_number = PhoneNumber.new @@ -30,23 +29,25 @@ def self.from_hash(hash) phone_number end + # rubocop:disable Metrics/PerceivedComplexity def ==(other) - self.id == other.id && - self.verified_name == other.verified_name && - self.display_phone_number == other.display_phone_number && - self.quality_rating == other.quality_rating && - self.is_pin_enabled == other.is_pin_enabled && - self.is_official_business_account == other.is_official_business_account && - self.account_mode == other.account_mode && - self.certificate == other.certificate && - self.code_verification_status == other.code_verification_status && - self.eligibility_for_api_business_global_search == other.eligibility_for_api_business_global_search && - self.name_status == other.name_status && - self.new_name_status == other.new_name_status && - self.status == other.status && - self.search_visibility == other.search_visibility && - self.messaging_limit_tier == other.messaging_limit_tier + id == other.id && + verified_name == other.verified_name && + display_phone_number == other.display_phone_number && + quality_rating == other.quality_rating && + is_pin_enabled == other.is_pin_enabled && + is_official_business_account == other.is_official_business_account && + account_mode == other.account_mode && + certificate == other.certificate && + code_verification_status == other.code_verification_status && + eligibility_for_api_business_global_search == other.eligibility_for_api_business_global_search && + name_status == other.name_status && + new_name_status == other.new_name_status && + status == other.status && + search_visibility == other.search_visibility && + messaging_limit_tier == other.messaging_limit_tier end + # rubocop:enable Metrics/PerceivedComplexity end end end diff --git a/lib/whatsapp_sdk/resource/template.rb b/lib/whatsapp_sdk/resource/template.rb index 27b2470..2883093 100644 --- a/lib/whatsapp_sdk/resource/template.rb +++ b/lib/whatsapp_sdk/resource/template.rb @@ -59,12 +59,12 @@ def self.from_hash(hash) end def ==(other) - self.id == other.id && - self.status == other.status && - self.category == other.category && - self.language == other.language && - self.name == other.name && - self.components_json == other.components_json + id == other.id && + status == other.status && + category == other.category && + language == other.language && + name == other.name && + components_json == other.components_json end end end diff --git a/test/api_response_helper.rb b/test/api_response_helper.rb deleted file mode 100644 index 4c3c554..0000000 --- a/test/api_response_helper.rb +++ /dev/null @@ -1,19 +0,0 @@ -# typed: false -# frozen_string_literal: true - -require_relative '../lib/whatsapp_sdk/api/response' -require_relative '../lib/whatsapp_sdk/api/responses/success_response' - -module ApiResponseHelper - def assert_ok_response(response) - assert_equal(WhatsappSdk::Api::Response, response.class) - assert_nil(response.error) - assert_predicate(response, :ok?) - end - - def assert_ok_success_response(response) - assert_ok_response(response) - assert_equal(WhatsappSdk::Api::Responses::SuccessResponse, response.data.class) - assert_predicate(response.data, :success?) - end -end diff --git a/test/errors_helper.rb b/test/errors_helper.rb index 1c2e69b..5d91489 100644 --- a/test/errors_helper.rb +++ b/test/errors_helper.rb @@ -16,7 +16,9 @@ def assert_unsupported_request_error(http_method, response, object_id, fb_trace_ ) end - def assert_unsupported_request_error_v2(http_method, object_id, fb_trace_id, error_info, type = "GraphMethodException") + def assert_unsupported_request_error_v2( + http_method, object_id, fb_trace_id, error_info, type = "GraphMethodException" + ) assert_error_info( { code: 100, diff --git a/test/test_helper.rb b/test/test_helper.rb index 60f2eec..1507767 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -10,7 +10,6 @@ require "pry-nav" require "webmock/minitest" require "errors_helper" -require "api_response_helper" require 'vcr' VCR.configure do |config| diff --git a/test/whatsapp/api/business_profile_test.rb b/test/whatsapp/api/business_profile_test.rb index 9ce5d15..3100c48 100644 --- a/test/whatsapp/api/business_profile_test.rb +++ b/test/whatsapp/api/business_profile_test.rb @@ -3,12 +3,11 @@ require 'api/business_profile' require 'api/client' -require 'api_response_helper' + module WhatsappSdk module Api class BusinessProfileTest < Minitest::Test include(ErrorsHelper) - include(ApiResponseHelper) def setup client = Client.new(ENV.fetch('WHATSAPP_ACCESS_TOKEN', nil)) @@ -72,7 +71,7 @@ def test_update_with_success_response websites: ["https://www.google.com"], vertical: "EDU" } - assert_equal(true, @business_profile_api.update(phone_number_id: 107_878_721_936_019, params: params)) + assert(@business_profile_api.update(phone_number_id: 107_878_721_936_019, params: params)) end end diff --git a/test/whatsapp/api/medias_test.rb b/test/whatsapp/api/medias_test.rb index 77314a3..66779f9 100644 --- a/test/whatsapp/api/medias_test.rb +++ b/test/whatsapp/api/medias_test.rb @@ -9,7 +9,6 @@ module WhatsappSdk module Api class MediasTest < Minitest::Test include(ErrorsHelper) - include(ApiResponseHelper) def setup client = Client.new(ENV.fetch("WHATSAPP_ACCESS_TOKEN", nil)) @@ -86,7 +85,7 @@ def test_delete_media_handles_error_response def test_delete_media_with_success_response VCR.use_cassette("medias/delete_media_with_success_response") do - assert_equal(true, @medias_api.delete(media_id: "1953032278471180")) + assert(@medias_api.delete(media_id: "1953032278471180")) end end @@ -96,7 +95,7 @@ def test_delete_media_sends_valid_params endpoint: "/1" ).returns({ "success" => true }) - assert_equal(true, @medias_api.delete(media_id: "1")) + assert(@medias_api.delete(media_id: "1")) end def test_upload_media_raises_an_error_if_the_file_passed_does_not_exists @@ -112,7 +111,7 @@ def test_upload_media_handles_error_response VCR.use_cassette("medias/upload_media_handles_error_response") do http_error = assert_raises(Api::Responses::HttpResponseError) do @medias_api.upload(sender_id: "1234567", file_path: "test/fixtures/assets/whatsapp.png", - type: "image/png") + type: "image/png") end assert_equal(400, http_error.http_status) @@ -206,7 +205,7 @@ def test_download_media_handles_error_response VCR.use_cassette("medias/download_media_handles_error_response") do http_error = assert_raises(Api::Responses::HttpResponseError) do @medias_api.download(url: url_example, media_type: "image/png", - file_path: "test/fixtures/assets/testing.png") + file_path: "test/fixtures/assets/testing.png") end assert_equal("301", http_error.http_status) @@ -220,8 +219,7 @@ def test_download_media_sends_valid_params .with(url: url_example, content_type_header: "image/png", file_path: file_path) .returns(Net::HTTPOK.new(true, 200, "OK")) - assert_equal( - true, + assert( @medias_api.download(url: url_example, file_path: file_path, media_type: "image/png") ) end @@ -237,8 +235,7 @@ def test_download_allows_unsupported_media_type .with(url: url_example, content_type_header: unsupported_media_type, file_path: file_path) .returns(mock) - assert_equal( - true, + assert( @medias_api.download(url: url_example, file_path: file_path, media_type: unsupported_media_type) ) end @@ -246,8 +243,7 @@ def test_download_allows_unsupported_media_type def test_download_media_success_response VCR.use_cassette("medias/download_media_success_response") do url = "https://lookaside.fbsbx.com/whatsapp_business/attachments/?mid=1761991787669262&ext=1728905510&hash=ATsz9FvlFt63X6Vj00u7PY7SNVCDtCYDeyUqClaX8b5rAg" - assert_equal( - true, + assert( @medias_api.download( url: url, file_path: "test/fixtures/assets/testing.png", media_type: "image/png" ) diff --git a/test/whatsapp/api/messages_test.rb b/test/whatsapp/api/messages_test.rb index 45396d5..45ea9fd 100644 --- a/test/whatsapp/api/messages_test.rb +++ b/test/whatsapp/api/messages_test.rb @@ -27,7 +27,6 @@ module Api class MessagesTest < Minitest::Test include(ContactHelper) include(ErrorsHelper) - include(ApiResponseHelper) def setup client = Client.new(ENV.fetch("WHATSAPP_ACCESS_TOKEN", nil)) @@ -118,9 +117,9 @@ def test_send_location_message_sends_the_correct_params ) assert_message_response({ - contacts: [{ "input" => "1234", "wa_id" => "1234" }], - messages: [{ "id" => "9876" }] - }, message_response) + contacts: [{ "input" => "1234", "wa_id" => "1234" }], + messages: [{ "id" => "9876" }] + }, message_response) end def test_send_image_raises_an_error_if_link_and_image_are_not_provided @@ -618,9 +617,9 @@ def test_send_template_with_success_response_by_passing_components_sends_the_cor ) assert_message_response({ - contacts: [{ "input" => "1234", "wa_id" => "1234" }], - messages: [{ "id" => "9876" }] - }, message_response) + contacts: [{ "input" => "1234", "wa_id" => "1234" }], + messages: [{ "id" => "9876" }] + }, message_response) end def test_send_interactive_reply_buttons_with_success_response_by_passing_interactive_json diff --git a/test/whatsapp/api/phone_numbers_test.rb b/test/whatsapp/api/phone_numbers_test.rb index d8ba0fe..5b42d13 100644 --- a/test/whatsapp/api/phone_numbers_test.rb +++ b/test/whatsapp/api/phone_numbers_test.rb @@ -9,7 +9,6 @@ module WhatsappSdk module Api class PhoneNumbersTest < Minitest::Test include(ErrorsHelper) - include(ApiResponseHelper) def setup client = Client.new(ENV.fetch('WHATSAPP_ACCESS_TOKEN', nil)) @@ -19,7 +18,7 @@ def setup def test_list_handles_error_response VCR.use_cassette('phone_numbers/registered_numbers_handles_error_response') do http_error = assert_raises(Api::Responses::HttpResponseError) do - @phone_numbers_api.list(123_123) + @phone_numbers_api.list(123_123) end assert_equal(400, http_error.http_status) diff --git a/test/whatsapp/api/templates_test.rb b/test/whatsapp/api/templates_test.rb index 81795f2..b17bc16 100644 --- a/test/whatsapp/api/templates_test.rb +++ b/test/whatsapp/api/templates_test.rb @@ -5,13 +5,11 @@ require 'api/templates' require 'api/client' require 'api/messages' -require 'api_response_helper' module WhatsappSdk module Api class TemplatesTest < Minitest::Test include(ErrorsHelper) - include(ApiResponseHelper) def setup client = Client.new(ENV.fetch('WHATSAPP_ACCESS_TOKEN', nil)) @@ -78,11 +76,13 @@ def test_get_templates assert_equal("en_US", first_template.language) assert_equal("APPROVED", first_template.status) assert_equal( - [{"type"=>"HEADER", "format"=>"TEXT", "text"=>"Hello World"}, - {"type"=>"BODY", - "text"=> - "Welcome and congratulations!! This message demonstrates your ability to send a message notification from WhatsApp Business Platform’s Cloud API. Thank you for taking the time to test with us."}, - {"type"=>"FOOTER", "text"=>"WhatsApp Business API Team"}], + [{ "type" => "HEADER", "format" => "TEXT", "text" => "Hello World" }, + { "type" => "BODY", + "text" => + "Welcome and congratulations!! This message demonstrates your ability to send a message " \ + "notification from WhatsApp Business Platform’s Cloud API. Thank you for taking the time "\ + "to test with us." }, + { "type" => "FOOTER", "text" => "WhatsApp Business API Team" }], first_template.components_json ) end @@ -132,8 +132,7 @@ def test_update_a_template_raises_an_error_when_category_is_invalid def test_update_a_template_with_components_and_category VCR.use_cassette('templates/update_a_template_with_components_and_category') do - assert_equal( - true, + assert( @templates_api.update( template_id: "1713674996085293", components_json: basic_components_json ) @@ -144,8 +143,7 @@ def test_update_a_template_with_components_and_category ##### Delete Message Template def test_delete_template_by_name VCR.use_cassette('templates/delete_template_by_name') do - assert_equal( - true, + assert( @templates_api.delete( business_id: 114_503_234_599_312, name: "seasonal_promotion" ) @@ -155,8 +153,7 @@ def test_delete_template_by_name def test_delete_template_by_id VCR.use_cassette('templates/delete_template_by_id') do - assert_equal( - true, + assert( @templates_api.delete( business_id: 114_503_234_599_312, name: "seasonal_promotion", hsm_id: 1_075_472_707_447_727 ) @@ -173,7 +170,7 @@ def test_delete_template_with_error_response assert_error_info( { code: 100, - error_subcode: 2593002, + error_subcode: 2_593_002, type: "OAuthException", message: "Invalid parameter", fbtrace_id: "Ax5tIkALJCP4l5S8jbPvW2n" diff --git a/test/whatsapp/resource/component_test.rb b/test/whatsapp/resource/component_test.rb index d09421f..a5bf89d 100644 --- a/test/whatsapp/resource/component_test.rb +++ b/test/whatsapp/resource/component_test.rb @@ -33,9 +33,9 @@ def test_validation def test_add_parameters image = MediaComponent.new(type: MediaComponent::Type::IMAGE, - link: "http(s)://URL", caption: "caption") + link: "http(s)://URL", caption: "caption") document = MediaComponent.new(type: MediaComponent::Type::DOCUMENT, - link: "http(s)://URL", filename: "txt.rb") + link: "http(s)://URL", filename: "txt.rb") video = MediaComponent.new(type: MediaComponent::Type::VIDEO, id: "123") currency = Currency.new(code: "USD", amount: 1000, fallback_value: "1000") date_time = DateTime.new(fallback_value: "2020-01-01T00:00:00Z") diff --git a/test/whatsapp/resource/parameter_object_test.rb b/test/whatsapp/resource/parameter_object_test.rb index fa22768..3012b85 100644 --- a/test/whatsapp/resource/parameter_object_test.rb +++ b/test/whatsapp/resource/parameter_object_test.rb @@ -16,9 +16,9 @@ module Resource class ParameterObjectTest < Minitest::Test def setup @image_media = MediaComponent.new(type: MediaComponent::Type::IMAGE, - link: "http(s)://URL", caption: "caption") + link: "http(s)://URL", caption: "caption") @document_media = MediaComponent.new(type: MediaComponent::Type::DOCUMENT, - link: "http://URL", filename: "txt.rb") + link: "http://URL", filename: "txt.rb") @video_media = MediaComponent.new(type: MediaComponent::Type::VIDEO, id: "123") @currency = Currency.new(code: "USD", amount: 1000, fallback_value: "USD") @date_time = DateTime.new(fallback_value: "2020-01-01T00:00:00Z")