From e11dfa35cf10083b3c2d088460c30bacb7d0b09c Mon Sep 17 00:00:00 2001
From: Piotr Sarnacki <drogus@gmail.com>
Date: Tue, 5 Nov 2013 14:36:22 +0100
Subject: [PATCH] Fix PATCH repos/:id/settings

---
 lib/travis/api/app/endpoint/repos.rb     | 10 ++++++++--
 spec/integration/v2/repositories_spec.rb | 13 ++++++++++++-
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/lib/travis/api/app/endpoint/repos.rb b/lib/travis/api/app/endpoint/repos.rb
index a062ffda..18f7b6af 100644
--- a/lib/travis/api/app/endpoint/repos.rb
+++ b/lib/travis/api/app/endpoint/repos.rb
@@ -52,10 +52,16 @@ class Travis::Api::App
         end
       end
 
-      put '/:id/settings' do
+      patch '/:id/settings' do
+        payload = JSON.parse request.body.read
+
+        if payload['settings'].blank? || !payload['settings'].is_a?(Hash)
+          halt 422, { "error" => "Settings must be passed with a request" }
+        end
+
         settings = service(:find_repo_settings, params).run
         if settings
-          settings.merge(params[:settings])
+          settings.merge(payload['settings'])
           # TODO: I would like to have better API here, but leaving this
           # for testing to not waste too much time before I can play with it
           settings.repository.save
diff --git a/spec/integration/v2/repositories_spec.rb b/spec/integration/v2/repositories_spec.rb
index 0d8d53e3..139c2c5c 100644
--- a/spec/integration/v2/repositories_spec.rb
+++ b/spec/integration/v2/repositories_spec.rb
@@ -24,12 +24,23 @@ describe 'Repos' do
       }.to change { repo.reload.key.private_key }
     end
 
+    it 'allows to update settings' do
+      json = { 'settings' => { 'a-new-setting' => 'value' } }.to_json
+      response = patch "repos/#{repo.id}/settings", json, headers
+
+      repo.reload.settings['a-new-setting'].should == 'value'
+
+      body = JSON.parse(response.body)
+      body['settings']['a-new-setting'].should == 'value'
+    end
+
     it 'allows to get settings' do
       repo.settings.replace('foo' => { 'type' => 'password', 'value' => 'abc123' })
       repo.save
 
       response = get "repos/#{repo.id}/settings", {}, headers
-      JSON.parse(response.body).should == { 'settings' => { 'foo' => { 'type' => 'password', 'value' => '∗∗∗∗∗∗' } } }
+      settings = Repository::Settings.defaults.deep_merge({ 'foo' => { 'type' => 'password', 'value' => '∗∗∗∗∗∗' } })
+      JSON.parse(response.body).should == { 'settings' => settings }
     end
   end