From 1dd712ddc238d2e6c30be09cb071c8e9b60cfcac Mon Sep 17 00:00:00 2001 From: Matt Humphrey Date: Wed, 6 Mar 2013 10:33:32 +0000 Subject: [PATCH] System hooks API. --- doc/api/system_hooks.md | 47 ++++++++++++++++++ lib/api.rb | 1 + lib/api/system_hooks.rb | 60 ++++++++++++++++++++++ spec/requests/api/system_hooks_spec.rb | 69 ++++++++++++++++++++++++++ 4 files changed, 177 insertions(+) create mode 100644 doc/api/system_hooks.md create mode 100644 lib/api/system_hooks.rb create mode 100644 spec/requests/api/system_hooks_spec.rb diff --git a/doc/api/system_hooks.md b/doc/api/system_hooks.md new file mode 100644 index 00000000000..f6e11ed238e --- /dev/null +++ b/doc/api/system_hooks.md @@ -0,0 +1,47 @@ +All methods require admin authorization. + +## List system hooks + +Get list of system hooks + +``` +GET /hooks +``` + +Will return hooks with status `200 OK` on success, or `404 Not found` on fail. + +## Add new system hook hook + +``` +POST /hooks +``` + +Parameters: + ++ `url` (required) - The hook URL + +Will return status `201 Created` on success, or `404 Not found` on fail. + +## Test system hook + +``` +GET /hooks/:id +``` + +Parameters: + ++ `id` (required) - The ID of hook + +Will return hook with status `200 OK` on success, or `404 Not found` on fail. + +## Delete system hook + +``` +DELETE /hooks/:id +``` + +Parameters: + ++ `id` (required) - The ID of hook + +Will return status `200 OK` on success, or `404 Not found` on fail. \ No newline at end of file diff --git a/lib/api.rb b/lib/api.rb index da31a1519dd..2a9a0eb2842 100644 --- a/lib/api.rb +++ b/lib/api.rb @@ -20,5 +20,6 @@ module Gitlab mount MergeRequests mount Notes mount Internal + mount SystemHooks end end diff --git a/lib/api/system_hooks.rb b/lib/api/system_hooks.rb new file mode 100644 index 00000000000..665a1cdd0d2 --- /dev/null +++ b/lib/api/system_hooks.rb @@ -0,0 +1,60 @@ +module Gitlab + # Hooks API + class SystemHooks < Grape::API + before { authenticated_as_admin! } + + resource :hooks do + # Get the list of system hooks + # + # Example Request: + # GET /hooks + get do + @hooks = SystemHook.all + present @hooks, with: Entities::Hook + end + + # Create new system hook + # + # Parameters: + # url (required) - url for system hook + # Example Request + # POST /hooks + post do + attrs = attributes_for_keys [:url] + @hook = SystemHook.new attrs + if @hook.save + present @hook, with: Entities::Hook + else + not_found! + end + end + + # Test a hook + # + # Example Request + # GET /hooks/:id + get ":id" do + @hook = SystemHook.find(params[:id]) + data = { + event_name: "project_create", + name: "Ruby", + path: "ruby", + project_id: 1, + owner_name: "Someone", + owner_email: "example@gitlabhq.com" + } + @hook.execute(data) + data + end + + # Delete a hook + # + # Example Request: + # DELETE /hooks/:id + delete ":id" do + @hook = SystemHook.find(params[:id]) + @hook.destroy + end + end + end +end \ No newline at end of file diff --git a/spec/requests/api/system_hooks_spec.rb b/spec/requests/api/system_hooks_spec.rb new file mode 100644 index 00000000000..9842ae91ec3 --- /dev/null +++ b/spec/requests/api/system_hooks_spec.rb @@ -0,0 +1,69 @@ +require 'spec_helper' + +describe Gitlab::API do + include ApiHelpers + + let(:user) { create(:user) } + let(:admin) { create(:admin) } + let!(:hook) { create(:system_hook, url: "http://example.com") } + + before { stub_request(:post, hook.url) } + + describe "GET /hooks" do + context "when not an admin" do + it "should return forbidden error" do + get api("/hooks", user) + response.status.should == 403 + end + end + + context "when authenticated as admin" do + it "should return an array of hooks" do + get api("/hooks", admin) + response.status.should == 200 + json_response.should be_an Array + json_response.first['url'].should == hook.url + end + end + end + + describe "POST /hooks" do + it "should create new hook" do + expect { + post api("/hooks", admin), url: 'http://example.com' + }.to change { SystemHook.count }.by(1) + end + + it "should respond with 404 on failure" do + post api("/hooks", admin) + response.status.should == 404 + end + + it "should not create new hook without url" do + expect { + post api("/hooks", admin) + }.to_not change { SystemHook.count } + end + end + + describe "GET /hooks/:id" do + it "should return hook by id" do + get api("/hooks/#{hook.id}", admin) + response.status.should == 200 + json_response['event_name'].should == 'project_create' + end + + it "should return 404 on failure" do + get api("/hooks/404", admin) + response.status.should == 404 + end + end + + describe "DELETE /hooks/:id" do + it "should delete a hook" do + expect { + delete api("/hooks/#{hook.id}", admin) + }.to change { SystemHook.count }.by(-1) + end + end +end \ No newline at end of file -- GitLab