annotate test/unit/custom_field_test.rb @ 1464:261b3d9a4903 redmine-2.4

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