72 lines
2.2 KiB
Ruby
72 lines
2.2 KiB
Ruby
|
require_relative '../sql_api.rb'
|
|||
|
require_relative '../../../spec/rspec_configuration.rb'
|
|||
|
|
|||
|
module Cartodb; end
|
|||
|
|
|||
|
describe CartoDB::SQLApi do
|
|||
|
|
|||
|
before(:each) do
|
|||
|
Cartodb.stubs(:config).returns(TEST_SQL_API_CONFIG)
|
|||
|
end
|
|||
|
|
|||
|
describe '#fetch' do
|
|||
|
|
|||
|
let(:api) { CartoDB::SQLApi.new(username: 'maloshumos') }
|
|||
|
|
|||
|
it "returns an array of rows" do
|
|||
|
stub_api_request 200, 'sql_api_success.json'
|
|||
|
result = api.fetch("SELECT cartodb_id, description from public_table")
|
|||
|
result.should eq [{"cartodb_id"=>1, "description"=>"a"}, {"cartodb_id"=>2, "description"=>"b"}, {"cartodb_id"=>3, "description"=>"c"}, {"cartodb_id"=>4, "description"=>"d"}]
|
|||
|
end
|
|||
|
|
|||
|
it "raises PermissionError when the table is private" do
|
|||
|
stub_api_request 400, 'sql_api_private.json'
|
|||
|
expect { api.fetch("SELECT * FROM private_table") }.to raise_error(CartoDB::SQLApi::PermissionError)
|
|||
|
end
|
|||
|
|
|||
|
it "raises SQLError when the query is flawed" do
|
|||
|
stub_api_request 400, 'sql_api_error.json'
|
|||
|
expect { api.fetch("wrong query") }.to raise_error(CartoDB::SQLApi::SQLError)
|
|||
|
end
|
|||
|
|
|||
|
it "handles gzipped output" do
|
|||
|
stub_api_request 200, 'sql_api_binary.bin'
|
|||
|
result = api.fetch("SELECT description from public_table", 'csv')
|
|||
|
result.should match /description,\r\n\"Pretend that you’ve opened this book/
|
|||
|
result.should match /And if not, then the onion will make it all happen for you.*$/
|
|||
|
end
|
|||
|
|
|||
|
end #fetch
|
|||
|
|
|||
|
|
|||
|
def stub_api_request(code, response_file)
|
|||
|
response = File.open(path_to(response_file)).read
|
|||
|
Typhoeus.stub(/.*carto.com\/api\/v[12]/).and_return(
|
|||
|
Typhoeus::Response.new(code: code, body: response)
|
|||
|
)
|
|||
|
end # stub_api_request
|
|||
|
|
|||
|
def path_to(filepath = '')
|
|||
|
File.expand_path(
|
|||
|
File.join(File.dirname(__FILE__), "../spec/fixtures/#{filepath}")
|
|||
|
)
|
|||
|
end #path_to
|
|||
|
|
|||
|
TEST_SQL_API_CONFIG = {:sql_api => {
|
|||
|
"private" => {
|
|||
|
"protocol" => 'http',
|
|||
|
"domain" => 'carto.com',
|
|||
|
"endpoint" => '/api/v1/sql',
|
|||
|
"port" => 8080
|
|||
|
},
|
|||
|
"public" => {
|
|||
|
"protocol" => 'http',
|
|||
|
"domain" => 'carto.com',
|
|||
|
"endpoint" => '/api/v2/sql',
|
|||
|
"port" => 8080
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
end # CartoDB::SQLApi
|