241 lines
8.4 KiB
Ruby
241 lines
8.4 KiB
Ruby
|
require_relative '../../../spec_helper_min'
|
||
|
require 'support/helpers'
|
||
|
require_relative '../../../../app/controllers/carto/api/maps_controller'
|
||
|
|
||
|
describe Carto::Api::MapsController do
|
||
|
include Carto::Factories::Visualizations, HelperMethods
|
||
|
|
||
|
def create_show_map_url(user: @user, map: @map)
|
||
|
map_url(user_domain: user.subdomain, api_key: user.api_key, id: map.id)
|
||
|
end
|
||
|
|
||
|
describe '#update' do
|
||
|
before(:all) do
|
||
|
@user = FactoryGirl.create(:carto_user)
|
||
|
@user2 = FactoryGirl.create(:carto_user)
|
||
|
@map, @table, @table_visualization, @visualization = create_full_visualization(@user)
|
||
|
end
|
||
|
|
||
|
after(:all) do
|
||
|
destroy_full_visualization(@map, @table, @table_visualization, @visualization)
|
||
|
# This avoids connection leaking.
|
||
|
::User[@user.id].destroy
|
||
|
::User[@user2.id].destroy
|
||
|
end
|
||
|
|
||
|
let(:payload) do
|
||
|
{
|
||
|
bounding_box_ne: "[85.0511, 179]",
|
||
|
bounding_box_sw: "[-85.0511, -179]",
|
||
|
center: "[28.483177058570757, -82.825927734375]",
|
||
|
provider: "leaflet",
|
||
|
view_bounds_ne: "[32.30570601389429, -76.32202148437499]",
|
||
|
view_bounds_sw: "[24.51713945052515, -89.329833984375]",
|
||
|
zoom: 7,
|
||
|
options: {
|
||
|
dashboard_menu: false,
|
||
|
legends: true,
|
||
|
scrollwheel: true,
|
||
|
layer_selector: true
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
|
||
|
it 'updates an existing map' do
|
||
|
put_json create_show_map_url, payload do |response|
|
||
|
response.status.should be_success
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'validates on update' do
|
||
|
payload[:options] = { spammy: 'hell', dashboard_menu: true }
|
||
|
put_json create_show_map_url, payload do |response|
|
||
|
response.status.should eq 422
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'invalidates VizJSON upon update' do
|
||
|
Carto::VisualizationInvalidationService.any_instance.expects(:invalidate).once
|
||
|
put_json create_show_map_url, payload do |response|
|
||
|
response.status.should eq 200
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'returns 401 for unauthorized user' do
|
||
|
put_json map_url(user_domain: @user2.subdomain,
|
||
|
api_key: 'wadus',
|
||
|
id: @map.id) do |response|
|
||
|
response.status.should eq 401
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'returns 404 for maps not owned by the user' do
|
||
|
put_json create_show_map_url(user: @user2) do |response|
|
||
|
response.status.should eq 404
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'returns 404 for inexistent map' do
|
||
|
put_json map_url(user_domain: @user.subdomain,
|
||
|
api_key: @user.api_key,
|
||
|
id: random_uuid) do |response|
|
||
|
response.status.should eq 404
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def create_update_map_url(user, map_id)
|
||
|
map_url(user_domain: user.username, api_key: user.api_key, id: map_id)
|
||
|
end
|
||
|
|
||
|
it 'updates existing map by id' do
|
||
|
# Intentionally uses long decimal numbers to test against JSON serialization problems
|
||
|
payload = {
|
||
|
provider: 'not_leaflet',
|
||
|
bounding_box_sw: [5.123456789123456789, 5.123456789123456789],
|
||
|
bounding_box_ne: [10.123456789123456789, 20.123456789123456789],
|
||
|
center: [7.123456789123456789, 7.123456789123456789],
|
||
|
zoom: 42,
|
||
|
view_bounds_sw: [-15.123456789123456789, -15.123456789123456789],
|
||
|
view_bounds_ne: [-35.123456789123456789, -55.123456789123456789],
|
||
|
legends: false,
|
||
|
scrollwheel: true
|
||
|
}
|
||
|
|
||
|
put_json create_update_map_url(@user, @map.id), payload do |response|
|
||
|
response.status.should be_success
|
||
|
response.body[:provider].should eq payload[:provider]
|
||
|
JSON.parse(response.body[:bounding_box_sw]).should eq payload[:bounding_box_sw]
|
||
|
JSON.parse(response.body[:bounding_box_ne]).should eq payload[:bounding_box_ne]
|
||
|
JSON.parse(response.body[:center]).should eq payload[:center]
|
||
|
response.body[:zoom].should eq payload[:zoom]
|
||
|
JSON.parse(response.body[:view_bounds_sw]).should eq payload[:view_bounds_sw]
|
||
|
JSON.parse(response.body[:view_bounds_ne]).should eq payload[:view_bounds_ne]
|
||
|
response.body[:legends].should eq payload[:legends]
|
||
|
response.body[:scrollwheel].should eq payload[:scrollwheel]
|
||
|
end
|
||
|
|
||
|
@map.reload
|
||
|
@map.provider.should eq payload[:provider]
|
||
|
JSON.parse(@map.bounding_box_sw).should eq payload[:bounding_box_sw]
|
||
|
JSON.parse(@map.bounding_box_ne).should eq payload[:bounding_box_ne]
|
||
|
JSON.parse(@map.center).should eq payload[:center]
|
||
|
@map.zoom.should eq payload[:zoom]
|
||
|
JSON.parse(@map.view_bounds_sw).should eq payload[:view_bounds_sw]
|
||
|
JSON.parse(@map.view_bounds_ne).should eq payload[:view_bounds_ne]
|
||
|
@map.legends.should eq payload[:legends]
|
||
|
@map.scrollwheel.should eq payload[:scrollwheel]
|
||
|
end
|
||
|
|
||
|
it 'only updates passed parameters' do
|
||
|
@map.view_bounds_sw.present?.should be_true
|
||
|
zoom = @map.zoom + 1
|
||
|
put_json create_update_map_url(@user, @map.id), zoom: zoom do
|
||
|
@map.reload
|
||
|
@map.view_bounds_sw.present?.should be_true
|
||
|
@map.zoom.should eq zoom
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'does not update map_id nor user_id' do
|
||
|
payload = {
|
||
|
id: 'c3c1030c-9783-45f4-bd08-022593a682aa',
|
||
|
user_id: 'c3c1030c-9783-45f4-bd08-022593a682ab'
|
||
|
}
|
||
|
|
||
|
put_json create_update_map_url(@user, @map.id), payload do |response|
|
||
|
response.status.should be_success
|
||
|
response.body[:id].should eq @map.id
|
||
|
response.body[:user_id].should eq @user.id
|
||
|
end
|
||
|
|
||
|
old_map_id = @map.id
|
||
|
@map.reload
|
||
|
@map.id.should eq old_map_id
|
||
|
@map.user_id.should eq @user.id
|
||
|
end
|
||
|
|
||
|
it 'returns 401 for unathorized user' do
|
||
|
put_json map_url(user_domain: @user2.username, api_key: 'wadus', id: @map.id) do |response|
|
||
|
response.status.should eq 401
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'returns 404 for maps not owned by the user' do
|
||
|
put_json create_update_map_url(@user2, @map.id), center: [1, 1] do |response|
|
||
|
response.status.should eq 404
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'returns 404 for unexisting map' do
|
||
|
put_json create_update_map_url(@user, 'c3c1030c-9783-45f4-bd08-022593a682ac') do |response|
|
||
|
response.status.should eq 404
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe '#show' do
|
||
|
before(:all) do
|
||
|
@user = FactoryGirl.create(:carto_user)
|
||
|
@user2 = FactoryGirl.create(:carto_user)
|
||
|
@map, @table, @table_visualization, @visualization = create_full_visualization(@user)
|
||
|
end
|
||
|
|
||
|
after(:all) do
|
||
|
destroy_full_visualization(@map, @table, @table_visualization, @visualization)
|
||
|
# This avoids connection leaking.
|
||
|
::User[@user.id].destroy
|
||
|
::User[@user2.id].destroy
|
||
|
end
|
||
|
|
||
|
it 'does not invalidate VizJSON upon show' do
|
||
|
Carto::Map.any_instance.expects(:force_notify_map_change).never
|
||
|
get_json create_show_map_url, {} do |response|
|
||
|
response.status.should eq 200
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'returns an existing map' do
|
||
|
get_json create_show_map_url do |response|
|
||
|
response.status.should be_success
|
||
|
response.body[:id].should eq @map.id
|
||
|
response.body[:user_id].should eq @map.user_id
|
||
|
response.body[:provider].should eq @map.provider
|
||
|
response.body[:bounding_box_sw].should eq @map.bounding_box_sw
|
||
|
response.body[:bounding_box_ne].should eq @map.bounding_box_ne
|
||
|
response.body[:center].should eq @map.center
|
||
|
response.body[:zoom].should eq @map.zoom
|
||
|
response.body[:view_bounds_sw].should eq @map.view_bounds_sw
|
||
|
response.body[:view_bounds_ne].should eq @map.view_bounds_ne
|
||
|
|
||
|
response_options = response.body[:options]
|
||
|
response_options[:dashboard_menu].should eq @map.dashboard_menu
|
||
|
response_options[:layer_selector].should eq @map.layer_selector
|
||
|
response_options[:legends].should eq @map.options[:legends]
|
||
|
response_options[:scrollwheel].should eq @map.options[:scrollwheel]
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'returns 401 for unauthorized user' do
|
||
|
get_json map_url(user_domain: @user2.subdomain,
|
||
|
api_key: 'wadus',
|
||
|
id: @map.id) do |response|
|
||
|
response.status.should eq 401
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'returns 404 for maps not owned by the user' do
|
||
|
get_json create_show_map_url(user: @user2) do |response|
|
||
|
response.status.should eq 404
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'returns 404 for inexistent map' do
|
||
|
get_json map_url(user_domain: @user.subdomain,
|
||
|
api_key: @user.api_key,
|
||
|
id: random_uuid) do |response|
|
||
|
response.status.should eq 404
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|