]> source.dussan.org Git - redmine.git/commitdiff
Refactor: convert api key tests to shoulda macros for reuse. #6447
authorEric Davis <edavis@littlestreamsoftware.com>
Mon, 1 Nov 2010 15:45:03 +0000 (15:45 +0000)
committerEric Davis <edavis@littlestreamsoftware.com>
Mon, 1 Nov 2010 15:45:03 +0000 (15:45 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4358 e93f8b46-1217-0410-a6f0-8f06a7374b81

test/integration/api_test/token_authentication_test.rb
test/test_helper.rb

index 7d6cb2e1d8d823e9128090eee4c9495c388c0cb1..5c116c16144aab0095e708d882ca04a148832b3d 100644 (file)
@@ -15,66 +15,12 @@ class ApiTest::TokenAuthenticationTest < ActionController::IntegrationTest
   
   # Using the NewsController because it's a simple API.
   context "get /news" do
-
     context "in :xml format" do
-      context "with a valid api token" do
-        setup do
-          @user = User.generate_with_protected!
-          @token = Token.generate!(:user => @user, :action => 'api')
-          get "/news.xml?key=#{@token.value}"
-        end
-        
-        should_respond_with :success
-        should_respond_with_content_type :xml
-        should "login as the user" do
-          assert_equal @user, User.current
-        end
-      end
-
-      context "with an invalid api token" do
-        setup do
-          @user = User.generate_with_protected!
-          @token = Token.generate!(:user => @user, :action => 'feeds')
-          get "/news.xml?key=#{@token.value}"
-        end
-        
-        should_respond_with :unauthorized
-        should_respond_with_content_type :xml
-        should "not login as the user" do
-          assert_equal User.anonymous, User.current
-        end
-      end
+      should_allow_key_based_auth(:get, "/news.xml")
     end
 
     context "in :json format" do
-      context "with a valid api token" do
-        setup do
-          @user = User.generate_with_protected!
-          @token = Token.generate!(:user => @user, :action => 'api')
-          get "/news.json?key=#{@token.value}"
-        end
-        
-        should_respond_with :success
-        should_respond_with_content_type :json
-        should "login as the user" do
-          assert_equal @user, User.current
-        end
-      end
-
-      context "with an invalid api token" do
-        setup do
-          @user = User.generate_with_protected!
-          @token = Token.generate!(:user => @user, :action => 'feeds')
-          get "/news.json?key=#{@token.value}"
-        end
-        
-        should_respond_with :unauthorized
-        should_respond_with_content_type :json
-        should "not login as the user" do
-          assert_equal User.anonymous, User.current
-        end
-      end
+      should_allow_key_based_auth(:get, "/news.json")
     end
-    
   end
 end
index db44bb9b8c8ef7e3c6c7cfc6e47c59f72da696da..001638754e82093e91befd5a4549611dd464f8a1 100644 (file)
@@ -185,6 +185,61 @@ class ActiveSupport::TestCase
       assert !user.new_record?
     end
   end
+
+  # Test that a request allows full key authentication
+  #
+  # @param [Symbol] http_method the HTTP method for request (:get, :post, :put, :delete)
+  # @param [String] url the request url, without the key=ZXY parameter
+  def self.should_allow_key_based_auth(http_method, url)
+    context "should allow key based auth using key=X for #{url}" do
+      context "with a valid api token" do
+        setup do
+          @user = User.generate_with_protected!
+          @token = Token.generate!(:user => @user, :action => 'api')
+          send(http_method, url + "?key=#{@token.value}")
+        end
+        
+        should_respond_with :success
+        should_respond_with_content_type_based_on_url(url)
+        should "login as the user" do
+          assert_equal @user, User.current
+        end
+      end
+
+      context "with an invalid api token" do
+        setup do
+          @user = User.generate_with_protected!
+          @token = Token.generate!(:user => @user, :action => 'feeds')
+          send(http_method, url + "?key=#{@token.value}")
+        end
+        
+        should_respond_with :unauthorized
+        should_respond_with_content_type_based_on_url(url)
+        should "not login as the user" do
+          assert_equal User.anonymous, User.current
+        end
+      end
+    end
+    
+  end
+
+  # Uses should_respond_with_content_type based on what's in the url:
+  #
+  # '/project/issues.xml' => should_respond_with_content_type :xml
+  # '/project/issues.json' => should_respond_with_content_type :json
+  #
+  # @param [String] url Request
+  def self.should_respond_with_content_type_based_on_url(url)
+    case
+    when url.match(/xml/i)
+      should_respond_with_content_type :xml
+    when url.match(/json/i)
+      should_respond_with_content_type :json
+    else
+      raise "Unknown content type for should_respond_with_content_type_based_on_url: #{url}"
+    end
+    
+  end
 end
 
 # Simple module to "namespace" all of the API tests