163 lines
5.9 KiB
Ruby
163 lines
5.9 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe "Geocodings API" do
|
|
before(:all) do
|
|
@user = FactoryGirl.create(:valid_user, table_quota: 50)
|
|
|
|
delete_user_data @user
|
|
host! "#{@user.username}.localhost.lan"
|
|
end
|
|
|
|
after(:all) do
|
|
@user.destroy
|
|
end
|
|
|
|
before(:each) do
|
|
bypass_named_maps
|
|
end
|
|
|
|
let(:params) { { :api_key => @user.api_key } }
|
|
|
|
describe 'POST /api/v1/geocodings' do
|
|
let(:table) { create_table(user_id: @user.id) }
|
|
|
|
it 'creates a new geocoding' do
|
|
Geocoding.any_instance.stubs("run!").returns(true)
|
|
payload = params.merge table_name: table.name, formatter: 'name, description', kind: 'high-resolution'
|
|
post_json api_v1_geocodings_create_url(payload) do |response|
|
|
response.status.should eq 200
|
|
response.body[:id].should_not be_nil
|
|
response.body[:user_id].should eq @user.id
|
|
response.body[:table_id].should eq table.id
|
|
response.body[:formatter].should eq 'name, description'
|
|
response.body[:created_at].should_not be_nil
|
|
response.body[:updated_at].should_not be_nil
|
|
end
|
|
end
|
|
|
|
it 'uses column_name instead of formatter if present' do
|
|
Geocoding.any_instance.stubs("run!").returns(true)
|
|
payload = params.merge table_name: table.name, column_name: 'name', kind: 'high-resolution'
|
|
post_json api_v1_geocodings_create_url(payload) do |response|
|
|
response.status.should eq 200
|
|
response.body[:id].should_not be_nil
|
|
response.body[:formatter].should eq '{name}'
|
|
end
|
|
end
|
|
|
|
describe 'namedplace geocodings' do
|
|
it "should set the country_code when the name of the country is present" do
|
|
Geocoding.any_instance.stubs("run!").returns(true)
|
|
payload = params.merge \
|
|
table_name: table.name,
|
|
column_name: 'name',
|
|
text: true,
|
|
location: 'spain',
|
|
kind: 'namedplace'
|
|
post_json api_v1_geocodings_create_url(payload) do |response|
|
|
response.status.should eq 200
|
|
response.body[:id].should_not be_nil
|
|
response.body[:country_code].should eq "'spain'"
|
|
response.body[:country_column].should be_nil
|
|
end
|
|
end
|
|
|
|
it "should set country_code and country_column when a country column has been selected" do
|
|
table.add_column!(name: "country", type: "text")
|
|
table.insert_row!(country: "spain")
|
|
table.insert_row!(country: "spain")
|
|
table.insert_row!(country: "us")
|
|
table.reload
|
|
|
|
Geocoding.any_instance.stubs("run!").returns(true)
|
|
payload = params.merge \
|
|
table_name: table.name,
|
|
column_name: 'name',
|
|
text: false,
|
|
location: 'country',
|
|
kind: 'namedplace'
|
|
post_json api_v1_geocodings_create_url, payload do |response|
|
|
response.status.should eq 200
|
|
response.body[:id].should_not be_nil
|
|
response.body[:country_code].split(',').sort.should eq ["'spain'", "'us'"]
|
|
response.body[:country_column].should eq "country"
|
|
end
|
|
end
|
|
|
|
it "should set the region_code when the name of the region is present" do
|
|
Geocoding.any_instance.stubs("run!").returns(true)
|
|
payload = params.merge \
|
|
table_name: table.name,
|
|
column_name: 'name',
|
|
text: true,
|
|
location: 'spain',
|
|
region_text: true,
|
|
region: 'madrid',
|
|
kind: 'namedplace'
|
|
post_json api_v1_geocodings_create_url(payload) do |response|
|
|
response.status.should eq 200
|
|
response.body[:id].should_not be_nil
|
|
response.body[:region_code].should eq "'madrid'"
|
|
response.body[:region_column].should be_nil
|
|
end
|
|
end
|
|
|
|
it "should set region_code and region_column when a region column has been selected" do
|
|
table.add_column!(name: "country", type: "text")
|
|
table.add_column!(name: "region", type: "text")
|
|
table.insert_row!(country: "spain", region: "madrid")
|
|
table.insert_row!(country: "spain", region: "madrid")
|
|
table.insert_row!(country: "us", region: "minnesota")
|
|
table.reload
|
|
|
|
Geocoding.any_instance.stubs("run!").returns(true)
|
|
payload = params.merge \
|
|
table_name: table.name,
|
|
column_name: 'name',
|
|
text: false,
|
|
location: 'country',
|
|
region_text: false,
|
|
region: 'region',
|
|
|
|
kind: 'namedplace'
|
|
post_json api_v1_geocodings_create_url, payload do |response|
|
|
response.status.should eq 200
|
|
response.body[:id].should_not be_nil
|
|
response.body[:region_code].split(',').sort.should eq ["'madrid'", "'minnesota'"]
|
|
response.body[:region_column].should eq "region"
|
|
end
|
|
end
|
|
end
|
|
|
|
it 'responds with 422 on bad payload' do
|
|
payload = params.merge(table_name: '', formatter: '', kind: 'high-resolution')
|
|
post_json api_v1_geocodings_create_url(payload) do |response|
|
|
response.status.should eq 422
|
|
response.body[:description].should eq "formatter is not present"
|
|
end
|
|
end
|
|
|
|
it 'responds with 500 on failure' do
|
|
payload = params.merge(table_name: '', formatter: '', kind: 'high-resolution')
|
|
Geocoding.any_instance.stubs(:save).raises(RuntimeError.new)
|
|
post_json api_v1_geocodings_create_url(payload) do |response|
|
|
response.status.should eq 500
|
|
response.body[:description].should eq "RuntimeError"
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'PUT /api/v1/geocodings/:id' do
|
|
it 'fails gracefully on job cancel failure' do
|
|
geocoding = FactoryGirl.create(:geocoding, table_id: Carto::UUIDHelper.random_uuid, formatter: 'b', user: @user)
|
|
Geocoding.any_instance.stubs(:cancel).raises('wadus')
|
|
|
|
put_json api_v1_geocodings_update_url(params.merge(id: geocoding.id)), { state: 'cancelled' } do |response|
|
|
response.status.should eq 400
|
|
response.body.should eq errors: "wadus"
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|