cartodb-4.29/spec/requests/carto/api/mapcaps_controller_spec.rb
2020-06-15 10:58:47 +08:00

207 lines
5.9 KiB
Ruby

require 'spec_helper_min'
require 'support/helpers'
require 'factories/carto_visualizations'
require_dependency 'carto/uuidhelper'
describe Carto::Api::MapcapsController do
include Carto::Factories::Visualizations
include HelperMethods
let(:dummy_mapcap) do
dummy = mock
dummy.stubs(:id).returns(UUIDTools::UUID.random_create.to_s)
dummy
end
before(:all) do
FactoryGirl.create(:carto_feature_flag, name: 'editor-3', restricted: false)
@user = FactoryGirl.create(:carto_user, builder_enabled: true)
@intruder = FactoryGirl.create(:carto_user, builder_enabled: true)
@map, @table, @table_visualization, @visualization = create_full_visualization(@user)
end
before(:each) { bypass_named_maps }
after(:all) do
Carto::FeatureFlag.destroy_all
@torque_layer.destroy
destroy_full_visualization(@map, @table, @table_visualization, @visualization)
@user.destroy
@intruder.destroy
end
def mapcap_should_be_correct(response)
new_mapcap_id = response[:id]
new_mapcap_id.should_not be_nil
mapcap = Carto::Mapcap.find(new_mapcap_id)
expected_response = JSON.parse(Carto::Api::MapcapPresenter.new(mapcap).to_poro.to_json).deep_symbolize_keys
response.should eq expected_response
end
describe '#create' do
after(:all) { Carto::Mapcap.all.each(&:destroy) }
def create_mapcap_url(user: @user, visualization: @visualization)
mapcaps_url(user_domain: user.subdomain, visualization_id: visualization.id, api_key: user.api_key)
end
it 'creates new mapcap' do
post_json create_mapcap_url, {} do |response|
response.status.should eq 201
mapcap_should_be_correct(response.body)
end
end
it 'should only allow MAX_MAPCAPS_PER_VISUALIZATION mapcaps' do
max_mapcaps = Carto::Visualization::MAX_MAPCAPS_PER_VISUALIZATION
(max_mapcaps + 1).times do
post_json create_mapcap_url, {} do |response|
response.status.should eq 201
mapcap_should_be_correct(response.body)
end
end
mapcaps = Carto::Mapcap.where(visualization_id: @visualization.id)
mapcaps.count == max_mapcaps
end
it 'returns 403 if user does not own the visualization' do
post_json create_mapcap_url(user: @intruder), {} do |response|
response.status.should eq 403
end
end
it 'triggers autoindex regeneration' do
::Resque.expects(:enqueue).with(::Resque::UserDBJobs::UserDBMaintenance::AutoIndexTable, @table.id).once
post_json create_mapcap_url, {} do |response|
response.status.should eq 201
mapcap_should_be_correct(response.body)
end
end
it 'triggers autoindex regeneration for torque layers' do
@map.data_layers.first.update_attribute(:kind, 'torque')
::Resque.expects(:enqueue).with(::Resque::UserDBJobs::UserDBMaintenance::AutoIndexTable, @table.id).once
post_json create_mapcap_url, {} do |response|
response.status.should eq 201
mapcap_should_be_correct(response.body)
end
end
end
describe '#index' do
before(:all) do
5.times { Carto::Mapcap.create(visualization_id: @visualization.id) }
@mapcaps = Carto::Mapcap.all
end
after(:all) { @mapcaps.each(&:destroy) }
def index_mapcap_url(user: @user, visualization: @visualization)
mapcaps_url(
user_domain: user.subdomain,
visualization_id: visualization.id,
api_key: user.api_key
)
end
it 'indexes all mapcaps' do
get_json index_mapcap_url, {} do |response|
response.status.should eq 200
response.body.each do |mapcap_representation|
mapcap_should_be_correct(mapcap_representation.deep_symbolize_keys)
end
end
end
it 'returns 403 if user does not own the visualization' do
get_json index_mapcap_url(user: @intruder), {} do |response|
response.status.should eq 403
end
end
end
describe '#show' do
before (:all) { @mapcap = Carto::Mapcap.create(visualization_id: @visualization.id) }
after (:all) { @mapcap.destroy }
def show_mapcap_url(user: @user, visualization: @visualization, mapcap: @mapcap)
mapcap_url(
user_domain: user.subdomain,
visualization_id: visualization.id,
id: mapcap.id,
api_key: user.api_key
)
end
it 'shows a mapcap' do
get_json show_mapcap_url, {} do |response|
response.status.should eq 200
mapcap_should_be_correct(response.body)
end
end
it 'returns 404 for an inexistent mapcap' do
get_json show_mapcap_url(mapcap: dummy_mapcap) do |response|
response.status.should eq 404
end
end
it 'returns 403 if user does not own the visualization' do
get_json show_mapcap_url(user: @intruder), {} do |response|
response.status.should eq 403
end
end
end
describe '#destroy' do
before (:each) { @mapcap = Carto::Mapcap.create(visualization_id: @visualization.id) }
after (:each) { @mapcap.destroy if @mapcap }
def destroy_mapcap_url(user: @user, visualization: @visualization, mapcap: @mapcap)
mapcap_url(
user_domain: user.subdomain,
visualization_id: visualization.id,
id: mapcap.id,
api_key: user.api_key
)
end
it 'destroy a mapcap' do
delete_json destroy_mapcap_url, {} do |response|
response.status.should eq 204
response.body.should be_empty
Carto::Mapcap.exists?(response.body[:id]).should_not be_true
end
end
it 'returns 404 for an inexistent mapcap' do
delete_json destroy_mapcap_url(mapcap: dummy_mapcap) do |response|
response.status.should eq 404
end
end
it 'returns 403 if user does not own the visualization' do
delete_json destroy_mapcap_url(user: @intruder), {} do |response|
response.status.should eq 403
end
end
end
end