Created
November 23, 2024 02:11
-
-
Save jjmonsalveg/e8d31d76fccdd25590786e5d06e55348 to your computer and use it in GitHub Desktop.
EasyBroker property example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
gem install minitest mocha |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# | |
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