require 'test_helper' class ShopifyAPITest < Test::Unit::TestCase def setup @service = build_service() end def test_request_uri_is_correct_when_no_sku_passed Timecop.freeze do timestamp = Time.now.utc.to_i uri = @service.send(:request_uri, 'fetch_stock', {timestamp: timestamp, shop: 'www.snowdevil.ca'}) assert_equal "http://supershopifyapptwin.com/fetch_stock.json?shop=www.snowdevil.ca×tamp=#{timestamp}", uri.to_s end end def test_request_uri_is_correct_when_sku_is_passed Timecop.freeze do timestamp = Time.now.utc.to_i uri = @service.send(:request_uri, 'fetch_stock', {sku: '123', timestamp: timestamp, shop: 'www.snowdevil.ca'}) assert_equal "http://supershopifyapptwin.com/fetch_stock.json?shop=www.snowdevil.ca&sku=123×tamp=#{timestamp}", uri.to_s end end def test_response_from_failed_stock_request mock_app_request('fetch_stock', anything, nil) response = @service.fetch_stock_levels() refute response.success? assert_equal "Unable to fetch remote stock levels", response.message end def test_response_from_failed_tracking_request mock_app_request('fetch_tracking_numbers', anything, nil) response = @service.fetch_tracking_numbers([1,2]) refute response.success? assert_equal "Unable to fetch remote tracking numbers [1, 2]", response.message end def test_response_with_invalid_json_is_parsed_to_empty_hash bad_json = '{a: 9, 0}' mock_app_request('fetch_stock', anything, bad_json) assert_equal({}, @service.fetch_stock_levels().stock_levels) end def test_response_with_valid_but_incorrect_json_is_parsed_to_empty_hash incorrect_json = '[]' mock_app_request('fetch_stock', anything, incorrect_json) assert_equal({}, @service.fetch_stock_levels().stock_levels) end def test_response_with_invalid_xml_is_parsed_to_empty_hash service = build_service(format: 'xml') bad_xml = '' mock_app_request('fetch_stock', anything, bad_xml) assert_equal({}, service.fetch_stock_levels().stock_levels) end def test_parse_stock_level_response_parses_xml_correctly service = build_service(format: 'xml') xml = 'sku11sku22' expected = {'sku1' => '1', 'sku2' => '2'} mock_app_request('fetch_stock', anything, xml) assert_equal expected, service.fetch_stock_levels().stock_levels end def test_parse_tracking_data_response_parses_xml_correctly service = build_service(format: 'xml') xml = '123abc456def' expected = {'123' => 'abc', '456' => 'def'} request_params = {order_ids: [1, 2, 4], order_names: [1, 2, 4]} mock_app_request('fetch_tracking_numbers', request_params, xml) assert_equal expected, service.fetch_tracking_data([1,2,4]).tracking_numbers after_deprecation = Time.now.to_date >= ShopifyAPIService::OrderIdCutoffDate flunk "The request params should no longer include 'order_ids'" if after_deprecation end def test_parse_stock_level_response_parses_json_with_root_correctly json = '{"stock_levels": {"998KIB":"10"}}' expected = {'998KIB' => "10"} mock_app_request('fetch_stock', anything, json) assert_equal expected, @service.fetch_stock_levels().stock_levels end def test_parse_tracking_data_response_parses_json_with_root_correctly json = '{"tracking_numbers": {"order1":"a","order2":"b"}}' expected = {'order1' => 'a', 'order2' => 'b'} mock_app_request('fetch_tracking_numbers', anything, json) assert_equal expected, @service.fetch_tracking_data([1,2]).tracking_numbers end def test_parse_stock_level_response_parses_json_without_root_correctly json = '{"998KIB":"10"}' expected = {'998KIB' => "10"} mock_app_request('fetch_stock', anything, json) assert_equal expected, @service.fetch_stock_levels().stock_levels end def test_parse_tracking_data_response_parses_json_without_root_correctly json = '{"order1":"a","order2":"b"}' expected = {'order1' => 'a', 'order2' => 'b'} mock_app_request('fetch_tracking_numbers', anything, json) assert_equal expected, @service.fetch_tracking_data([1,2]).tracking_numbers end def test_send_app_request_rescues_response_errors response = stub(code: "404", message: "Not Found") @service.expects(:ssl_get).raises(ActiveMerchant::ResponseError, response) refute @service.fetch_stock_levels().success? end def test_send_app_request_rescues_invalid_response_errors @service.expects(:ssl_get).raises(ActiveMerchant::InvalidResponseError.new("error html")) refute @service.fetch_stock_levels().success? end private def mock_app_request(action, input, output) ShopifyAPIService.any_instance.expects(:send_app_request).with(action, nil, input).returns(output) end def build_service(options = {}) options.reverse_merge!({ name: "fulfillment_app", callback_url: 'http://supershopifyapptwin.com', format: 'json' }) ShopifyAPIService.new(options) end end