126 lines
4.4 KiB
Ruby
126 lines
4.4 KiB
Ruby
require_relative '../../spec_helper'
|
|
require_relative '../../../app/models/visualization/table_blender'
|
|
|
|
include CartoDB::Visualization
|
|
|
|
# TODO this file cannot be executed in isolation
|
|
describe TableBlender do
|
|
let(:user) do
|
|
FactoryGirl.create(:valid_user, private_tables_enabled: true, viewer: true)
|
|
end
|
|
|
|
let(:map_mock) do
|
|
map = mock
|
|
map.stubs(:to_hash).returns({})
|
|
map.stubs(:user).returns(user)
|
|
map.stubs(:user_layers).returns([])
|
|
map.stubs(:data_layers).returns([])
|
|
map
|
|
end
|
|
|
|
describe '#blend' do
|
|
include Carto::Factories::Visualizations
|
|
include_context 'users helper'
|
|
|
|
it 'raises an error for viewer users' do
|
|
tables = [fake_public_table, fake_private_table]
|
|
expect {
|
|
TableBlender.new(user, tables).blend
|
|
}.to raise_error(/Viewer users can't blend tables/)
|
|
user.destroy
|
|
end
|
|
|
|
describe 'multiple tables' do
|
|
it 'sets increasing order for data layers and keep tiled first and last' do
|
|
map1 = FactoryGirl.create(:carto_map_with_2_tiled_layers, user_id: @carto_user1.id)
|
|
map2 = FactoryGirl.create(:carto_map_with_2_tiled_layers, user_id: @carto_user1.id)
|
|
map1, table1, table_visualization1, visualization1 = create_full_visualization(@carto_user1, canonical_map: map1)
|
|
map2, table2, table_visualization2, visualization2 = create_full_visualization(@carto_user1, canonical_map: map2)
|
|
|
|
blender = CartoDB::Visualization::TableBlender.new(@carto_user1, [table1, table2])
|
|
map = blender.blend
|
|
|
|
map.layers.count.should eq 4
|
|
orders_and_kind = map.layers.map { |l| [l.order, l.kind] }.sort { |x, y| x[0] <=> y[0] }
|
|
orders_and_kind.should eq [[0, 'tiled'], [1, 'carto'], [2, 'carto'], [3, 'tiled']]
|
|
|
|
destroy_full_visualization(map2, table2, table_visualization2, visualization2)
|
|
destroy_full_visualization(map1, table1, table_visualization1, visualization1)
|
|
end
|
|
end
|
|
|
|
describe 'default basemap' do
|
|
before(:each) do
|
|
@map, @table, @table_visualization, @visualization = create_full_visualization(@carto_user1)
|
|
end
|
|
|
|
after(:each) do
|
|
destroy_full_visualization(@map, @table, @table_visualization, @visualization)
|
|
end
|
|
|
|
it 'is chosen from table map basemap for editor users' do
|
|
@carto_user1.builder_enabled = false
|
|
# Let's force a name change in order to be sure that it's taken from the table map and it's not a default one
|
|
fake_name = 'fake_basemap_name'
|
|
@table.map.user_layers.first.options['name'] = fake_name
|
|
@table.save
|
|
|
|
blender = CartoDB::Visualization::TableBlender.new(@carto_user1, [@table])
|
|
|
|
map = blender.blend
|
|
map.user_layers.first.options['name'].should eq fake_name
|
|
end
|
|
|
|
it 'is chosen from the default basemap for builder users' do
|
|
@carto_user1.builder_enabled = true
|
|
# Let's force a name change in order to be sure that it's not taken from the table map
|
|
fake_name = 'fake_basemap_name'
|
|
@table.map.user_layers.first.options['name'] = fake_name
|
|
@table.save
|
|
|
|
blender = CartoDB::Visualization::TableBlender.new(@carto_user1, [@table])
|
|
|
|
map = blender.blend
|
|
map.user_layers.first.options['name'].should_not eq fake_name
|
|
map.user_layers.first.options['name'].should eq Cartodb.default_basemap['name']
|
|
end
|
|
end
|
|
end
|
|
|
|
# TODO test too coupled with implementation outside blender
|
|
# refactor once Privacy is extracted
|
|
describe '#blended_privacy' do
|
|
it 'returns private if any of all tables is private' do
|
|
user = Object.new
|
|
tables = [fake_public_table, fake_private_table]
|
|
TableBlender.new(user, tables).blended_privacy.should == 'private'
|
|
|
|
tables = [fake_private_table, fake_public_table]
|
|
TableBlender.new(user, tables).blended_privacy.should == 'private'
|
|
end
|
|
|
|
it 'returns public if all tables are public' do
|
|
user = Object.new
|
|
tables = [fake_public_table, fake_public_table]
|
|
|
|
TableBlender.new(user, tables).blended_privacy.should == 'public'
|
|
end
|
|
end
|
|
|
|
def fake_public_table
|
|
table = mock
|
|
table.stubs(:private?).returns(false)
|
|
table.stubs(:public_with_link_only?).returns(false)
|
|
table.stubs(:map).returns(map_mock)
|
|
table
|
|
end
|
|
|
|
def fake_private_table
|
|
table = mock
|
|
table.stubs(:private?).returns(true)
|
|
table.stubs(:public_with_link_only?).returns(false)
|
|
table.stubs(:map).returns(map_mock)
|
|
table
|
|
end
|
|
end
|