|
|
|
@ -14,7 +14,7 @@ describe Carto::Api::Public::DataObservatoryController do
|
|
|
|
|
@granted_token = @user1.api_keys.create_regular_key!(name: 'do', grants: do_grants).token
|
|
|
|
|
@headers = { 'CONTENT_TYPE' => 'application/json' }
|
|
|
|
|
populate_do_metadata
|
|
|
|
|
@feature_flag = FactoryGirl.create(:feature_flag, name: 'do-licensing', restricted: true)
|
|
|
|
|
@feature_flag = FactoryGirl.create(:feature_flag, name: 'do-instant-licensing', restricted: true)
|
|
|
|
|
Carto::FeatureFlagsUser.create(user_id: @user1.id, feature_flag_id: @feature_flag.id)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
@ -120,8 +120,24 @@ describe Carto::Api::Public::DataObservatoryController do
|
|
|
|
|
$users_metadata.del(@redis_key)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
before(:each) do
|
|
|
|
|
Cartodb::Central.any_instance.stubs(:check_do_enabled).returns(true)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
after(:each) do
|
|
|
|
|
Cartodb::Central.any_instance.unstub(:check_do_enabled)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it_behaves_like 'an endpoint validating a DO API key'
|
|
|
|
|
|
|
|
|
|
it 'checks if DO is enabled' do
|
|
|
|
|
central_mock = mock
|
|
|
|
|
Cartodb::Central.stubs(:new).returns(central_mock)
|
|
|
|
|
central_mock.expects(:check_do_enabled).once.returns(true)
|
|
|
|
|
|
|
|
|
|
get_json endpoint_url(api_key: @master), @headers
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'returns 200 with the non expired subscriptions' do
|
|
|
|
|
expected_dataset = { project: 'carto', dataset: 'abc', table: 'table2', id: 'carto.abc.table2', type: 'dataset' }
|
|
|
|
|
get_json endpoint_url(api_key: @master), @headers do |response|
|
|
|
|
@ -212,6 +228,14 @@ describe Carto::Api::Public::DataObservatoryController do
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
describe 'subscription_info' do
|
|
|
|
|
before(:each) do
|
|
|
|
|
Cartodb::Central.any_instance.stubs(:check_do_enabled).returns(true)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
after(:each) do
|
|
|
|
|
Cartodb::Central.any_instance.unstub(:check_do_enabled)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
before(:all) do
|
|
|
|
|
@url_helper = 'api_v4_do_subscription_info_url'
|
|
|
|
|
@params = { id: 'carto.abc.dataset1', type: 'dataset' }
|
|
|
|
@ -219,6 +243,14 @@ describe Carto::Api::Public::DataObservatoryController do
|
|
|
|
|
|
|
|
|
|
it_behaves_like 'an endpoint validating a DO API key'
|
|
|
|
|
|
|
|
|
|
it 'checks if DO is enabled' do
|
|
|
|
|
central_mock = mock
|
|
|
|
|
Cartodb::Central.stubs(:new).returns(central_mock)
|
|
|
|
|
central_mock.expects(:check_do_enabled).once.returns(true)
|
|
|
|
|
|
|
|
|
|
get_json endpoint_url(api_key: @master, id: 'carto.abc.dataset1', type: 'dataset'), @headers
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'returns 400 if the id param is not valid' do
|
|
|
|
|
get_json endpoint_url(api_key: @master, id: 'wrong'), @headers do |response|
|
|
|
|
|
expect(response.status).to eq(400)
|
|
|
|
@ -237,15 +269,6 @@ describe Carto::Api::Public::DataObservatoryController do
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'returns 403 if the feature flag is not enabled for the user' do
|
|
|
|
|
with_feature_flag @user1, 'do-licensing', false do
|
|
|
|
|
get_json endpoint_url(api_key: @master, id: 'carto.abc.dataset1', type: 'dataset'), @headers do |response|
|
|
|
|
|
expect(response.status).to eq(403)
|
|
|
|
|
expect(response.body).to eq(errors: "DO licensing not enabled", errors_cause: nil)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'returns 404 if the metadata user does not exist' do
|
|
|
|
|
Carto::User.find_by_username('do-metadata').destroy
|
|
|
|
|
|
|
|
|
@ -326,15 +349,6 @@ describe Carto::Api::Public::DataObservatoryController do
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'returns 403 if the feature flag is not enabled for the user' do
|
|
|
|
|
with_feature_flag @user1, 'do-licensing', false do
|
|
|
|
|
post_json endpoint_url(api_key: @master), @payload do |response|
|
|
|
|
|
expect(response.status).to eq(403)
|
|
|
|
|
expect(response.body).to eq(errors: "DO licensing not enabled", errors_cause: nil)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'returns 404 if the metadata user does not exist' do
|
|
|
|
|
Carto::User.find_by_username('do-metadata').destroy
|
|
|
|
|
|
|
|
|
@ -353,13 +367,6 @@ describe Carto::Api::Public::DataObservatoryController do
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'returns 404 if the dataset metadata is incomplete' do
|
|
|
|
|
post_json endpoint_url(api_key: @master), id: 'carto.abc.incomplete', type: 'dataset' do |response|
|
|
|
|
|
expect(response.status).to eq(404)
|
|
|
|
|
expect(response.body).to eq(errors: "Incomplete metadata found for carto.abc.incomplete", errors_cause: nil)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'returns 500 with an explicit message if the central call fails' do
|
|
|
|
|
central_response = OpenStruct.new(code: 500, body: { errors: ['boom'] }.to_json)
|
|
|
|
|
central_error = CartoDB::CentralCommunicationFailure.new(central_response)
|
|
|
|
@ -371,59 +378,91 @@ describe Carto::Api::Public::DataObservatoryController do
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'returns 200 with the dataset metadata and calls the DoLicensingService with the expected params' do
|
|
|
|
|
expected_params = [{
|
|
|
|
|
dataset_id: 'carto.abc.dataset1',
|
|
|
|
|
available_in: ['bq'],
|
|
|
|
|
price: 100.0,
|
|
|
|
|
expires_at: Time.parse('2019/01/01 00:00:00')
|
|
|
|
|
}]
|
|
|
|
|
it 'sends request emails if the dataset metadata is incomplete' do
|
|
|
|
|
mailer_mock = stub(:deliver_now)
|
|
|
|
|
dataset_id = 'carto.abc.incomplete'
|
|
|
|
|
dataset_name = 'Incomplete dataset'
|
|
|
|
|
DataObservatoryMailer.expects(:user_request).with(@carto_user1, dataset_id, dataset_name).once
|
|
|
|
|
.returns(mailer_mock)
|
|
|
|
|
DataObservatoryMailer.expects(:carto_request).with(@carto_user1, dataset_id, 0.0).once.returns(mailer_mock)
|
|
|
|
|
|
|
|
|
|
mock_service = mock
|
|
|
|
|
mock_service.expects(:subscribe).with(expected_params).once
|
|
|
|
|
Carto::DoLicensingService.expects(:new).with(@user1.username).once.returns(mock_service)
|
|
|
|
|
post_json endpoint_url(api_key: @master), id: dataset_id, type: 'dataset' do |response|
|
|
|
|
|
expect(response.status).to eq(200)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
Delorean.time_travel_to '2018/01/01 00:00:00' do
|
|
|
|
|
it 'sends request emails if instant licensing is not enabled for the user' do
|
|
|
|
|
mailer_mock = stub(:deliver_now)
|
|
|
|
|
dataset_id = @payload[:id]
|
|
|
|
|
dataset_name = 'CARTO dataset 1'
|
|
|
|
|
DataObservatoryMailer.expects(:user_request).with(@carto_user1, dataset_id, dataset_name).once
|
|
|
|
|
.returns(mailer_mock)
|
|
|
|
|
DataObservatoryMailer.expects(:carto_request).with(@carto_user1, dataset_id, 0.0).once.returns(mailer_mock)
|
|
|
|
|
|
|
|
|
|
with_feature_flag @user1, 'do-instant-licensing', false do
|
|
|
|
|
post_json endpoint_url(api_key: @master), @payload do |response|
|
|
|
|
|
expect(response.status).to eq(200)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'sends request emails if the delivery time is not 0' do
|
|
|
|
|
mailer_mock = stub(:deliver_now)
|
|
|
|
|
dataset_id = 'carto.abc.geography1'
|
|
|
|
|
dataset_name = 'CARTO geography 1'
|
|
|
|
|
DataObservatoryMailer.expects(:user_request).with(@carto_user1, dataset_id, dataset_name).once.returns(mailer_mock)
|
|
|
|
|
DataObservatoryMailer.expects(:carto_request).with(@carto_user1, dataset_id, 3.0).once.returns(mailer_mock)
|
|
|
|
|
Carto::DoLicensingService.expects(:new).never
|
|
|
|
|
|
|
|
|
|
Delorean.time_travel_to '2018/01/01 00:00:00' do
|
|
|
|
|
post_json endpoint_url(api_key: @master), id: 'carto.abc.geography1', type: 'geography' do |response|
|
|
|
|
|
expect(response.status).to eq(200)
|
|
|
|
|
expected_response = {
|
|
|
|
|
estimated_delivery_days: 0.0,
|
|
|
|
|
id: 'carto.abc.dataset1',
|
|
|
|
|
estimated_delivery_days: 3.0,
|
|
|
|
|
id: 'carto.abc.geography1',
|
|
|
|
|
licenses: 'licenses',
|
|
|
|
|
licenses_link: 'licenses_link',
|
|
|
|
|
rights: 'rights',
|
|
|
|
|
subscription_list_price: 100.0,
|
|
|
|
|
subscription_list_price: 90.0,
|
|
|
|
|
tos: 'tos',
|
|
|
|
|
tos_link: 'tos_link',
|
|
|
|
|
type: 'dataset'
|
|
|
|
|
type: 'geography'
|
|
|
|
|
}
|
|
|
|
|
expect(response.body).to eq expected_response
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'returns 200 with the dataset metadata without calling DoLicensingService when the delivery time is not 0' do
|
|
|
|
|
Carto::DoLicensingService.expects(:new).never
|
|
|
|
|
it 'returns 200 with the dataset metadata and calls the DoLicensingService with the expected params' do
|
|
|
|
|
expected_params = [{
|
|
|
|
|
dataset_id: 'carto.abc.dataset1',
|
|
|
|
|
available_in: ['bq'],
|
|
|
|
|
price: 100.0,
|
|
|
|
|
expires_at: Time.parse('2019/01/01 00:00:00')
|
|
|
|
|
}]
|
|
|
|
|
|
|
|
|
|
mock_service = mock
|
|
|
|
|
mock_service.expects(:subscribe).with(expected_params).once
|
|
|
|
|
Carto::DoLicensingService.expects(:new).with(@user1.username).once.returns(mock_service)
|
|
|
|
|
|
|
|
|
|
Delorean.time_travel_to '2018/01/01 00:00:00' do
|
|
|
|
|
post_json endpoint_url(api_key: @master), id: 'carto.abc.geography1', type: 'geography' do |response|
|
|
|
|
|
post_json endpoint_url(api_key: @master), @payload do |response|
|
|
|
|
|
expect(response.status).to eq(200)
|
|
|
|
|
expected_response = {
|
|
|
|
|
estimated_delivery_days: 3.0,
|
|
|
|
|
id: 'carto.abc.geography1',
|
|
|
|
|
estimated_delivery_days: 0.0,
|
|
|
|
|
id: 'carto.abc.dataset1',
|
|
|
|
|
licenses: 'licenses',
|
|
|
|
|
licenses_link: 'licenses_link',
|
|
|
|
|
rights: 'rights',
|
|
|
|
|
subscription_list_price: 90.0,
|
|
|
|
|
subscription_list_price: 100.0,
|
|
|
|
|
tos: 'tos',
|
|
|
|
|
tos_link: 'tos_link',
|
|
|
|
|
type: 'geography'
|
|
|
|
|
type: 'dataset'
|
|
|
|
|
}
|
|
|
|
|
expect(response.body).to eq expected_response
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
describe 'unsubscribe' do
|
|
|
|
@ -439,15 +478,6 @@ describe Carto::Api::Public::DataObservatoryController do
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'returns 403 if the feature flag is not enabled for the user' do
|
|
|
|
|
with_feature_flag @user1, 'do-licensing', false do
|
|
|
|
|
delete_json endpoint_url(@params) do |response|
|
|
|
|
|
expect(response.status).to eq(403)
|
|
|
|
|
expect(response.body).to eq(errors: "DO licensing not enabled", errors_cause: nil)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'returns 204 calls the DoLicensingService with the expected params' do
|
|
|
|
|
mock_service = mock
|
|
|
|
|
mock_service.expects(:unsubscribe).with('carto.abc.dataset1').once
|
|
|
|
@ -463,15 +493,17 @@ describe Carto::Api::Public::DataObservatoryController do
|
|
|
|
|
metadata_user = FactoryGirl.create(:user, username: 'do-metadata')
|
|
|
|
|
db_seed = %{
|
|
|
|
|
CREATE TABLE datasets(id text, estimated_delivery_days numeric, subscription_list_price numeric, tos text,
|
|
|
|
|
tos_link text, licenses text, licenses_link text, rights text, available_in text[]);
|
|
|
|
|
tos_link text, licenses text, licenses_link text, rights text, available_in text[],
|
|
|
|
|
name text);
|
|
|
|
|
INSERT INTO datasets VALUES ('carto.abc.dataset1', 0.0, 100.0, 'tos', 'tos_link', 'licenses', 'licenses_link',
|
|
|
|
|
'rights', '{bq}');
|
|
|
|
|
'rights', '{bq}', 'CARTO dataset 1');
|
|
|
|
|
INSERT INTO datasets VALUES ('carto.abc.incomplete', 0.0, 100.0, 'tos', 'tos_link', 'licenses', 'licenses_link',
|
|
|
|
|
'rights', NULL);
|
|
|
|
|
'rights', NULL, 'Incomplete dataset');
|
|
|
|
|
CREATE TABLE geographies(id text, estimated_delivery_days numeric, subscription_list_price numeric, tos text,
|
|
|
|
|
tos_link text, licenses text, licenses_link text, rights text, available_in text[]);
|
|
|
|
|
tos_link text, licenses text, licenses_link text, rights text, available_in text[],
|
|
|
|
|
name text);
|
|
|
|
|
INSERT INTO geographies VALUES ('carto.abc.geography1', 3.0, 90.0, 'tos', 'tos_link', 'licenses', 'licenses_link',
|
|
|
|
|
'rights', '{bq}');
|
|
|
|
|
'rights', '{bq}', 'CARTO geography 1');
|
|
|
|
|
}
|
|
|
|
|
metadata_user.in_database.run(db_seed)
|
|
|
|
|
end
|
|
|
|
|