diff options
author | Alex Denisov <1101.debian@gmail.com> | 2012-09-16 17:52:06 +0300 |
---|---|---|
committer | Alex Denisov <1101.debian@gmail.com> | 2012-09-16 17:52:06 +0300 |
commit | c23eb4082948322a1b690e0850c09bfc8df81589 (patch) | |
tree | b8fa0b5cff6e69176aec2b5398f508f81733f5d4 | |
parent | caef9ed1121a16ca0cc78715695daaa974271bfd (diff) | |
download | gitlab-ce-c23eb4082948322a1b690e0850c09bfc8df81589.tar.gz |
SSH Keys API implemented
-rw-r--r-- | lib/api.rb | 1 | ||||
-rw-r--r-- | lib/api/entities.rb | 6 | ||||
-rw-r--r-- | lib/api/keys.rb | 44 | ||||
-rw-r--r-- | spec/requests/api/ssh_keys_spec.rb | 55 |
4 files changed, 106 insertions, 0 deletions
diff --git a/lib/api.rb b/lib/api.rb index be04701c25d..37e03849b96 100644 --- a/lib/api.rb +++ b/lib/api.rb @@ -17,5 +17,6 @@ module Gitlab mount Projects mount Issues mount Milestones + mount Keys end end diff --git a/lib/api/entities.rb b/lib/api/entities.rb index b50d683f940..13a48e12019 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -48,5 +48,11 @@ module Gitlab expose :assignee, :author, using: Entities::UserBasic expose :closed, :updated_at, :created_at end + + class Key < Grape::Entity + expose :id, + :title, + :key + end end end diff --git a/lib/api/keys.rb b/lib/api/keys.rb new file mode 100644 index 00000000000..96ab7029fe5 --- /dev/null +++ b/lib/api/keys.rb @@ -0,0 +1,44 @@ +module Gitlab + # Keys API + class Keys < Grape::API + before { authenticate! } + resource :keys do + # Get currently authenticated user's keys + # + # Example Request: + # GET /keys + get do + present current_user.keys, with: Entities::Key + end + # Add new ssh key to currently authenticated user + # + # Parameters: + # key (required) - New SSH Key + # title (required) - New SSH Key's title + # Example Request: + # POST /keys + post do + key = current_user.keys.new( + title: params[:title], + key: params[:key] + ) + if key.save + present key, with: Entities::Key + else + not_found! + end + end + # Delete existed ssh key of currently authenticated user + # + # Parameters: + # id (required) - SSH Key ID + # Example Request: + # DELETE /keys/:id + delete "/:id" do + key = current_user.keys.find params[:id] + key.delete + end + end + end +end + diff --git a/spec/requests/api/ssh_keys_spec.rb b/spec/requests/api/ssh_keys_spec.rb new file mode 100644 index 00000000000..b8c60377897 --- /dev/null +++ b/spec/requests/api/ssh_keys_spec.rb @@ -0,0 +1,55 @@ +require 'spec_helper' + +describe Gitlab::Keys do + include ApiHelpers + let(:user) { + user = Factory.create :user + user.reset_authentication_token! + user + } + let(:key) { Factory.create :key, { user: user}} + + describe "GET /keys" do + context "when unauthenticated" do + it "should return authentication error" do + get api("/keys") + response.status.should == 401 + end + end + context "when authenticated" do + it "should return array of ssh keys" do + user.keys << key + user.save + get api("/keys", user) + response.status.should == 200 + json_response.should be_an Array + json_response.first["title"].should == key.title + end + end + end + + describe "POST /keys" do + it "should not create invalid ssh key" do + post api("/keys", user), { title: "invalid key" } + response.status.should == 404 + end + it "should create ssh key" do + key_attrs = Factory.attributes :key + expect { + post api("/keys", user), key_attrs + }.to change{ user.keys.count }.by(1) + end + end + + describe "DELETE /keys/:id" do + it "should delete existed key" do + user.keys << key + user.save + expect { + delete api("/keys/#{key.id}", user) + }.to change{user.keys.count}.by(-1) + end + end + +end + |