Project

General

Profile

Patch #43640 » v2-02-tests-group-controller-remove_users.patch

Florian Walchshofer, 2026-01-03 22:33

View differences:

test/fixtures/groups_users.yml (working copy)
5 5
groups_users_002:
6 6
  group_id: 11
7 7
  user_id: 8
8
groups_users_003:
9
  group_id: 10
10
  user_id: 9
test/functional/context_menus_controller_test.rb (working copy)
314 314

  
315 315
  def test_context_menu_should_propose_shared_versions_for_issues_from_different_projects
316 316
    @request.session[:user_id] = 2
317
    version = Version.create!(:name => 'Shared', :sharing => 'system', :project_id => 1)
317
    Version.create!(:name => 'Shared', :sharing => 'system', :project_id => 1)
318 318

  
319 319
    get(
320 320
      :issues,
......
522 522
      assert_select 'a.icon-del', :count => 0
523 523
    end
524 524
  end
525

  
526
  def test_context_menu_multiple_users_should_show_add_user_to_group_links
527
    get :users, params: { ids: [1, 2] }
528
    assert_response :success
529

  
530
    assert_select 'a.submenu', text: I18n.t(:label_add_user_to_group), count: 1
531
    assert_select 'a.submenu', text: I18n.t(:label_remove_user_from_group), count: 0
532

  
533
    assert_select 'a.icon.icon-lock span.icon-label', text: 'Lock', count: 1
534
    assert_select 'a.icon.icon-del span.icon-label', text: 'Delete', count: 1
535

  
536
    assert_select 'li.folder' do |folders|
537
      rem_folder = folders.find { |li| li.at_css('> a.submenu')&.text&.strip == I18n.t(:label_add_user_to_group) }
538
      assert rem_folder, "a.submenu '#{I18n.t(:label_add_user_to_group)}' not found"
539
      if rem_folder
540
        assert_select rem_folder, '> ul > li', count: 2
541
        assert_select rem_folder, "ul > li > a[rel='nofollow'][data-method='post']", count: 2
542
      end
543
    end
544
  end
545

  
546
  def test_context_menu_multiple_users_should_show_remove_add_user_from_group_links
547
    get :users, params: { ids: [1, 8] }
548
    assert_response :success
549

  
550
    assert_select 'a.icon.icon-lock span.icon-label', text: 'Lock', count: 1
551
    assert_select 'a.icon.icon-del span.icon-label', text: 'Delete', count: 1
552

  
553
    assert_select 'a.submenu', text: I18n.t(:label_add_user_to_group), count: 1
554
    assert_select 'a.submenu', text: I18n.t(:label_remove_user_from_group), count: 1
555

  
556
    assert_select 'li.folder' do |folders|
557
      rem_folder = folders.find { |li| li.at_css('> a.submenu')&.text&.strip == I18n.t(:label_add_user_to_group) }
558
      assert rem_folder, "a.submenu '#{I18n.t(:label_add_user_to_group)}' not found"
559
      if rem_folder
560
        assert_select rem_folder, '> ul > li', count: 2
561
        assert_select rem_folder, "ul > li > a[rel='nofollow'][data-method='post']", count: 2
562
      end
563

  
564
      rem_folder = folders.find { |li| li.at_css('> a.submenu')&.text&.strip == I18n.t(:label_remove_user_from_group) }
565
      assert rem_folder, "a.submenu '#{I18n.t(:label_remove_user_from_group)}' not found"
566
      if rem_folder
567
        assert_select rem_folder, '> ul > li', count: 2
568
        assert_select rem_folder, "ul > li > a[rel='nofollow'][data-method='delete']", count: 2
569
      end
570
    end
571
  end
572

  
573
  def test_context_menu_single_user_should_show_remove_user_from_group_links
574
    get :users, params: { ids: [8] }
575
    assert_response :success
576

  
577
    assert_select 'a.submenu', text: I18n.t(:label_remove_user_from_group), count: 1
578
    assert_select 'a.submenu', text: I18n.t(:label_add_user_to_group), count: 0
579

  
580
    assert_select 'a.icon.icon-lock span.icon-label', text: 'Lock', count: 1
581
    assert_select 'a.icon.icon-edit span.icon-label', text: 'Edit', count: 1
582
    assert_select 'a.icon.icon-del span.icon-label', text: 'Delete', count: 1
583

  
584
    assert_select 'li.folder' do |folders|
585
      rem_folder = folders.find { |li| li.at_css('> a.submenu')&.text&.strip == I18n.t(:label_remove_user_from_group) }
586
      assert rem_folder, "a.submenu '#{I18n.t(:label_remove_user_from_group)}' not found"
587
      if rem_folder
588
        assert_select rem_folder, '> ul > li', count: 2
589
        assert_select rem_folder, "ul > li > a[rel='nofollow'][data-method='delete']", count: 2
590
        assert_select rem_folder, 'a[data-confirm]' do |links|
591
          value = links.first['data-confirm']
592
          assert value.start_with?('Are you sure you want to remove 1 user')
593
        end
594
      end
595
    end
596
  end
597

  
598
  def test_context_menu_mulitple_user_should_show_remove_add_user_from_group_links
599
    get :users, params: { ids: [8, 9] }
600
    assert_response :success
601

  
602
    assert_select 'a.icon.icon-edit span.icon-label', text: 'Edit', count: 0
603
    assert_select 'a.icon.icon-lock span.icon-label', text: 'Lock', count: 1
604
    assert_select 'a.icon.icon-del span.icon-label', text: 'Delete', count: 1
605

  
606
    assert_select 'a.submenu', text: I18n.t(:label_remove_user_from_group), count: 1
607
    assert_select 'a.submenu', text: I18n.t(:label_add_user_to_group), count: 1
608

  
609
    assert_select 'li.folder' do |folders|
610
      rem_folder = folders.find { |li| li.at_css('> a.submenu')&.text&.strip == I18n.t(:label_add_user_to_group) }
611
      assert rem_folder, "a.submenu '#{I18n.t(:label_add_user_to_group)}' not found"
612
      if rem_folder
613
        assert_select rem_folder, '> ul > li', count: 1
614
        assert_select rem_folder, "ul > li > a[rel='nofollow'][data-method='post']", count: 1
615
      end
616

  
617
      rem_folder = folders.find { |li| li.at_css('> a.submenu')&.text&.strip == I18n.t(:label_remove_user_from_group) }
618
      assert rem_folder, "a.submenu '#{I18n.t(:label_remove_user_from_group)}' not found"
619
      if rem_folder
620
        assert_select rem_folder, '> ul > li', count: 2
621
        assert_select rem_folder, "ul > li > a[rel='nofollow'][data-method='delete']", count: 2
622
        assert_select rem_folder, 'a[data-confirm]' do |links|
623
          value = links.first['data-confirm']
624
          assert value.start_with?('Are you sure you want to remove 2 users')
625
        end
626
      end
627
    end
628
  end
525 629
end
test/functional/groups_controller_test.rb (working copy)
247 247
    assert_match /John Smith/, response.body
248 248
  end
249 249

  
250
  def test_remove_user
250
  def test_remove_users
251 251
    assert_difference 'Group.find(10).users.count', -1 do
252 252
      delete(
253
        :remove_user,
253
        :remove_users,
254 254
        :params => {
255 255
          :id => 10,
256 256
          :user_id => '8'
......
259 259
    end
260 260
  end
261 261

  
262
  def test_xhr_remove_user
262
  def test_xhr_remove_users
263 263
    assert_difference 'Group.find(10).users.count', -1 do
264 264
      delete(
265
        :remove_user,
265
        :remove_users,
266 266
        :params => {
267 267
          :id => 10,
268 268
          :user_id => '8'
......
274 274
    end
275 275
  end
276 276

  
277
  def test_remove_users_patch
278
    assert_difference 'Group.find(10).users.count', -2 do
279
      delete(
280
        :remove_users,
281
        :params => {
282
          :id => 10,
283
          :user_ids => ['8', '9']
284
        }
285
      )
286
    end
287
  end
288

  
289
  def test_xhr_remove_users_patch
290
    assert_difference 'Group.find(10).users.count', -2 do
291
      delete(
292
        :remove_users,
293
        :params => {
294
          :id => 10,
295
          :user_ids => ['8', '9']
296
        },
297
        :xhr => true
298
      )
299
      assert_response :success
300
      assert_equal 'text/javascript', response.media_type
301
    end
302
  end
303

  
277 304
  def test_autocomplete_for_user
278 305
    get(
279 306
      :autocomplete_for_user,
test/functional/issues_controller_test.rb (working copy)
4641 4641
    assert issue.watched_by?(User.find(3))
4642 4642
    assert issue.watched_by?(Group.find(10))
4643 4643
    # Watchers notified
4644
    assert_equal 3, ActionMailer::Base.deliveries.size
4644
    assert_equal 4, ActionMailer::Base.deliveries.size
4645 4645
    mail = ActionMailer::Base.deliveries[1]
4646 4646
    assert [mail.to].flatten.include?(User.find(3).mail)
4647 4647
    mail = ActionMailer::Base.deliveries[2]
test/integration/api_test/api_routing_test.rb (working copy)
51 51

  
52 52
  def test_group_users
53 53
    should_route 'POST /groups/567/users' => 'groups#add_users', :id => '567'
54
    should_route 'DELETE /groups/567/users/12' => 'groups#remove_user', :id => '567', :user_id => '12'
54
    should_route 'DELETE /groups/567/users/12' => 'groups#remove_users', :id => '567', :user_id => '12'
55
    should_route 'DELETE /groups/567/users' => 'groups#remove_users', :id => '567'
55 56
  end
56 57

  
57 58
  def test_issue_categories
test/integration/api_test/groups_test.rb (working copy)
237 237
    end
238 238
    assert_not_include User.find(8), group.reload.users
239 239
  end
240

  
241
  test "DELETE /groups/:id/users.xml should remove users from the group" do
242
    group = Group.generate!
243
    group.users << User.find(5)
244
    group.users << User.find(6)
245
    assert_difference 'group.reload.users.count', -2 do
246
      delete(
247
        "/groups/#{group.id}/users.xml",
248
        :params => {:user_ids => [5, 6]},
249
        :headers => credentials('admin')
250
      )
251
      assert_response :no_content
252
      assert_equal '', @response.body
253
    end
254
    assert_not_include User.find(5), group.reload.users
255
    assert_not_include User.find(6), group.reload.users
256
  end
257

  
258
  test "DELETE /groups/:id/users.xml removes users and skips unknown user IDs" do
259
    group = Group.generate!
260
    group.users << User.find(5)
261
    group.users << User.find(6)
262
    group.users << User.find(7)
263
    assert_difference 'group.reload.users.count', -2 do
264
      delete(
265
        "/groups/#{group.id}/users.xml",
266
        :params => {:user_ids => [5, 6, 8]},
267
        :headers => credentials('admin')
268
      )
269
      assert_response :no_content
270
      assert_equal '', @response.body
271
    end
272
    assert_not_include User.find(5), group.reload.users
273
    assert_not_include User.find(6), group.reload.users
274
    assert_include User.find(7), group.reload.users
275
  end
240 276
end
test/integration/api_test/users_test.rb (working copy)
107 107
    assert_response :success
108 108
    json = ActiveSupport::JSON.decode(response.body)
109 109
    assert json.key?('users')
110
    assert_equal 1, json['users'].size
110
    assert_equal 2, json['users'].size
111 111
    assert_equal 8, json['users'][0]['id']
112 112

  
113 113
    # there should be an implicit filter for status = 1
114
    User.where(id: [2, 8]).update_all status: 3
114
    User.where(id: [2, 8, 9]).update_all status: 3
115 115

  
116 116
    get '/users.json', headers: credentials('admin'), params: { name: 'jsmith' }
117 117
    assert_response :success
test/integration/routing/groups_test.rb (working copy)
37 37
  def test_group_users
38 38
    should_route 'GET /groups/567/users/new' => 'groups#new_users', :id => '567'
39 39
    should_route 'POST /groups/567/users' => 'groups#add_users', :id => '567'
40
    should_route 'DELETE /groups/567/users/12' => 'groups#remove_user', :id => '567', :user_id => '12'
40
    should_route 'DELETE /groups/567/users/12' => 'groups#remove_users', :id => '567', :user_id => '12'
41
    should_route 'DELETE /groups/567/users' => 'groups#remove_users', :id => '567'
41 42
  end
42 43
end
test/unit/user_query_test.rb (working copy)
132 132
    q = UserQuery.new name: '_'
133 133
    q.add_filter('is_member_of_group', '=', ['10', '99'])
134 134
    users = find_users_with_query q
135
    assert_equal [8], users.map(&:id)
135
    assert_equal [8, 9], users.map(&:id)
136 136
  end
137 137

  
138 138
  def test_group_filter_not
......
147 147
    q = UserQuery.new name: '_'
148 148
    q.add_filter('is_member_of_group', '*', [''])
149 149
    users = find_users_with_query q
150
    assert_equal [8], users.map(&:id)
150
    assert_equal [8, 9], users.map(&:id)
151 151
  end
152 152

  
153 153
  def test_group_filter_none
(7-7/8)