From 27d6abfa35dbc57bdaa8110578b4f91768df47f3 Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Fri, 17 Apr 2015 10:38:13 +0200 Subject: [PATCH 1/3] add integrative tests for typed_value for booleans first charge of tests. I intend those to fail for postgres, but can't verify that locally, so travis will have to do it for me. If you see this build failing for the newly added specs: This is intentional! --- spec/models/custom_value_spec.rb | 58 ++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 spec/models/custom_value_spec.rb diff --git a/spec/models/custom_value_spec.rb b/spec/models/custom_value_spec.rb new file mode 100644 index 0000000000..f8fd6d6c0b --- /dev/null +++ b/spec/models/custom_value_spec.rb @@ -0,0 +1,58 @@ +#-- copyright +# OpenProject is a project management system. +# Copyright (C) 2012-2015 the OpenProject Foundation (OPF) +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +require 'spec_helper' + +describe CustomValue do + let(:format) { 'bool' } + let(:custom_field) { FactoryGirl.create(:custom_field, field_format: format) } + subject { FactoryGirl.create(:custom_value, custom_field: custom_field, value: value) } + + describe '#typed_value' do + before do + # we are testing the database-side integratively here + # databases might choose to store values in weird and unexpected formats (e.g. booleans) + subject.reload + end + + describe 'boolean custom value' do + let(:format) { 'bool' } + let(:value) { true } + + context 'is true' do + it { expect(subject.typed_value).to eql(true) } + end + + context 'is false' do + let(:value) { false } + + it { expect(subject.typed_value).to eql(false) } + end + end + end +end From 60ca7791118b8e933a5d68d5b96603d4f2441f6b Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Fri, 17 Apr 2015 11:12:03 +0200 Subject: [PATCH 2/3] make transform to boolean more database resistant PostgreSQL has many representations for bool: http://www.postgresql.org/docs/9.1/static/datatype-boolean.html --- app/models/custom_value/bool_strategy.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/custom_value/bool_strategy.rb b/app/models/custom_value/bool_strategy.rb index 5bc05ae3b0..49e70ce0cb 100644 --- a/app/models/custom_value/bool_strategy.rb +++ b/app/models/custom_value/bool_strategy.rb @@ -37,7 +37,7 @@ class CustomValue::BoolStrategy < CustomValue::FormatStrategy def typed_value return nil unless value_present? - value == '1' || value == true + ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value) end def validate_type_of_value From 8e1970b9bb0b360f4e0b8b375ec6d7b9d71ede3e Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Fri, 17 Apr 2015 11:12:31 +0200 Subject: [PATCH 3/3] add roundtrip tests for more datatypes --- spec/models/custom_value_spec.rb | 42 +++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/spec/models/custom_value_spec.rb b/spec/models/custom_value_spec.rb index f8fd6d6c0b..667f0c5cfd 100644 --- a/spec/models/custom_value_spec.rb +++ b/spec/models/custom_value_spec.rb @@ -35,8 +35,8 @@ describe CustomValue do describe '#typed_value' do before do - # we are testing the database-side integratively here - # databases might choose to store values in weird and unexpected formats (e.g. booleans) + # we are testing roundtrips through the database here + # the databases might choose to store values in weird and unexpected formats (e.g. booleans) subject.reload end @@ -45,14 +45,48 @@ describe CustomValue do let(:value) { true } context 'is true' do - it { expect(subject.typed_value).to eql(true) } + it { expect(subject.typed_value).to eql(value) } end context 'is false' do let(:value) { false } - it { expect(subject.typed_value).to eql(false) } + it { expect(subject.typed_value).to eql(value) } end + + context 'is nil' do + let(:value) { nil } + + it { expect(subject.typed_value).to eql(value) } + end + end + + describe 'integer custom value' do + let(:format) { 'string' } + let(:value) { 'This is a string!' } + + it { expect(subject.typed_value).to eql(value) } + end + + describe 'integer custom value' do + let(:format) { 'int' } + let(:value) { 123 } + + it { expect(subject.typed_value).to eql(value) } + end + + describe 'float custom value' do + let(:format) { 'float' } + let(:value) { 3.147 } + + it { expect(subject.typed_value).to eql(value) } + end + + describe 'date custom value' do + let(:format) { 'date' } + let(:value) { Date.today } + + it { expect(subject.typed_value).to eql(value) } end end end