+require File.dirname(__FILE__) + '/../test_helper'
+require File.dirname(__FILE__) + '/../oauth_controller_test_helper'
+require 'oauth/client/action_controller_request'
+
+class OauthController; def rescue_action(e) raise e end; end
+
+class OauthControllerRequestTokenTest < ActionController::TestCase
+ include OAuthControllerTestHelper
+ tests OauthController
+
+ def setup
+ @controller = OauthController.new
+ setup_oauth
+ sign_request_with_oauth
+ @client_application.stubs(:create_request_token).returns(@request_token)
+ end
+
+ def do_get
+ get :request_token
+ end
+
+ def test_should_be_successful
+ do_get
+ assert @response.success?
+ end
+
+ def test_should_query_for_client_application
+ ClientApplication.expects(:find_by_key).with('key').returns(@client_application)
+ do_get
+ end
+
+ def test_should_request_token_from_client_application
+ @client_application.expects(:create_request_token).returns(@request_token)
+ do_get
+ end
+
+ def test_should_return_token_string
+ do_get
+ assert_equal @request_token_string, @response.body
+ end
+end
+
+class OauthControllerTokenAuthorizationTest < ActionController::TestCase
+ include OAuthControllerTestHelper
+ tests OauthController
+
+ def setup
+ @controller = OauthController.new
+ login
+ setup_oauth
+ RequestToken.stubs(:find_by_token).returns(@request_token)
+ end
+
+ def do_get
+ get :authorize, :oauth_token => @request_token.token
+ end
+
+ def do_post
+ @request_token.expects(:authorize!).with(@user)
+ post :authorize,:oauth_token=>@request_token.token,:authorize=>"1"
+ end
+
+ def do_post_without_user_authorization
+ @request_token.expects(:invalidate!)
+ post :authorize,:oauth_token=>@request_token.token,:authorize=>"0"
+ end
+
+ def do_post_with_callback
+ @request_token.expects(:authorize!).with(@user)
+ post :authorize,:oauth_token=>@request_token.token,:oauth_callback=>"http://application/alternative",:authorize=>"1"
+ end
+
+ def do_post_with_no_application_callback
+ @request_token.expects(:authorize!).with(@user)
+ @client_application.stubs(:callback_url).returns(nil)
+ post :authorize, :oauth_token => @request_token.token, :authorize=>"1"
+ end
+
+ def test_should_be_successful
+ do_get
+ assert @response.success?
+ end
+
+ def test_should_query_for_client_application
+ RequestToken.expects(:find_by_token).returns(@request_token)
+ do_get
+ end
+
+ def test_should_assign_token
+ do_get
+ assert_equal @request_token, assigns(:token)
+ end
+
+ def test_should_render_authorize_template
+ do_get
+ assert_template('authorize')
+ end
+
+ def test_should_redirect_to_default_callback
+ do_post
+ assert_response :redirect
+ assert_redirected_to("http://application/callback?oauth_token=#{@request_token.token}")
+ end
+
+ def test_should_redirect_to_callback_in_query
+ do_post_with_callback
+ assert_response :redirect
+ assert_redirected_to("http://application/alternative?oauth_token=#{@request_token.token}")
+ end
+
+ def test_should_be_successful_on_authorize_without_any_application_callback
+ do_post_with_no_application_callback
+ assert @response.success?
+ assert_template('authorize_success')
+ end
+
+ def test_should_render_failure_screen_on_user_invalidation
+ do_post_without_user_authorization
+ assert_template('authorize_failure')
+ end
+
+ def test_should_render_failure_screen_if_token_is_invalidated
+ @request_token.expects(:invalidated?).returns(true)
+ do_get
+ assert_template('authorize_failure')
+ end
+
+
+end
+
+class OauthControllerGetAccessTokenTest < ActionController::TestCase
+ include OAuthControllerTestHelper
+ tests OauthController
+
+ def setup
+ @controller = OauthController.new
+ setup_oauth
+ sign_request_with_oauth @request_token
+ @request_token.stubs(:exchange!).returns(@access_token)
+ end
+
+ def do_get
+ get :access_token
+ end
+
+ def test_should_be_successful
+ do_get
+ assert @response.success?
+ end
+
+ def test_should_query_for_client_application
+ ClientApplication.expects(:find_token).with(@request_token.token).returns(@request_token)
+ do_get
+ end
+
+ def test_should_request_token_from_client_application
+ @request_token.expects(:exchange!).returns(@access_token)
+ do_get
+ end
+
+ def test_should__return_token_string
+ do_get
+ assert_equal @access_token_string, @response.body
+ end
+end
+
+class OauthorizedController < ApplicationController
+ before_filter :login_or_oauth_required,:only=>:both
+ before_filter :login_required,:only=>:interactive
+ before_filter :oauth_required,:only=>:token_only
+
+ def interactive
+ render :text => "interactive"
+ end
+
+ def token_only
+ render :text => "token"
+ end
+
+ def both
+ render :text => "both"
+ end
+end
+
+
+class OauthControllerAccessControlTest < ActionController::TestCase
+ include OAuthControllerTestHelper
+ tests OauthorizedController
+
+ def setup
+ @controller = OauthorizedController.new
+ end
+
+ def test_should__have_access_token_set_up_correctly
+ setup_to_authorize_request
+ assert @access_token.is_a?(AccessToken)
+ assert @access_token.authorized?
+ assert !@access_token.invalidated?
+ assert_equal @user, @access_token.user
+ assert_equal @client_application, @access_token.client_application
+ end
+
+ def test_should_return_false_for_oauth_by_default
+ assert_equal false, @controller.send(:oauth?)
+ end
+
+ def test_should_return_nil_for_current_token_by_default
+ assert_nil @controller.send(:current_token)
+ end
+
+ def test_should_allow_oauth_when_using_login_or_oauth_required
+ setup_to_authorize_request
+ sign_request_with_oauth(@access_token)
+ ClientApplication.expects(:find_token).with(@access_token.token).returns(@access_token)
+ get :both
+ assert_equal @access_token, @controller.send(:current_token)
+ assert @controller.send(:current_token).is_a?(AccessToken)
+ assert_equal @user, @controller.send(:current_user)
+ assert_equal @client_application, @controller.send(:current_client_application)
+ assert_equal '200', @response.code
+ assert @response.success?
+ end
+
+ def test_should_allow_interactive_when_using_login_or_oauth_required
+ login
+ get :both
+ assert @response.success?
+ assert_equal @user, @controller.send(:current_user)
+ assert_nil @controller.send(:current_token)
+ end
+
+ def test_should_allow_oauth_when_using_oauth_required
+ setup_to_authorize_request
+ sign_request_with_oauth(@access_token)
+ ClientApplication.expects(:find_token).with(@access_token.token).returns(@access_token)
+ get :token_only
+ assert_equal @access_token, @controller.send(:current_token)
+ assert_equal @client_application, @controller.send(:current_client_application)
+ assert_equal @user, @controller.send(:current_user)
+ assert_equal '200', @response.code
+ assert @response.success?
+ end
+
+ def test_should_disallow_oauth_using_request_token_when_using_oauth_required
+ setup_to_authorize_request
+ ClientApplication.expects(:find_token).with(@request_token.token).returns(@request_token)
+ sign_request_with_oauth(@request_token)
+ get :token_only
+ assert_equal '401', @response.code
+ end
+
+ def test_should_disallow_interactive_when_using_oauth_required
+ login
+ get :token_only
+ assert_equal '401', @response.code
+
+ assert_equal @user, @controller.send(:current_user)
+ assert_nil @controller.send(:current_token)
+ end
+
+ def test_should_disallow_oauth_when_using_login_required
+ setup_to_authorize_request
+ sign_request_with_oauth(@access_token)
+ get :interactive
+ assert_equal "302",@response.code
+ assert_nil @controller.send(:current_user)
+ assert_nil @controller.send(:current_token)
+ end
+
+ def test_should_allow_interactive_when_using_login_required
+ login
+ get :interactive
+ assert @response.success?
+ assert_equal @user, @controller.send(:current_user)
+ assert_nil @controller.send(:current_token)
+ end
+
+end
+
+class OauthControllerRevokeTest < ActionController::TestCase
+ include OAuthControllerTestHelper
+ tests OauthController
+
+ def setup
+ @controller = OauthController.new
+ setup_oauth_for_user
+ @request_token.stubs(:invalidate!)
+ end
+
+ def do_post
+ post :revoke, :token => "TOKEN STRING"
+ end
+
+ def test_should_redirect_to_index
+ do_post
+ assert_response :redirect
+ assert_redirected_to('http://test.host/oauth_clients')
+ end
+
+ def test_should_query_current_users_tokens
+ @tokens.expects(:find_by_token).returns(@request_token)
+ do_post
+ end
+
+ def test_should_call_invalidate_on_token
+ @request_token.expects(:invalidate!)
+ do_post
+ end
+
+end