From a16ce2b9ddc7a479ccdb9f8a40fce98226381487 Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Fri, 6 Mar 2026 13:30:30 -0600 Subject: [PATCH] feat: add decimal type support to ApplicationSetting --- lib/towerops/settings/application_setting.ex | 9 ++++++++- test/towerops/settings_test.exs | 21 ++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/towerops/settings/application_setting.ex b/lib/towerops/settings/application_setting.ex index e5c5d2fa..d8efa463 100644 --- a/lib/towerops/settings/application_setting.ex +++ b/lib/towerops/settings/application_setting.ex @@ -35,7 +35,7 @@ defmodule Towerops.Settings.ApplicationSetting do setting |> cast(attrs, [:key, :value, :value_type, :description]) |> validate_required([:key, :value_type]) - |> validate_inclusion(:value_type, ["string", "integer", "uuid", "boolean", "json"]) + |> validate_inclusion(:value_type, ["string", "integer", "uuid", "boolean", "json", "decimal"]) |> unique_constraint(:key) end @@ -72,4 +72,11 @@ defmodule Towerops.Settings.ApplicationSetting do {:error, _} -> nil end end + + def parse_value(%__MODULE__{value: value, value_type: "decimal"}) do + case Decimal.parse(value) do + {decimal, _remainder} -> decimal + :error -> nil + end + end end diff --git a/test/towerops/settings_test.exs b/test/towerops/settings_test.exs index c96bb33c..ec51b83b 100644 --- a/test/towerops/settings_test.exs +++ b/test/towerops/settings_test.exs @@ -50,6 +50,27 @@ defmodule Towerops.SettingsTest do {:ok, _setting} = create_setting("test_invalid_json", "not json", "json") assert Settings.get_setting("test_invalid_json") == nil end + + test "parses decimal values correctly" do + {:ok, _setting} = create_setting("test_decimal", "123.45", "decimal") + + result = Settings.get_setting("test_decimal") + assert result == Decimal.new("123.45") + assert %Decimal{} = result + end + + test "returns nil for invalid decimal" do + {:ok, _setting} = create_setting("test_invalid_decimal", "not_a_number", "decimal") + + assert Settings.get_setting("test_invalid_decimal") == nil + end + + test "parses decimal with remainder correctly" do + {:ok, _setting} = create_setting("test_decimal_remainder", "123.45abc", "decimal") + + # Decimal.parse stops at invalid chars, returns parsed portion + assert Settings.get_setting("test_decimal_remainder") == Decimal.new("123.45") + end end describe "get_setting_record/1" do