1 # frozen_string_literal: true
 
   6   class UserBlocksControllerTest < ActionDispatch::IntegrationTest
 
   9         { :path => "/api/0.6/user_blocks", :method => :post },
 
  10         { :controller => "api/user_blocks", :action => "create" }
 
  13         { :path => "/api/0.6/user_blocks/1", :method => :get },
 
  14         { :controller => "api/user_blocks", :action => "show", :id => "1" }
 
  17         { :path => "/api/0.6/user_blocks/1.json", :method => :get },
 
  18         { :controller => "api/user_blocks", :action => "show", :id => "1", :format => "json" }
 
  23       blocked_user = create(:user)
 
  24       creator_user = create(:moderator_user)
 
  25       block = create(:user_block, :user => blocked_user, :creator => creator_user, :reason => "because running tests")
 
  27       get api_user_block_path(block)
 
  28       assert_response :success
 
  29       assert_select "osm>user_block", 1 do
 
  30         assert_select ">@id", block.id.to_s
 
  31         assert_select ">user", 1
 
  32         assert_select ">user>@uid", blocked_user.id.to_s
 
  33         assert_select ">creator", 1
 
  34         assert_select ">creator>@uid", creator_user.id.to_s
 
  35         assert_select ">revoker", 0
 
  36         assert_select ">reason", 1
 
  37         assert_select ">reason", "because running tests"
 
  40       get api_user_block_path(block, :format => "json")
 
  41       assert_response :success
 
  42       js = ActiveSupport::JSON.decode(@response.body)
 
  44       assert_equal block.id, js["user_block"]["id"]
 
  47     def test_show_not_found
 
  48       get api_user_block_path(123)
 
  49       assert_response :not_found
 
  50       assert_equal "text/plain", @response.media_type
 
  53     def test_create_no_permission
 
  54       blocked_user = create(:user)
 
  55       assert_empty blocked_user.blocks
 
  57       post api_user_blocks_path(:user => blocked_user.id, :reason => "because", :period => 1)
 
  58       assert_response :unauthorized
 
  59       assert_empty blocked_user.blocks
 
  61       regular_creator_user = create(:user)
 
  62       auth_header = bearer_authorization_header(regular_creator_user, :scopes => %w[read_prefs])
 
  63       post api_user_blocks_path(:user => blocked_user.id, :reason => "because", :period => 1), :headers => auth_header
 
  64       assert_response :forbidden
 
  65       assert_empty blocked_user.blocks
 
  67       auth_header = bearer_authorization_header(regular_creator_user, :scopes => %w[read_prefs write_blocks])
 
  68       post api_user_blocks_path(:user => blocked_user.id, :reason => "because", :period => 1), :headers => auth_header
 
  69       assert_response :forbidden
 
  70       assert_empty blocked_user.blocks
 
  72       moderator_creator_user = create(:moderator_user)
 
  73       auth_header = bearer_authorization_header(moderator_creator_user, :scopes => %w[read_prefs])
 
  74       post api_user_blocks_path(:user => blocked_user.id, :reason => "because", :period => 1), :headers => auth_header
 
  75       assert_response :forbidden
 
  76       assert_empty blocked_user.blocks
 
  79     def test_create_invalid_because_no_user
 
  80       blocked_user = create(:user, :deleted)
 
  81       assert_empty blocked_user.blocks
 
  83       creator_user = create(:moderator_user)
 
  84       auth_header = bearer_authorization_header(creator_user, :scopes => %w[read_prefs write_blocks])
 
  85       post api_user_blocks_path(:reason => "because", :period => 1), :headers => auth_header
 
  86       assert_response :bad_request
 
  87       assert_equal "text/plain", @response.media_type
 
  88       assert_equal "No user was given", @response.body
 
  90       assert_empty blocked_user.blocks
 
  93     def test_create_invalid_because_user_is_unknown
 
  94       creator_user = create(:moderator_user)
 
  95       auth_header = bearer_authorization_header(creator_user, :scopes => %w[read_prefs write_blocks])
 
  96       post api_user_blocks_path(:user => 0, :reason => "because", :period => 1), :headers => auth_header
 
  97       assert_response :not_found
 
  98       assert_equal "text/plain", @response.media_type
 
 101     def test_create_invalid_because_user_is_deleted
 
 102       blocked_user = create(:user, :deleted)
 
 103       assert_empty blocked_user.blocks
 
 105       creator_user = create(:moderator_user)
 
 106       auth_header = bearer_authorization_header(creator_user, :scopes => %w[read_prefs write_blocks])
 
 107       post api_user_blocks_path(:user => blocked_user.id, :reason => "because", :period => 1), :headers => auth_header
 
 108       assert_response :not_found
 
 109       assert_equal "text/plain", @response.media_type
 
 111       assert_empty blocked_user.blocks
 
 114     def test_create_invalid_because_missing_reason
 
 115       create_with_params_and_assert_bad_request("No reason was given", :period => "10")
 
 118     def test_create_invalid_because_missing_period
 
 119       create_with_params_and_assert_bad_request("No period was given", :reason => "because")
 
 122     def test_create_invalid_because_non_numeric_period
 
 123       create_with_params_and_assert_bad_request("Period should be a number of hours", :reason => "because", :period => "one hour")
 
 126     def test_create_invalid_because_negative_period
 
 127       create_with_params_and_assert_bad_request("Period must be between 0 and #{UserBlock::PERIODS.max}", :reason => "go away", :period => "-1")
 
 130     def test_create_invalid_because_excessive_period
 
 131       create_with_params_and_assert_bad_request("Period must be between 0 and #{UserBlock::PERIODS.max}", :reason => "go away", :period => "10000000")
 
 134     def test_create_invalid_because_unknown_needs_view
 
 135       create_with_params_and_assert_bad_request("Needs_view must be true if provided", :reason => "because", :period => "1", :needs_view => "maybe")
 
 138     def test_create_success
 
 139       blocked_user = create(:user)
 
 140       creator_user = create(:moderator_user)
 
 142       assert_empty blocked_user.blocks
 
 143       auth_header = bearer_authorization_header(creator_user, :scopes => %w[read_prefs write_blocks])
 
 144       post api_user_blocks_path(:user => blocked_user.id, :reason => "because", :period => 1), :headers => auth_header
 
 145       assert_response :success
 
 146       assert_equal 1, blocked_user.blocks.length
 
 148       block = blocked_user.blocks.take
 
 149       assert_predicate block, :active?
 
 150       assert_equal "because", block.reason
 
 151       assert_equal creator_user, block.creator
 
 153       assert_equal "application/xml", @response.media_type
 
 154       assert_select "osm>user_block", 1 do
 
 155         assert_select ">@id", block.id.to_s
 
 156         assert_select ">@needs_view", "false"
 
 157         assert_select ">user", 1
 
 158         assert_select ">user>@uid", blocked_user.id.to_s
 
 159         assert_select ">creator", 1
 
 160         assert_select ">creator>@uid", creator_user.id.to_s
 
 161         assert_select ">revoker", 0
 
 162         assert_select ">reason", 1
 
 163         assert_select ">reason", "because"
 
 167     def test_create_success_with_needs_view
 
 168       blocked_user = create(:user)
 
 169       creator_user = create(:moderator_user)
 
 171       assert_empty blocked_user.blocks
 
 172       auth_header = bearer_authorization_header(creator_user, :scopes => %w[read_prefs write_blocks])
 
 173       post api_user_blocks_path(:user => blocked_user.id, :reason => "because", :period => "1", :needs_view => "true"), :headers => auth_header
 
 174       assert_response :success
 
 175       assert_equal 1, blocked_user.blocks.length
 
 177       block = blocked_user.blocks.take
 
 178       assert_predicate block, :active?
 
 179       assert_equal "because", block.reason
 
 180       assert_equal creator_user, block.creator
 
 182       assert_equal "application/xml", @response.media_type
 
 183       assert_select "osm>user_block", 1 do
 
 184         assert_select ">@id", block.id.to_s
 
 185         assert_select ">@needs_view", "true"
 
 186         assert_select ">user", 1
 
 187         assert_select ">user>@uid", blocked_user.id.to_s
 
 188         assert_select ">creator", 1
 
 189         assert_select ">creator>@uid", creator_user.id.to_s
 
 190         assert_select ">revoker", 0
 
 191         assert_select ">reason", 1
 
 192         assert_select ">reason", "because"
 
 198     def create_with_params_and_assert_bad_request(message, **params)
 
 199       blocked_user = create(:user)
 
 200       assert_empty blocked_user.blocks
 
 202       moderator_creator_user = create(:moderator_user)
 
 203       auth_header = bearer_authorization_header(moderator_creator_user, :scopes => %w[read_prefs write_blocks])
 
 205       post api_user_blocks_path({ :user => blocked_user.id }.merge(params)), :headers => auth_header
 
 206       assert_response :bad_request
 
 207       assert_equal "text/plain", @response.media_type
 
 208       assert_equal message, @response.body
 
 210       assert_empty blocked_user.blocks