Skip to content

Commit 5b71da2

Browse files
authored
Merge pull request #1737 from codidact/0valt/1732/close_reasons
0valt/1732/close reasons
2 parents 00a8551 + 3f9f144 commit 5b71da2

3 files changed

Lines changed: 75 additions & 31 deletions

File tree

app/controllers/close_reasons_controller.rb

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,21 @@ def edit; end
1616

1717
def update
1818
before = @close_reason.attributes.map { |k, v| "#{k}: #{v}" }.join(' ')
19-
@close_reason.update(close_reason_params)
20-
after = @close_reason.attributes.map { |k, v| "#{k}: #{v}" }.join(' ')
19+
if @close_reason.update(close_reason_params)
20+
after = @close_reason.attributes.map { |k, v| "#{k}: #{v}" }.join(' ')
2121

22-
AuditLog.moderator_audit(event_type: 'close_reason_update',
23-
related: @close_reason,
24-
user: current_user,
25-
comment: "from <<CloseReason #{before}>>\nto <<CloseReason #{after}>>")
22+
AuditLog.moderator_audit(event_type: 'close_reason_update',
23+
related: @close_reason,
24+
user: current_user,
25+
comment: "from <<CloseReason #{before}>>\nto <<CloseReason #{after}>>")
2626

27-
if @close_reason.community.nil?
28-
redirect_to close_reasons_path(global: 1)
27+
if @close_reason.community.nil?
28+
redirect_to close_reasons_path(global: 1)
29+
else
30+
redirect_to close_reasons_path
31+
end
2932
else
30-
redirect_to close_reasons_path
33+
render :edit, status: :bad_request
3134
end
3235
end
3336

@@ -36,14 +39,12 @@ def new
3639
end
3740

3841
def create
39-
@close_reason = CloseReason.new(name: params[:close_reason][:name],
40-
description: params[:close_reason][:description],
41-
requires_other_post: params[:close_reason][:requires_other_post],
42-
active: params[:close_reason][:active],
43-
community: params[:global] == '1' ? nil : @community)
42+
community_params = { community: params[:global] == '1' ? nil : @community }
43+
@close_reason = CloseReason.new(close_reason_params.merge(community_params))
4444

4545
if @close_reason.save
4646
attr = @close_reason.attributes_print
47+
4748
AuditLog.moderator_audit(event_type: 'close_reason_create',
4849
related: @close_reason,
4950
user: current_user,
@@ -55,7 +56,7 @@ def create
5556
redirect_to close_reasons_path
5657
end
5758
else
58-
render :new
59+
render :new, status: :bad_request
5960
end
6061
end
6162

app/models/close_reason.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,11 @@ class CloseReason < ApplicationRecord
33

44
scope :active, -> { where(active: true) }
55

6-
validates :name, uniqueness: { scope: [:community_id], case_sensitive: false }
6+
validates :name, length: { maximum: 255 },
7+
presence: true,
8+
uniqueness: { scope: [:community_id], case_sensitive: false }
9+
10+
def global?
11+
community.nil?
12+
end
713
end

test/controllers/close_reasons_controller_test.rb

Lines changed: 52 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,22 @@ class CloseReasonsControllerTest < ActionController::TestCase
3333
assert_not_nil assigns(:close_reason)
3434
end
3535

36-
test 'should create close reason' do
36+
test 'should correctly create close reasons' do
3737
sign_in users(:global_admin)
38-
post :create, params: { close_reason: { name: 'test', description: 'test', requires_other_post: true,
39-
active: true } }
40-
assert_response(:found)
41-
assert_redirected_to close_reasons_path
42-
assert_not_nil assigns(:close_reason)
43-
assert_not_nil assigns(:close_reason).id
38+
39+
[false, true].each do |global|
40+
try_create_close_reason(global: global, name: global ? 'all communities' : 'per-community')
41+
42+
assert_response(:found)
43+
assert_redirected_to close_reasons_path(global: global ? '1' : nil)
44+
assert_not_nil assigns(:close_reason)&.id
45+
end
46+
end
47+
48+
test 'should not create invalid close reasons' do
49+
sign_in users(:global_admin)
50+
try_create_close_reason(name: '')
51+
assert_response(:bad_request)
4452
end
4553

4654
test 'should get edit' do
@@ -56,14 +64,43 @@ class CloseReasonsControllerTest < ActionController::TestCase
5664
assert_response(:not_found)
5765
end
5866

59-
test 'should update close reason' do
67+
test 'should correctly update close reasons' do
6068
sign_in users(:global_admin)
61-
patch :update, params: { id: close_reasons(:duplicate).id, close_reason: { name: 'test', description: 'test',
62-
requires_other_post: true,
63-
active: false } }
64-
assert_response(:found)
65-
assert_redirected_to close_reasons_path
66-
assert_not_nil assigns(:close_reason)
67-
assert_equal false, assigns(:close_reason).active
69+
70+
close_reasons.each do |reason|
71+
try_update_close_reason(reason, active: false, name: "#{reason.name} updated")
72+
73+
assert_response(:found)
74+
assert_redirected_to close_reasons_path(global: reason.global? ? '1' : nil)
75+
76+
@close_reason = assigns(:close_reason)
77+
78+
assert_not_nil @close_reason
79+
assert_equal false, @close_reason.active
80+
assert_equal "#{reason.name} updated", @close_reason.name
81+
end
82+
end
83+
84+
test 'should not update close reasons to invalid states' do
85+
sign_in users(:global_admin)
86+
try_update_close_reason(close_reasons(:duplicate), name: '')
87+
assert_response(:bad_request)
88+
end
89+
90+
private
91+
92+
def try_create_close_reason(**opts)
93+
global = opts.delete(:global) || false
94+
95+
post :create, params: { close_reason: { name: 'test',
96+
description: 'test',
97+
requires_other_post: true,
98+
active: true }.merge(opts),
99+
global: global ? '1' : '0' }
100+
end
101+
102+
def try_update_close_reason(reason, **opts)
103+
patch :update, params: { id: reason.id,
104+
close_reason: opts }
68105
end
69106
end

0 commit comments

Comments
 (0)