263 lines
8.2 KiB
Ruby
263 lines
8.2 KiB
Ruby
|
require_relative '../../../spec_helper'
|
||
|
require_relative '../../../../app/controllers/carto/api/overlays_controller'
|
||
|
require_relative '../../../../spec/requests/api/json/overlays_controller_shared_examples'
|
||
|
|
||
|
describe Carto::Api::OverlaysController do
|
||
|
|
||
|
it_behaves_like 'overlays controllers' do
|
||
|
end
|
||
|
|
||
|
before(:all) do
|
||
|
@user = create_user
|
||
|
@api_key = @user.api_key
|
||
|
|
||
|
@user2 = create_user
|
||
|
|
||
|
host! "#{@user.username}.localhost.lan"
|
||
|
end
|
||
|
|
||
|
before(:each) do
|
||
|
bypass_named_maps
|
||
|
delete_user_data @user
|
||
|
@table = create_table user_id: @user.id
|
||
|
end
|
||
|
|
||
|
after(:all) do
|
||
|
bypass_named_maps
|
||
|
@user.destroy
|
||
|
end
|
||
|
|
||
|
let(:params) { { api_key: @user.api_key, visualization_id: @table.table_visualization.id } }
|
||
|
|
||
|
FAKE_UUID = Carto::UUIDHelper.random_uuid
|
||
|
|
||
|
describe '#index' do
|
||
|
it 'lists all overlays' do
|
||
|
existing_overlay_ids = []
|
||
|
get_json overlays_url(params) do |response|
|
||
|
response.status.should be_success
|
||
|
response.body.count.should eq 5 # Newly created overlays have this amount of layers
|
||
|
existing_overlay_ids = response.body.map { |overlay| overlay['id'] }
|
||
|
end
|
||
|
|
||
|
header_overlay = Carto::Overlay.new(type: 'header', visualization_id: params[:visualization_id], order: 1)
|
||
|
header_overlay.save
|
||
|
|
||
|
text_overlay = Carto::Overlay.new(type: 'text', visualization_id: params[:visualization_id], order: 2)
|
||
|
text_overlay.save
|
||
|
|
||
|
new_overlay_ids = [header_overlay.id, text_overlay.id]
|
||
|
|
||
|
get_json overlays_url(params) do |response|
|
||
|
response.status.should be_success
|
||
|
current_overlay_ids = response.body.map { |overlay| overlay['id'] }
|
||
|
response.body.count.should == new_overlay_ids.count + existing_overlay_ids.count
|
||
|
# == checks order, while intersection doesn't
|
||
|
(current_overlay_ids & (existing_overlay_ids + new_overlay_ids) == current_overlay_ids).should eq true
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'returns 401 when accessing other users overlays' do
|
||
|
get_json overlays_url(params.merge(api_key: @user2.api_key)) do |response|
|
||
|
response.status.should eq 401
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'returns 404 when accessing non-existing visualization' do
|
||
|
get_json overlays_url(params.merge(visualization_id: FAKE_UUID)) do |response|
|
||
|
response.status.should eq 404
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe '#show' do
|
||
|
it 'gets the details of an overlay' do
|
||
|
header_overlay = Carto::Overlay.new(type: 'header', visualization_id: params[:visualization_id])
|
||
|
header_overlay.save
|
||
|
|
||
|
get_json overlay_url(params.merge(id: header_overlay.id)) do |response|
|
||
|
response.status.should be_success
|
||
|
response.body[:id].should == header_overlay.id
|
||
|
response.body[:visualization_id].should == params[:visualization_id]
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'returns 401 when accessing other users overlays' do
|
||
|
overlay = Carto::Overlay.new(type: 'text', visualization_id: params[:visualization_id])
|
||
|
overlay.save
|
||
|
|
||
|
get_json overlay_url(params.merge(id: overlay.id, api_key: @user2.api_key)) do |response|
|
||
|
response.status.should eq 401
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'returns 404 when accessing non-existing overlay' do
|
||
|
get_json overlay_url(params.merge(id: FAKE_UUID)) do |response|
|
||
|
response.status.should eq 404
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe '#create' do
|
||
|
it 'creates an overlay' do
|
||
|
payload = {
|
||
|
type: 'header',
|
||
|
template: 'wadus',
|
||
|
order: 0,
|
||
|
options: { display: true }
|
||
|
}
|
||
|
|
||
|
post_json overlays_url(params), payload do |response|
|
||
|
response.status.should be_success
|
||
|
response.body[:id].should be
|
||
|
response.body[:type].should eq payload[:type]
|
||
|
response.body[:template].should eq payload[:template]
|
||
|
response.body[:order].should eq payload[:order]
|
||
|
response.body[:options].should eq payload[:options]
|
||
|
end
|
||
|
|
||
|
overlay = Carto::Overlay.where(visualization_id: params[:visualization_id], template: 'wadus').first
|
||
|
overlay.should be
|
||
|
overlay.type.should eq payload[:type]
|
||
|
overlay.template.should eq payload[:template]
|
||
|
overlay.order.should eq payload[:order]
|
||
|
overlay.options.symbolize_keys.should eq payload[:options]
|
||
|
end
|
||
|
|
||
|
it 'fails to create two overlays of the same unique type' do
|
||
|
header_overlay = Carto::Overlay.new(type: 'header', visualization_id: params[:visualization_id])
|
||
|
header_overlay.save
|
||
|
|
||
|
payload = {
|
||
|
type: 'header'
|
||
|
}
|
||
|
|
||
|
post_json overlays_url(params), payload do |response|
|
||
|
response.status.should eq 422
|
||
|
response.body[:errors].should be
|
||
|
end
|
||
|
|
||
|
Carto::Overlay.where(visualization_id: params[:visualization_id], type: 'header').count.should eq 1
|
||
|
end
|
||
|
|
||
|
it 'returns 401 when creating overlays in other users viz' do
|
||
|
payload = {
|
||
|
type: 'text'
|
||
|
}
|
||
|
|
||
|
post_json overlays_url(params.merge(api_key: @user2.api_key)), payload do |response|
|
||
|
response.status.should eq 401
|
||
|
end
|
||
|
|
||
|
Carto::Overlay.where(visualization_id: params[:visualization_id], type: 'text').count.should eq 0
|
||
|
end
|
||
|
|
||
|
it 'returns 404 when creating overlays in non-existent viz' do
|
||
|
post_json overlays_url(params.merge(visualization_id: FAKE_UUID)) do |response|
|
||
|
response.status.should eq 404
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe '#update' do
|
||
|
it 'updates an overlay' do
|
||
|
overlay = Carto::Overlay.new(type: 'text', visualization_id: params[:visualization_id])
|
||
|
overlay.save
|
||
|
|
||
|
payload = {
|
||
|
type: 'header',
|
||
|
template: 'wadus',
|
||
|
order: 0,
|
||
|
options: { display: true }
|
||
|
}
|
||
|
|
||
|
put_json overlay_url(params.merge(id: overlay.id)), payload do |response|
|
||
|
response.status.should be_success
|
||
|
response.body[:id].should be
|
||
|
response.body[:type].should eq payload[:type]
|
||
|
response.body[:template].should eq payload[:template]
|
||
|
response.body[:order].should eq payload[:order]
|
||
|
response.body[:options].should eq payload[:options]
|
||
|
end
|
||
|
|
||
|
overlay.reload
|
||
|
overlay.type.should eq payload[:type]
|
||
|
overlay.template.should eq payload[:template]
|
||
|
overlay.order.should eq payload[:order]
|
||
|
overlay.options.symbolize_keys.should eq payload[:options]
|
||
|
end
|
||
|
|
||
|
it 'fails to update two overlays of the same unique type' do
|
||
|
header_overlay = Carto::Overlay.new(type: 'header', visualization_id: params[:visualization_id])
|
||
|
header_overlay.save
|
||
|
|
||
|
overlay = Carto::Overlay.new(type: 'text', visualization_id: params[:visualization_id])
|
||
|
overlay.save
|
||
|
|
||
|
payload = {
|
||
|
type: 'header'
|
||
|
}
|
||
|
|
||
|
put_json overlay_url(params.merge(id: overlay.id)), payload do |response|
|
||
|
response.status.should eq 422
|
||
|
response.body[:errors].should be
|
||
|
end
|
||
|
|
||
|
overlay.reload
|
||
|
overlay.type.should eq 'text'
|
||
|
end
|
||
|
|
||
|
it 'returns 401 when updating overlays from another user' do
|
||
|
overlay = Carto::Overlay.new(type: 'text', visualization_id: params[:visualization_id])
|
||
|
overlay.save
|
||
|
|
||
|
payload = {
|
||
|
type: 'text'
|
||
|
}
|
||
|
|
||
|
put_json overlay_url(params.merge(api_key: @user2.api_key, id: overlay.id)), payload do |response|
|
||
|
response.status.should eq 401
|
||
|
end
|
||
|
|
||
|
overlay.reload
|
||
|
overlay.type.should eq 'text'
|
||
|
end
|
||
|
|
||
|
it 'returns 404 when updating non-existing overlay' do
|
||
|
put_json overlay_url(params.merge(id: FAKE_UUID)) do |response|
|
||
|
response.status.should eq 404
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe '#delete' do
|
||
|
it 'deletes an overlay' do
|
||
|
overlay = Carto::Overlay.new(type: 'text', visualization_id: params[:visualization_id])
|
||
|
overlay.save
|
||
|
|
||
|
delete overlay_url(params.merge(id: overlay.id)) do |response|
|
||
|
response.status.should be_success
|
||
|
end
|
||
|
|
||
|
expect { Carto::Overlay.find(overlay.id) }.to raise_error(ActiveRecord::RecordNotFound)
|
||
|
end
|
||
|
|
||
|
it 'returns 401 when deleting overlays from another user' do
|
||
|
overlay = Carto::Overlay.new(type: 'text', visualization_id: params[:visualization_id])
|
||
|
overlay.save
|
||
|
|
||
|
delete overlay_url(params.merge(api_key: @user2.api_key, id: overlay.id)) do |response|
|
||
|
response.status.should eq 401
|
||
|
end
|
||
|
|
||
|
overlay.reload.should be
|
||
|
end
|
||
|
|
||
|
it 'returns 404 when deleting non-existent overlays' do
|
||
|
delete overlay_url(params.merge(id: FAKE_UUID)) do |response|
|
||
|
response.status.should eq 404
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|