Skip to content
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
55 changes: 47 additions & 8 deletions lib/fino/settings/numeric.rb
Original file line number Diff line number Diff line change
Expand Up @@ -47,17 +47,56 @@ def base_factor
end
end

class Minutes < Generic
include Time

def initialize = super("Minutes", "min")

def base_factor
60
end
end

class Hours < Generic
include Time

def initialize = super("Hours", "hour")

def base_factor
3600
end
end

class Days < Generic
include Time

def initialize = super("Days", "day")

def base_factor
86_400
end
end

UNITS = {
"ms" => Milliseconds,
"milliseconds" => Milliseconds,
"sec" => Seconds,
"seconds" => Seconds,
"min" => Minutes,
"minutes" => Minutes,
"hour" => Hours,
"hours" => Hours,
"day" => Days,
"days" => Days
}.freeze

module_function

def for(identifier)
case identifier.to_s
when "ms", "milliseconds"
Milliseconds.new
when "sec", "seconds"
Seconds.new
else
Generic.new(identifier.to_s.capitalize)
end
klass = UNITS[identifier.to_s]
return klass.new if klass

Generic.new(identifier.to_s.capitalize)
end
end

Expand Down
46 changes: 46 additions & 0 deletions spec/fino/settings/numeric_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,30 @@
expect(described_class.for("seconds")).to be_a(described_class::Seconds)
end

it "returns Minutes for 'min'" do
expect(described_class.for("min")).to be_a(described_class::Minutes)
end

it "returns Minutes for 'minutes'" do
expect(described_class.for("minutes")).to be_a(described_class::Minutes)
end

it "returns Hours for 'hour'" do
expect(described_class.for("hour")).to be_a(described_class::Hours)
end

it "returns Hours for 'hours'" do
expect(described_class.for("hours")).to be_a(described_class::Hours)
end

it "returns Days for 'day'" do
expect(described_class.for("day")).to be_a(described_class::Days)
end

it "returns Days for 'days'" do
expect(described_class.for("days")).to be_a(described_class::Days)
end

it "returns Generic for unknown identifiers" do
unit = described_class.for("requests")
expect(unit).to be_a(described_class::Generic)
Expand All @@ -40,6 +64,7 @@
setting :http_read_timeout, :integer, default: 200, unit: :ms
setting :http_open_timeout, :integer, default: 1, unit: :sec
setting :max_retries, :integer, default: 3
setting :cleanup_interval, :integer, default: 30, unit: :day
end

section :rates do
Expand Down Expand Up @@ -90,6 +115,27 @@
expect(setting.value(unit: :ms)).to eq(500.0)
end
end

context "when converting days to seconds" do
it "converts correctly" do
setting = Fino.setting(:cleanup_interval, at: :integration)
expect(setting.value(unit: :sec)).to eq(2_592_000)
end
end

context "when converting days to hours" do
it "converts correctly" do
setting = Fino.setting(:cleanup_interval, at: :integration)
expect(setting.value(unit: :hours)).to eq(720)
end
end

context "when converting days to minutes" do
it "converts correctly" do
setting = Fino.setting(:cleanup_interval, at: :integration)
expect(setting.value(unit: :minutes)).to eq(43_200)
end
end
end

describe "error handling" do
Expand Down
Loading