Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cast PostgreSQL's timestamptz columns to time #1325

Merged
merged 2 commits into from
May 23, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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