1046 lines
40 KiB
Ruby
1046 lines
40 KiB
Ruby
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
|