spec/connectors/gitlab/extractor_spec.rb (208 lines of code) (raw):

# frozen_string_literal: true require 'hashie/mash' require 'connectors/gitlab/extractor' require 'connectors/gitlab/custom_client' require 'connectors/gitlab/connector' describe Connectors::GitLab::Extractor do let(:projects_json) { connectors_fixture_raw('gitlab/projects_list.json') } let(:project_json) { connectors_fixture_raw('gitlab/project.json') } let(:user_json) { connectors_fixture_raw('gitlab/user.json') } let(:external_user_json) { connectors_fixture_raw('gitlab/external_user.json') } let(:external_users_json) { connectors_fixture_raw('gitlab/external_users.json') } let(:project_members_json) { connectors_fixture_raw('gitlab/project_members.json') } let(:base_url) { 'https://www.example.com' } let(:cursors) { nil } let(:client_proc) do proc do Connectors::GitLab::CustomClient.new( :base_url => base_url, :api_token => 'token' ) end end let(:authorization_data_proc) { proc { {} } } subject do Connectors::GitLab::Extractor.new(:base_url => base_url) end describe '#yield_projects_page' do it 'correctly produces one page of documents' do stub_request(:get, "#{base_url}/projects?order_by=id&owned=true&pagination=keyset&per_page=100&sort=desc") .to_return(:status => 200, :body => projects_json) link = subject.yield_projects_page do |result| expect(result).to_not be_nil expect(result.size).to eq(100) item = result[0].with_indifferent_access expect(item[:id]).to_not be_nil expect(item[:name]).to_not be_nil end expect(link).to be_nil end context 'for multi-page results' do let(:link_header) { '<https://gitlab.com/api/v4/projects?id_before=35879340&imported=false&membership=false&order_by=id&owned=false&page=1&pagination=keyset&per_page=100&repository_checksum_failed=false&sort=desc&starred=false&statistics=false&wiki_checksum_failed=false&with_custom_attributes=false&with_issues_enabled=false&with_merge_requests_enabled=false>; rel="next"' } context 'when next page' do before(:each) do stub_request(:get, "#{base_url}/projects?order_by=id&owned=true&pagination=keyset&per_page=100&sort=desc") .to_return( :status => 200, :body => projects_json, :headers => { 'Link' => link_header } ) stub_request(:get, "#{base_url}/projects?id_before=35879340&imported=false&membership=false&order_by=id&owned=false&page=1&pagination=keyset&per_page=100&repository_checksum_failed=false&sort=desc&starred=false&statistics=false&wiki_checksum_failed=false&with_custom_attributes=false&with_issues_enabled=false&with_merge_requests_enabled=false") .to_return( :status => 200, :body => '[]' ) end it 'returns the cursor link from parameters' do link = subject.yield_projects_page do |result| expect(result.size).to eq(100) item = result[0].with_indifferent_access expect(item[:id]).to_not be_nil expect(item[:name]).to_not be_nil end expect(link).to eq(link_header) end it 'uses the cursor link from parameters' do subject.yield_projects_page(link_header) do |result| expect(result.size).to eq(0) end end end context 'without permissions' do context 'private projects' do let(:projects) do [ { :id => 1, :visibility => :private } ] end it 'returns nothing in permissions' do stub_request(:get, "#{base_url}/projects?order_by=id&owned=true&pagination=keyset&per_page=100&sort=desc") .to_return(:status => 200, :body => JSON.dump(projects)) stub_request(:get, "#{base_url}/projects/1/members/all") .to_return(:status => 200, :body => project_members_json) subject.yield_projects_page do |result| expect(result).to_not be_nil expect(result.size).to eq(1) permissions = result[0][:_allow_permissions] expect(permissions).to_not be_present end end end end context 'with permissions' do let(:config) { Connectors::GitLab::Config.new(:cursors => {}, :index_permissions => true) } context 'public projects' do let(:projects) do [ { :id => 1, :visibility => :public }, { :id => 2, :visibility => :public } ] end it 'returns empty permissions' do stub_request(:get, "#{base_url}/projects?order_by=id&owned=true&pagination=keyset&per_page=100&sort=desc") .to_return(:status => 200, :body => JSON.dump(projects)) subject.yield_projects_page do |result| expect(result).to_not be_nil expect(result.size).to eq(2) expect(result[0][:_allow_permissions]).to_not be_present expect(result[0][:_allow_permissions]).to_not be_present end end end context 'internal projects' do let(:projects) do [ { :id => 1, :visibility => :internal } ] end # TODO: permissions xit 'returns internal in permissions' do stub_request(:get, "#{base_url}/projects?order_by=id&owned=true&pagination=keyset&per_page=100&sort=desc") .to_return(:status => 200, :body => JSON.dump(projects)) stub_request(:get, "#{base_url}/projects/1/members/all") .to_return(:status => 200, :body => '[]') subject.yield_projects_page do |result| expect(result).to_not be_nil expect(result.size).to eq(1) permissions = result[0][:_allow_permissions] expect(permissions).to be_present expect(permissions.size).to eq(1) expect(permissions).to include('type:internal') end end end context 'private projects' do let(:projects) do [ { :id => 1, :visibility => :private } ] end # TODO: permissions xit 'returns actual users in permissions' do stub_request(:get, "#{base_url}/projects?order_by=id&owned=true&pagination=keyset&per_page=100&sort=desc") .to_return(:status => 200, :body => JSON.dump(projects)) stub_request(:get, "#{base_url}/projects/1/members/all") .to_return(:status => 200, :body => project_members_json) subject.yield_projects_page do |result| expect(result).to_not be_nil expect(result.size).to eq(1) permissions = result[0][:_allow_permissions] expect(permissions).to be_present expect(permissions.size).to eq(3) expect(permissions).to_not include('type:internal') expect(permissions).to_not include('user:11', 'user:22', 'user:33') end end end end end context 'for incremental sync' do let(:modified_since) { Time.now.days_ago(2) } # TODO: incremental xit 'uses the modified after date' do date_param = CGI.escape(modified_since.iso8601) stub_request(:get, "#{base_url}/projects?order_by=id&owned=true&pagination=keyset&per_page=100&sort=desc&last_activity_after=#{date_param}") .to_return(:status => 200, :body => projects_json) subject.yield_projects_page(:modified_since => modified_since) do |result| expect(result).to_not be_nil expect(result.size).to eq(100) end end end end describe '#deleted' do let(:existing_id) { 36029109 } let(:non_existing_ids) { [123, 234, 345] } # TODO: deletions xit 'correctly gets non-existing ids' do ids = non_existing_ids.dup.push(existing_id) non_existing_ids.each { |id| stub_request(:get, "#{base_url}/projects/#{id}").to_return(:status => 404) } stub_request(:get, "#{base_url}/projects/#{existing_id}") .to_return(:status => 200, :body => project_json) subject.deleted_ids(ids) do |result| expect(result).to eq(non_existing_ids) end end end describe '#permissions' do let(:user_id) { 1 } let(:user_name) { 'sytses' } let(:external_user_id) { 11422639 } let(:external_user_name) { 'PCHINC1' } before do stub_request(:get, "#{base_url}/users/#{external_user_id}").to_return(:body => external_user_json) stub_request(:get, "#{base_url}/users/#{user_id}").to_return(:body => user_json) stub_request(:get, "#{base_url}/users?external=true&username=#{external_user_name}").to_return(:body => external_users_json) stub_request(:get, "#{base_url}/users?external=true&username=#{user_name}").to_return(:body => '[]') end # TODO: permissions xit 'correctly sets permissions for internal user' do permissions = subject.permissions(user_id) do |result| end expect(permissions).to_not be_empty expect(permissions).to include("user:#{user_id}") expect(permissions).to include('type:internal') end # TODO: permissions xit 'correctly sets permissions for external user' do permissions = subject.permissions(external_user_id) do |result| end expect(permissions).to_not be_empty expect(permissions).to include("user:#{external_user_id}") expect(permissions).to_not include('type:internal') end end end