160 lines
5.2 KiB
Ruby
160 lines
5.2 KiB
Ruby
|
require 'spec_helper_min'
|
||
|
require 'models/layer_shared_examples'
|
||
|
|
||
|
describe Carto::Layer do
|
||
|
include Carto::Factories::Visualizations
|
||
|
|
||
|
it_behaves_like 'Layer model' do
|
||
|
let(:layer_class) { Carto::Layer }
|
||
|
def create_map(options = {})
|
||
|
options.delete(:table_id)
|
||
|
map = Carto::Map.create(options)
|
||
|
FactoryGirl.create(:carto_visualization, map: map, user_id: options[:user_id]) if options[:user_id].present?
|
||
|
|
||
|
map
|
||
|
end
|
||
|
|
||
|
def add_layer_to_entity(entity, layer)
|
||
|
entity.layers << layer
|
||
|
end
|
||
|
|
||
|
before(:all) do
|
||
|
@user = FactoryGirl.create(:carto_user, private_tables_enabled: true)
|
||
|
|
||
|
@table = Table.new
|
||
|
@table.user_id = @user.id
|
||
|
@table.save
|
||
|
end
|
||
|
|
||
|
before(:each) do
|
||
|
bypass_named_maps
|
||
|
end
|
||
|
|
||
|
after(:all) do
|
||
|
@user.destroy
|
||
|
end
|
||
|
|
||
|
describe '#copy' do
|
||
|
it 'returns a copy of the layer' do
|
||
|
layer = layer_class.create(kind: 'carto', options: { style: 'bogus' })
|
||
|
layer_copy = layer.dup
|
||
|
|
||
|
layer_copy.kind.should == layer.kind
|
||
|
layer_copy.options.should == layer.options
|
||
|
layer_copy.id.should be_nil
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe '#affected_tables' do
|
||
|
before(:all) do
|
||
|
bypass_named_maps
|
||
|
@user = FactoryGirl.create(:carto_user)
|
||
|
@map, @table1, @table_visualization, @visualization = create_full_visualization(@user)
|
||
|
@table2 = FactoryGirl.create(:carto_user_table, user_id: @user.id, map_id: @map.id)
|
||
|
@analysis = FactoryGirl.create(:analysis_point_in_polygon,
|
||
|
user: @user, visualization: @visualization,
|
||
|
source_table: @table1.name, target_table: @table2.name)
|
||
|
@layer = @map.data_layers.first
|
||
|
end
|
||
|
|
||
|
after(:all) do
|
||
|
@analysis.destroy
|
||
|
destroy_full_visualization(@map, @table1, @table_visualization, @visualization)
|
||
|
@user.destroy
|
||
|
end
|
||
|
|
||
|
let(:source_analysis_id) { @analysis.analysis_node.children[0].id }
|
||
|
let(:target_analysis_id) { @analysis.analysis_node.children[1].id }
|
||
|
|
||
|
it 'returns all tables from the root analysis' do
|
||
|
@layer.stubs(:options).returns(source: @analysis.natural_id)
|
||
|
@layer.stubs(:affected_table_names).returns([]).twice
|
||
|
affected = @layer.send(:affected_tables)
|
||
|
affected.count.should eq 2
|
||
|
affected.should include @table1
|
||
|
affected.should include @table2
|
||
|
end
|
||
|
|
||
|
it 'returns only tables from the sub-analysis' do
|
||
|
@layer.stubs(:options).returns(source: source_analysis_id)
|
||
|
@layer.stubs(:affected_table_names).returns([]).once
|
||
|
affected = @layer.send(:affected_tables)
|
||
|
affected.count.should eq 1
|
||
|
affected.should include @table1
|
||
|
|
||
|
@layer.stubs(:options).returns(source: target_analysis_id)
|
||
|
@layer.stubs(:affected_table_names).returns([]).once
|
||
|
affected = @layer.send(:affected_tables)
|
||
|
affected.count.should eq 1
|
||
|
affected.should include @table2
|
||
|
end
|
||
|
|
||
|
it 'ignores query/table_name if source is specified' do
|
||
|
@layer.stubs(:options).returns(source: 'wadus', table_name: @table1.name)
|
||
|
affected = @layer.send(:affected_tables)
|
||
|
affected.should be_empty
|
||
|
end
|
||
|
|
||
|
it 'fallbacks to query/table_name if source is not specified' do
|
||
|
@layer.stubs(:options).returns(table_name: @table1.name)
|
||
|
affected = @layer.send(:affected_tables)
|
||
|
affected.should eq [@table1]
|
||
|
|
||
|
query = "SELECT * FROM #{@table2.name}"
|
||
|
@layer.stubs(:options).returns(query: query)
|
||
|
@layer.stubs(:affected_table_names).with(query).returns([@table2.name]).once
|
||
|
affected = @layer.send(:affected_tables)
|
||
|
affected.should eq [@table2]
|
||
|
end
|
||
|
|
||
|
it 'returns values only from query (overrides table_name) if both specified' do
|
||
|
query = "SELECT * FROM #{@table2.name}"
|
||
|
@layer.stubs(:options).returns(table_name: @table1.name, query: query)
|
||
|
@layer.stubs(:affected_table_names).with(query).returns([@table2.name]).once
|
||
|
affected = @layer.send(:affected_tables)
|
||
|
affected.count.should eq 1
|
||
|
affected.should include @table2
|
||
|
end
|
||
|
|
||
|
describe '#affected_table_names' do
|
||
|
it 'should return the affected tables' do
|
||
|
sql = "select coalesce('tabname', null) from cdb_tablemetadata;select 1;select * from spatial_ref_sys"
|
||
|
@layer.send(:affected_table_names, sql).should =~ ["cartodb.cdb_tablemetadata", "public.spatial_ref_sys"]
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe '#backup' do
|
||
|
before(:all) do
|
||
|
Carto::VisualizationBackup.all.map(&:destroy)
|
||
|
@user = create_user
|
||
|
@map, @table1, @table_visualization, @visualization = create_full_visualization(@user)
|
||
|
end
|
||
|
|
||
|
after(:all) do
|
||
|
@map.destroy
|
||
|
@table1.destroy
|
||
|
@table_visualization.destroy
|
||
|
@visualization.destroy
|
||
|
@user.destroy
|
||
|
Carto::VisualizationBackup.all.map(&:destroy)
|
||
|
end
|
||
|
|
||
|
it 'creates a backup when layer is destroyed' do
|
||
|
layer = @visualization.layers.first
|
||
|
layer.destroy
|
||
|
|
||
|
Carto::VisualizationBackup.all.count.should eq 1
|
||
|
|
||
|
backup = Carto::VisualizationBackup.where(visualization_id: @visualization.id).first
|
||
|
backup.should_not eq nil
|
||
|
backup.user_id.should eq @user.id
|
||
|
backup.created_at.should_not eq nil
|
||
|
backup.category.should eq Carto::VisualizationBackup::CATEGORY_LAYER
|
||
|
backup.export.should_not be_empty
|
||
|
backup.destroy
|
||
|
end
|
||
|
end
|
||
|
end
|