Skip to content

Instantly share code, notes, and snippets.

@jjmonsalveg
Created November 23, 2024 02:11
Show Gist options
  • Save jjmonsalveg/e8d31d76fccdd25590786e5d06e55348 to your computer and use it in GitHub Desktop.
Save jjmonsalveg/e8d31d76fccdd25590786e5d06e55348 to your computer and use it in GitHub Desktop.
EasyBroker property example
require 'net/http'
require 'json'
class EasyBrokerAPI
API_KEY = 'l7u502p8v46ba3ppgvj5y2aad50lb9'
BASE_URL = 'https://api.stagingeb.com/v1/properties'
def initialize(http_client = Net::HTTP)
@http_client = http_client
@headers = { 'X-Authorization' => API_KEY }
end
def fetch_properties(page: 1, limit: 20, search: {})
uri = URI(BASE_URL)
query_params = { page: page, limit: limit }.merge(search)
uri.query = URI.encode_www_form(query_params)
http = @http_client.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri, @headers)
response = http.request(request)
raise "Error: #{response.code}" unless response.is_a?(Net::HTTPSuccess)
JSON.parse(response.body)['content']
end
def fetch_all_properties(limit: 20, search: {})
properties = []
page = 1
loop do
current_properties = fetch_properties(page: page, limit: limit, search: search)
break if current_properties.empty?
properties.concat(current_properties)
page += 1
end
properties
end
end
gem install minitest mocha
#
require 'minitest/autorun'
require 'mocha/minitest'
require_relative 'easy_broker_api'
class EasyBrokerAPITest < Minitest::Test
def setup
@mock_http_client = mock('http_client')
@api = EasyBrokerAPI.new(@mock_http_client)
end
def test_fetch_properties_with_pagination_and_limit
mock_response = mock('response')
mock_response.stubs(:is_a?).with(Net::HTTPSuccess).returns(true)
mock_response.stubs(:body).returns('{"content": [{"title": "Property 1"}, {"title": "Property 2"}]}')
mock_http = mock('http')
@mock_http_client.stubs(:new).returns(mock_http)
mock_http.stubs(:use_ssl=).with(true)
mock_http.stubs(:request).returns(mock_response)
properties = @api.fetch_properties(page: 1, limit: 2)
assert_equal 2, properties.size
assert_equal 'Property 1', properties.first['title']
end
def test_fetch_properties_with_search_filters
mock_response = mock('response')
mock_response.stubs(:is_a?).with(Net::HTTPSuccess).returns(true)
mock_response.stubs(:body).returns('{"content": [{"title": "Filtered Property"}]}')
mock_http = mock('http')
@mock_http_client.stubs(:new).returns(mock_http)
mock_http.stubs(:use_ssl=).with(true)
mock_http.stubs(:request).returns(mock_response)
properties = @api.fetch_properties(search: { 'min_price' => 500000, 'operation_type' => 'sale' })
assert_equal 1, properties.size
assert_equal 'Filtered Property', properties.first['title']
end
def test_fetch_all_properties
mock_response_page1 = mock('response_page1')
mock_response_page1.stubs(:is_a?).with(Net::HTTPSuccess).returns(true)
mock_response_page1.stubs(:body).returns('{"content": [{"title": "Property 1"}]}')
mock_response_page2 = mock('response_page2')
mock_response_page2.stubs(:is_a?).with(Net::HTTPSuccess).returns(true)
mock_response_page2.stubs(:body).returns('{"content": [{"title": "Property 2"}]}')
mock_response_page3 = mock('response_page3')
mock_response_page3.stubs(:is_a?).with(Net::HTTPSuccess).returns(true)
mock_response_page3.stubs(:body).returns('{"content": []}')
mock_http = mock('http')
@mock_http_client.stubs(:new).returns(mock_http)
mock_http.stubs(:use_ssl=).with(true)
mock_http.stubs(:request).returns(mock_response_page1, mock_response_page2, mock_response_page3)
properties = @api.fetch_all_properties(limit: 1)
assert_equal 2, properties.size
assert_equal 'Property 1', properties.first['title']
assert_equal 'Property 2', properties.last['title']
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment