travis-api/spec/integration/v2/settings/ssh_key_spec.rb

123 lines
4.3 KiB
Ruby

require 'spec_helper'
describe 'ssh keys endpoint' do
let(:repo) { Factory(:repository) }
let(:headers) { { 'HTTP_ACCEPT' => 'application/vnd.travis-ci.2+json' } }
describe 'without an authenticated user' do
let(:headers) { { 'HTTP_ACCEPT' => 'application/vnd.travis-ci.2+json' } }
let(:user) { Factory(:user) }
describe 'GET /ssh_key' do
it 'responds with 401' do
response = get "/settings/ssh_key/#{repo.id}", {}, headers
response.should_not be_successful
response.status.should == 401
end
end
describe 'PATCH /ssh_key' do
it 'responds with 401' do
response = patch "/settings/ssh_key/#{repo.id}", {}, headers
response.should_not be_successful
response.status.should == 401
end
end
describe 'DELETE /ssh_key' do
it 'responds with 401' do
response = delete "/settings/ssh_key/#{repo.id}", {}, headers
response.should_not be_successful
response.status.should == 401
end
end
end
describe 'with authenticated user' do
let(:user) { Factory(:user) }
let(:token) { Travis::Api::App::AccessToken.create(user: user, app_id: -1) }
let(:headers) { { 'HTTP_ACCEPT' => 'application/vnd.travis-ci.2+json', 'HTTP_AUTHORIZATION' => "token #{token}" } }
before { user.permissions.create!(:repository_id => repo.id, :admin => true, :push => true) }
describe 'GET /ssh_key' do
it 'returns an item' do
settings = repo.settings
record = settings.create(:ssh_key, description: 'key for my repo', value: TEST_PRIVATE_KEY)
settings.save
response = get "/settings/ssh_key/#{repo.id}", {}, headers
json = JSON.parse(response.body)
json['ssh_key']['description'].should == 'key for my repo'
json['ssh_key']['id'].should == repo.id
json['ssh_key'].should_not have_key('value')
json['ssh_key']['fingerprint'].should == '57:78:65:c2:c9:c8:c9:f7:dd:2b:35:39:40:27:d2:40'
end
it 'returns 404 if ssh_key can\'t be found' do
response = get "/settings/ssh_key/#{repo.id}", {}, headers
json = JSON.parse(response.body)
json['error'].should == "Could not find a requested setting"
end
end
describe 'PATCH /settings/ssh_key' do
it 'should update a key' do
settings = repo.settings
ssh_key = settings.create(:ssh_key, description: 'foo', value: TEST_PRIVATE_KEY)
settings.save
new_key = OpenSSL::PKey::RSA.generate(2048).to_s
body = { ssh_key: { description: 'bar', value: new_key } }.to_json
response = patch "/settings/ssh_key/#{repo.id}", body, headers
json = JSON.parse(response.body)
json['ssh_key']['description'].should == 'bar'
json['ssh_key'].should_not have_key('value')
updated_ssh_key = repo.reload.settings.ssh_key
updated_ssh_key.description.should == 'bar'
updated_ssh_key.repository_id.should == repo.id
updated_ssh_key.value.decrypt.should == new_key
end
it 'returns an error message if ssh_key is invalid' do
settings = repo.settings
ssh_key = settings.create(:ssh_key, description: 'foo', value: 'the key')
settings.save
body = { ssh_key: { value: nil } }.to_json
response = patch "/settings/ssh_key/#{repo.id}", body, headers
response.status.should == 422
json = JSON.parse(response.body)
json['message'].should == 'Validation failed'
json['errors'].should == [{
'field' => 'value',
'code' => 'missing_field'
}]
ssh_key = repo.reload.settings.ssh_key
ssh_key.description.should == 'foo'
ssh_key.repository_id.should == repo.id
ssh_key.value.decrypt.should == 'the key'
end
end
describe 'DELETE /ssh_keys/:id' do
it 'should nullify an ssh_key' do
settings = repo.settings
ssh_key = settings.create(:ssh_key, description: 'foo', value: 'the key')
settings.save
response = delete "/settings/ssh_key/#{repo.id}", {}, headers
json = JSON.parse(response.body)
json['ssh_key']['description'].should == 'foo'
json['ssh_key'].should_not have_key('value')
repo.reload.settings.ssh_key.should be_nil
end
end
end
end