From 5d2bb20e830dd324b6f9d3ef82786d1509742545 Mon Sep 17 00:00:00 2001 From: Lucas Fais Date: Mon, 23 May 2022 16:38:32 -0300 Subject: [PATCH] Cast PostgreSQL's timestamptz columns to time (#1325) * Cast PostgreSQL's :timestamptz to time * Add basic Nodes::Value specs (Cast PostgreSQL's timestamptz columns to time) --- lib/ransack/nodes/value.rb | 2 +- spec/ransack/nodes/value_spec.rb | 115 +++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 spec/ransack/nodes/value_spec.rb diff --git a/lib/ransack/nodes/value.rb b/lib/ransack/nodes/value.rb index f232d60..76b5c93 100644 --- a/lib/ransack/nodes/value.rb +++ b/lib/ransack/nodes/value.rb @@ -26,7 +26,7 @@ module Ransack case type when :date cast_to_date(value) - when :datetime, :timestamp, :time + when :datetime, :timestamp, :time, :timestamptz cast_to_time(value) when :boolean cast_to_boolean(value) diff --git a/spec/ransack/nodes/value_spec.rb b/spec/ransack/nodes/value_spec.rb new file mode 100644 index 0000000..f74040d --- /dev/null +++ b/spec/ransack/nodes/value_spec.rb @@ -0,0 +1,115 @@ +require 'spec_helper' + +module Ransack + module Nodes + describe Value do + let(:context) { Context.for(Person) } + + subject do + Value.new(context, raw_value) + end + + context "with a date value" do + let(:raw_value) { "2022-05-23" } + + [:date].each do |type| + it "should cast #{type} correctly" do + result = subject.cast(type) + + expect(result).to be_a_kind_of(Date) + expect(result).to eq(Date.parse(raw_value)) + end + end + end + + context "with a timestamp value" do + let(:raw_value) { "2022-05-23 10:40:02 -0400" } + + [:datetime, :timestamp, :time, :timestamptz].each do |type| + it "should cast #{type} correctly" do + result = subject.cast(type) + + expect(result).to be_a_kind_of(Time) + expect(result).to eq(Time.zone.parse(raw_value)) + end + end + end + + Constants::TRUE_VALUES.each do |value| + context "with a true boolean value (#{value})" do + let(:raw_value) { value.to_s } + + it "should cast boolean correctly" do + result = subject.cast(:boolean) + expect(result).to eq(true) + end + end + end + + Constants::FALSE_VALUES.each do |value| + context "with a false boolean value (#{value})" do + let(:raw_value) { value.to_s } + + it "should cast boolean correctly" do + result = subject.cast(:boolean) + + expect(result).to eq(false) + end + end + end + + ["12", "101.5"].each do |value| + context "with an integer value (#{value})" do + let(:raw_value) { value } + + it "should cast #{value} to integer correctly" do + result = subject.cast(:integer) + + expect(result).to be_an(Integer) + expect(result).to eq(value.to_i) + end + end + end + + ["12", "101.5"].each do |value| + context "with a float value (#{value})" do + let(:raw_value) { value } + + it "should cast #{value} to float correctly" do + result = subject.cast(:float) + + expect(result).to be_an(Float) + expect(result).to eq(value.to_f) + end + end + end + + ["12", "101.5"].each do |value| + context "with a decimal value (#{value})" do + let(:raw_value) { value } + + it "should cast #{value} to decimal correctly" do + result = subject.cast(:decimal) + + expect(result).to be_a(BigDecimal) + expect(result).to eq(value.to_d) + end + end + end + + ["12", "101.513"].each do |value| + context "with a money value (#{value})" do + let(:raw_value) { value } + + it "should cast #{value} to money correctly" do + result = subject.cast(:money) + + expect(result).to be_a(String) + expect(result).to eq(value.to_f.to_s) + end + end + end + + end + end +end