Feature #1767 » 0003-Modify-tests-for-custom-fields-configurable-switchab.patch
test/functional/context_menus_controller_test.rb | ||
---|---|---|
419 | 419 |
end |
420 | 420 | |
421 | 421 |
def test_time_entries_context_menu_should_include_custom_fields |
422 |
field = TimeEntryCustomField.generate!(:name => "Field", :field_format => "list", :possible_values => ["foo", "bar"]) |
|
422 |
field = TimeEntryCustomField.generate!(:name => "Field", :field_format => "list", :possible_values => ["foo", "bar"], :is_for_all => true)
|
|
423 | 423 | |
424 | 424 |
@request.session[:user_id] = 2 |
425 | 425 |
get( |
test/functional/custom_fields_controller_test.rb | ||
---|---|---|
134 | 134 |
assert_select 'input[type=radio][name=?]', 'custom_field[visible]', 2 |
135 | 135 |
assert_select 'input[type=checkbox][name=?]', 'custom_field[role_ids][]', 3 |
136 | 136 | |
137 |
assert_select 'input[type=checkbox][name=?]', 'custom_field[project_ids][]', Project.count |
|
138 |
assert_select 'input[type=hidden][name=?]', 'custom_field[project_ids][]', 1 |
|
137 | 139 |
assert_select 'input[type=hidden][name=type][value=TimeEntryCustomField]' |
138 | 140 |
end |
139 | 141 |
end |
... | ... | |
157 | 159 |
assert_select 'input[type=radio][name=?]', 'custom_field[visible]', 2 |
158 | 160 |
assert_select 'input[type=checkbox][name=?]', 'custom_field[role_ids][]', 3 |
159 | 161 | |
162 |
assert_select 'input[type=checkbox][name=?]', 'custom_field[project_ids][]', Project.count |
|
163 |
assert_select 'input[type=hidden][name=?]', 'custom_field[project_ids][]', 1 |
|
160 | 164 |
assert_select 'input[type=hidden][name=type][value=ProjectCustomField]' |
161 | 165 |
end |
162 | 166 |
end |
... | ... | |
184 | 188 |
end |
185 | 189 |
end |
186 | 190 | |
187 |
def test_new_time_entry_custom_field_should_not_show_trackers_and_projects
|
|
191 |
def test_new_time_entry_custom_field_should_not_show_trackers |
|
188 | 192 |
get( |
189 | 193 |
:new, |
190 | 194 |
:params => { |
... | ... | |
195 | 199 | |
196 | 200 |
assert_select 'form#custom_field_form' do |
197 | 201 |
assert_select 'input[name=?]', 'custom_field[tracker_ids][]', 0 |
198 |
assert_select 'input[name=?]', 'custom_field[project_ids][]', 0 |
|
199 | 202 |
end |
200 | 203 |
end |
201 | 204 | |
... | ... | |
257 | 260 |
assert_select '[name=?]', 'custom_field[default_value]', 0 |
258 | 261 |
end |
259 | 262 | |
260 |
def test_setting_full_width_layout_shoul_be_present_only_for_long_text_issue_custom_field |
|
263 |
def test_setting_full_width_layout_should_be_present_only_for_long_text_issue_custom_field
|
|
261 | 264 |
get( |
262 | 265 |
:new, |
263 | 266 |
:params => { |
... | ... | |
330 | 333 |
tracker_ids = [1, 2] |
331 | 334 |
project_ids = [1, 2, 3] |
332 | 335 | |
333 |
copy_from = CustomField.find(1) |
|
334 |
copy_from.role_ids = role_ids |
|
335 |
copy_from.tracker_ids = tracker_ids |
|
336 |
copy_from.project_ids = project_ids |
|
337 |
copy_from.save |
|
338 | ||
339 |
get :new, :params => {:copy => copy_from.id.to_s, :type => IssueCustomField} |
|
340 |
assert_response :success |
|
341 | ||
342 |
assert_select 'form' do |
|
343 |
# field_format selected |
|
344 |
assert_select 'select[name=?]', 'custom_field[field_format]' do |
|
345 |
assert_select "option[value=\"#{copy_from.field_format}\"][selected=selected]" |
|
346 |
end |
|
347 |
# blank name |
|
348 |
assert_select 'input[name=?][value=""]', 'custom_field[name]' |
|
349 |
# description copied |
|
350 |
assert_select 'textarea[name=?]', 'custom_field[description]', :text => copy_from.description |
|
351 |
# role checked |
|
352 |
role_ids.each do |role_id| |
|
353 |
assert_select "input[type=checkbox][name=?][value=#{role_id}][checked=checked]", 'custom_field[role_ids][]' |
|
354 |
end |
|
355 |
# role not checked |
|
356 |
(Role.givable.pluck(:id) - role_ids).each do |role_id| |
|
357 |
assert_select "input[type=checkbox][name=?][value=#{role_id}]", 'custom_field[role_ids][]' |
|
358 |
end |
|
359 |
# tracker checked |
|
360 |
tracker_ids.each do |tracker_id| |
|
361 |
assert_select "input[type=checkbox][name=?][value=#{tracker_id}][checked=checked]", 'custom_field[tracker_ids][]' |
|
362 |
end |
|
363 |
# tracker not checked |
|
364 |
(Tracker.all.pluck(:id) - tracker_ids).each do |tracker_id| |
|
365 |
assert_select "input[type=checkbox][name=?][value=#{tracker_id}]", 'custom_field[tracker_ids][]' |
|
366 |
end |
|
367 |
# project checked |
|
368 |
project_ids.each do |project_id| |
|
369 |
assert_select "input[type=checkbox][name=?][value=#{project_id}][checked=checked]", 'custom_field[project_ids][]' |
|
370 |
end |
|
371 |
# project not checked |
|
372 |
(Project.all.pluck(:id) - project_ids).each do |project_id| |
|
373 |
assert_select "input[type=checkbox][name=?][value=#{project_id}]", 'custom_field[project_ids][]' |
|
336 |
[ |
|
337 |
CustomField.find(1), # IssueCustomField |
|
338 |
CustomField.find(3), # ProjectCustomField |
|
339 |
CustomField.find(10), # TimeEntryCustomField |
|
340 |
].each do |copy_from| |
|
341 |
copy_from.role_ids = role_ids |
|
342 |
copy_from.tracker_ids = tracker_ids if copy_from.is_a?(IssueCustomField) |
|
343 |
copy_from.project_ids = project_ids |
|
344 |
copy_from.save |
|
345 | ||
346 |
get :new, :params => {:copy => copy_from.id.to_s, :type => copy_from.class} |
|
347 |
assert_response :success |
|
348 | ||
349 |
assert_select 'form' do |
|
350 |
# field_format selected |
|
351 |
assert_select 'select[name=?]', 'custom_field[field_format]' do |
|
352 |
assert_select "option[value=\"#{copy_from.field_format}\"][selected=selected]" |
|
353 |
end |
|
354 |
# blank name |
|
355 |
assert_select 'input[name=?][value=""]', 'custom_field[name]' |
|
356 |
# description copied |
|
357 |
assert_select 'textarea[name=?]', 'custom_field[description]', :text => copy_from.description |
|
358 |
# role checked |
|
359 |
role_ids.each do |role_id| |
|
360 |
assert_select "input[type=checkbox][name=?][value=#{role_id}][checked=checked]", 'custom_field[role_ids][]' |
|
361 |
end |
|
362 |
# role not checked |
|
363 |
(Role.givable.pluck(:id) - role_ids).each do |role_id| |
|
364 |
assert_select "input[type=checkbox][name=?][value=#{role_id}]", 'custom_field[role_ids][]' |
|
365 |
end |
|
366 |
if copy_from.is_a?(IssueCustomField) |
|
367 |
# tracker checked |
|
368 |
tracker_ids.each do |tracker_id| |
|
369 |
assert_select "input[type=checkbox][name=?][value=#{tracker_id}][checked=checked]", 'custom_field[tracker_ids][]' |
|
370 |
end |
|
371 |
# tracker not checked |
|
372 |
(Tracker.all.pluck(:id) - tracker_ids).each do |tracker_id| |
|
373 |
assert_select "input[type=checkbox][name=?][value=#{tracker_id}]", 'custom_field[tracker_ids][]' |
|
374 |
end |
|
375 |
end |
|
376 |
# project checked |
|
377 |
project_ids.each do |project_id| |
|
378 |
assert_select "input[type=checkbox][name=?][value=#{project_id}][checked=checked]", 'custom_field[project_ids][]' |
|
379 |
end |
|
380 |
# project not checked |
|
381 |
(Project.all.pluck(:id) - project_ids).each do |project_id| |
|
382 |
assert_select "input[type=checkbox][name=?][value=#{project_id}]", 'custom_field[project_ids][]' |
|
383 |
end |
|
374 | 384 |
end |
375 | 385 |
end |
376 | 386 |
end |
test/functional/issues_controller_test.rb | ||
---|---|---|
298 | 298 |
def test_index_with_project_custom_field_filter |
299 | 299 |
field = |
300 | 300 |
ProjectCustomField. |
301 |
create!(:name => 'Client', :is_filter => true, :field_format => 'string') |
|
301 |
create!(:name => 'Client', :is_filter => true, :field_format => 'string', :is_for_all => true)
|
|
302 | 302 |
CustomValue.create!(:custom_field => field, :customized => Project.find(3), :value => 'Foo') |
303 | 303 |
CustomValue.create!(:custom_field => field, :customized => Project.find(5), :value => 'Foo') |
304 | 304 |
filter_name = "project.cf_#{field.id}" |
test/functional/project_enumerations_controller_test.rb | ||
---|---|---|
213 | 213 |
"Time Entries are not assigned to system activities" |
214 | 214 |
end |
215 | 215 | |
216 |
def test_update_could_be_switch_availability_of_time_entry_custom_field |
|
217 |
custom_field = TimeEntryCustomField.generate!(:is_for_all => false) |
|
218 |
project = Project.find(1) |
|
219 |
refute_includes project.time_entry_custom_fields, custom_field |
|
220 | ||
221 |
@request.session[:user_id] = 2 # manager |
|
222 |
put( |
|
223 |
:update, |
|
224 |
:params => { |
|
225 |
:project_id => 1, |
|
226 |
:enumerations => { |
|
227 |
"11"=>{"parent_id"=>"11", "custom_field_values"=>{"7"=>"1"}, "active"=>"1"} # QA, no changes |
|
228 |
}, |
|
229 |
:project => { |
|
230 |
'time_entry_custom_field_ids' => [custom_field.id.to_s] |
|
231 |
} |
|
232 |
} |
|
233 |
) |
|
234 |
assert_response :redirect |
|
235 |
assert_redirected_to '/projects/ecookbook/settings/activities' |
|
236 | ||
237 |
project.reload |
|
238 |
assert_includes project.time_entry_custom_fields, custom_field |
|
239 |
end |
|
240 | ||
216 | 241 |
def test_destroy |
217 | 242 |
@request.session[:user_id] = 2 # manager |
218 | 243 |
project_activity = TimeEntryActivity.new({ |
test/functional/projects_controller_test.rb | ||
---|---|---|
688 | 688 |
end |
689 | 689 | |
690 | 690 |
def test_show_should_not_display_blank_custom_fields_with_multiple_values |
691 |
f1 = ProjectCustomField.generate! :field_format => 'list', :possible_values => %w(Foo Bar), :multiple => true |
|
692 |
f2 = ProjectCustomField.generate! :field_format => 'list', :possible_values => %w(Baz Qux), :multiple => true |
|
691 |
f1 = ProjectCustomField.generate! :field_format => 'list', :possible_values => %w(Foo Bar), :multiple => true, :is_for_all => true
|
|
692 |
f2 = ProjectCustomField.generate! :field_format => 'list', :possible_values => %w(Baz Qux), :multiple => true, :is_for_all => true
|
|
693 | 693 |
project = Project.generate!(:custom_field_values => {f2.id.to_s => %w(Qux)}) |
694 | 694 |
get(:show, :params => {:id => project.id}) |
695 | 695 |
assert_response :success |
test/functional/projects_custom_fields_visibility_test.rb | ||
---|---|---|
1 |
# frozen_string_literal: true |
|
2 | ||
3 |
# Redmine - project management software |
|
4 |
# Copyright (C) 2006-2021 Jean-Philippe Lang |
|
5 |
# |
|
6 |
# This program is free software; you can redistribute it and/or |
|
7 |
# modify it under the terms of the GNU General Public License |
|
8 |
# as published by the Free Software Foundation; either version 2 |
|
9 |
# of the License, or (at your option) any later version. |
|
10 |
# |
|
11 |
# This program is distributed in the hope that it will be useful, |
|
12 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
13 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
14 |
# GNU General Public License for more details. |
|
15 |
# |
|
16 |
# You should have received a copy of the GNU General Public License |
|
17 |
# along with this program; if not, write to the Free Software |
|
18 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
19 | ||
20 |
require File.expand_path('../../test_helper', __FILE__) |
|
21 | ||
22 |
class ProjectsCustomFieldsVisibilityTest < Redmine::ControllerTest |
|
23 |
tests ProjectsController |
|
24 |
fixtures :projects, :members, :roles, :member_roles, |
|
25 |
:users, |
|
26 |
:custom_fields, :custom_values, :custom_fields_projects |
|
27 | ||
28 |
def test_index_should_show_visible_custom_fields_only |
|
29 |
prepare_test_data |
|
30 | ||
31 |
with_settings project_list_display_type: 'list' do |
|
32 |
@users_to_test.each do |user, fields| |
|
33 |
@request.session[:user_id] = user.id |
|
34 |
get :index, params: { |
|
35 |
c: (['identifier'] + @fields.map{|f| "cf_#{f.id}"}) |
|
36 |
} |
|
37 |
@fields.each_with_index do |field, i| |
|
38 |
if fields.include?(field) |
|
39 |
assert_select 'td', {text: "Value#{i}", count: 1}, "User #{user.id} was not able to view #{field.name}" |
|
40 |
else |
|
41 |
assert_select 'td', {text: "Value#{i}", count: 0}, "User #{user.id} was able to view #{field.name}" |
|
42 |
end |
|
43 |
end |
|
44 |
end |
|
45 |
end |
|
46 |
end |
|
47 | ||
48 |
def test_index_as_csv_should_show_visible_custom_fields_only |
|
49 |
prepare_test_data |
|
50 | ||
51 |
with_settings project_list_display_type: 'list' do |
|
52 |
@users_to_test.each do |user, fields| |
|
53 |
@request.session[:user_id] = user.id |
|
54 |
get :index, params: { |
|
55 |
c: (['identifier'] + @fields.map{|f| "cf_#{f.id}"}), |
|
56 |
format: 'csv' |
|
57 |
} |
|
58 |
@fields.each_with_index do |field, i| |
|
59 |
if fields.include?(field) |
|
60 |
assert_include "Value#{i}", response.body, "User #{user.id} was not able to view #{field.name} in CSV" |
|
61 |
else |
|
62 |
assert_not_include "Value#{i}", response.body, "User #{user.id} was able to view #{field.name} in CSV" |
|
63 |
end |
|
64 |
end |
|
65 |
end |
|
66 |
end |
|
67 |
end |
|
68 | ||
69 |
def test_settings_should_not_show_custom_fields_not_visible_for_user |
|
70 |
project_cf = ProjectCustomField.find(3) |
|
71 |
project_cf.visible = false |
|
72 |
project_cf.role_ids = [2] # Developer |
|
73 |
project_cf.save! |
|
74 | ||
75 |
@request.session[:user_id] = 2 # Manager |
|
76 |
get :settings, params: { |
|
77 |
id: 1 |
|
78 |
} |
|
79 | ||
80 |
assert_response :success |
|
81 |
assert_select 'select#project_custom_field_values_3', 0 |
|
82 |
assert_select 'input[type=checkbox][name="project[project_custom_field_ids][]"][value="3"]' |
|
83 |
end |
|
84 | ||
85 |
def test_show_should_not_show_custom_fields_not_visible_for_user |
|
86 |
project_cf = ProjectCustomField.find(3) |
|
87 |
project_cf.visible = false |
|
88 |
project_cf.role_ids = [2] # Developer |
|
89 |
project_cf.save! |
|
90 | ||
91 |
@request.session[:user_id] = 2 # Manager |
|
92 |
get :show, params: { |
|
93 |
id: 1 |
|
94 |
} |
|
95 | ||
96 |
assert_response :success |
|
97 |
assert_select 'li.list_cf.cf_3', 0 |
|
98 |
end |
|
99 | ||
100 |
def test_show_should_not_show_custom_fields_not_available_for_project |
|
101 |
project_cf = ProjectCustomField.find(3) |
|
102 |
project_cf.visible = true |
|
103 |
project_cf.is_for_all = false |
|
104 |
project_cf.project_ids = [2] |
|
105 |
project_cf.save! |
|
106 | ||
107 |
@request.session[:user_id] = 2 |
|
108 |
get :show, params: { |
|
109 |
id: 1 |
|
110 |
} |
|
111 | ||
112 |
assert_response :success |
|
113 |
assert_select 'li.list_cf.cf_3', 0 |
|
114 |
end |
|
115 | ||
116 |
private |
|
117 | ||
118 |
def prepare_test_data |
|
119 |
field_attributes = {field_format: 'string', is_for_all: true, is_filter: true} |
|
120 |
@fields = [] |
|
121 |
@fields << (field1 = ProjectCustomField.create!(field_attributes.merge(name: 'Field 1', visible: true))) |
|
122 |
@fields << (field2 = ProjectCustomField.create!(field_attributes.merge(name: 'Field 2', visible: false, role_ids: [1, 2]))) |
|
123 |
@fields << (field3 = ProjectCustomField.create!(field_attributes.merge(name: 'Field 3', visible: false, role_ids: [1, 3]))) |
|
124 |
project = Project.find(1) |
|
125 |
project.safe_attributes = { |
|
126 |
custom_field_values: {field1.id => 'Value0', field2.id => 'Value1', field3.id => 'Value2'} |
|
127 |
}; |
|
128 |
project.save! |
|
129 | ||
130 |
user_with_role_on_other_project = User.generate! |
|
131 |
User.add_to_project(user_with_role_on_other_project, Project.find(2), Role.find(3)) |
|
132 | ||
133 |
@users_to_test = { |
|
134 |
User.find(1) => [field1, field2, field3], |
|
135 |
User.find(3) => [field1, field2], |
|
136 |
user_with_role_on_other_project => [field1], # should see field1 only on Project 1 |
|
137 |
User.generate! => [field1], |
|
138 |
User.anonymous => [field1], |
|
139 |
} |
|
140 | ||
141 |
Member.where(project_id: 1).each do |member| |
|
142 |
member.destroy unless @users_to_test.key?(member.principal) |
|
143 |
end |
|
144 |
end |
|
145 |
end |
test/functional/timelog_controller_test.rb | ||
---|---|---|
859 | 859 |
end |
860 | 860 | |
861 | 861 |
def test_bulk_update_clear_custom_field |
862 |
field = TimeEntryCustomField.generate!(:field_format => 'string') |
|
862 |
field = TimeEntryCustomField.generate!(:field_format => 'string', :is_for_all => true)
|
|
863 | 863 |
@request.session[:user_id] = 2 |
864 | 864 |
post( |
865 | 865 |
:bulk_update, |
... | ... | |
1467 | 1467 |
end |
1468 | 1468 | |
1469 | 1469 |
def test_index_with_time_entry_custom_field_column |
1470 |
field = TimeEntryCustomField.generate!(:field_format => 'string') |
|
1470 |
field = TimeEntryCustomField.generate!(:field_format => 'string', :is_for_all => true)
|
|
1471 | 1471 |
entry = TimeEntry.generate!(:hours => 2.5, :custom_field_values => {field.id => 'CF Value'}) |
1472 | 1472 |
field_name = "cf_#{field.id}" |
1473 | 1473 | |
... | ... | |
1479 | 1479 |
end |
1480 | 1480 | |
1481 | 1481 |
def test_index_with_time_entry_custom_field_sorting |
1482 |
field = TimeEntryCustomField.generate!(:field_format => 'string', :name => 'String Field') |
|
1482 |
field = TimeEntryCustomField.generate!(:field_format => 'string', :name => 'String Field', :is_for_all => true)
|
|
1483 | 1483 |
TimeEntry.generate!(:hours => 2.5, :custom_field_values => {field.id => 'CF Value 1'}) |
1484 | 1484 |
TimeEntry.generate!(:hours => 2.5, :custom_field_values => {field.id => 'CF Value 3'}) |
1485 | 1485 |
TimeEntry.generate!(:hours => 2.5, :custom_field_values => {field.id => 'CF Value 2'}) |
test/functional/timelog_custom_fields_visibility_test.rb | ||
---|---|---|
42 | 42 |
get :index, :params => { |
43 | 43 |
:project_id => 1, |
44 | 44 |
:issue_id => @issue.id, |
45 |
:c => (['hours'] + @fields.map{|f| "issue.cf_#{f.id}"}) |
|
45 |
:c => (['hours'] + |
|
46 |
@fields.map{|f| |
|
47 |
f.is_a?(TimeEntryCustomField) ? |
|
48 |
"cf_#{f.id}" : "#{(/(.+)CustomField/ =~ f.class.name;$1).underscore}.cf_#{f.id}" |
|
49 |
} |
|
50 |
) |
|
46 | 51 |
} |
47 | 52 |
@fields.each_with_index do |field, i| |
48 | 53 |
if fields.include?(field) |
... | ... | |
62 | 67 |
get :index, :params => { |
63 | 68 |
:project_id => 1, |
64 | 69 |
:issue_id => @issue.id, |
65 |
:c => (['hours'] + @fields.map{|f| "issue.cf_#{f.id}"}), |
|
70 |
:c => (['hours'] + |
|
71 |
@fields.map{|f| |
|
72 |
f.is_a?(TimeEntryCustomField) ? |
|
73 |
"cf_#{f.id}" : "#{(/(.+)CustomField/ =~ f.class.name;$1).underscore}.cf_#{f.id}" |
|
74 |
} |
|
75 |
), |
|
66 | 76 |
:format => 'csv' |
67 | 77 |
} |
68 | 78 |
@fields.each_with_index do |field, i| |
... | ... | |
125 | 135 |
assert_select 'select#time_entry_custom_field_values_10', 0 |
126 | 136 |
end |
127 | 137 | |
138 |
def test_edit_should_not_show_custom_fields_not_available_for_project |
|
139 |
time_entry_cf = TimeEntryCustomField.find(10) |
|
140 |
time_entry_cf.visible = true |
|
141 |
time_entry_cf.is_for_all = false |
|
142 |
time_entry_cf.project_ids = [2] |
|
143 |
time_entry_cf.save! |
|
144 | ||
145 |
@request.session[:user_id] = 2 |
|
146 |
get :edit, :params => { |
|
147 |
:id => 3, |
|
148 |
:project_id => 1 |
|
149 |
} |
|
150 |
assert_response :success |
|
151 |
assert_select 'select#time_entry_custom_field_values_10', 0 |
|
152 |
end |
|
153 | ||
128 | 154 |
private |
129 | 155 | |
130 | 156 |
def prepare_test_data |
131 | 157 |
field_attributes = {:field_format => 'string', :is_for_all => true, :is_filter => true, :trackers => Tracker.all} |
158 |
field_attributes_exclude_trackers = field_attributes.reject{|k,v|k == :trackers} |
|
132 | 159 |
@fields = [] |
133 | 160 |
@fields << (@field1 = IssueCustomField.create!(field_attributes.merge(:name => 'Field 1', :visible => true))) |
134 | 161 |
@fields << (@field2 = IssueCustomField.create!(field_attributes.merge(:name => 'Field 2', :visible => false, :role_ids => [1, 2]))) |
135 | 162 |
@fields << (@field3 = IssueCustomField.create!(field_attributes.merge(:name => 'Field 3', :visible => false, :role_ids => [1, 3]))) |
163 |
@fields << (@field4 = TimeEntryCustomField.create!(field_attributes_exclude_trackers.merge(:name => 'Field 4', :visible => true))) |
|
164 |
@fields << (@field5 = TimeEntryCustomField.create!(field_attributes_exclude_trackers.merge(:name => 'Field 5', :visible => false, :role_ids => [1, 2]))) |
|
165 |
@fields << (@field6 = TimeEntryCustomField.create!(field_attributes_exclude_trackers.merge(:name => 'Field 6', :visible => false, :role_ids => [1, 3]))) |
|
166 |
@fields << (@field7 = ProjectCustomField.create!(field_attributes_exclude_trackers.merge(:name => 'Field 7', :visible => true))) |
|
167 |
@fields << (@field8 = ProjectCustomField.create!(field_attributes_exclude_trackers.merge(:name => 'Field 8', :visible => false, :role_ids => [1, 2]))) |
|
168 |
@fields << (@field9 = ProjectCustomField.create!(field_attributes_exclude_trackers.merge(:name => 'Field 9', :visible => false, :role_ids => [1, 3]))) |
|
136 | 169 |
@issue = Issue.generate!( |
137 | 170 |
:author_id => 1, |
138 | 171 |
:project_id => 1, |
139 | 172 |
:tracker_id => 1, |
140 | 173 |
:custom_field_values => {@field1.id => 'Value0', @field2.id => 'Value1', @field3.id => 'Value2'} |
141 | 174 |
) |
142 |
TimeEntry.generate!(:issue => @issue) |
|
175 |
TimeEntry.generate!( |
|
176 |
:issue => @issue, |
|
177 |
:custom_field_values => {@field4.id => 'Value3', @field5.id => 'Value4', @field6.id => 'Value5'} |
|
178 |
) |
|
179 |
project = Project.find(1) |
|
180 |
project.safe_attributes = { |
|
181 |
:custom_field_values => {@field7.id => 'Value6', @field8.id => 'Value7', @field9.id => 'Value8'} |
|
182 |
}; |
|
183 |
project.save! |
|
143 | 184 | |
144 | 185 |
@user_with_role_on_other_project = User.generate! |
145 | 186 |
User.add_to_project(@user_with_role_on_other_project, Project.find(2), Role.find(3)) |
146 | 187 | |
147 | 188 |
@users_to_test = { |
148 |
User.find(1) => [@field1, @field2, @field3], |
|
149 |
User.find(3) => [@field1, @field2], |
|
150 |
@user_with_role_on_other_project => [@field1], # should see field1 only on Project 1
|
|
151 |
User.generate! => [@field1], |
|
152 |
User.anonymous => [@field1]
|
|
189 |
User.find(1) => [@field1, @field2, @field3, @field4, @field5, @field6, @field7, @field8, @field9],
|
|
190 |
User.find(3) => [@field1, @field2, @field4, @field5, @field7, @field8],
|
|
191 |
@user_with_role_on_other_project => [@field1, @field4, @field7], # should see field1,field4,field7 only on Project 1
|
|
192 |
User.generate! => [@field1, @field4, @field7],
|
|
193 |
User.anonymous => [@field1, @field4, @field7],
|
|
153 | 194 |
} |
154 | 195 | |
155 | 196 |
Member.where(:project_id => 1).each do |member| |
test/helpers/application_helper_test.rb | ||
---|---|---|
1815 | 1815 |
end |
1816 | 1816 | |
1817 | 1817 |
def test_link_to_attachment_container |
1818 |
field = ProjectCustomField.generate!(:name => "File", :field_format => 'attachment') |
|
1818 |
field = ProjectCustomField.generate!(:name => "File", :field_format => 'attachment', :is_for_all => true)
|
|
1819 | 1819 |
project = projects(:projects_001) |
1820 | 1820 |
project_custom_value_attachment = new_record(Attachment) do |
1821 | 1821 |
project.custom_field_values = {field.id => {:file => mock_file}} |
test/integration/api_test/time_entries_test.rb | ||
---|---|---|
89 | 89 |
end |
90 | 90 | |
91 | 91 |
test "POST /time_entries.xml with issue_id should accept custom fields" do |
92 |
field = TimeEntryCustomField.create!(:name => 'Test', :field_format => 'string') |
|
92 |
field = TimeEntryCustomField.create!(:name => 'Test', :field_format => 'string', :is_for_all => true)
|
|
93 | 93 | |
94 | 94 |
assert_difference 'TimeEntry.count' do |
95 | 95 |
post( |
test/unit/custom_field_test.rb | ||
---|---|---|
22 | 22 |
class CustomFieldTest < ActiveSupport::TestCase |
23 | 23 |
fixtures :custom_fields, :roles, :projects, |
24 | 24 |
:trackers, :issue_statuses, |
25 |
:issues, :users |
|
25 |
:issues, :users, |
|
26 |
:time_entries, :members, :member_roles, :custom_fields_projects |
|
26 | 27 | |
27 | 28 |
def setup |
28 | 29 |
User.current = nil |
... | ... | |
260 | 261 |
def test_changing_multiple_to_false_should_delete_multiple_values |
261 | 262 |
field = ProjectCustomField.create!(:name => 'field', :field_format => 'list', |
262 | 263 |
:multiple => 'true', |
263 |
:possible_values => ['field1', 'field2']) |
|
264 |
:possible_values => ['field1', 'field2'], :is_for_all => true)
|
|
264 | 265 |
other = ProjectCustomField.create!(:name => 'other', :field_format => 'list', |
265 | 266 |
:multiple => 'true', |
266 |
:possible_values => ['other1', 'other2']) |
|
267 |
:possible_values => ['other1', 'other2'], :is_for_all => true)
|
|
267 | 268 |
item_with_multiple_values = Project.generate!(:custom_field_values => |
268 | 269 |
{field.id => ['field1', 'field2'], |
269 | 270 |
other.id => ['other1', 'other2']}) |
... | ... | |
349 | 350 |
assert_equal -12.5, field.cast_value('-12.5') |
350 | 351 |
end |
351 | 352 | |
352 |
def test_project_custom_field_visibility |
|
353 |
project_field = ProjectCustomField.generate!(:visible => false, :field_format => 'list', :possible_values => %w[a b c]) |
|
354 |
project = Project.find(3) |
|
355 |
project.custom_field_values = {project_field.id => 'a'} |
|
356 | ||
357 |
# Admins can find projects with the field |
|
358 |
with_current_user(User.find(1)) do |
|
359 |
assert_includes Project.where(project_field.visibility_by_project_condition), project |
|
360 |
end |
|
361 | ||
362 |
# The field is not visible to normal users |
|
363 |
with_current_user(User.find(2)) do |
|
364 |
refute_includes Project.where(project_field.visibility_by_project_condition), project |
|
353 |
def test_custom_field_visibility_by_project_condition |
|
354 |
Member.create!(:principal => User.find(2), :project_id => 3, :role_ids => [1]) |
|
355 |
[Issue.find(5), TimeEntry.find(4), Project.find(3)].each do |customized_obj| |
|
356 |
customized_klass = customized_obj.class |
|
357 |
custom_field_klass = "#{customized_klass.name}CustomField".constantize |
|
358 |
custom_field = custom_field_klass.generate!( |
|
359 |
:field_format => 'list', :possible_values => %w[a b c], |
|
360 |
:visible => false, :role_ids => [2], |
|
361 |
:is_for_all => false, :project_ids => [3] |
|
362 |
) |
|
363 |
customized_obj.custom_field_values = {custom_field.id => 'a'} |
|
364 | ||
365 |
# Admins can find customized objects with the field |
|
366 |
with_current_user(User.find(1)) do |
|
367 |
assert_includes customized_klass.where(custom_field.visibility_by_project_condition), customized_obj |
|
368 |
end |
|
369 | ||
370 |
# The field is not visible to normal users |
|
371 |
with_current_user(User.find(2)) do |
|
372 |
refute_includes customized_klass.where(custom_field.visibility_by_project_condition), customized_obj |
|
373 |
end |
|
365 | 374 |
end |
366 | 375 |
end |
367 | 376 | |
... | ... | |
417 | 426 |
end |
418 | 427 | |
419 | 428 |
def test_copy_from_should_copy_projects |
420 |
issue_custom_field = IssueCustomField.new(:name => 'IssueCustomField', :project_ids => [1, 2, 3, 4, 5, 6]) |
|
421 |
copy = IssueCustomField.new.copy_from(issue_custom_field) |
|
422 |
assert_equal [1, 2, 3, 4, 5, 6], copy.project_ids |
|
429 |
%w(IssueCustomField TimeEntryCustomField ProjectCustomField).each do |klass_name| |
|
430 |
klass = klass_name.constantize |
|
431 |
custom_field = klass.new(:name => klass_name, :project_ids => [1, 2, 3, 4, 5, 6]) |
|
432 |
copy = klass.new.copy_from(custom_field) |
|
433 |
assert_equal [1, 2, 3, 4, 5, 6], copy.project_ids |
|
434 |
end |
|
423 | 435 |
end |
424 | 436 |
end |
test/unit/project_test.rb | ||
---|---|---|
1094 | 1094 |
def test_safe_attributes_should_include_only_custom_fields_visible_to_user |
1095 | 1095 |
cf1 = ProjectCustomField.create!(:name => 'Visible field', |
1096 | 1096 |
:field_format => 'string', |
1097 |
:visible => false, :role_ids => [1]) |
|
1097 |
:visible => false, :role_ids => [1], :is_for_all => true)
|
|
1098 | 1098 |
cf2 = ProjectCustomField.create!(:name => 'Non visible field', |
1099 | 1099 |
:field_format => 'string', |
1100 |
:visible => false, :role_ids => [3]) |
|
1101 |
user = User.find(2)
|
|
1100 |
:visible => false, :role_ids => [3], :is_for_all => true)
|
|
1101 |
User.current = User.find(2)
|
|
1102 | 1102 |
project = Project.find(1) |
1103 | 1103 | |
1104 | 1104 |
project.send( |
... | ... | |
1107 | 1107 |
'custom_field_values' => { |
1108 | 1108 |
cf1.id.to_s => 'value1', cf2.id.to_s => 'value2' |
1109 | 1109 |
} |
1110 |
}, |
|
1111 |
user |
|
1110 |
} |
|
1112 | 1111 |
) |
1113 | 1112 |
assert_equal 'value1', project.custom_field_value(cf1) |
1114 | 1113 |
assert_nil project.custom_field_value(cf2) |
... | ... | |
1121 | 1120 |
{'id' => cf1.id.to_s, 'value' => 'valuea'}, |
1122 | 1121 |
{'id' => cf2.id.to_s, 'value' => 'valueb'} |
1123 | 1122 |
] |
1124 |
}, |
|
1125 |
user |
|
1123 |
} |
|
1126 | 1124 |
) |
1127 | 1125 |
assert_equal 'valuea', project.custom_field_value(cf1) |
1128 | 1126 |
assert_nil project.custom_field_value(cf2) |
test/unit/query_test.rb | ||
---|---|---|
1161 | 1161 |
end |
1162 | 1162 | |
1163 | 1163 |
def test_filter_on_project_custom_field |
1164 |
field = ProjectCustomField.create!(:name => 'Client', :is_filter => true, :field_format => 'string') |
|
1164 |
field = ProjectCustomField.create!(:name => 'Client', :is_filter => true, :field_format => 'string', :is_for_all => true)
|
|
1165 | 1165 |
CustomValue.create!(:custom_field => field, :customized => Project.find(3), :value => 'Foo') |
1166 | 1166 |
CustomValue.create!(:custom_field => field, :customized => Project.find(5), :value => 'Foo') |
1167 | 1167 |
test/unit/time_entry_custom_field_test.rb | ||
---|---|---|
49 | 49 |
def test_safe_attributes_should_include_only_custom_fields_visible_to_user |
50 | 50 |
cf1 = TimeEntryCustomField.create!(:name => 'Visible field', |
51 | 51 |
:field_format => 'string', |
52 |
:visible => false, :role_ids => [1]) |
|
52 |
:visible => false, :role_ids => [1], :is_for_all => true)
|
|
53 | 53 |
cf2 = TimeEntryCustomField.create!(:name => 'Non visible field', |
54 | 54 |
:field_format => 'string', |
55 |
:visible => false, :role_ids => [3]) |
|
56 |
user = User.find(2)
|
|
55 |
:visible => false, :role_ids => [3], :is_for_all => true)
|
|
56 |
User.current = User.find(2)
|
|
57 | 57 |
time_entry = TimeEntry.new(:issue_id => 1) |
58 | 58 | |
59 | 59 |
time_entry.send :safe_attributes=, {'custom_field_values' => { |
60 | 60 |
cf1.id.to_s => 'value1', |
61 | 61 |
cf2.id.to_s => 'value2' |
62 |
}}, user
|
|
62 |
}} |
|
63 | 63 | |
64 | 64 |
assert_equal 'value1', time_entry.custom_field_value(cf1) |
65 | 65 |
assert_nil time_entry.custom_field_value(cf2) |
... | ... | |
67 | 67 |
time_entry.send :safe_attributes=, {'custom_fields' => [ |
68 | 68 |
{'id' => cf1.id.to_s, 'value' => 'valuea'}, |
69 | 69 |
{'id' => cf2.id.to_s, 'value' => 'valueb'} |
70 |
]}, user
|
|
70 |
]} |
|
71 | 71 | |
72 | 72 |
assert_equal 'valuea', time_entry.custom_field_value(cf1) |
73 | 73 |
assert_nil time_entry.custom_field_value(cf2) |