##// END OF EJS Templates
prevent test failures with "trackers is invalid"...
Toshi MARUYAMA -
r13190:34bb545e4f32
parent child
Show More
@@ -1,317 +1,319
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2014 Jean-Philippe Lang
2 # Copyright (C) 2006-2014 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 require File.expand_path('../../test_helper', __FILE__)
18 require File.expand_path('../../test_helper', __FILE__)
19
19
20 class CustomFieldTest < ActiveSupport::TestCase
20 class CustomFieldTest < ActiveSupport::TestCase
21 fixtures :custom_fields, :roles, :projects, :issues
21 fixtures :custom_fields, :roles, :projects,
22 :trackers, :issue_statuses,
23 :issues
22
24
23 def test_create
25 def test_create
24 field = UserCustomField.new(:name => 'Money money money', :field_format => 'float')
26 field = UserCustomField.new(:name => 'Money money money', :field_format => 'float')
25 assert field.save
27 assert field.save
26 end
28 end
27
29
28 def test_before_validation
30 def test_before_validation
29 field = CustomField.new(:name => 'test_before_validation', :field_format => 'int')
31 field = CustomField.new(:name => 'test_before_validation', :field_format => 'int')
30 field.searchable = true
32 field.searchable = true
31 assert field.save
33 assert field.save
32 assert_equal false, field.searchable
34 assert_equal false, field.searchable
33 field.searchable = true
35 field.searchable = true
34 assert field.save
36 assert field.save
35 assert_equal false, field.searchable
37 assert_equal false, field.searchable
36 end
38 end
37
39
38 def test_regexp_validation
40 def test_regexp_validation
39 field = IssueCustomField.new(:name => 'regexp', :field_format => 'text', :regexp => '[a-z0-9')
41 field = IssueCustomField.new(:name => 'regexp', :field_format => 'text', :regexp => '[a-z0-9')
40 assert !field.save
42 assert !field.save
41 assert_include I18n.t('activerecord.errors.messages.invalid'),
43 assert_include I18n.t('activerecord.errors.messages.invalid'),
42 field.errors[:regexp]
44 field.errors[:regexp]
43 field.regexp = '[a-z0-9]'
45 field.regexp = '[a-z0-9]'
44 assert field.save
46 assert field.save
45 end
47 end
46
48
47 def test_default_value_should_be_validated
49 def test_default_value_should_be_validated
48 field = CustomField.new(:name => 'Test', :field_format => 'int')
50 field = CustomField.new(:name => 'Test', :field_format => 'int')
49 field.default_value = 'abc'
51 field.default_value = 'abc'
50 assert !field.valid?
52 assert !field.valid?
51 field.default_value = '6'
53 field.default_value = '6'
52 assert field.valid?
54 assert field.valid?
53 end
55 end
54
56
55 def test_default_value_should_not_be_validated_when_blank
57 def test_default_value_should_not_be_validated_when_blank
56 field = CustomField.new(:name => 'Test', :field_format => 'list', :possible_values => ['a', 'b'], :is_required => true, :default_value => '')
58 field = CustomField.new(:name => 'Test', :field_format => 'list', :possible_values => ['a', 'b'], :is_required => true, :default_value => '')
57 assert field.valid?
59 assert field.valid?
58 end
60 end
59
61
60 def test_field_format_should_be_validated
62 def test_field_format_should_be_validated
61 field = CustomField.new(:name => 'Test', :field_format => 'foo')
63 field = CustomField.new(:name => 'Test', :field_format => 'foo')
62 assert !field.valid?
64 assert !field.valid?
63 end
65 end
64
66
65 def test_field_format_validation_should_accept_formats_added_at_runtime
67 def test_field_format_validation_should_accept_formats_added_at_runtime
66 Redmine::FieldFormat.add 'foobar', Class.new(Redmine::FieldFormat::Base)
68 Redmine::FieldFormat.add 'foobar', Class.new(Redmine::FieldFormat::Base)
67
69
68 field = CustomField.new(:name => 'Some Custom Field', :field_format => 'foobar')
70 field = CustomField.new(:name => 'Some Custom Field', :field_format => 'foobar')
69 assert field.valid?, 'field should be valid'
71 assert field.valid?, 'field should be valid'
70 ensure
72 ensure
71 Redmine::FieldFormat.delete 'foobar'
73 Redmine::FieldFormat.delete 'foobar'
72 end
74 end
73
75
74 def test_should_not_change_field_format_of_existing_custom_field
76 def test_should_not_change_field_format_of_existing_custom_field
75 field = CustomField.find(1)
77 field = CustomField.find(1)
76 field.field_format = 'int'
78 field.field_format = 'int'
77 assert_equal 'list', field.field_format
79 assert_equal 'list', field.field_format
78 end
80 end
79
81
80 def test_possible_values_should_accept_an_array
82 def test_possible_values_should_accept_an_array
81 field = CustomField.new
83 field = CustomField.new
82 field.possible_values = ["One value", ""]
84 field.possible_values = ["One value", ""]
83 assert_equal ["One value"], field.possible_values
85 assert_equal ["One value"], field.possible_values
84 end
86 end
85
87
86 def test_possible_values_should_accept_a_string
88 def test_possible_values_should_accept_a_string
87 field = CustomField.new
89 field = CustomField.new
88 field.possible_values = "One value"
90 field.possible_values = "One value"
89 assert_equal ["One value"], field.possible_values
91 assert_equal ["One value"], field.possible_values
90 end
92 end
91
93
92 def test_possible_values_should_accept_a_multiline_string
94 def test_possible_values_should_accept_a_multiline_string
93 field = CustomField.new
95 field = CustomField.new
94 field.possible_values = "One value\nAnd another one \r\n \n"
96 field.possible_values = "One value\nAnd another one \r\n \n"
95 assert_equal ["One value", "And another one"], field.possible_values
97 assert_equal ["One value", "And another one"], field.possible_values
96 end
98 end
97
99
98 def test_possible_values_stored_as_binary_should_be_utf8_encoded
100 def test_possible_values_stored_as_binary_should_be_utf8_encoded
99 field = CustomField.find(11)
101 field = CustomField.find(11)
100 assert_kind_of Array, field.possible_values
102 assert_kind_of Array, field.possible_values
101 assert field.possible_values.size > 0
103 assert field.possible_values.size > 0
102 field.possible_values.each do |value|
104 field.possible_values.each do |value|
103 assert_equal "UTF-8", value.encoding.name
105 assert_equal "UTF-8", value.encoding.name
104 end
106 end
105 end
107 end
106
108
107 def test_destroy
109 def test_destroy
108 field = CustomField.find(1)
110 field = CustomField.find(1)
109 assert field.destroy
111 assert field.destroy
110 end
112 end
111
113
112 def test_new_subclass_instance_should_return_an_instance
114 def test_new_subclass_instance_should_return_an_instance
113 f = CustomField.new_subclass_instance('IssueCustomField')
115 f = CustomField.new_subclass_instance('IssueCustomField')
114 assert_kind_of IssueCustomField, f
116 assert_kind_of IssueCustomField, f
115 end
117 end
116
118
117 def test_new_subclass_instance_should_set_attributes
119 def test_new_subclass_instance_should_set_attributes
118 f = CustomField.new_subclass_instance('IssueCustomField', :name => 'Test')
120 f = CustomField.new_subclass_instance('IssueCustomField', :name => 'Test')
119 assert_kind_of IssueCustomField, f
121 assert_kind_of IssueCustomField, f
120 assert_equal 'Test', f.name
122 assert_equal 'Test', f.name
121 end
123 end
122
124
123 def test_new_subclass_instance_with_invalid_class_name_should_return_nil
125 def test_new_subclass_instance_with_invalid_class_name_should_return_nil
124 assert_nil CustomField.new_subclass_instance('WrongClassName')
126 assert_nil CustomField.new_subclass_instance('WrongClassName')
125 end
127 end
126
128
127 def test_new_subclass_instance_with_non_subclass_name_should_return_nil
129 def test_new_subclass_instance_with_non_subclass_name_should_return_nil
128 assert_nil CustomField.new_subclass_instance('Project')
130 assert_nil CustomField.new_subclass_instance('Project')
129 end
131 end
130
132
131 def test_string_field_validation_with_blank_value
133 def test_string_field_validation_with_blank_value
132 f = CustomField.new(:field_format => 'string')
134 f = CustomField.new(:field_format => 'string')
133
135
134 assert f.valid_field_value?(nil)
136 assert f.valid_field_value?(nil)
135 assert f.valid_field_value?('')
137 assert f.valid_field_value?('')
136
138
137 f.is_required = true
139 f.is_required = true
138 assert !f.valid_field_value?(nil)
140 assert !f.valid_field_value?(nil)
139 assert !f.valid_field_value?('')
141 assert !f.valid_field_value?('')
140 end
142 end
141
143
142 def test_string_field_validation_with_min_and_max_lengths
144 def test_string_field_validation_with_min_and_max_lengths
143 f = CustomField.new(:field_format => 'string', :min_length => 2, :max_length => 5)
145 f = CustomField.new(:field_format => 'string', :min_length => 2, :max_length => 5)
144
146
145 assert f.valid_field_value?(nil)
147 assert f.valid_field_value?(nil)
146 assert f.valid_field_value?('')
148 assert f.valid_field_value?('')
147 assert !f.valid_field_value?(' ')
149 assert !f.valid_field_value?(' ')
148 assert f.valid_field_value?('a' * 2)
150 assert f.valid_field_value?('a' * 2)
149 assert !f.valid_field_value?('a')
151 assert !f.valid_field_value?('a')
150 assert !f.valid_field_value?('a' * 6)
152 assert !f.valid_field_value?('a' * 6)
151 end
153 end
152
154
153 def test_string_field_validation_with_regexp
155 def test_string_field_validation_with_regexp
154 f = CustomField.new(:field_format => 'string', :regexp => '^[A-Z0-9]*$')
156 f = CustomField.new(:field_format => 'string', :regexp => '^[A-Z0-9]*$')
155
157
156 assert f.valid_field_value?(nil)
158 assert f.valid_field_value?(nil)
157 assert f.valid_field_value?('')
159 assert f.valid_field_value?('')
158 assert !f.valid_field_value?(' ')
160 assert !f.valid_field_value?(' ')
159 assert f.valid_field_value?('ABC')
161 assert f.valid_field_value?('ABC')
160 assert !f.valid_field_value?('abc')
162 assert !f.valid_field_value?('abc')
161 end
163 end
162
164
163 def test_date_field_validation
165 def test_date_field_validation
164 f = CustomField.new(:field_format => 'date')
166 f = CustomField.new(:field_format => 'date')
165
167
166 assert f.valid_field_value?(nil)
168 assert f.valid_field_value?(nil)
167 assert f.valid_field_value?('')
169 assert f.valid_field_value?('')
168 assert !f.valid_field_value?(' ')
170 assert !f.valid_field_value?(' ')
169 assert f.valid_field_value?('1975-07-14')
171 assert f.valid_field_value?('1975-07-14')
170 assert !f.valid_field_value?('1975-07-33')
172 assert !f.valid_field_value?('1975-07-33')
171 assert !f.valid_field_value?('abc')
173 assert !f.valid_field_value?('abc')
172 end
174 end
173
175
174 def test_list_field_validation
176 def test_list_field_validation
175 f = CustomField.new(:field_format => 'list', :possible_values => ['value1', 'value2'])
177 f = CustomField.new(:field_format => 'list', :possible_values => ['value1', 'value2'])
176
178
177 assert f.valid_field_value?(nil)
179 assert f.valid_field_value?(nil)
178 assert f.valid_field_value?('')
180 assert f.valid_field_value?('')
179 assert !f.valid_field_value?(' ')
181 assert !f.valid_field_value?(' ')
180 assert f.valid_field_value?('value2')
182 assert f.valid_field_value?('value2')
181 assert !f.valid_field_value?('abc')
183 assert !f.valid_field_value?('abc')
182 end
184 end
183
185
184 def test_int_field_validation
186 def test_int_field_validation
185 f = CustomField.new(:field_format => 'int')
187 f = CustomField.new(:field_format => 'int')
186
188
187 assert f.valid_field_value?(nil)
189 assert f.valid_field_value?(nil)
188 assert f.valid_field_value?('')
190 assert f.valid_field_value?('')
189 assert !f.valid_field_value?(' ')
191 assert !f.valid_field_value?(' ')
190 assert f.valid_field_value?('123')
192 assert f.valid_field_value?('123')
191 assert f.valid_field_value?('+123')
193 assert f.valid_field_value?('+123')
192 assert f.valid_field_value?('-123')
194 assert f.valid_field_value?('-123')
193 assert !f.valid_field_value?('6abc')
195 assert !f.valid_field_value?('6abc')
194 end
196 end
195
197
196 def test_float_field_validation
198 def test_float_field_validation
197 f = CustomField.new(:field_format => 'float')
199 f = CustomField.new(:field_format => 'float')
198
200
199 assert f.valid_field_value?(nil)
201 assert f.valid_field_value?(nil)
200 assert f.valid_field_value?('')
202 assert f.valid_field_value?('')
201 assert !f.valid_field_value?(' ')
203 assert !f.valid_field_value?(' ')
202 assert f.valid_field_value?('11.2')
204 assert f.valid_field_value?('11.2')
203 assert f.valid_field_value?('-6.250')
205 assert f.valid_field_value?('-6.250')
204 assert f.valid_field_value?('5')
206 assert f.valid_field_value?('5')
205 assert !f.valid_field_value?('6abc')
207 assert !f.valid_field_value?('6abc')
206 end
208 end
207
209
208 def test_multi_field_validation
210 def test_multi_field_validation
209 f = CustomField.new(:field_format => 'list', :multiple => 'true', :possible_values => ['value1', 'value2'])
211 f = CustomField.new(:field_format => 'list', :multiple => 'true', :possible_values => ['value1', 'value2'])
210
212
211 assert f.valid_field_value?(nil)
213 assert f.valid_field_value?(nil)
212 assert f.valid_field_value?('')
214 assert f.valid_field_value?('')
213 assert !f.valid_field_value?(' ')
215 assert !f.valid_field_value?(' ')
214 assert f.valid_field_value?([])
216 assert f.valid_field_value?([])
215 assert f.valid_field_value?([nil])
217 assert f.valid_field_value?([nil])
216 assert f.valid_field_value?([''])
218 assert f.valid_field_value?([''])
217 assert !f.valid_field_value?([' '])
219 assert !f.valid_field_value?([' '])
218
220
219 assert f.valid_field_value?('value2')
221 assert f.valid_field_value?('value2')
220 assert !f.valid_field_value?('abc')
222 assert !f.valid_field_value?('abc')
221
223
222 assert f.valid_field_value?(['value2'])
224 assert f.valid_field_value?(['value2'])
223 assert !f.valid_field_value?(['abc'])
225 assert !f.valid_field_value?(['abc'])
224
226
225 assert f.valid_field_value?(['', 'value2'])
227 assert f.valid_field_value?(['', 'value2'])
226 assert !f.valid_field_value?(['', 'abc'])
228 assert !f.valid_field_value?(['', 'abc'])
227
229
228 assert f.valid_field_value?(['value1', 'value2'])
230 assert f.valid_field_value?(['value1', 'value2'])
229 assert !f.valid_field_value?(['value1', 'abc'])
231 assert !f.valid_field_value?(['value1', 'abc'])
230 end
232 end
231
233
232 def test_changing_multiple_to_false_should_delete_multiple_values
234 def test_changing_multiple_to_false_should_delete_multiple_values
233 field = ProjectCustomField.create!(:name => 'field', :field_format => 'list', :multiple => 'true', :possible_values => ['field1', 'field2'])
235 field = ProjectCustomField.create!(:name => 'field', :field_format => 'list', :multiple => 'true', :possible_values => ['field1', 'field2'])
234 other = ProjectCustomField.create!(:name => 'other', :field_format => 'list', :multiple => 'true', :possible_values => ['other1', 'other2'])
236 other = ProjectCustomField.create!(:name => 'other', :field_format => 'list', :multiple => 'true', :possible_values => ['other1', 'other2'])
235
237
236 item_with_multiple_values = Project.generate!(:custom_field_values => {field.id => ['field1', 'field2'], other.id => ['other1', 'other2']})
238 item_with_multiple_values = Project.generate!(:custom_field_values => {field.id => ['field1', 'field2'], other.id => ['other1', 'other2']})
237 item_with_single_values = Project.generate!(:custom_field_values => {field.id => ['field1'], other.id => ['other2']})
239 item_with_single_values = Project.generate!(:custom_field_values => {field.id => ['field1'], other.id => ['other2']})
238
240
239 assert_difference 'CustomValue.count', -1 do
241 assert_difference 'CustomValue.count', -1 do
240 field.multiple = false
242 field.multiple = false
241 field.save!
243 field.save!
242 end
244 end
243
245
244 item_with_multiple_values = Project.find(item_with_multiple_values.id)
246 item_with_multiple_values = Project.find(item_with_multiple_values.id)
245 assert_kind_of String, item_with_multiple_values.custom_field_value(field)
247 assert_kind_of String, item_with_multiple_values.custom_field_value(field)
246 assert_kind_of Array, item_with_multiple_values.custom_field_value(other)
248 assert_kind_of Array, item_with_multiple_values.custom_field_value(other)
247 assert_equal 2, item_with_multiple_values.custom_field_value(other).size
249 assert_equal 2, item_with_multiple_values.custom_field_value(other).size
248 end
250 end
249
251
250 def test_value_class_should_return_the_class_used_for_fields_values
252 def test_value_class_should_return_the_class_used_for_fields_values
251 assert_equal User, CustomField.new(:field_format => 'user').value_class
253 assert_equal User, CustomField.new(:field_format => 'user').value_class
252 assert_equal Version, CustomField.new(:field_format => 'version').value_class
254 assert_equal Version, CustomField.new(:field_format => 'version').value_class
253 end
255 end
254
256
255 def test_value_class_should_return_nil_for_other_fields
257 def test_value_class_should_return_nil_for_other_fields
256 assert_nil CustomField.new(:field_format => 'text').value_class
258 assert_nil CustomField.new(:field_format => 'text').value_class
257 assert_nil CustomField.new.value_class
259 assert_nil CustomField.new.value_class
258 end
260 end
259
261
260 def test_value_from_keyword_for_list_custom_field
262 def test_value_from_keyword_for_list_custom_field
261 field = CustomField.find(1)
263 field = CustomField.find(1)
262 assert_equal 'PostgreSQL', field.value_from_keyword('postgresql', Issue.find(1))
264 assert_equal 'PostgreSQL', field.value_from_keyword('postgresql', Issue.find(1))
263 end
265 end
264
266
265 def test_visibile_scope_with_admin_should_return_all_custom_fields
267 def test_visibile_scope_with_admin_should_return_all_custom_fields
266 admin = User.generate! {|user| user.admin = true}
268 admin = User.generate! {|user| user.admin = true}
267 CustomField.delete_all
269 CustomField.delete_all
268 fields = [
270 fields = [
269 CustomField.generate!(:visible => true),
271 CustomField.generate!(:visible => true),
270 CustomField.generate!(:visible => false),
272 CustomField.generate!(:visible => false),
271 CustomField.generate!(:visible => false, :role_ids => [1, 3]),
273 CustomField.generate!(:visible => false, :role_ids => [1, 3]),
272 CustomField.generate!(:visible => false, :role_ids => [1, 2]),
274 CustomField.generate!(:visible => false, :role_ids => [1, 2]),
273 ]
275 ]
274
276
275 assert_equal 4, CustomField.visible(admin).count
277 assert_equal 4, CustomField.visible(admin).count
276 end
278 end
277
279
278 def test_visibile_scope_with_non_admin_user_should_return_visible_custom_fields
280 def test_visibile_scope_with_non_admin_user_should_return_visible_custom_fields
279 CustomField.delete_all
281 CustomField.delete_all
280 fields = [
282 fields = [
281 CustomField.generate!(:visible => true),
283 CustomField.generate!(:visible => true),
282 CustomField.generate!(:visible => false),
284 CustomField.generate!(:visible => false),
283 CustomField.generate!(:visible => false, :role_ids => [1, 3]),
285 CustomField.generate!(:visible => false, :role_ids => [1, 3]),
284 CustomField.generate!(:visible => false, :role_ids => [1, 2]),
286 CustomField.generate!(:visible => false, :role_ids => [1, 2]),
285 ]
287 ]
286 user = User.generate!
288 user = User.generate!
287 User.add_to_project(user, Project.first, Role.find(3))
289 User.add_to_project(user, Project.first, Role.find(3))
288
290
289 assert_equal [fields[0], fields[2]], CustomField.visible(user).order("id").to_a
291 assert_equal [fields[0], fields[2]], CustomField.visible(user).order("id").to_a
290 end
292 end
291
293
292 def test_visibile_scope_with_anonymous_user_should_return_visible_custom_fields
294 def test_visibile_scope_with_anonymous_user_should_return_visible_custom_fields
293 CustomField.delete_all
295 CustomField.delete_all
294 fields = [
296 fields = [
295 CustomField.generate!(:visible => true),
297 CustomField.generate!(:visible => true),
296 CustomField.generate!(:visible => false),
298 CustomField.generate!(:visible => false),
297 CustomField.generate!(:visible => false, :role_ids => [1, 3]),
299 CustomField.generate!(:visible => false, :role_ids => [1, 3]),
298 CustomField.generate!(:visible => false, :role_ids => [1, 2]),
300 CustomField.generate!(:visible => false, :role_ids => [1, 2]),
299 ]
301 ]
300
302
301 assert_equal [fields[0]], CustomField.visible(User.anonymous).order("id").to_a
303 assert_equal [fields[0]], CustomField.visible(User.anonymous).order("id").to_a
302 end
304 end
303
305
304 def test_float_cast_blank_value_should_return_nil
306 def test_float_cast_blank_value_should_return_nil
305 field = CustomField.new(:field_format => 'float')
307 field = CustomField.new(:field_format => 'float')
306 assert_equal nil, field.cast_value(nil)
308 assert_equal nil, field.cast_value(nil)
307 assert_equal nil, field.cast_value('')
309 assert_equal nil, field.cast_value('')
308 end
310 end
309
311
310 def test_float_cast_valid_value_should_return_float
312 def test_float_cast_valid_value_should_return_float
311 field = CustomField.new(:field_format => 'float')
313 field = CustomField.new(:field_format => 'float')
312 assert_equal 12.0, field.cast_value('12')
314 assert_equal 12.0, field.cast_value('12')
313 assert_equal 12.5, field.cast_value('12.5')
315 assert_equal 12.5, field.cast_value('12.5')
314 assert_equal 12.5, field.cast_value('+12.5')
316 assert_equal 12.5, field.cast_value('+12.5')
315 assert_equal -12.5, field.cast_value('-12.5')
317 assert_equal -12.5, field.cast_value('-12.5')
316 end
318 end
317 end
319 end
@@ -1,263 +1,264
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2014 Jean-Philippe Lang
2 # Copyright (C) 2006-2014 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 require File.expand_path('../../test_helper', __FILE__)
18 require File.expand_path('../../test_helper', __FILE__)
19
19
20 class ProjectMembersInheritanceTest < ActiveSupport::TestCase
20 class ProjectMembersInheritanceTest < ActiveSupport::TestCase
21 fixtures :roles, :users
21 fixtures :roles, :users,
22 :projects, :trackers, :issue_statuses
22
23
23 def setup
24 def setup
24 @parent = Project.generate!
25 @parent = Project.generate!
25 @member = Member.create!(:principal => User.find(2), :project => @parent, :role_ids => [1, 2])
26 @member = Member.create!(:principal => User.find(2), :project => @parent, :role_ids => [1, 2])
26 assert_equal 2, @member.reload.roles.size
27 assert_equal 2, @member.reload.roles.size
27 end
28 end
28
29
29 def test_project_created_with_inherit_members_disabled_should_not_inherit_members
30 def test_project_created_with_inherit_members_disabled_should_not_inherit_members
30 assert_no_difference 'Member.count' do
31 assert_no_difference 'Member.count' do
31 project = Project.generate_with_parent!(@parent, :inherit_members => false)
32 project = Project.generate_with_parent!(@parent, :inherit_members => false)
32
33
33 assert_equal 0, project.memberships.count
34 assert_equal 0, project.memberships.count
34 end
35 end
35 end
36 end
36
37
37 def test_project_created_with_inherit_members_should_inherit_members
38 def test_project_created_with_inherit_members_should_inherit_members
38 assert_difference 'Member.count', 1 do
39 assert_difference 'Member.count', 1 do
39 project = Project.generate_with_parent!(@parent, :inherit_members => true)
40 project = Project.generate_with_parent!(@parent, :inherit_members => true)
40 project.reload
41 project.reload
41
42
42 assert_equal 1, project.memberships.count
43 assert_equal 1, project.memberships.count
43 member = project.memberships.first
44 member = project.memberships.first
44 assert_equal @member.principal, member.principal
45 assert_equal @member.principal, member.principal
45 assert_equal @member.roles.sort, member.roles.sort
46 assert_equal @member.roles.sort, member.roles.sort
46 end
47 end
47 end
48 end
48
49
49 def test_turning_on_inherit_members_should_inherit_members
50 def test_turning_on_inherit_members_should_inherit_members
50 Project.generate_with_parent!(@parent, :inherit_members => false)
51 Project.generate_with_parent!(@parent, :inherit_members => false)
51
52
52 assert_difference 'Member.count', 1 do
53 assert_difference 'Member.count', 1 do
53 project = Project.order('id desc').first
54 project = Project.order('id desc').first
54 project.inherit_members = true
55 project.inherit_members = true
55 project.save!
56 project.save!
56 project.reload
57 project.reload
57
58
58 assert_equal 1, project.memberships.count
59 assert_equal 1, project.memberships.count
59 member = project.memberships.first
60 member = project.memberships.first
60 assert_equal @member.principal, member.principal
61 assert_equal @member.principal, member.principal
61 assert_equal @member.roles.sort, member.roles.sort
62 assert_equal @member.roles.sort, member.roles.sort
62 end
63 end
63 end
64 end
64
65
65 def test_turning_off_inherit_members_should_remove_inherited_members
66 def test_turning_off_inherit_members_should_remove_inherited_members
66 Project.generate_with_parent!(@parent, :inherit_members => true)
67 Project.generate_with_parent!(@parent, :inherit_members => true)
67
68
68 assert_difference 'Member.count', -1 do
69 assert_difference 'Member.count', -1 do
69 project = Project.order('id desc').first
70 project = Project.order('id desc').first
70 project.inherit_members = false
71 project.inherit_members = false
71 project.save!
72 project.save!
72 project.reload
73 project.reload
73
74
74 assert_equal 0, project.memberships.count
75 assert_equal 0, project.memberships.count
75 end
76 end
76 end
77 end
77
78
78 def test_moving_a_root_project_under_a_parent_should_inherit_members
79 def test_moving_a_root_project_under_a_parent_should_inherit_members
79 Project.generate!(:inherit_members => true)
80 Project.generate!(:inherit_members => true)
80 project = Project.order('id desc').first
81 project = Project.order('id desc').first
81
82
82 assert_difference 'Member.count', 1 do
83 assert_difference 'Member.count', 1 do
83 project.set_parent!(@parent)
84 project.set_parent!(@parent)
84 project.reload
85 project.reload
85
86
86 assert_equal 1, project.memberships.count
87 assert_equal 1, project.memberships.count
87 member = project.memberships.first
88 member = project.memberships.first
88 assert_equal @member.principal, member.principal
89 assert_equal @member.principal, member.principal
89 assert_equal @member.roles.sort, member.roles.sort
90 assert_equal @member.roles.sort, member.roles.sort
90 end
91 end
91 end
92 end
92
93
93 def test_moving_a_subproject_as_root_should_loose_inherited_members
94 def test_moving_a_subproject_as_root_should_loose_inherited_members
94 Project.generate_with_parent!(@parent, :inherit_members => true)
95 Project.generate_with_parent!(@parent, :inherit_members => true)
95 project = Project.order('id desc').first
96 project = Project.order('id desc').first
96
97
97 assert_difference 'Member.count', -1 do
98 assert_difference 'Member.count', -1 do
98 project.set_parent!(nil)
99 project.set_parent!(nil)
99 project.reload
100 project.reload
100
101
101 assert_equal 0, project.memberships.count
102 assert_equal 0, project.memberships.count
102 end
103 end
103 end
104 end
104
105
105 def test_moving_a_subproject_to_another_parent_should_change_inherited_members
106 def test_moving_a_subproject_to_another_parent_should_change_inherited_members
106 other_parent = Project.generate!
107 other_parent = Project.generate!
107 other_member = Member.create!(:principal => User.find(4), :project => other_parent, :role_ids => [3])
108 other_member = Member.create!(:principal => User.find(4), :project => other_parent, :role_ids => [3])
108 other_member.reload
109 other_member.reload
109
110
110 Project.generate_with_parent!(@parent, :inherit_members => true)
111 Project.generate_with_parent!(@parent, :inherit_members => true)
111 project = Project.order('id desc').first
112 project = Project.order('id desc').first
112 project.set_parent!(other_parent.reload)
113 project.set_parent!(other_parent.reload)
113 project.reload
114 project.reload
114
115
115 assert_equal 1, project.memberships.count
116 assert_equal 1, project.memberships.count
116 member = project.memberships.first
117 member = project.memberships.first
117 assert_equal other_member.principal, member.principal
118 assert_equal other_member.principal, member.principal
118 assert_equal other_member.roles.sort, member.roles.sort
119 assert_equal other_member.roles.sort, member.roles.sort
119 end
120 end
120
121
121 def test_inheritance_should_propagate_to_subprojects
122 def test_inheritance_should_propagate_to_subprojects
122 project = Project.generate_with_parent!(@parent, :inherit_members => false)
123 project = Project.generate_with_parent!(@parent, :inherit_members => false)
123 subproject = Project.generate_with_parent!(project, :inherit_members => true)
124 subproject = Project.generate_with_parent!(project, :inherit_members => true)
124 project.reload
125 project.reload
125
126
126 assert_difference 'Member.count', 2 do
127 assert_difference 'Member.count', 2 do
127 project.inherit_members = true
128 project.inherit_members = true
128 project.save
129 project.save
129 project.reload
130 project.reload
130 subproject.reload
131 subproject.reload
131
132
132 assert_equal 1, project.memberships.count
133 assert_equal 1, project.memberships.count
133 assert_equal 1, subproject.memberships.count
134 assert_equal 1, subproject.memberships.count
134 member = subproject.memberships.first
135 member = subproject.memberships.first
135 assert_equal @member.principal, member.principal
136 assert_equal @member.principal, member.principal
136 assert_equal @member.roles.sort, member.roles.sort
137 assert_equal @member.roles.sort, member.roles.sort
137 end
138 end
138 end
139 end
139
140
140 def test_inheritance_removal_should_propagate_to_subprojects
141 def test_inheritance_removal_should_propagate_to_subprojects
141 project = Project.generate_with_parent!(@parent, :inherit_members => true)
142 project = Project.generate_with_parent!(@parent, :inherit_members => true)
142 subproject = Project.generate_with_parent!(project, :inherit_members => true)
143 subproject = Project.generate_with_parent!(project, :inherit_members => true)
143 project.reload
144 project.reload
144
145
145 assert_difference 'Member.count', -2 do
146 assert_difference 'Member.count', -2 do
146 project.inherit_members = false
147 project.inherit_members = false
147 project.save
148 project.save
148 project.reload
149 project.reload
149 subproject.reload
150 subproject.reload
150
151
151 assert_equal 0, project.memberships.count
152 assert_equal 0, project.memberships.count
152 assert_equal 0, subproject.memberships.count
153 assert_equal 0, subproject.memberships.count
153 end
154 end
154 end
155 end
155
156
156 def test_adding_a_member_should_propagate
157 def test_adding_a_member_should_propagate
157 project = Project.generate_with_parent!(@parent, :inherit_members => true)
158 project = Project.generate_with_parent!(@parent, :inherit_members => true)
158
159
159 assert_difference 'Member.count', 2 do
160 assert_difference 'Member.count', 2 do
160 member = Member.create!(:principal => User.find(4), :project => @parent, :role_ids => [1, 3])
161 member = Member.create!(:principal => User.find(4), :project => @parent, :role_ids => [1, 3])
161 member.reload
162 member.reload
162
163
163 inherited_member = project.memberships.order('id desc').first
164 inherited_member = project.memberships.order('id desc').first
164 assert_equal member.principal, inherited_member.principal
165 assert_equal member.principal, inherited_member.principal
165 assert_equal member.roles.sort, inherited_member.roles.sort
166 assert_equal member.roles.sort, inherited_member.roles.sort
166 end
167 end
167 end
168 end
168
169
169 def test_adding_a_member_should_not_propagate_if_child_does_not_inherit
170 def test_adding_a_member_should_not_propagate_if_child_does_not_inherit
170 project = Project.generate_with_parent!(@parent, :inherit_members => false)
171 project = Project.generate_with_parent!(@parent, :inherit_members => false)
171
172
172 assert_difference 'Member.count', 1 do
173 assert_difference 'Member.count', 1 do
173 member = Member.create!(:principal => User.find(4), :project => @parent, :role_ids => [1, 3])
174 member = Member.create!(:principal => User.find(4), :project => @parent, :role_ids => [1, 3])
174
175
175 assert_nil project.reload.memberships.detect {|m| m.principal == member.principal}
176 assert_nil project.reload.memberships.detect {|m| m.principal == member.principal}
176 end
177 end
177 end
178 end
178
179
179 def test_removing_a_member_should_propagate
180 def test_removing_a_member_should_propagate
180 project = Project.generate_with_parent!(@parent, :inherit_members => true)
181 project = Project.generate_with_parent!(@parent, :inherit_members => true)
181
182
182 assert_difference 'Member.count', -2 do
183 assert_difference 'Member.count', -2 do
183 @member.reload.destroy
184 @member.reload.destroy
184 project.reload
185 project.reload
185
186
186 assert_equal 0, project.memberships.count
187 assert_equal 0, project.memberships.count
187 end
188 end
188 end
189 end
189
190
190 def test_adding_a_group_member_should_propagate_with_its_users
191 def test_adding_a_group_member_should_propagate_with_its_users
191 project = Project.generate_with_parent!(@parent, :inherit_members => true)
192 project = Project.generate_with_parent!(@parent, :inherit_members => true)
192 group = Group.generate!
193 group = Group.generate!
193 user = User.find(4)
194 user = User.find(4)
194 group.users << user
195 group.users << user
195
196
196 assert_difference 'Member.count', 4 do
197 assert_difference 'Member.count', 4 do
197 assert_difference 'MemberRole.count', 8 do
198 assert_difference 'MemberRole.count', 8 do
198 member = Member.create!(:principal => group, :project => @parent, :role_ids => [1, 3])
199 member = Member.create!(:principal => group, :project => @parent, :role_ids => [1, 3])
199 project.reload
200 project.reload
200 member.reload
201 member.reload
201
202
202 inherited_group_member = project.memberships.detect {|m| m.principal == group}
203 inherited_group_member = project.memberships.detect {|m| m.principal == group}
203 assert_not_nil inherited_group_member
204 assert_not_nil inherited_group_member
204 assert_equal member.roles.sort, inherited_group_member.roles.sort
205 assert_equal member.roles.sort, inherited_group_member.roles.sort
205
206
206 inherited_user_member = project.memberships.detect {|m| m.principal == user}
207 inherited_user_member = project.memberships.detect {|m| m.principal == user}
207 assert_not_nil inherited_user_member
208 assert_not_nil inherited_user_member
208 assert_equal member.roles.sort, inherited_user_member.roles.sort
209 assert_equal member.roles.sort, inherited_user_member.roles.sort
209 end
210 end
210 end
211 end
211 end
212 end
212
213
213 def test_removing_a_group_member_should_propagate
214 def test_removing_a_group_member_should_propagate
214 project = Project.generate_with_parent!(@parent, :inherit_members => true)
215 project = Project.generate_with_parent!(@parent, :inherit_members => true)
215 group = Group.generate!
216 group = Group.generate!
216 user = User.find(4)
217 user = User.find(4)
217 group.users << user
218 group.users << user
218 member = Member.create!(:principal => group, :project => @parent, :role_ids => [1, 3])
219 member = Member.create!(:principal => group, :project => @parent, :role_ids => [1, 3])
219
220
220 assert_difference 'Member.count', -4 do
221 assert_difference 'Member.count', -4 do
221 assert_difference 'MemberRole.count', -8 do
222 assert_difference 'MemberRole.count', -8 do
222 member.destroy
223 member.destroy
223 project.reload
224 project.reload
224
225
225 inherited_group_member = project.memberships.detect {|m| m.principal == group}
226 inherited_group_member = project.memberships.detect {|m| m.principal == group}
226 assert_nil inherited_group_member
227 assert_nil inherited_group_member
227
228
228 inherited_user_member = project.memberships.detect {|m| m.principal == user}
229 inherited_user_member = project.memberships.detect {|m| m.principal == user}
229 assert_nil inherited_user_member
230 assert_nil inherited_user_member
230 end
231 end
231 end
232 end
232 end
233 end
233
234
234 def test_adding_user_who_use_is_already_a_member_to_parent_project_should_merge_roles
235 def test_adding_user_who_use_is_already_a_member_to_parent_project_should_merge_roles
235 project = Project.generate_with_parent!(@parent, :inherit_members => true)
236 project = Project.generate_with_parent!(@parent, :inherit_members => true)
236 user = User.find(4)
237 user = User.find(4)
237 Member.create!(:principal => user, :project => project, :role_ids => [1, 2])
238 Member.create!(:principal => user, :project => project, :role_ids => [1, 2])
238
239
239 assert_difference 'Member.count', 1 do
240 assert_difference 'Member.count', 1 do
240 Member.create!(:principal => User.find(4), :project => @parent.reload, :role_ids => [1, 3])
241 Member.create!(:principal => User.find(4), :project => @parent.reload, :role_ids => [1, 3])
241
242
242 member = project.reload.memberships.detect {|m| m.principal == user}
243 member = project.reload.memberships.detect {|m| m.principal == user}
243 assert_not_nil member
244 assert_not_nil member
244 assert_equal [1, 2, 3], member.roles.uniq.sort.map(&:id)
245 assert_equal [1, 2, 3], member.roles.uniq.sort.map(&:id)
245 end
246 end
246 end
247 end
247
248
248 def test_turning_on_inheritance_with_user_who_is_already_a_member_should_merge_roles
249 def test_turning_on_inheritance_with_user_who_is_already_a_member_should_merge_roles
249 project = Project.generate_with_parent!(@parent)
250 project = Project.generate_with_parent!(@parent)
250 user = @member.user
251 user = @member.user
251 Member.create!(:principal => user, :project => project, :role_ids => [1, 3])
252 Member.create!(:principal => user, :project => project, :role_ids => [1, 3])
252 project.reload
253 project.reload
253
254
254 assert_no_difference 'Member.count' do
255 assert_no_difference 'Member.count' do
255 project.inherit_members = true
256 project.inherit_members = true
256 project.save!
257 project.save!
257
258
258 member = project.reload.memberships.detect {|m| m.principal == user}
259 member = project.reload.memberships.detect {|m| m.principal == user}
259 assert_not_nil member
260 assert_not_nil member
260 assert_equal [1, 2, 3], member.roles.uniq.sort.map(&:id)
261 assert_equal [1, 2, 3], member.roles.uniq.sort.map(&:id)
261 end
262 end
262 end
263 end
263 end
264 end
General Comments 0
You need to be logged in to leave comments. Login now