Skip to content

Commit 12e060f

Browse files
committed
Adds test to Ecto fields of type {:map, :float}
Signed-off-by: Tallys Martins <[email protected]>
1 parent fbcfa0b commit 12e060f

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed

test/elixir_bench/repo_test.exs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
defmodule ElixirBench.RepoTest do
2+
alias ElixirBench.Repo
3+
alias ElixirBench.Benchmarks
4+
use ElixirBench.DataCase
5+
6+
defmodule RepoMeasurement do
7+
use Ecto.Schema
8+
import Ecto.Changeset
9+
10+
schema "repo_measurements" do
11+
field :map_float_percentiles, {:map, :float}
12+
field :map_percentiles, :map
13+
end
14+
15+
@fields [:map_float_percentiles, :map_percentiles]
16+
def changeset(%RepoMeasurement{} = measurement, attrs) do
17+
measurement
18+
|> cast(attrs, @fields)
19+
end
20+
end
21+
22+
defmodule CreateMeasurementMigration do
23+
use Ecto.Migration
24+
25+
def change do
26+
create table(:repo_measurements) do
27+
add(:map_float_percentiles, {:map, :float})
28+
add(:map_percentiles, :map)
29+
end
30+
end
31+
end
32+
33+
# A bug in ecto with {:map, :float} fields
34+
# See discussions in https://github.com/elixir-ecto/ecto/issues/2637
35+
# This test will let us know when the bug is fixed in future updates of ecto,
36+
# after that we can remove this
37+
38+
test "raise when exponential notation is given to field of type {:map, :float}" do
39+
:ok = Ecto.Migrator.up(Repo, 0, CreateMeasurementMigration, log: false)
40+
{value, _} = Float.parse("416500")
41+
assert ^value = 4.165e5
42+
43+
percentiles = %{"50" => value, "99" => value}
44+
45+
changeset =
46+
RepoMeasurement.changeset(%RepoMeasurement{}, %{"map_float_percentiles" => percentiles})
47+
48+
assert {:ok, _} = Repo.insert(changeset)
49+
50+
assert_raise ArgumentError,
51+
~r/cannot load `%{"50" => 416500, "99" => 416500}` as type {:map, :float} for field `map_float_percentiles`/,
52+
fn ->
53+
Repo.all(RepoMeasurement)
54+
end
55+
56+
:ok = Ecto.Migrator.down(Repo, 0, CreateMeasurementMigration, log: false)
57+
end
58+
59+
test "not raise when float notation is given for field of type {:map, :float}" do
60+
:ok = Ecto.Migrator.up(Repo, 0, CreateMeasurementMigration, log: false)
61+
percentiles = %{"50" => 4101.0, "99" => 4160.0}
62+
63+
changeset =
64+
RepoMeasurement.changeset(%RepoMeasurement{}, %{"map_float_percentiles" => percentiles})
65+
66+
assert {:ok, measurement} = Repo.insert(changeset)
67+
^measurement = Repo.one(RepoMeasurement)
68+
69+
assert %{"50" => 4101.0, "99" => 4160.0} = measurement.map_float_percentiles
70+
:ok = Ecto.Migrator.down(Repo, 0, CreateMeasurementMigration, log: false)
71+
end
72+
73+
test "not raise when exponential notation is given to field of type :map" do
74+
:ok = Ecto.Migrator.up(Repo, 0, CreateMeasurementMigration, log: false)
75+
percentiles = %{"50" => 4.165e5, "99" => 4.165e5}
76+
changeset = RepoMeasurement.changeset(%RepoMeasurement{}, %{"map_percentiles" => percentiles})
77+
assert {:ok, _} = Repo.insert(changeset)
78+
79+
measurement = Repo.one(RepoMeasurement)
80+
assert %{"50" => 416_500, "99" => 416_500} = measurement.map_percentiles
81+
:ok = Ecto.Migrator.down(Repo, 0, CreateMeasurementMigration, log: false)
82+
end
83+
end

0 commit comments

Comments
 (0)