Skip to content

Commit

Permalink
Cast PostgreSQL's timestamptz columns to time (#1325)
Browse files Browse the repository at this point in the history
* Cast PostgreSQL's :timestamptz to time

* Add basic Nodes::Value specs (Cast PostgreSQL's timestamptz columns to time)
  • Loading branch information
lucasfais authored May 23, 2022
1 parent 49b8311 commit 5d2bb20
Show file tree
Hide file tree
Showing 2 changed files with 116 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/ransack/nodes/value.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ def cast(type)
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)
Expand Down
115 changes: 115 additions & 0 deletions spec/ransack/nodes/value_spec.rb
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 5d2bb20

Please sign in to comment.