]> git.openstreetmap.org Git - rails.git/blob - test/integration/user_terms_seen_test.rb
use a controller method to handle cancan denials
[rails.git] / test / integration / user_terms_seen_test.rb
1 require "test_helper"
2
3 class UserTermsSeenTest < ActionDispatch::IntegrationTest
4   def setup
5     stub_hostip_requests
6   end
7
8   def test_api_blocked
9     with_terms_seen(true) do
10       user = create(:user, :terms_seen => false)
11
12       get "/api/#{API_VERSION}/user/preferences", :headers => auth_header(user.display_name, "test")
13       assert_response :forbidden
14
15       # touch it so that the user has seen the terms
16       user.terms_seen = true
17       user.save
18
19       get "/api/#{API_VERSION}/user/preferences", :headers => auth_header(user.display_name, "test")
20       assert_response :success
21     end
22   end
23
24   def test_terms_presented_at_login
25     with_terms_seen(true) do
26       user = create(:user, :terms_seen => false)
27
28       # try to log in
29       get "/login"
30       follow_redirect!
31       assert_response :success
32       assert_template "user/login"
33       post "/login", :params => { :username => user.email, :password => "test", :referer => "/diary/new" }
34       assert_response :redirect
35       # but now we need to look at the terms
36       assert_redirected_to :controller => :user, :action => :terms, :referer => "/diary/new"
37       follow_redirect!
38       assert_response :success
39
40       # don't agree to the terms, but hit decline
41       post "/user/save", :params => { :decline => true, :referer => "/diary/new" }
42       assert_redirected_to "/diary/new"
43       follow_redirect!
44
45       # should be carried through to a normal login with a message
46       assert_response :success
47       assert_not flash[:notice].nil?
48     end
49   end
50
51   def test_terms_cant_be_circumvented
52     with_terms_seen(true) do
53       user = create(:user, :terms_seen => false)
54
55       # try to log in
56       get "/login"
57       follow_redirect!
58       assert_response :success
59       assert_template "user/login"
60       post "/login", :params => { :username => user.email, :password => "test", :referer => "/diary/new" }
61       assert_response :redirect
62       # but now we need to look at the terms
63       assert_redirected_to :controller => :user, :action => :terms, :referer => "/diary/new"
64
65       # check that if we go somewhere else now, it redirects
66       # back to the terms page.
67       get "/traces/mine"
68       assert_redirected_to :controller => :user, :action => :terms, :referer => "/traces/mine"
69       get "/traces/mine", :params => { :referer => "/diary/new" }
70       assert_redirected_to :controller => :user, :action => :terms, :referer => "/diary/new"
71     end
72   end
73
74   private
75
76   def auth_header(user, pass)
77     { "HTTP_AUTHORIZATION" => format("Basic %{auth}", :auth => Base64.encode64("#{user}:#{pass}")) }
78   end
79
80   def with_terms_seen(value)
81     require_terms_seen = Object.send("remove_const", "REQUIRE_TERMS_SEEN")
82     Object.const_set("REQUIRE_TERMS_SEEN", value)
83
84     yield
85
86     Object.send("remove_const", "REQUIRE_TERMS_SEEN")
87     Object.const_set("REQUIRE_TERMS_SEEN", require_terms_seen)
88   end
89 end