cartodb/spec/requests/carto/api/grantables_controller_spec.rb
2020-06-15 10:58:47 +08:00

149 lines
6.6 KiB
Ruby
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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