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