# frozen_string_literal: true require 'helper' require 'null_client' class TestPeddlerClient < MiniTest::Test def setup @response_body = 'foo' Excon.defaults[:mock] = true Excon.stub({}, body: @response_body, status: 200) @klass = Class.new(Null::Client) @client = @klass.new @client.configure_with_mock_data! @client.operation('Foo') end def teardown Excon.stubs.clear Excon.defaults.delete(:mock) end def test_configures_path @klass.path('/Foo') assert @client.aws_endpoint.match(%r{/Foo$}) end def test_instance_path_overrides_class_path @klass.path('/Foo') @client.path = '/Foo/Bar' assert @client.aws_endpoint.match(%r{/Foo/Bar$}) end def test_default_path assert_equal '/', @klass.path end def test_has_user_agent assert @client.connection.data[:headers].key?('User-Agent') end def test_inherits_parents_params assert_equal Peddler::Client.params, @klass.params end def test_inherits_parents_path assert_equal @klass.path, Class.new(@klass).path end def test_inherits_parents_parser assert_equal @klass.parser, Class.new(@klass).parser end def test_params_include_seller_id assert @klass.params.key?('SellerId') end def test_params_include_auth_token @klass.params.key?('MWSAuthToken') end def test_configures @client.configure do |config| config.aws_access_key_id = '123' end assert_equal '123', @client.aws_access_key_id end def test_configures_when_initialising client = @klass.new(aws_access_key_id: '123') assert_equal '123', client.aws_access_key_id end def test_sets_content_type_header_for_latin_flat_file @client.body = 'foo' content_type = @client.headers.fetch('Content-Type') assert_equal 'text/tab-separated-values; charset=CP1252', content_type end def test_sets_content_type_header_for_chinese_flat_file @client.primary_marketplace_id = 'AAHKV2X7AFYLW' @client.body = 'foo' content_type = @client.headers.fetch('Content-Type') assert_equal 'text/tab-separated-values; charset=UTF-16', content_type end def test_sets_content_type_header_for_japanese_flat_file @client.primary_marketplace_id = 'A1VC38T7YXB528' @client.body = 'foo' content_type = @client.headers.fetch('Content-Type') assert_equal 'text/tab-separated-values; charset=Windows-31J', content_type end def test_sets_content_type_header_for_xml @client.body = '' content_type = @client.headers.fetch('Content-Type') assert_equal 'text/xml', content_type end def test_encodes_body_for_latin_flat_file @client.body = 'foo' assert_equal 'Windows-1252', @client.body.encoding.to_s end def test_encodes_body_for_chinese_flat_file @client.primary_marketplace_id = 'AAHKV2X7AFYLW' @client.body = 'foo' assert_equal 'UTF-16', @client.body.encoding.to_s end def test_encodes_body_for_japanese_flat_file @client.primary_marketplace_id = 'A1VC38T7YXB528' @client.body = 'foo' assert_equal 'Windows-31J', @client.body.encoding.to_s end def test_runs_a_request res = @client.run assert_equal @response_body, res.body end def test_clears_body_when_run_succeeds @client.body = 'foo' @client.run assert_nil @client.body end def test_does_not_clear_body_when_run_fails Excon.stub({}, status: 503) @client.body = 'foo' assert_raises(Excon::Error::ServiceUnavailable) do @client.run end refute_nil @client.body end def test_streams_response chunks = '' streamer = ->(chunk, _, _) { chunks += chunk } @client.run(&streamer) assert_equal @response_body, chunks end class Instrumentor class << self attr_accessor :events def instrument(name, params = {}) events.update(name => params) yield if block_given? end end @events = {} end def test_request_preserves_user_agent @client.defaults.update(instrumentor: Instrumentor) @client.run headers = Instrumentor.events['excon.request'][:headers] assert headers.key?('User-Agent') end def test_error_callback_on_class Excon.stub({}, status: 503) assert_raises(Excon::Error::ServiceUnavailable) do @client.run end @klass.on_error do |e| assert_equal 503, e.response.status end @client.run # no longer raises Excon.stubs.clear end def test_error_callback_on_instance Excon.stub({}, status: 503) assert_raises(Excon::Error::ServiceUnavailable) do @client.run end @client.on_error do |e| assert_equal 503, e.response.status end @client.run Excon.stubs.clear end def test_error_callback_on_client_ancestor Excon.stub({}, status: 503) @klass.on_error do |e| assert_equal 503, e.response.status end @client.run # no longer raises klass = Class.new(Null::Client) other_client = klass.new other_client.configure_with_mock_data! other_client.operation('Foo') assert_raises(Excon::Error::ServiceUnavailable) do other_client.run end Excon.stubs.clear end def test_decorates_error_response res = { body: 'Foo', status: 503 } Excon.stub({}, res) e = nil begin @client.run rescue StandardError => e assert e.response.parse end assert e end def test_deprecated_error_callback Excon.stub({}, status: 503) @client.on_error do |_, res| assert_equal 503, res.status end assert_output nil, /DEPRECATION/ do @client.run end Excon.stubs.clear end def test_deprecated_marketplace_id_accessor refute_nil @client.marketplace_id @client.marketplace_id = '123' assert_equal '123', @client.marketplace_id assert_equal @client.primary_marketplace_id, @client.marketplace_id end end