spec/lib/release_tools/release_managers/client_spec.rb (133 lines of code) (raw):

# frozen_string_literal: true require 'spec_helper' describe ReleaseTools::ReleaseManagers::Client do describe 'initialize' do # Disable VCR for these requests, so that we can verify them with WebMock # without requiring a cassette recording around do |ex| VCR.turn_off! ex.run VCR.turn_on! end it 'configures properly for dev' do request = stub_request(:get, %r{\Ahttps://dev\.gitlab\.org/.+}) described_class.new(:dev).members expect(request).to have_been_requested end it 'configures properly for production' do request = stub_request(:get, %r{\Ahttps://gitlab\.com/.+}) described_class.new(:production).members expect(request).to have_been_requested end it 'configures properly for ops' do request = stub_request(:get, %r{\Ahttps://ops\.gitlab\.net/.+}) described_class.new(:ops).members expect(request).to have_been_requested end end describe '#sync_membership' do subject { described_class.new(:dev) } let(:internal_client) do spy( group_members: [ double(username: 'james'), double(username: 'RSPEICHER') # Test case-sensitivity ] ) end before do allow(subject).to receive(:client).and_return(internal_client) end it 'adds missing members, skipping existing members' do expect(subject).to receive(:add_member).with('douwem') expect(subject).not_to receive(:add_member).with('james') expect(subject).not_to receive(:add_member).with('rspeicher') subject.sync_membership(%w[DouweM james rspeicher]) end it 'removes undefined members, skipping existing members' do expect(subject).to receive(:remove_member).with('rspeicher') expect(subject).not_to receive(:remove_member).with('james') subject.sync_membership(%w[james]) end it 'keeps track of exceptions when they occur' do sync_error = ReleaseTools::ReleaseManagers::Client::SyncError.new('BOOM') expect(subject).to receive(:get_user) { raise sync_error } expect { subject.sync_membership(%w[james]) }.not_to raise_error expect(subject.sync_errors).to contain_exactly(sync_error) end end describe '#get_user' do subject { described_class.new(:dev) } let(:internal_client) { double('Client') } before do allow(subject).to receive(:client).and_return(internal_client) end it 'searches users by username' do expect(internal_client) .to receive(:users) .with(username: 'bob') .and_return([double(username: 'bob')]) expect(subject.get_user('bob').username).to eq 'bob' end it 'raises an error when a user was not found' do expect(internal_client) .to receive(:users) .with(username: 'bob') .and_return([]) expect { subject.get_user('bob') }.to raise_error(ReleaseTools::ReleaseManagers::Client::UserNotFoundError) end end describe '#join' do subject { described_class.new(:dev) } let(:internal_client) do spy( group_members: [ double(username: 'bob'), double(username: 'carl') ] ) end before do allow(subject).to receive(:client).and_return(internal_client) end it 'adds a member to the group' do expect(subject).to receive(:add_member).with('alice') subject.join('alice') end it 'does not add esisting members' do expect(subject).not_to receive(:add_member).with('bob') subject.join('bob') end it 'keeps track of exceptions when they occur' do sync_error = ReleaseTools::ReleaseManagers::Client::SyncError.new('BOOM') expect(subject).to receive(:get_user) { raise sync_error } expect { subject.join('alice') }.not_to raise_error expect(subject.sync_errors).to contain_exactly(sync_error) end end describe '#leave' do subject { described_class.new(:dev) } let(:internal_client) do spy( group_members: [ double(username: 'bob'), double(username: 'carl') ] ) end before do allow(subject).to receive(:client).and_return(internal_client) end it 'removes a member to the group' do expect(subject).to receive(:remove_member).with('carl') subject.leave('carl') end it 'does not remove members that are not in the group' do expect(subject).not_to receive(:remove_member).with('alice') subject.leave('alice') end it 'keeps track of exceptions when they occur' do sync_error = ReleaseTools::ReleaseManagers::Client::SyncError.new('BOOM') expect(subject).to receive(:get_user) { raise sync_error } expect { subject.leave('bob') }.not_to raise_error expect(subject.sync_errors).to contain_exactly(sync_error) end end end