extract licensing logic to a service

pull/15136/head
Gonzalo Riestra 5 years ago
parent 8ece026c01
commit c897d567c3

@ -357,6 +357,7 @@ SPEC_HELPER_MIN_SPECS = \
spec/models/carto/user_migration_spec.rb \
spec/requests/carto/api/public/data_observatory_controller_spec.rb \
spec/lib/tasks/data_observatory_rake_spec.rb \
spec/services/carto/do_licensing_service_spec.rb \
$(NULL)
# This class must be tested isolated as pollutes namespace

@ -0,0 +1,27 @@
module Carto
class DoLicensingService
def initialize(username)
@username = username
end
def purchase(datasets)
Cartodb::Central.new.create_do_datasets(username: @username, datasets: datasets)
bq_datasets = filter_datasets(datasets, 'bq')
spanner_datasets = filter_datasets(datasets, 'spanner')
redis_key = "do:#{@username}:datasets"
redis_value = ["bq", bq_datasets.to_json, "spanner", spanner_datasets.to_json]
# TODO: merge values, not replace
$users_metadata.hmset(redis_key, redis_value)
end
private
def filter_datasets(datasets, storage)
filtered_datasets = datasets.select { |dataset| dataset[:available_in].include?(storage) }
filtered_datasets.map { |dataset| dataset.slice(:dataset_id, :expires_at) }
end
end
end

@ -11,21 +11,13 @@ namespace :cartodb do
raise usage unless username.present? && datasets_csv.present?
datasets = []
bq_datasets = []
spanner_datasets = []
CSV.foreach(args[:datasets_csv]) do |row|
available_in = row[1].split(';')
dataset = { dataset_id: row[0], available_in: available_in, price: row[2].to_f, expires_at: Time.parse(row[3]) }
datasets << dataset
bq_datasets << dataset.slice(:dataset_id, :expires_at) if available_in.include?('bq')
spanner_datasets << dataset.slice(:dataset_id, :expires_at) if available_in.include?('spanner')
end
Cartodb::Central.new.create_do_datasets(username: username, datasets: datasets)
redis_key = "do:#{username}:datasets"
redis_value = ["bq", bq_datasets.to_json, "spanner", spanner_datasets.to_json]
$users_metadata.hmset(redis_key, redis_value)
Carto::DoLicensingService.new(username).purchase(datasets)
puts 'Task finished succesfully!'
end

@ -36,41 +36,20 @@ describe 'data_observatory.rake' do
}.to raise_error(RuntimeError, 'USAGE: data_observatory:purchase_datasets["username","path/datasets.csv"]')
end
it 'calls create_do_datasets from Central with the expected parameters' do
it 'calls purchase from Carto::DoLicensingService with the expected parameters' do
File.stubs(:open).returns(csv_example)
central_mock = mock
Cartodb::Central.stubs(:new).returns(central_mock)
expected_datasets = [
{ dataset_id: 'dataset1', available_in: ['bq', 'spanner'], price: 100,
expires_at: Time.new(2020, 9, 27, 8, 0, 0) },
{ dataset_id: 'dataset2', available_in: ['spanner'], price: 200,
expires_at: Time.new(2020, 12, 31, 12, 0, 0) }
]
central_mock.expects(:create_do_datasets).once.with(username: 'fulano', datasets: expected_datasets)
service_mock = mock
service_mock.expects(:purchase).once.with(expected_datasets)
Carto::DoLicensingService.expects(:new).once.with('fulano').returns(service_mock)
Rake::Task['cartodb:data_observatory:purchase_datasets'].invoke('fulano', 'datasets.csv')
end
it 'stores the metadata in Redis' do
File.stubs(:open).returns(csv_example)
Cartodb::Central.any_instance.stubs(:create_do_datasets)
redis_key = "do:fulano:datasets"
bq_datasets = [
{ dataset_id: 'dataset1', expires_at: Time.new(2020, 9, 27, 8, 0, 0) }
].to_json
spanner_datasets = [
{ dataset_id: 'dataset1', expires_at: Time.new(2020, 9, 27, 8, 0, 0) },
{ dataset_id: 'dataset2', expires_at: Time.new(2020, 12, 31, 12, 0, 0) }
].to_json
Rake::Task['cartodb:data_observatory:purchase_datasets'].invoke('fulano', 'datasets.csv')
$users_metadata.hget(redis_key, 'bq').should eq bq_datasets
$users_metadata.hget(redis_key, 'spanner').should eq spanner_datasets
end
end
def csv_example

@ -0,0 +1,54 @@
require 'spec_helper_min'
describe Carto::DoLicensingService do
before(:all) do
@user = FactoryGirl.create(:valid_user, username: 'fulano')
@service = Carto::DoLicensingService.new('fulano')
@datasets = [
{ dataset_id: 'dataset1', available_in: ['bq', 'spanner'], price: 100,
expires_at: Time.new(2020, 9, 27, 8, 0, 0) },
{ dataset_id: 'dataset2', available_in: ['spanner'], price: 200,
expires_at: Time.new(2020, 12, 31, 12, 0, 0) }
]
end
after(:all) do
@user.destroy
end
describe '#purchase' do
before(:each) do
@central_mock = mock
Cartodb::Central.stubs(:new).returns(@central_mock)
end
after(:each) do
Cartodb::Central.unstub(:new)
end
it 'calls create_do_datasets from Central with the expected parameters' do
@central_mock.expects(:create_do_datasets).once.with(username: 'fulano', datasets: @datasets)
@service.purchase(@datasets)
end
it 'stores the metadata in Redis' do
@central_mock.stubs(:create_do_datasets)
redis_key = "do:fulano:datasets"
bq_datasets = [
{ dataset_id: 'dataset1', expires_at: Time.new(2020, 9, 27, 8, 0, 0) }
].to_json
spanner_datasets = [
{ dataset_id: 'dataset1', expires_at: Time.new(2020, 9, 27, 8, 0, 0) },
{ dataset_id: 'dataset2', expires_at: Time.new(2020, 12, 31, 12, 0, 0) }
].to_json
@service.purchase(@datasets)
$users_metadata.hget(redis_key, 'bq').should eq bq_datasets
$users_metadata.hget(redis_key, 'spanner').should eq spanner_datasets
end
end
end
Loading…
Cancel
Save