# frozen_string_literal: true require 'helper' require 'null_client' class TestPeddlerClient < MiniTest::Test def setup Excon.defaults[:mock] = true @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 class HappyPath < TestPeddlerClient def setup @response_body = 'foo' Excon.stub({}, body: @response_body, status: 200) super 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_params_include_seller_id assert @klass.params.key?('SellerId') end def test_params_include_auth_token @klass.params.key?('MWSAuthToken') end def test_inherits_parents_parser assert_equal @klass.parser, Class.new(@klass).parser end def test_sets_marketplace marketplace = Peddler::Marketplace.find('US') @client.marketplace = 'US' assert_equal marketplace, @client.marketplace @client.marketplace = marketplace assert_equal marketplace, @client.marketplace 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.marketplace = 'CN' @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.marketplace = 'JP' @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.marketplace = 'CN' @client.body = 'foo' assert_equal 'UTF-16', @client.body.encoding.to_s end def test_encodes_body_for_japanese_flat_file @client.marketplace = 'JP' @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_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 end class MWSErrorPath < TestPeddlerClient def setup body = <<-XML RequestThrottled XML Excon.stub({}, body: body, status: 503) super end def test_default_error_handling assert_raises Peddler::Errors::RequestThrottled do @client.run end end def test_does_not_clear_body_when_run_fails @client.body = 'foo' assert_raises Peddler::Errors::RequestThrottled do @client.run end refute_nil @client.body end end class OtherHTTPStatusErrorPath < TestPeddlerClient def setup body = <<-XML 500 XML Excon.stub({}, body: body, status: 500) super end def test_error_handling assert_raises Excon::Error::InternalServerError do @client.run end end def test_does_not_clear_body_when_run_fails @client.body = 'foo' assert_raises Excon::Error::InternalServerError do @client.run end refute_nil @client.body end end end