From a7c4fd2c2300a0ddc0ccdc2eaba99c066bece2bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=9A=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BB=D0=B5=D0=BD=D0=BE=D0=BA?= <dmitry.kovalenok@twinslash.com> Date: Wed, 31 Oct 2012 14:06:08 +0300 Subject: [PATCH] functional testing --- app/controllers/redmine_oauth_controller.rb | 71 +++++++++++++++++++ .../redmine_omniauth_controller.rb | 8 ++- .../hooks/_view_account_login_bottom.html.erb | 2 +- config/routes.rb | 4 +- .../redmine_oauth_controller_test.rb | 29 ++++++++ 5 files changed, 108 insertions(+), 6 deletions(-) create mode 100644 app/controllers/redmine_oauth_controller.rb create mode 100644 test/functional/redmine_oauth_controller_test.rb diff --git a/app/controllers/redmine_oauth_controller.rb b/app/controllers/redmine_oauth_controller.rb new file mode 100644 index 0000000..28ca925 --- /dev/null +++ b/app/controllers/redmine_oauth_controller.rb @@ -0,0 +1,71 @@ +require 'account_controller' +require 'json' + +class RedmineOauthController < AccountController + def oauth_google + redirect_to oauth_client.auth_code.authorize_url(redirect_uri: oauth_google_callback_url, scope: scopes) + end + + def oauth_google_callback + token = oauth_client.auth_code.get_token(params[:code], redirect_uri: oauth_google_callback_url) + result = token.get('https://www.googleapis.com/oauth2/v1/userinfo') + info = JSON.parse(result.body) + if info && info["verified_email"] + user = User.find_or_initialize_by_mail(info["email"]) + if user.new_record? + # Self-registration off + redirect_to(home_url) && return unless Setting.self_registration? + # Create on the fly + user.firstname, user.lastname = info["name"].split(' ') unless info['name'].nil? + user.firstname ||= info[:given_name] + user.lastname ||= info[:family_name] + user.mail = info["email"] + login = info["email"].match(/(.+)@/) unless info["email"].nil? + user.login = login[1] if login + user.login ||= [user.firstname, user.lastname]*"." + user.random_password + user.register + + case Setting.self_registration + when '1' + register_by_email_activation(user) do + onthefly_creation_failed(user) + end + when '3' + register_automatically(user) do + onthefly_creation_failed(user) + end + else + register_manually_by_administrator(user) do + onthefly_creation_failed(user) + end + end + else + # Existing record + if user.active? + successful_authentication(user) + else + account_pending + end + end + else + flash[:error] = l(:notice_unable_to_obtain_google_credentials) + redirect_to signin_path + end + end + + def oauth_client + @client ||= OAuth2::Client.new(settings[:client_id], settings[:client_secret], + site: 'https://accounts.google.com', + authorize_url: '/o/oauth2/auth', + token_url: '/o/oauth2/token') + end + + def settings + @settings ||= Setting.plugin_redmine_omniauth_google + end + + def scopes + 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile' + end +end \ No newline at end of file diff --git a/app/controllers/redmine_omniauth_controller.rb b/app/controllers/redmine_omniauth_controller.rb index 7440eaa..64bbca0 100644 --- a/app/controllers/redmine_omniauth_controller.rb +++ b/app/controllers/redmine_omniauth_controller.rb @@ -1,16 +1,18 @@ require 'account_controller' require 'json' -class RedmineOmniauthController < AccountController - def omniauth_google +class RedmineOauthController < AccountController + def oauth_google + ds redirect_to oauth_client.auth_code.authorize_url(redirect_uri: oauth_google_callback_url, scope: scopes) end def oauth_google_callback token = oauth_client.auth_code.get_token(params[:code], redirect_uri: oauth_google_callback_url) result = token.get('https://www.googleapis.com/oauth2/v1/userinfo') + binding.pr info = JSON.parse(result.body) - if info["verified_email"] + if info && info["verified_email"] user = User.find_or_initialize_by_mail(info["email"]) if user.new_record? # Self-registration off diff --git a/app/views/hooks/_view_account_login_bottom.html.erb b/app/views/hooks/_view_account_login_bottom.html.erb index 5e569b5..09d8ea9 100644 --- a/app/views/hooks/_view_account_login_bottom.html.erb +++ b/app/views/hooks/_view_account_login_bottom.html.erb @@ -1,3 +1,3 @@ <% if Setting.openid? %> - <%= link_to image_tag('/plugin_assets/redmine_omniauth_google/images/google_login_icon.jpg'), omniauth_google_path(openid_url: 'google.com') %> + <%= link_to image_tag('/plugin_assets/redmine_omniauth_google/images/google_login_icon.jpg'), oauth_google_path %> <% end %> \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index d7b17ac..269600b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,2 +1,2 @@ -get 'omniauth_google', to: 'redmine_omniauth#omniauth_google', as: :omniauth_google -get 'oauth_google_callback', to: 'redmine_omniauth#oauth_google_callback' \ No newline at end of file +get 'oauth_google', to: 'redmine_oauth#oauth_google' +get 'oauth_google_callback', to: 'redmine_oauth#oauth_google_callback' \ No newline at end of file diff --git a/test/functional/redmine_oauth_controller_test.rb b/test/functional/redmine_oauth_controller_test.rb new file mode 100644 index 0000000..82c4e47 --- /dev/null +++ b/test/functional/redmine_oauth_controller_test.rb @@ -0,0 +1,29 @@ +require File.expand_path('../../test_helper', __FILE__) + +class RedmineOauthControllerTest < ActionController::TestCase + def setup + User.current = nil + Setting.openid = '1' + OAuth2::AccessToken.any_instance.stubs(get: OAuth2::Response.new(nil)) + OAuth2::Client.any_instance.stubs(get_token: OAuth2::AccessToken.new('code', 'redirect_uri')) + end + def set_response_body_stub body + OAuth2::Response.any_instance.stubs(body: body.to_json) + end + + def test_login_with_omniauth_for_new_user + Setting.self_registration = '3' + user_credentials = {:firstname => 'Cool', + :lastname => 'User', + :mail => 'user@somedomain.com'} + User.where(user_credentials).delete_all + new_user = User.new(user_credentials) + new_user.login = 'cool_user' + + set_response_body_stub({verified_email: "true", name: [new_user.firstname, new_user.lastname]*" ", given_name: new_user.firstname, family_name: new_user.lastname, email: new_user.mail}) + get :oauth_google_callback, :email => new_user.mail + assert_redirected_to controller: 'my', action: 'account' + end + + #assert existing_user.save! +end \ No newline at end of file -- GitLab