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

134 lines
4.4 KiB
Ruby

require_relative '../../spec_helper'
describe Carto::UserService do
before(:all) do
@user = FactoryGirl.create(:valid_user)
end
before(:each) do
delete_user_data(@user)
$pool.close_connections!
end
after(:all) do
bypass_named_maps
@user.destroy
end
describe "#in_database" do
it "initializes the connection with the expected options" do
carto_user = Carto::User.find(@user.id)
default_opts = {
username: carto_user.database_username,
password: carto_user.database_password,
user_schema: carto_user.database_schema
}
expected_params = [carto_user.database_host, carto_user.database_name, default_opts]
Carto::Db::Connection.expects(:connect).with(*expected_params)
carto_user.in_database
end
it "sets statement timeout option" do
custom_timeout = 123456
expected_returned_custom_timeout = { statement_timeout: "#{custom_timeout}ms" }
@returned_timeout = nil
@default_timeout = nil
@returned_timeout_new = nil
@default_timeout_new = nil
@user.in_database do |db|
@default_timeout = db[%{SHOW statement_timeout}].first
end
@user.in_database(statement_timeout: custom_timeout) do |db|
@returned_timeout = db[%{SHOW statement_timeout}].first
end
@returned_timeout.should eq expected_returned_custom_timeout
@default_timeout.should_not eq @returned_timeout
@user.in_database do |db|
@default_timeout.should eq db[%{SHOW statement_timeout}].first
end
# Now test with CARTO user
carto_user = Carto::User.find(@user.id)
carto_user.in_database do |db|
@default_timeout_new = db.execute(%{SHOW statement_timeout}).first
end
carto_user.in_database(statement_timeout: custom_timeout) do |db|
@returned_timeout_new = db.execute(%{SHOW statement_timeout}).first
end
@returned_timeout_new.symbolize_keys!
@default_timeout_new .symbolize_keys!
@returned_timeout_new.should eq expected_returned_custom_timeout
@default_timeout_new.should_not eq @returned_timeout_new
carto_user.in_database do |db|
@default_timeout_new.should eq db.execute(%{SHOW statement_timeout}).first.symbolize_keys
end
@default_timeout_new .symbolize_keys!
@returned_timeout_new.should eq @returned_timeout
@default_timeout_new.should eq @default_timeout
end
it "sets search_path correctly" do
expected_returned_normal_search_path = {
search_path: "#{@user.database_schema}, cartodb, cdb_dataservices_client, public"
}
@normal_search_path = nil
@normal_search_path_new = nil
@user.in_database do |db|
@normal_search_path = db[%{SHOW search_path}].first
end
@normal_search_path.should eq expected_returned_normal_search_path
carto_user = Carto::User.find(@user.id)
carto_user.in_database do |db|
@normal_search_path_new = db.execute(%{SHOW search_path}).first
end
@normal_search_path_new.symbolize_keys!
@normal_search_path_new.should eq expected_returned_normal_search_path
@normal_search_path_new.should eq @normal_search_path
end
it "only allows superadmin operations to the expected roles" do
carto_user = Carto::User.find(@user.id)
expect {
@user.in_database do |conn|
conn.execute(%{SELECT set_config('log_statement_stats', 'off', false)})
end
}.to raise_exception(Sequel::DatabaseError, /permission denied to set parameter "log_statement_stats"/)
expect {
carto_user.in_database do |conn|
conn.execute(%{SELECT set_config('log_statement_stats', 'off', false)})
end
}.to raise_exception(ActiveRecord::StatementInvalid, /permission denied to set parameter "log_statement_stats"/)
@user.in_database(as: :superuser) do |conn|
conn.execute(%{SELECT set_config('log_statement_stats', 'off', false)})
end
carto_user.in_database(as: :superuser) do |conn|
conn.execute(%{SELECT set_config('log_statement_stats', 'off', false)})
end
@user.in_database(as: :cluster_admin) do |conn|
conn.execute(%{SELECT set_config('log_statement_stats', 'off', false)})
end
carto_user.in_database(as: :cluster_admin) do |conn|
conn.execute(%{SELECT set_config('log_statement_stats', 'off', false)})
end
end
end
end