]> git.openstreetmap.org Git - rails.git/blob - test/controllers/accounts/auth_deletions_controller_test.rb
Merge remote-tracking branch 'upstream/pull/7252'
[rails.git] / test / controllers / accounts / auth_deletions_controller_test.rb
1 # frozen_string_literal: true
2
3 require "test_helper"
4
5 module Accounts
6   class AuthDeletionsControllerTest < ActionDispatch::IntegrationTest
7     ##
8     # test all routes which lead to this controller
9     def test_routes
10       assert_routing(
11         { :path => "/auth/provider/deletions/confirmation_code", :method => :get },
12         { :controller => "accounts/auth_deletions", :action => "show", :provider => "provider", :confirmation_code => "confirmation_code" }
13       )
14       assert_routing(
15         { :path => "/auth/provider/deletions", :method => :post },
16         { :controller => "accounts/auth_deletions", :action => "create", :provider => "provider" }
17       )
18     end
19
20     ##
21     # test showing status of a facebook deletion request
22     def test_show_facebook
23       user = create(:user, :auth_provider => "facebook", :auth_uid => "12345")
24       confirmation_code = Rails.application.message_verifier(:social_login_deletion).generate([user.auth_uid, Time.now.to_i])
25
26       get auth_deletion_path(:provider => "facebook", :confirmation_code => confirmation_code)
27       assert_response :success
28       assert_select "p", /^Data for Facebook ID 12345 was removed at .* and it was disconnected from the associated OpenStreetMap account\.$/
29     end
30
31     ##
32     # test showing status of a facebook deletion request with an invalid code
33     def test_show_facebook_invalid_code
34       get auth_deletion_path(:provider => "facebook", :confirmation_code => "invalid")
35       assert_response :bad_request
36     end
37
38     ##
39     # test creation of a facebook deletion request
40     def test_create_facebook
41       user = create(:user, :auth_provider => "facebook", :auth_uid => "12345")
42
43       payload = Base64.urlsafe_encode64(
44         JSON.generate(
45           :algorithm => "HMAC-SHA256",
46           :expires => Time.now.to_i + 3600,
47           :issued_at => Time.now.to_i,
48           :user_id => "12345"
49         )
50       )
51       signature = OpenSSL::HMAC.digest("SHA256", Settings.facebook_auth_secret, payload)
52       encoded_signature = Base64.urlsafe_encode64(signature)
53       signed_request = [encoded_signature, payload].join(".")
54
55       post auth_deletions_path(:provider => "facebook"), :params => { :signed_request => signed_request }
56       assert_response :success
57       puts @response.body
58       js = ActiveSupport::JSON.decode(@response.body)
59       assert_not_nil js
60       assert_not_nil js["confirmation_code"]
61       assert_equal auth_deletion_url(:provider => "facebook", :confirmation_code => js["confirmation_code"]), js["url"]
62
63       assert_nil user.reload.auth_provider
64       assert_nil user.reload.auth_uid
65     end
66
67     ##
68     # test creation of a facebook deletion request with an invalid signature
69     def test_create_facebook_bad_signature
70       user = create(:user, :auth_provider => "facebook", :auth_uid => "12345")
71
72       payload = Base64.urlsafe_encode64(
73         JSON.generate(
74           :algorithm => "HMAC-SHA256",
75           :expires => Time.now.to_i + 3600,
76           :issued_at => Time.now.to_i,
77           :user_id => "12345"
78         )
79       )
80       signature = OpenSSL::HMAC.digest("SHA256", "invalid secret", payload)
81       encoded_signature = Base64.urlsafe_encode64(signature)
82       signed_request = [encoded_signature, payload].join(".")
83
84       post auth_deletions_path(:provider => "facebook"), :params => { :signed_request => signed_request }
85       assert_response :bad_request
86
87       user.reload
88       assert_equal "facebook", user.auth_provider
89       assert_equal "12345", user.auth_uid
90     end
91
92     ##
93     # test creation of a facebook deletion request for an unassociated ID
94     def test_create_facebook_not_associated
95       payload = Base64.urlsafe_encode64(
96         JSON.generate(
97           :algorithm => "HMAC-SHA256",
98           :expires => Time.now.to_i + 3600,
99           :issued_at => Time.now.to_i,
100           :user_id => "12345"
101         )
102       )
103       signature = OpenSSL::HMAC.digest("SHA256", Settings.facebook_auth_secret, payload)
104       encoded_signature = Base64.urlsafe_encode64(signature)
105       signed_request = [encoded_signature, payload].join(".")
106
107       post auth_deletions_path(:provider => "facebook"), :params => { :signed_request => signed_request }
108       assert_response :not_found
109     end
110
111     ##
112     # test creation of a deletion request for an unsupported provider
113     def test_create_unsupported
114       post auth_deletions_path(:provider => "unsupported")
115       assert_response :not_found
116     end
117   end
118 end