You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1046 lines
40 KiB

require 'mock_redis'
require 'active_support/time'
require_relative '../spec_helper'
require_relative '../../services/dataservices-metrics/lib/geocoder_usage_metrics'
require_relative '../../services/dataservices-metrics/lib/observatory_snapshot_usage_metrics'
require_relative '../../services/dataservices-metrics/lib/observatory_general_usage_metrics'
# Tests should define the following method:
# - `get_twitter_imports_count_by_user_id`
# - `get_user_by_id`
shared_examples_for "user models" do
describe '#get_twitter_imports_count' do
include_context 'users helper'
it "should count tweet imports" do
FactoryGirl.create(:search_tweet, user: @user1, retrieved_items: 5)
FactoryGirl.create(:search_tweet, user: @user2, retrieved_items: 6)
get_twitter_imports_count_by_user_id(@user1.id).should == 5
end
end
describe 'twitter_datasource_enabled for org users' do
include_context 'organization with users helper'
before(:all) do
@config = Cartodb.config.deep_dup
CartoDB::Datasources::DatasourcesFactory.set_config(@config)
end
after(:all) do
CartoDB::Datasources::DatasourcesFactory.set_config(nil)
end
it 'is enabled if organization has it enabled and with custom config, no matter whether user has it or not,
and enabled if he has it enabled and with custom config, no matter whether org has it or not' do
twitter_search_conf = @config[:datasource_search]['twitter_search']
custom_wadus = {
"auth_required" => false,
"username" => "xx",
"password" => "xx",
"search_url" => "http://fake.url.nil",
"ratelimit_active" => false,
"ratelimit_concurrency" => 3,
"ratelimit_ttl" => 4,
"ratelimit_wait_secs" => 0.1
}
twitter_search_conf['customized']['custom_wadus'] = custom_wadus
twitter_search_conf['standard'] = custom_wadus
@organization.twitter_datasource_enabled = false
@organization.save.reload
@org_user_1.twitter_datasource_enabled = true
@org_user_1.save.reload
twitter_search_conf['customized_user_list'] = []
twitter_search_conf['customized_orgs_list'] = []
twitter_search_conf['entity_to_config_map'] = []
get_user_by_id(@org_user_1.id).twitter_datasource_enabled.should == false
twitter_search_conf['standard'] = {}
@organization.twitter_datasource_enabled = false
@organization.save.reload
@org_user_1.twitter_datasource_enabled = false
@org_user_1.save.reload
twitter_search_conf['customized_user_list'] = []
twitter_search_conf['customized_orgs_list'] = []
twitter_search_conf['entity_to_config_map'] = []
get_user_by_id(@org_user_1.id).twitter_datasource_enabled.should == false
@organization.twitter_datasource_enabled = true
@organization.save.reload
@org_user_1.twitter_datasource_enabled = false
@org_user_1.save.reload
twitter_search_conf['customized_user_list'] = []
twitter_search_conf['customized_orgs_list'] = [@organization.name]
twitter_search_conf['entity_to_config_map'] = [{ @organization.name => 'custom_wadus' }]
get_user_by_id(@org_user_1.id).twitter_datasource_enabled.should == true
@organization.twitter_datasource_enabled = false
@organization.save.reload
@org_user_1.twitter_datasource_enabled = true
@org_user_1.save.reload
twitter_search_conf['customized_user_list'] = [@org_user_1.username]
twitter_search_conf['customized_orgs_list'] = []
twitter_search_conf['entity_to_config_map'] = [{ @org_user_1.username => 'custom_wadus' }]
get_user_by_id(@org_user_1.id).twitter_datasource_enabled.should == true
end
end
describe 'User#remaining_geocoding_quota' do
include_context 'users helper'
include_context 'organization with users helper'
it 'calculates the remaining quota for a non-org user correctly' do
@user1.geocoding_quota = 500
@user1.geocoder_provider = 'heremaps'
@user1.save
user1_geocoder_metrics = CartoDB::GeocoderUsageMetrics.new(@user1.username, nil)
user1_geocoder_metrics.incr(:geocoder_here, :success_responses, 100)
get_user_by_id(@user1.id).remaining_geocoding_quota.should == 400
end
it 'takes into account geocodings performed by the org users #4033' do
@organization.geocoding_quota = 500
@organization.save.reload
@organization.owner.geocoder_provider = 'heremaps'
@organization.owner.save.reload
org_user_1_geocoder_metrics = CartoDB::GeocoderUsageMetrics.new(
@org_user_1.username,
@org_user_1.organization.name
)
org_user_1_geocoder_metrics.incr(:geocoder_here, :success_responses, 100)
org_user_2_geocoder_metrics = CartoDB::GeocoderUsageMetrics.new(
@org_user_2.username,
@org_user_2.organization.name
)
org_user_2_geocoder_metrics.incr(:geocoder_here, :success_responses, 100)
get_user_by_id(@org_user_1.id).remaining_geocoding_quota.should == 300
get_user_by_id(@org_user_2.id).remaining_geocoding_quota.should == 300
end
end
describe 'User#used_geocoding_quota' do
include_context 'users helper'
include_context 'organization with users helper'
before(:each) do
Date.stubs(:today).returns(Date.new(2016,02,28))
Date.stubs(:current).returns(Date.new(2016,02,28))
DateTime.stubs(:current).returns(DateTime.new(2016,02,28))
@mock_redis = MockRedis.new
@user1.geocoding_quota = 500
@user1.geocoder_provider = 'heremaps'
@user1.period_end_date = (Date.current + 1) << 1
@user1.save.reload
@organization.geocoding_quota = 500
@organization.save.reload
@organization.owner.period_end_date = (Date.current + 1) << 1
@organization.owner.geocoder_provider = 'heremaps'
@organization.owner.save.reload
end
it 'calculates the used geocoder quota in the current billing cycle' do
usage_metrics = CartoDB::GeocoderUsageMetrics.new(@user1.username, nil, @mock_redis)
CartoDB::GeocoderUsageMetrics.stubs(:new).returns(usage_metrics)
Geocoding.new(kind: 'high-resolution',
user: @user1,
formatter: '{dummy}',
processed_rows: 0,
cache_hits: 100,
created_at: (Date.current - 1)).save
Geocoding.new(kind: 'high-resolution',
user: @user1,
formatter: '{dummy}',
processed_rows: 100,
cache_hits: 0,
created_at: (Date.current - 2)).save
Geocoding.new(kind: 'high-resolution',
user: @user1,
formatter: '{dummy}',
processed_rows: 10,
cache_hits: 0,
created_at: Date.current).save
usage_metrics.incr(:geocoder_here, :success_responses, 10, Date.current)
usage_metrics.incr(:geocoder_here, :success_responses, 100, (Date.current - 2))
usage_metrics.incr(:geocoder_cache, :success_responses, 100, (Date.current - 1))
get_user_by_id(@user1.id).get_geocoding_calls.should == 210
end
it 'calculates the used geocoding quota for an organization' do
usage_metrics_1 = CartoDB::GeocoderUsageMetrics.new(@org_user_1.username, @organization.name, @mock_redis)
usage_metrics_2 = CartoDB::GeocoderUsageMetrics.new(@org_user_2.username, @organization.name, @mock_redis)
@organization.owner.geocoder_provider = 'heremaps'
# We are going to get the organization data show we could use both usage_metrics objects
CartoDB::GeocoderUsageMetrics.stubs(:new).returns(usage_metrics_1)
Geocoding.new(kind: 'high-resolution',
user: @org_user_1,
formatter: '{dummy}',
processed_rows: 100,
created_at: Date.current).save
Geocoding.new(kind: 'high-resolution',
user: @org_user_2,
formatter: '{dummy}',
processed_rows: 120,
cache_hits: 10,
created_at: Date.current - 1).save
usage_metrics_1.incr(:geocoder_here, :success_responses, 100, Date.current)
usage_metrics_2.incr(:geocoder_here, :success_responses, 120, Date.current - 1)
usage_metrics_2.incr(:geocoder_cache, :success_responses, 10, Date.current - 1)
@organization.get_geocoding_calls.should == 230
end
it 'calculates the used geocoder quota in the current billing cycle including empty requests' do
usage_metrics = CartoDB::GeocoderUsageMetrics.new(@user1.username, nil, @mock_redis)
CartoDB::GeocoderUsageMetrics.stubs(:new).returns(usage_metrics)
usage_metrics.incr(:geocoder_here, :success_responses, 10, Date.current)
usage_metrics.incr(:geocoder_here, :success_responses, 100, (Date.current - 2))
usage_metrics.incr(:geocoder_here, :empty_responses, 10, (Date.current - 2))
usage_metrics.incr(:geocoder_cache, :success_responses, 100, (Date.current - 1))
get_user_by_id(@user1.id).get_geocoding_calls.should == 220
end
end
describe 'User#remaining here isolines quota' do
include_context 'users helper'
include_context 'organization with users helper'
before(:each) do
Date.stubs(:today).returns(Date.new(2016,02,28))
Date.stubs(:current).returns(Date.new(2016,02,28))
DateTime.stubs(:current).returns(DateTime.new(2016,02,28))
@mock_redis = MockRedis.new
@user1.here_isolines_quota = 500
@user1.period_end_date = (Date.current + 1) << 1
@user1.isolines_provider = 'heremaps'
@user1.save.reload
@organization.here_isolines_quota = 500
@organization.save.reload
@organization.owner.period_end_date = (Date.current + 1) << 1
@organization.owner.isolines_provider = 'heremaps'
@organization.owner.save.reload
end
it 'calculates the remaining quota for a non-org user correctly' do
usage_metrics = CartoDB::IsolinesUsageMetrics.new(@user1.username, nil, @mock_redis)
CartoDB::IsolinesUsageMetrics.stubs(:new).returns(usage_metrics)
usage_metrics.incr(:here_isolines, :isolines_generated, 100, Date.current)
@user1.remaining_here_isolines_quota.should == 400
end
it 'takes into account here isoline requests performed by the org users' do
usage_metrics_1 = CartoDB::IsolinesUsageMetrics.new(@org_user_1.username, @organization.name, @mock_redis)
usage_metrics_2 = CartoDB::IsolinesUsageMetrics.new(@org_user_2.username, @organization.name, @mock_redis)
CartoDB::IsolinesUsageMetrics.stubs(:new).
with(@organization.owner.username, @organization.name).
returns(usage_metrics_1)
usage_metrics_1.incr(:here_isolines, :isolines_generated, 100, Date.current)
usage_metrics_2.incr(:here_isolines, :isolines_generated, 100, Date.current)
@org_user_1.remaining_here_isolines_quota.should == 300
@org_user_2.remaining_here_isolines_quota.should == 300
end
end
describe 'User#used_here_isolines_quota' do
include_context 'users helper'
include_context 'organization with users helper'
before(:each) do
Date.stubs(:today).returns(Date.new(2016,02,28))
Date.stubs(:current).returns(Date.new(2016,02,28))
DateTime.stubs(:current).returns(DateTime.new(2016,02,28))
@mock_redis = MockRedis.new
@user1.here_isolines_quota = 500
@user1.period_end_date = (Date.current + 1) << 1
@user1.isolines_provider = 'heremaps'
@user1.save.reload
@organization.here_isolines_quota = 500
@organization.save.reload
@organization.owner.period_end_date = (Date.current + 1) << 1
@organization.owner.isolines_provider = 'heremaps'
@organization.owner.save.reload
end
it 'calculates the used here isolines quota in the current billing cycle' do
usage_metrics = CartoDB::IsolinesUsageMetrics.new(@user1.username, nil, @mock_redis)
CartoDB::IsolinesUsageMetrics.stubs(:new).returns(usage_metrics)
usage_metrics.incr(:here_isolines, :isolines_generated, 10, Date.current)
usage_metrics.incr(:here_isolines, :isolines_generated, 100, (Date.current - 2))
@user1.get_here_isolines_calls.should == 110
end
it 'calculates the used here isolines quota for an organization' do
usage_metrics_1 = CartoDB::IsolinesUsageMetrics.new(@org_user_1.username, @organization.name, @mock_redis)
usage_metrics_2 = CartoDB::IsolinesUsageMetrics.new(@org_user_2.username, @organization.name, @mock_redis)
CartoDB::IsolinesUsageMetrics.stubs(:new).
with(@organization.owner.username, @organization.name).
returns(usage_metrics_1)
usage_metrics_1.incr(:here_isolines, :isolines_generated, 100, Date.current)
usage_metrics_2.incr(:here_isolines, :isolines_generated, 120, Date.current - 1)
@organization.get_here_isolines_calls.should == 220
end
it 'calculates the used here isolines quota in the current billing cycle including empty requests' do
usage_metrics = CartoDB::IsolinesUsageMetrics.new(@user1.username, nil, @mock_redis)
CartoDB::IsolinesUsageMetrics.stubs(:new).returns(usage_metrics)
usage_metrics.incr(:here_isolines, :isolines_generated, 10, Date.current)
usage_metrics.incr(:here_isolines, :isolines_generated, 100, (Date.current - 2))
usage_metrics.incr(:here_isolines, :empty_responses, 10, (Date.current - 2))
@user1.get_here_isolines_calls.should == 120
end
end
describe 'User#remaining data observatory snapshot quota' do
include_context 'users helper'
include_context 'organization with users helper'
before(:each) do
Date.stubs(:today).returns(Date.new(2016, 02, 28))
Date.stubs(:current).returns(Date.new(2016, 02, 28))
DateTime.stubs(:current).returns(DateTime.new(2016, 02, 28))
@mock_redis = MockRedis.new
@user1.obs_snapshot_quota = 500
@user1.period_end_date = (Date.current + 1) << 1
@user1.save.reload
@organization.obs_snapshot_quota = 500
@organization.save.reload
@organization.owner.period_end_date = (Date.current + 1) << 1
@organization.owner.save.reload
end
it 'calculates the remaining quota for a non-org user correctly' do
usage_metrics = CartoDB::ObservatorySnapshotUsageMetrics.new(@user1.username, nil, @mock_redis)
CartoDB::ObservatorySnapshotUsageMetrics.stubs(:new).returns(usage_metrics)
usage_metrics.incr(:obs_snapshot, :success_responses, 100, Date.current)
@user1.remaining_obs_snapshot_quota.should == 400
end
it 'takes into account data observatory requests performed by the org users' do
usage_metrics_1 = CartoDB::ObservatorySnapshotUsageMetrics.new(@org_user_1.username, @organization.name, @mock_redis)
usage_metrics_2 = CartoDB::ObservatorySnapshotUsageMetrics.new(@org_user_2.username, @organization.name, @mock_redis)
CartoDB::ObservatorySnapshotUsageMetrics.stubs(:new).
with(@organization.owner.username, @organization.name).
returns(usage_metrics_1)
usage_metrics_1.incr(:obs_snapshot, :success_responses, 100, Date.current)
usage_metrics_2.incr(:obs_snapshot, :success_responses, 100, Date.current)
@org_user_1.remaining_obs_snapshot_quota.should == 300
@org_user_2.remaining_obs_snapshot_quota.should == 300
end
end
describe 'User#remaining data observatory general quota' do
include_context 'users helper'
include_context 'organization with users helper'
before(:each) do
Date.stubs(:today).returns(Date.new(2016, 02, 28))
Date.stubs(:current).returns(Date.new(2016, 02, 28))
DateTime.stubs(:current).returns(DateTime.new(2016, 02, 28))
@mock_redis = MockRedis.new
@user1.obs_general_quota = 500
@user1.period_end_date = (Date.current + 1) << 1
@user1.save.reload
@organization.obs_general_quota = 500
@organization.save.reload
@organization.owner.period_end_date = (Date.current + 1) << 1
@organization.owner.save.reload
end
it 'calculates the remaining quota for a non-org user correctly' do
usage_metrics = CartoDB::ObservatoryGeneralUsageMetrics.new(@user1.username, nil, @mock_redis)
CartoDB::ObservatoryGeneralUsageMetrics.stubs(:new).returns(usage_metrics)
usage_metrics.incr(:obs_general, :success_responses, 100, Date.current)
@user1.remaining_obs_general_quota.should == 400
end
it 'takes into account data observatory requests performed by the org users' do
usage_metrics_1 = CartoDB::ObservatoryGeneralUsageMetrics.new(@org_user_1.username, @organization.name, @mock_redis)
usage_metrics_2 = CartoDB::ObservatoryGeneralUsageMetrics.new(@org_user_2.username, @organization.name, @mock_redis)
CartoDB::ObservatoryGeneralUsageMetrics.stubs(:new).
with(@organization.owner.username, @organization.name).
returns(usage_metrics_1)
usage_metrics_1.incr(:obs_general, :success_responses, 100, Date.current)
usage_metrics_2.incr(:obs_general, :success_responses, 100, Date.current)
@org_user_1.remaining_obs_general_quota.should == 300
@org_user_2.remaining_obs_general_quota.should == 300
end
end
describe 'User#used_obs_snapshot_quota' do
include_context 'users helper'
include_context 'organization with users helper'
before(:each) do
Date.stubs(:today).returns(Date.new(2016, 02, 28))
Date.stubs(:current).returns(Date.new(2016, 02, 28))
DateTime.stubs(:current).returns(DateTime.new(2016, 02, 28))
@mock_redis = MockRedis.new
@user1.obs_snapshot_quota = 500
@user1.period_end_date = (Date.current + 1) << 1
@user1.save.reload
@organization.obs_snapshot_quota = 500
@organization.save.reload
@organization.owner.period_end_date = (Date.current + 1) << 1
@organization.owner.save.reload
end
it 'calculates the used data observatory snapshot quota in the current billing cycle' do
usage_metrics = CartoDB::ObservatorySnapshotUsageMetrics.new(@user1.username, nil, @mock_redis)
CartoDB::ObservatorySnapshotUsageMetrics.stubs(:new).returns(usage_metrics)
usage_metrics.incr(:obs_snapshot, :success_responses, 10, Date.current)
usage_metrics.incr(:obs_snapshot, :success_responses, 100, (Date.current - 2))
@user1.get_obs_snapshot_calls.should == 110
end
it 'calculates the used data observatory snapshot quota for an organization' do
usage_metrics_1 = CartoDB::ObservatorySnapshotUsageMetrics.new(@org_user_1.username, @organization.name, @mock_redis)
usage_metrics_2 = CartoDB::ObservatorySnapshotUsageMetrics.new(@org_user_2.username, @organization.name, @mock_redis)
CartoDB::ObservatorySnapshotUsageMetrics.stubs(:new).
with(@organization.owner.username, @organization.name).
returns(usage_metrics_1)
usage_metrics_1.incr(:obs_snapshot, :success_responses, 100, Date.current)
usage_metrics_2.incr(:obs_snapshot, :success_responses, 120, Date.current - 1)
@organization.get_obs_snapshot_calls.should == 220
end
it 'calculates the used data observatory snapshot quota in the current billing cycle including empty requests' do
usage_metrics = CartoDB::ObservatorySnapshotUsageMetrics.new(@user1.username, nil, @mock_redis)
CartoDB::ObservatorySnapshotUsageMetrics.stubs(:new).returns(usage_metrics)
usage_metrics.incr(:obs_snapshot, :success_responses, 10, Date.current)
usage_metrics.incr(:obs_snapshot, :success_responses, 100, (Date.current - 2))
usage_metrics.incr(:obs_snapshot, :empty_responses, 10, (Date.current - 2))
@user1.get_obs_snapshot_calls.should == 120
end
end
describe 'User#used_obs_general_quota' do
include_context 'users helper'
include_context 'organization with users helper'
before(:each) do
Date.stubs(:today).returns(Date.new(2016, 02, 28))
Date.stubs(:current).returns(Date.new(2016, 02, 28))
DateTime.stubs(:current).returns(DateTime.new(2016, 02, 28))
@mock_redis = MockRedis.new
@user1.obs_general_quota = 500
@user1.period_end_date = (Date.current + 1) << 1
@user1.save.reload
@organization.obs_general_quota = 500
@organization.save.reload
@organization.owner.period_end_date = (Date.current + 1) << 1
@organization.owner.save.reload
end
it 'calculates the used data observatory general quota in the current billing cycle' do
usage_metrics = CartoDB::ObservatoryGeneralUsageMetrics.new(@user1.username, nil, @mock_redis)
CartoDB::ObservatoryGeneralUsageMetrics.stubs(:new).returns(usage_metrics)
usage_metrics.incr(:obs_general, :success_responses, 10, Date.current)
usage_metrics.incr(:obs_general, :success_responses, 100, (Date.current - 2))
@user1.get_obs_general_calls.should == 110
end
it 'calculates the used data observatory general quota for an organization' do
usage_metrics_1 = CartoDB::ObservatoryGeneralUsageMetrics.new(@org_user_1.username, @organization.name, @mock_redis)
usage_metrics_2 = CartoDB::ObservatoryGeneralUsageMetrics.new(@org_user_2.username, @organization.name, @mock_redis)
CartoDB::ObservatoryGeneralUsageMetrics.stubs(:new).
with(@organization.owner.username, @organization.name).
returns(usage_metrics_1)
usage_metrics_1.incr(:obs_general, :success_responses, 100, Date.current)
usage_metrics_2.incr(:obs_general, :success_responses, 120, Date.current - 1)
@organization.get_obs_general_calls.should == 220
end
it 'calculates the used data observatory general quota in the current billing cycle including empty requests' do
usage_metrics = CartoDB::ObservatoryGeneralUsageMetrics.new(@user1.username, nil, @mock_redis)
CartoDB::ObservatoryGeneralUsageMetrics.stubs(:new).returns(usage_metrics)
usage_metrics.incr(:obs_general, :success_responses, 10, Date.current)
usage_metrics.incr(:obs_general, :success_responses, 100, (Date.current - 2))
usage_metrics.incr(:obs_general, :empty_responses, 10, (Date.current - 2))
@user1.get_obs_general_calls.should == 120
end
end
describe 'User#remaining routing quota' do
include_context 'users helper'
include_context 'organization with users helper'
before(:each) do
Date.stubs(:today).returns(Date.new(2016,02,28))
Date.stubs(:current).returns(Date.new(2016,02,28))
DateTime.stubs(:current).returns(DateTime.new(2016,02,28))
@mock_redis = MockRedis.new
@user1.mapzen_routing_quota = 500
@user1.period_end_date = (Date.current + 1) << 1
@user1.routing_provider = 'mapbox'
@user1.save.reload
@organization.routing_provider = 'mapbox'
@organization.mapzen_routing_quota = 500
@organization.save.reload
@organization.owner.period_end_date = (Date.current + 1) << 1
@organization.owner.routing_provider = 'mapbox'
@organization.owner.save.reload
end
it 'calculates the remaining quota for a non-org user correctly' do
usage_metrics = CartoDB::RoutingUsageMetrics.new(@user1.username, nil, @mock_redis)
CartoDB::RoutingUsageMetrics.stubs(:new).returns(usage_metrics)
usage_metrics.incr(:routing_mapbox, :total_requests, 100, Date.current)
usage_metrics.incr(:routing_mapbox, :success_responses, 100, Date.current)
@user1.remaining_mapzen_routing_quota.should == 400
end
it 'takes into account routing requests performed by the org users' do
usage_metrics_1 = CartoDB::RoutingUsageMetrics.new(@org_user_1.username, @organization.name, @mock_redis)
usage_metrics_2 = CartoDB::RoutingUsageMetrics.new(@org_user_2.username, @organization.name, @mock_redis)
CartoDB::RoutingUsageMetrics.stubs(:new).
with(@organization.owner.username, @organization.name).
returns(usage_metrics_1)
usage_metrics_1.incr(:routing_mapbox, :total_requests, 100, Date.current)
usage_metrics_1.incr(:routing_mapbox, :success_responses, 100, Date.current)
usage_metrics_2.incr(:routing_mapbox, :total_requests, 100, Date.current)
usage_metrics_2.incr(:routing_mapbox, :success_responses, 100, Date.current)
@org_user_1.remaining_mapzen_routing_quota.should == 300
@org_user_2.remaining_mapzen_routing_quota.should == 300
end
end
describe 'User#used_routing_quota' do
include_context 'users helper'
include_context 'organization with users helper'
before(:each) do
Date.stubs(:today).returns(Date.new(2016,02,28))
Date.stubs(:current).returns(Date.new(2016,02,28))
DateTime.stubs(:current).returns(DateTime.new(2016,02,28))
@mock_redis = MockRedis.new
@user1.mapzen_routing_quota = 500
@user1.period_end_date = (Date.current + 1) << 1
@user1.routing_provider = 'mapbox'
@user1.save.reload
@organization.routing_provider = 'mapbox'
@organization.mapzen_routing_quota = 500
@organization.save.reload
@organization.owner.period_end_date = (Date.current + 1) << 1
@organization.owner.routing_provider = 'mapbox'
@organization.owner.save.reload
end
it 'calculates the used mapzen routing quota in the current billing cycle' do
usage_metrics = CartoDB::RoutingUsageMetrics.new(@user1.username, nil, @mock_redis)
CartoDB::RoutingUsageMetrics.stubs(:new).returns(usage_metrics)
usage_metrics.incr(:routing_mapbox, :total_requests, 10, Date.current)
usage_metrics.incr(:routing_mapbox, :total_requests, 100, (Date.current - 2))
usage_metrics.incr(:routing_mapbox, :success_responses, 10, Date.current)
usage_metrics.incr(:routing_mapbox, :success_responses, 100, (Date.current - 2))
@user1.get_mapzen_routing_calls.should == 110
end
it 'calculates the used mapzen routing quota for an organization' do
usage_metrics_1 = CartoDB::RoutingUsageMetrics.new(@org_user_1.username, @organization.name, @mock_redis)
usage_metrics_2 = CartoDB::RoutingUsageMetrics.new(@org_user_2.username, @organization.name, @mock_redis)
CartoDB::RoutingUsageMetrics.stubs(:new).
with(@organization.owner.username, @organization.name).
returns(usage_metrics_1)
usage_metrics_1.incr(:routing_mapbox, :total_requests, 100, Date.current)
usage_metrics_2.incr(:routing_mapbox, :total_requests, 120, Date.current - 1)
usage_metrics_1.incr(:routing_mapbox, :success_responses, 100, Date.current)
usage_metrics_2.incr(:routing_mapbox, :success_responses, 120, Date.current - 1)
@organization.get_mapzen_routing_calls.should == 220
end
it 'calculates the used mapzen routing quota in the current billing cycle including empty requests' do
usage_metrics = CartoDB::RoutingUsageMetrics.new(@user1.username, nil, @mock_redis)
CartoDB::RoutingUsageMetrics.stubs(:new).returns(usage_metrics)
usage_metrics.incr(:routing_mapbox, :total_requests, 10, Date.current)
usage_metrics.incr(:routing_mapbox, :total_requests, 100, (Date.current - 2))
usage_metrics.incr(:routing_mapbox, :success_responses, 10, Date.current)
usage_metrics.incr(:routing_mapbox, :success_responses, 100, (Date.current - 2))
usage_metrics.incr(:routing_mapbox, :empty_responses, 10, (Date.current - 2))
@user1.get_mapzen_routing_calls.should == 120
end
end
describe 'single user' do
before(:all) do
@user = create_user
end
after(:all) do
User[@user.id].destroy
end
it 'generates auth_tokens and save them for future accesses' do
token = @user.get_auth_token
token.should be
@user.reload
@user.get_auth_token.should eq token
end
end
describe '#needs_password_confirmation?' do
before(:all) do
@user = create_user
end
after(:each) do
@user.google_sign_in = nil
@user.last_password_change_date = nil
@user.organization = nil
end
after(:all) do
User[@user.id].destroy
end
it 'is true for a normal user' do
@user.needs_password_confirmation?.should == true
@user.google_sign_in = nil
@user.needs_password_confirmation?.should == true
@user.google_sign_in = false
@user.needs_password_confirmation?.should == true
end
it 'is false for users that signed in with Google' do
@user.google_sign_in = true
@user.needs_password_confirmation?.should == false
end
it 'is true for users that signed in with Google but changed the password' do
@user.google_sign_in = true
@user.last_password_change_date = Time.now
@user.needs_password_confirmation?.should == true
end
it 'is false for users within a SAML organization' do
organization = FactoryGirl.create(:saml_organization)
organization.auth_saml_enabled?.should == true
@user.organization = @user.is_a?(Carto::User) ? Carto::Organization.find(organization.id) : organization
@user.needs_password_confirmation?.should == false
@user.organization = nil
organization.destroy
end
end
describe 'defaults and email and password changes checks' do
before(:all) do
@user = create_user
end
after(:all) do
User[@user.id].destroy
end
it "Should properly report ability to change (or not) email & password when proceeds" do
@user.google_sign_in = false
password_change_date = @user.last_password_change_date
Carto::Ldap::Manager.any_instance.stubs(:configuration_present?).returns(false)
@user.can_change_email?.should eq true
@user.can_change_password?.should eq true
@user.google_sign_in = true
@user.can_change_email?.should eq false
@user.last_password_change_date = nil
@user.can_change_email?.should eq false
Carto::Ldap::Manager.any_instance.stubs(:configuration_present?).returns(true)
@user.can_change_email?.should eq false
@user.last_password_change_date = password_change_date
@user.google_sign_in = false
@user.can_change_email?.should eq false
@user.can_change_password?.should eq false
end
it "should set a default database_host" do
@user.database_host.should eq ::SequelRails.configuration.environment_for(Rails.env)['host']
end
it "should set a default api_key" do
@user.reload.api_key.should_not be_blank
end
it "should set created_at" do
@user.created_at.should_not be_nil
end
it "should update updated_at" do
expect {
@user.name = "new #{@user.name}"
@user.save
}.to change(@user, :updated_at)
end
it "should set up a user after create" do
@new_user = new_user
@new_user.save
@new_user.reload
@new_user.should_not be_new
@new_user.database_name.should_not be_nil
@new_user.in_database.test_connection.should == true
@new_user.destroy
end
it "should have a crypted password" do
@user.crypted_password.should_not be_blank
@user.crypted_password.should_not == 'admin123'
end
end
describe 'batch_queries_statement_timeout' do
include_context 'users helper'
it 'batch_queries_statement_timeout is not touched at all when creating a user' do
User.expects(:batch_queries_statement_timeout).never
User.expects(:batch_queries_statement_timeout=).never
begin
user = create_user
ensure
user.destroy
end
end
it 'batch_queries_statement_timeout is not touched at all when saving a user' do
@user1.expects(:batch_queries_statement_timeout).never
@user1.expects(:batch_queries_statement_timeout=).never
@user1.save
end
it 'synces with central upon update_to_central' do
cartodb_central_client_mock = mock
cartodb_central_client_mock.expects(:update_user).once.with { |username, attributes|
username == @user1.username && attributes[:batch_queries_statement_timeout] == 42
}
@user1.expects(:sync_data_with_cartodb_central?).once.returns(true)
@user1.expects(:cartodb_central_client).once.returns(cartodb_central_client_mock)
@user1.batch_queries_statement_timeout = 42
@user1.update_in_central
end
it 'reads from redis just once' do
begin
user = create_user
$users_metadata.expects(:HMGET).with("limits:batch:#{user.username}", 'timeout').once.returns([42])
user.batch_queries_statement_timeout.should be 42
user.batch_queries_statement_timeout.should be 42
ensure
user.destroy
end
end
it 'reads from redis just once, even if nil' do
begin
user = create_user
$users_metadata.expects(:HMGET).with("limits:batch:#{user.username}", 'timeout').once.returns([nil])
user.batch_queries_statement_timeout.should be_nil
user.batch_queries_statement_timeout.should be_nil
ensure
user.destroy
end
end
it 'deletes the key in redis when set to nil' do
$users_metadata.expects(:HDEL).with("limits:batch:#{@user1.username}", 'timeout').once
$users_metadata.expects(:HMSET).with("limits:batch:#{@user1.username}", 'timeout', nil).never
@user1.batch_queries_statement_timeout = nil
@user1.batch_queries_statement_timeout.should be_nil
end
it 'deletes the key in redis when set to the empty string' do
# This is important to sync from central and use the default value instead
$users_metadata.expects(:HDEL).with("limits:batch:#{@user1.username}", 'timeout').once
$users_metadata.expects(:HMSET).with("limits:batch:#{@user1.username}", 'timeout', "").never
@user1.batch_queries_statement_timeout = ""
@user1.batch_queries_statement_timeout.should be_nil
end
it 'sets the value in redis to the integer specified' do
$users_metadata.expects(:HMSET).with("limits:batch:#{@user1.username}", 'timeout', 42).once
@user1.batch_queries_statement_timeout = 42
@user1.batch_queries_statement_timeout.should eq 42
end
it 'raises an error if set to zero' do
$users_metadata.expects(:HMSET).with("limits:batch:#{@user1.username}", 'timeout', 0).never
expect {
@user1.batch_queries_statement_timeout = 0
}.to raise_exception
end
it 'raises an error if set to a negative value' do
$users_metadata.expects(:HMSET).with("limits:batch:#{@user1.username}", 'timeout', -42).never
expect {
@user1.batch_queries_statement_timeout = -42
}.to raise_exception
end
it 'can cast to integer values' do
$users_metadata.expects(:HMSET).with("limits:batch:#{@user1.username}", 'timeout', 42).once
@user1.batch_queries_statement_timeout = "42"
@user1.batch_queries_statement_timeout.should eq 42
end
end
describe '#basemaps' do
it 'shows all basemaps for Google Maps users' do
user = create_user
basemaps = user.basemaps
basemaps.keys.sort.should eq ['CARTO', 'Stamen']
user.google_maps_key = 'client=whatever'
user.google_maps_private_key = 'wadus'
user.save
basemaps = user.basemaps
basemaps.keys.sort.should eq ['CARTO', 'GMaps', 'Stamen']
end
end
describe '#default_basemap' do
it 'defaults to Google for Google Maps users, first declared basemap for others' do
user = create_user
user.default_basemap['name'].should eq Cartodb.default_basemap['name']
user.google_maps_key = 'client=whatever'
user.google_maps_private_key = 'wadus'
user.save
user.default_basemap['name'].should eq 'GMaps Roadmap'
end
end
shared_examples_for 'google maps key inheritance' do
before(:all) do
@user = create_user
end
after(:all) do
@user.destroy
end
def set_user_field(value)
@user.send(write_field + '=', value)
end
def set_organization_field(value)
@user.stubs(:organization).returns(mock)
@user.organization.stubs(write_field).returns(value)
end
def get_field
@user.send(read_field)
end
it 'returns user key for users without organization' do
set_user_field('wadus')
get_field.should eq 'wadus'
end
it 'returns nil for users without organization nor key' do
set_user_field(nil)
get_field.should eq nil
end
it 'takes key from user if organization is not set' do
set_user_field('wadus')
set_organization_field(nil)
get_field.should eq 'wadus'
end
it 'takes key from user if organization is blank' do
set_user_field('wadus')
set_organization_field('')
get_field.should eq 'wadus'
end
it 'takes key from organization if both set' do
set_user_field('wadus')
set_organization_field('org_key')
get_field.should eq 'org_key'
end
it 'returns nil if key is not set at user nor organization' do
set_user_field(nil)
set_organization_field(nil)
get_field.should be_nil
end
end
describe '#google_maps_api_key' do
it_behaves_like 'google maps key inheritance' do
let(:write_field) { 'google_maps_key' }
let(:read_field) { 'google_maps_api_key' }
end
end
describe '#google_maps_private_key' do
it_behaves_like 'google maps key inheritance' do
let(:write_field) { 'google_maps_private_key' }
let(:read_field) { 'google_maps_private_key' }
end
end
describe '#view_dashboard' do
it 'sets dashboard_viewed_at time' do
user = create_user
user.dashboard_viewed_at = nil
user.save
user.view_dashboard
last = user.dashboard_viewed_at
last.should_not be_nil
user.view_dashboard
user.dashboard_viewed_at.should_not eq last
end
end
describe '#name_or_username' do
before(:all) do
@user = create_user
end
after(:all) do
@user.destroy
end
it 'returns username if no name available' do
@user.name = ''
@user.last_name = nil
expect(@user.name_or_username).to eq @user.username
end
it 'returns first name if available' do
@user.name = 'Petete'
@user.last_name = nil
expect(@user.name_or_username).to eq 'Petete'
end
it 'returns last name if available' do
@user.name = ''
@user.last_name = 'Trapito'
expect(@user.name_or_username).to eq 'Trapito'
end
it 'returns first+last name if available' do
@user.name = 'Petete'
@user.last_name = 'Trapito'
expect(@user.name_or_username).to eq 'Petete Trapito'
end
end
describe '#relevant_frontend_version' do
before(:all) do
@user = create_user
end
describe "when user doesn't have user_frontend_version set" do
it 'should return application frontend version' do
CartoDB::Application.stubs(:frontend_version).returns('app_frontend_version')
@user.relevant_frontend_version.should eq 'app_frontend_version'
end
end
describe 'when user has user_frontend_version set' do
it 'should return user frontend version' do
@user.frontend_version = 'user_frontend_version'
@user.relevant_frontend_version.should eq 'user_frontend_version'
end
end
end
describe '#valid_password?' do
before(:all) do
@user = create_user
end
after(:all) do
@user.destroy
end
it 'returns true if the password is valid' do
result = @user.valid_password?(:password, 'new_password', 'new_password')
result.should be_true
end
it 'returns false if the passwords do not match' do
result = @user.valid_password?(:password, 'new_password', 'other')
result.should be_false
end
end
describe '#valid_password_confirmation' do
before(:all) do
@user = create_user
end
after(:all) do
@user.destroy
end
it 'returns true if the password is valid' do
@user.password = 'new_password'
@user.save
result = @user.valid_password_confirmation('new_password')
result.should be_true
end
it 'returns false if the passwords is not correct' do
result = @user.valid_password_confirmation('wrong_pass')
result.should be_false
end
it 'returns true if SAML is enabled' do
organization = FactoryGirl.create(:saml_organization)
@user.organization_id = organization.id
result = @user.valid_password_confirmation('wrong_pass')
result.should be_true
end
end
end