annotate .svn/pristine/c5/c5d7758e547d0bfbbce3e5c93eb387772d220785.svn-base @ 1613:90bed4e10cc8 deploy

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