From 4d73706ff349e043ca62612e977ae600e8cae4ad Mon Sep 17 00:00:00 2001
From: Andy Allan <git@gravitystorm.co.uk>
Date: Sun, 30 Oct 2016 11:06:35 +0100
Subject: [PATCH] Refactor the gravatar email changes to use webmock stubbing

The main reason for doing this is to make the tests easier to read,
rather than having to look up both the gravatar fixture, and then
correlate that with the users fixture. Putting the expected response
code in the tests is much more explicit.
---
 test/controllers/user_controller_test.rb | 58 +++++++++++++-----------
 test/http/gravatar.yml                   |  7 ---
 test/test_helper.rb                      |  6 +++
 3 files changed, 37 insertions(+), 34 deletions(-)
 delete mode 100644 test/http/gravatar.yml

diff --git a/test/controllers/user_controller_test.rb b/test/controllers/user_controller_test.rb
index ef4bd0fff..eb57e2689 100644
--- a/test/controllers/user_controller_test.rb
+++ b/test/controllers/user_controller_test.rb
@@ -5,7 +5,6 @@ class UserControllerTest < ActionController::TestCase
 
   setup do
     stub_request(:get, "http://api.hostip.info/country.php?ip=0.0.0.0")
-    stub_request(:get, /.*gravatar.com.*d=404/).to_return(:status => 404)
   end
 
   ##
@@ -397,6 +396,7 @@ class UserControllerTest < ActionController::TestCase
 
   def test_confirm_success_no_token_no_referer
     user = users(:inactive_user)
+    stub_gravatar_request(user.email)
     confirm_string = user.tokens.create.token
 
     @request.cookies["_osm_session"] = user.display_name
@@ -407,6 +407,7 @@ class UserControllerTest < ActionController::TestCase
 
   def test_confirm_success_good_token_no_referer
     user = users(:inactive_user)
+    stub_gravatar_request(user.email)
     confirm_string = user.tokens.create.token
     token = user.tokens.create.token
 
@@ -417,6 +418,7 @@ class UserControllerTest < ActionController::TestCase
 
   def test_confirm_success_bad_token_no_referer
     user = users(:inactive_user)
+    stub_gravatar_request(user.email)
     confirm_string = user.tokens.create.token
     token = users(:normal_user).tokens.create.token
 
@@ -428,6 +430,7 @@ class UserControllerTest < ActionController::TestCase
 
   def test_confirm_success_no_token_with_referer
     user = users(:inactive_user)
+    stub_gravatar_request(user.email)
     confirm_string = user.tokens.create(:referer => diary_new_path).token
 
     @request.cookies["_osm_session"] = user.display_name
@@ -438,6 +441,7 @@ class UserControllerTest < ActionController::TestCase
 
   def test_confirm_success_good_token_with_referer
     user = users(:inactive_user)
+    stub_gravatar_request(user.email)
     confirm_string = user.tokens.create(:referer => diary_new_path).token
     token = user.tokens.create.token
 
@@ -448,6 +452,7 @@ class UserControllerTest < ActionController::TestCase
 
   def test_confirm_success_bad_token_with_referer
     user = users(:inactive_user)
+    stub_gravatar_request(user.email)
     confirm_string = user.tokens.create(:referer => diary_new_path).token
     token = users(:normal_user).tokens.create.token
 
@@ -526,6 +531,7 @@ class UserControllerTest < ActionController::TestCase
 
   def test_confirm_email_success
     user = users(:second_public_user)
+    stub_gravatar_request(user.new_email)
     confirm_string = user.tokens.create.token
 
     post :confirm_email, :confirm_string => confirm_string
@@ -556,35 +562,33 @@ class UserControllerTest < ActionController::TestCase
   # this happens when the email is actually changed
   # which is triggered by the confirmation mail
   def test_gravatar_auto_enable
-    with_http_stubs "gravatar" do
-      # switch to email that has a gravatar
-      user = users(:first_gravatar_user)
-      confirm_string = user.tokens.create.token
-      # precondition gravatar should be turned off
-      assert !user.image_use_gravatar
-      post :confirm_email, :confirm_string => confirm_string
-      assert_response :redirect
-      assert_redirected_to :action => :account, :display_name => user.display_name
-      assert_match /Confirmed your change of email address/, flash[:notice]
-      # gravatar use should now be enabled
-      assert User.find(users(:first_gravatar_user).id).image_use_gravatar
-    end
+    # switch to email that has a gravatar
+    user = users(:first_gravatar_user)
+    stub_gravatar_request(user.new_email, 200)
+    confirm_string = user.tokens.create.token
+    # precondition gravatar should be turned off
+    assert !user.image_use_gravatar
+    post :confirm_email, :confirm_string => confirm_string
+    assert_response :redirect
+    assert_redirected_to :action => :account, :display_name => user.display_name
+    assert_match /Confirmed your change of email address/, flash[:notice]
+    # gravatar use should now be enabled
+    assert User.find(users(:first_gravatar_user).id).image_use_gravatar
   end
 
   def test_gravatar_auto_disable
-    with_http_stubs "gravatar" do
-      # switch to email without a gravatar
-      user = users(:second_gravatar_user)
-      confirm_string = user.tokens.create.token
-      # precondition gravatar should be turned on
-      assert user.image_use_gravatar
-      post :confirm_email, :confirm_string => confirm_string
-      assert_response :redirect
-      assert_redirected_to :action => :account, :display_name => user.display_name
-      assert_match /Confirmed your change of email address/, flash[:notice]
-      # gravatar use should now be disabled
-      assert !User.find(users(:second_gravatar_user).id).image_use_gravatar
-    end
+    # switch to email without a gravatar
+    user = users(:second_gravatar_user)
+    stub_gravatar_request(user.new_email, 404)
+    confirm_string = user.tokens.create.token
+    # precondition gravatar should be turned on
+    assert user.image_use_gravatar
+    post :confirm_email, :confirm_string => confirm_string
+    assert_response :redirect
+    assert_redirected_to :action => :account, :display_name => user.display_name
+    assert_match /Confirmed your change of email address/, flash[:notice]
+    # gravatar use should now be disabled
+    assert !User.find(users(:second_gravatar_user).id).image_use_gravatar
   end
 
   def test_terms_new_user
diff --git a/test/http/gravatar.yml b/test/http/gravatar.yml
deleted file mode 100644
index c954bc822..000000000
--- a/test/http/gravatar.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-/avatar/842bc90353fac655450e62223e4e105d?d=404 :
-  code: 404
-  body: Ignored, test for new_g2@openstreetmap.org
-
-/avatar/d2e95ef0ac6933916bf42ff1ee4eca4b?d=404 :
-  code: 200
-  body: Ignored, test for new_g1@openstreetmap.org
diff --git a/test/test_helper.rb b/test/test_helper.rb
index 11782e098..c45331f20 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -168,5 +168,11 @@ module ActiveSupport
 
       yield
     end
+
+    def stub_gravatar_request(email, status = 200, body = nil)
+      hash = Digest::MD5.hexdigest(email.downcase)
+      url = "https://www.gravatar.com/avatar/#{hash}?d=404"
+      stub_request(:get, url).and_return(:status => status, :body => body)
+    end
   end
 end
-- 
2.39.5