|
| 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