diff --git a/lib/ipinfo_io.rb b/lib/ipinfo_io.rb index 76e7cda..197ab04 100644 --- a/lib/ipinfo_io.rb +++ b/lib/ipinfo_io.rb @@ -1,25 +1,30 @@ # frozen_string_literal: true require "ipinfo_io/version" +require 'ipinfo_io/errors' require 'faraday' require 'json' module IpinfoIo + RATE_LIMIT_MESSAGE = "To increase your limits, please review our paid plans at https://ipinfo.io/pricing" + HOST = 'ipinfo.io' + class << self def lookup(ip=nil) - response = Faraday.get("https://ipinfo.io/#{ip}") do |req| - default_header.each_pair do |key, value| + response = Faraday.get("https://#{HOST}/#{ip}") do |req| + default_headers.each_pair do |key, value| req.headers[key] = value end end + raise RateLimitError.new(RATE_LIMIT_MESSAGE) if response.status.eql?(429) + JSON.parse(response.body) end - private - def default_header + def default_headers { 'User-Agent' => "ruby/#{::IpinfoIo::VERSION}", 'Accept' => 'application/json' diff --git a/lib/ipinfo_io/errors.rb b/lib/ipinfo_io/errors.rb new file mode 100644 index 0000000..54954bc --- /dev/null +++ b/lib/ipinfo_io/errors.rb @@ -0,0 +1,3 @@ +module IpinfoIo + class RateLimitError < StandardError; end +end diff --git a/test/ipinfo_io_test.rb b/test/ipinfo_io_test.rb index df39506..bbbcc15 100644 --- a/test/ipinfo_io_test.rb +++ b/test/ipinfo_io_test.rb @@ -9,6 +9,12 @@ def test_that_it_has_a_version_number refute_nil ::IpinfoIo::VERSION end + def test_rate_limit_error + stub_request(:get, 'https://ipinfo.io').to_return(body:'', status: 429) + error = assert_raises(IpinfoIo::RateLimitError) { IpinfoIo.lookup } + assert_equal "To increase your limits, please review our paid plans at https://ipinfo.io/pricing", error.message + end + def test_lookup_without_arg expected = { "ip" => "110.171.151.183", diff --git a/test/test_helper.rb b/test/test_helper.rb index 3b152e0..c3fbfa1 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -4,7 +4,7 @@ require 'minitest/autorun' require 'minitest/reporters' require 'minitest-vcr' -require 'webmock' +require 'webmock/minitest' Minitest::Reporters.use!( Minitest::Reporters::SpecReporter.new