cartodb/spec/models/carto/mapcap_spec.rb
2020-06-15 10:58:47 +08:00

265 lines
9.0 KiB
Ruby

require 'spec_helper_min'
require 'support/helpers'
describe Carto::Mapcap do
include Carto::Factories::Visualizations
before(:all) do
@user = FactoryGirl.create(:carto_user, private_tables_enabled: true)
@map, @table, @table_visualization, @visualization = create_full_visualization(@user)
end
after(:all) do
destroy_full_visualization(@map, @table, @table_visualization, @visualization)
@user.destroy
end
describe '#ids_vizjson' do
before(:all) do
@mapcap = Carto::Mapcap.create!(visualization_id: @visualization.id)
@ids_json = @mapcap.ids_json
end
after(:all) do
@mapcap.destroy
@ids_json = nil
end
it 'should have visualization_id' do
@ids_json[:visualization_id].should_not be_nil
end
it 'should have map_id' do
@ids_json[:map_id].should_not be_nil
end
it 'should have correct visualization_id' do
@ids_json[:visualization_id].should eq @visualization.id
end
it 'should have correct map_id' do
@ids_json[:map_id].should eq @map.id
end
describe 'with layers' do
before(:all) do
@carto_layer = FactoryGirl.create(:carto_layer, kind: 'carto', maps: [@map])
@visualization.reload
@mapcap = Carto::Mapcap.create!(visualization_id: @visualization.id)
@ids_json_layers = @mapcap.ids_json[:layers]
end
after(:all) do
@mapcap.destroy
@carto_layer.destroy
@visualization.reload
@ids_json_layers = nil
end
it 'should not have empty layers' do
@ids_json_layers.should_not be_empty
end
it 'should contain layer ids and in the right order' do
@ids_json_layers.count.should eq @visualization.layers.count
@ids_json_layers.each_with_index do |layer, index|
layer[:layer_id].should eq @visualization.layers[index].id
end
end
describe 'with widgets' do
before(:all) do
@widget = FactoryGirl.create(:widget, layer: @carto_layer)
@visualization.reload
@mapcap = Carto::Mapcap.create!(visualization_id: @visualization.id)
@ids_json_layers = @mapcap.ids_json[:layers]
end
after(:all) do
@widget.destroy
@visualization.reload
@mapcap.destroy
@ids_json_layers = nil
end
it 'should contain widgets only for layers with widgets and in the right order' do
@visualization.layers.each_with_index do |layer, index|
@ids_json_layers[index][:widgets].each_with_index do |widget_id, widget_index|
widget_id.should eq layer.widgets[widget_index].id
end
end
end
end
end
end
describe '#regenerate_visualization' do
before(:all) do
FactoryGirl.create(:analysis, visualization: @visualization, user: @user)
FactoryGirl.create(:widget, layer: @visualization.data_layers.first)
@visualization.reload
@mapcap = Carto::Mapcap.create!(visualization_id: @visualization.id)
end
after(:all) do
@mapcap.destroy
@ids_json = nil
end
it 'tokens should be functional from regenerated visualizations after privacy changes' do
@visualization.create_mapcap!
@visualization.privacy = Carto::Visualization::PRIVACY_PROTECTED
@visualization.password = "r4nr0mp455"
@visualization.save!
mapcap = @visualization.create_mapcap!
mapcap.regenerate_visualization.non_mapcapped.auth_token
end
it 'should preserve map' do
regenerated_visualization = @mapcap.regenerate_visualization
regenerated_visualization.map.id.should eq @map.id
end
it 'should preserve visualization' do
regenerated_visualization = @mapcap.regenerate_visualization
regenerated_visualization.id.should eq @visualization.id
end
it 'should preserve user' do
regenerated_visualization = @mapcap.regenerate_visualization
regenerated_visualization.user.id.should eq @visualization.user.id
end
it 'should preserve permission' do
regenerated_visualization = @mapcap.regenerate_visualization
regenerated_visualization.permission.id.should eq @visualization.permission.id
end
it 'should preserve analyses' do
regenerated_visualization = @mapcap.regenerate_visualization
analysis = @visualization.analyses.first
regenerated_analysis = regenerated_visualization.analyses.first
expect(regenerated_analysis.analysis_definition).to eq analysis.analysis_definition
end
it 'should preserve widgets' do
regenerated_visualization = @mapcap.regenerate_visualization
widget = @visualization.widgets.first
regenerated_widget = regenerated_visualization.widgets.first
expect(regenerated_widget.order).to eq widget.order
expect(regenerated_widget.type).to eq widget.type
expect(regenerated_widget.title).to eq widget.title
expect(regenerated_widget.options).to eq widget.options
expect(regenerated_widget.source_id).to eq widget.source_id
expect(regenerated_widget.style).to eq widget.style
end
it 'should be readonly' do
rv = @mapcap.regenerate_visualization
rv.readonly?.should eq true
rv.user.readonly?.should eq true
rv.full_user.readonly?.should eq true
rv.permission.readonly?.should eq true
rv.likes.each { |like| like.readonly?.should eq true }
rv.shared_entities.each { |entity| entity.readonly?.should eq true }
rv.unordered_children.each { |child| child.readonly?.should eq true }
rv.overlays.each { |overlay| overlay.readonly?.should eq true }
rv.active_layer.readonly?.should eq true
rv.map.readonly?.should eq true
rv.related_templates.each { |template| template.readonly?.should eq true }
rv.external_sources.each { |resource| resource.readonly?.should eq true }
rv.analyses.each { |analysis| analysis.readonly?.should eq true }
rv.mapcaps.each { |mapcap| mapcap.readonly?.should eq true }
rv.state.readonly?.should eq true
rv.snapshots.each { |snapshot| snapshot.readonly?.should eq true }
end
describe 'without user DB' do
before(:all) do
@user_nodb = FactoryGirl.create(:carto_user, private_tables_enabled: true)
@map_nodb, @table_nodb, @table_visualization_nodb, @visualization_nodb = create_full_visualization(@user_nodb)
@mapcap_nodb = Carto::Mapcap.create!(visualization_id: @visualization_nodb.id)
@actual_db_name = @user_nodb.database_name
@user_nodb.update_attribute(:database_name, 'wadus')
@mapcap_nodb.reload
end
after(:all) do
@user_nodb.update_attribute(:database_name, @actual_db_name)
destroy_full_visualization(@map_nodb, @table_nodb, @table_visualization_nodb, @visualization_nodb)
@user_nodb.destroy
end
it 'should work' do
CartoDB::Logger.expects(:warning).never
User.any_instance.expects(:in_database).never
@mapcap_nodb.regenerate_visualization
User.any_instance.unstub(:in_database)
end
end
describe 'with layers' do
before(:all) do
@carto_layer = FactoryGirl.create(:carto_layer, kind: 'carto', maps: [@map])
@visualization.reload
@mapcap = Carto::Mapcap.create!(visualization_id: @visualization.id)
end
after(:all) do
@mapcap.destroy
@carto_layer.destroy
@visualization.reload
end
it 'should contain same layers in same order' do
CartoDB::Logger.expects(:warning).never
User.any_instance.stubs(:in_database).raises("Mapcap regeneration shouldn't touch user database")
Carto::User.any_instance.stubs(:in_database).raises("Mapcap regeneration shouldn't touch user database")
regenerated_visualization = @mapcap.regenerate_visualization
regenerated_visualization.layers.each_with_index do |layer, index|
expect(layer.id).to eq(regenerated_visualization.layers[index].id)
end
Carto::User.any_instance.unstub(:in_database)
User.any_instance.unstub(:in_database)
end
describe 'with widgets' do
before(:all) do
@widget = FactoryGirl.create(:widget, layer: @carto_layer)
@visualization.reload
@mapcap = Carto::Mapcap.create!(visualization_id: @visualization.id)
end
after(:all) do
@widget.destroy
@visualization.reload
@mapcap.destroy
end
it 'should contain widgets only for layers with widgets and in the right order' do
@visualization.layers.each_with_index do |layer, index|
regenerated_visualization = @mapcap.regenerate_visualization
regenerated_layer = regenerated_visualization.layers[index]
layer.widgets.length.should eq regenerated_layer.widgets.length
layer.widgets.each_with_index do |widget, widget_index|
widget.should eq regenerated_layer.widgets[widget_index]
end
end
end
end
end
end
end