cartodb-4.42/spec/requests/carto/api/grantables_controller_spec.rb

149 lines
6.6 KiB
Ruby
Raw Normal View History

2024-04-06 13:25:13 +08:00
require_relative '../../../spec_helper'
require_relative '.././../../factories/organizations_contexts'
require_relative '.././../../factories/visualization_creation_helpers'
require_relative '../../../../app/controllers/carto/api/grantables_controller'
describe Carto::Api::GrantablesController do
include_context 'organization with users helper'
def count_grantables(organization)
organization.users.length + organization.groups.length
end
describe 'Grantables', :order => :defined do
before(:all) do
@headers = { 'CONTENT_TYPE' => 'application/json', :format => "json", 'Accept' => 'application/json' }
end
it "Throws 401 error without http auth" do
get api_v1_grantables_index_url(user_domain: @org_user_owner.username, organization_id: @carto_organization.id), {}, @headers
response.status.should == 401
end
describe "#index", :order => :defined do
it "returns all organization users as a grantable of type user with avatar_url" do
get_json api_v1_grantables_index_url(user_domain: @org_user_owner.username, organization_id: @carto_organization.id, api_key: @org_user_owner.api_key), {}, @headers do |response|
response.status.should == 200
grantables = response.body[:grantables]
grantables.length.should == @carto_organization.users.length
grantables.map { |g| g[:id] }.should include(@org_user_1.id)
grantables.map { |g| g[:avatar_url] }.should include(@org_user_1.avatar_url)
response.body[:total_entries].should == @carto_organization.users.length
end
end
it "returns all organization users and groups as a grantable of the right type, including additional information" do
group_1 = FactoryGirl.create(:random_group, display_name: 'g_1', organization: @carto_organization)
group_2 = FactoryGirl.create(:random_group, display_name: 'g_2', organization: @carto_organization)
@carto_organization.reload
get_json api_v1_grantables_index_url(user_domain: @org_user_owner.username, organization_id: @carto_organization.id, api_key: @org_user_owner.api_key), {}, @headers do |response|
response.status.should == 200
response.body[:grantables].length.should == count_grantables(@carto_organization)
response.body[:total_entries].should == count_grantables(@carto_organization)
response.body[:grantables].each { |g|
g[:id].should == g[:model][:id]
case g[:type]
when 'user'
g[:name].should == g[:model][:username]
user = Carto::User.find_by_username(g[:model][:username])
g[:model][:groups].should == user.groups.map { |group| Carto::Api::GroupPresenter.new(group).to_poro }
when 'group'
g[:name].should == g[:model][:display_name]
users = g[:model][:users]
group = @carto_organization.groups.find_by_display_name(g[:name])
users.should == group.users.map { |u| Carto::UserPresenter.new(u).to_poro }
else
raise "Unknown type #{g[:type]}"
end
}
end
end
it "can paginate results" do
group_1 = @carto_organization.groups[0]
group_2 = @carto_organization.groups[1]
per_page = 1
# this expectation is based on known naming:
expected_ids = [group_1.id, group_2.id, @org_user_owner.id, @org_user_1.id, @org_user_2.id]
expected_ids.each { |expected_id|
page = expected_ids.index(expected_id) + 1
get_json api_v1_grantables_index_url(user_domain: @org_user_owner.username, organization_id: @carto_organization.id, api_key: @org_user_owner.api_key), { page: page, per_page: per_page, order: 'name' }, @headers do |response|
response.status.should == 200
response.body[:grantables][0][:id].should eq(expected_id), "#{response.body[:grantables][0][:id]} != #{expected_id}. Failing page: #{page}"
response.body[:grantables].length.should == per_page
response.body[:total_entries].should == count_grantables(@carto_organization)
end
}
end
it "can order by type" do
expected_types = (1..@carto_organization.groups.count).map{'group'} + (1..@carto_organization.users.count).map{'user'}
get_json api_v1_grantables_index_url(user_domain: @org_user_owner.username, organization_id: @carto_organization.id, api_key: @org_user_owner.api_key), { order: 'type' }, @headers do |response|
response.status.should == 200
response.body[:grantables].map { |g| g[:type] }.should == expected_types
end
end
it 'can filter by name' do
group = @carto_organization.groups.first
get_json api_v1_grantables_index_url(user_domain: @org_user_owner.username, organization_id: @carto_organization.id, api_key: @org_user_owner.api_key), {q: group.display_name}, @headers do |response|
response.status.should == 200
response.body[:grantables].length.should == 1
response.body[:total_entries].should == 1
response.body[:grantables][0][:id].should == group.id
end
end
it 'filter by name with special characters uses them as literals' do
search_strings = ['%', '___'] # % and _ are special characters in LIKE operator matchers
search_strings.each do |q|
get_json api_v1_grantables_index_url(
user_domain: @org_user_owner.username,
organization_id: @carto_organization.id,
api_key: @org_user_owner.api_key
), { q: q }, @headers do |response|
response.status.should == 200
response.body[:grantables].length.should == 0
response.body[:total_entries].should == 0
end
end
end
it "validates order param" do
[:id, :name, :type, :avatar_url, :organization_id, :updated_at].each do |param|
get_json api_v1_grantables_index_url(
order: param,
user_domain: @org_user_owner.username,
organization_id: @carto_organization.id,
api_key: @org_user_owner.api_key
), {}, @headers do |response|
response.status.should == 200
end
end
get_json api_v1_grantables_index_url(
order: :invalid,
user_domain: @org_user_owner.username,
organization_id: @carto_organization.id,
api_key: @org_user_owner.api_key
), {}, @headers do |response|
response.status.should == 400
response.body.fetch(:errors).should_not be_nil
end
end
end
end
end