measure.test.exs (6941B)
1 # Zenflows is designed to implement the Valueflows vocabulary, 2 # written and maintained by srfsh <info@dyne.org>. 3 # Copyright (C) 2021-2023 Dyne.org foundation <foundation@dyne.org>. 4 # 5 # This program is free software: you can redistribute it and/or modify 6 # it under the terms of the GNU Affero General Public License as published by 7 # the Free Software Foundation, either version 3 of the License, or 8 # (at your option) any later version. 9 # 10 # This program is distributed in the hope that it will be useful, 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 # GNU Affero General Public License for more details. 14 # 15 # You should have received a copy of the GNU Affero General Public License 16 # along with this program. If not, see <https://www.gnu.org/licenses/>. 17 18 defmodule ZenflowsTest.VF.Measure do 19 use ZenflowsTest.Help.EctoCase, async: true 20 21 alias Ecto.Changeset 22 alias Zenflows.VF.{Measure, Unit} 23 24 defmodule Dummy do 25 use Ecto.Schema 26 27 alias Ecto.Changeset 28 alias Zenflows.VF.{Measure, Unit} 29 30 embedded_schema do 31 field :quantity, :map, virtual: true 32 belongs_to :quantity_has_unit, Unit 33 field :quantity_has_numerical_value, :decimal 34 end 35 36 def changeset(params) do 37 %__MODULE__{} 38 |> common(params) 39 |> Map.put(:action, :insert) 40 end 41 42 def changeset(schema, params) do 43 schema 44 |> common(params) 45 |> Map.put(:action, :update) 46 end 47 48 defp common(schema, params) do 49 schema 50 |> Changeset.cast(params, [:quantity]) 51 |> Measure.cast(:quantity) 52 end 53 end 54 55 setup do 56 %{ 57 params: %{ 58 has_unit_id: Factory.insert!(:unit).id, 59 has_numerical_value: Factory.decimal(), 60 }, 61 inserted: %Dummy{ 62 quantity_has_unit_id: Factory.insert!(:unit).id, 63 quantity_has_numerical_value: Factory.decimal(), 64 }, 65 } 66 end 67 68 test "insert", %{params: params} do 69 # no changes when params is `%{}` 70 assert %Changeset{valid?: true, changes: %{}} = Dummy.changeset(%{}) 71 72 # fields are nil when `:quantity` is `nil` 73 assert %Changeset{valid?: true, changes: chgs} = Dummy.changeset(%{quantity: nil}) 74 assert chgs.quantity_has_unit_id == nil 75 assert chgs.quantity_has_numerical_value == nil 76 77 # fields are properly set when `:quantity` is properly set 78 assert %Changeset{valid?: true, changes: chgs} = Dummy.changeset(%{quantity: params}) 79 assert chgs.quantity_has_unit_id == params.has_unit_id 80 assert Decimal.eq?(chgs.quantity_has_numerical_value, params.has_numerical_value) 81 82 # `:has_numerical_value` must be positive 83 assert %Changeset{valid?: false, errors: errs} 84 = Dummy.changeset(%{quantity: Map.put(params, :has_numerical_value, 0)}) 85 assert length(Keyword.get_values(errs, :quantity)) == 1 86 assert %Changeset{valid?: false, errors: errs} 87 = Dummy.changeset(%{quantity: Map.put(params, :has_numerical_value, -1)}) 88 assert length(Keyword.get_values(errs, :quantity)) == 1 89 90 # when no fields are provided, no fields are set 91 assert %Changeset{valid?: false, changes: chgs, errors: errs} 92 = Dummy.changeset(%{quantity: %{}}) 93 assert length(Keyword.get_values(errs, :quantity)) == 2 94 refute Map.has_key?(chgs, :quantity_has_unit_id) 95 or Map.has_key?(chgs, :quantity_has_numerical_value) 96 97 # when `:has_unit_id` is `nil`, no fields are set 98 assert %Changeset{valid?: false, changes: chgs, errors: errs} 99 = Dummy.changeset(%{quantity: %{has_unit_id: nil}}) 100 assert length(Keyword.get_values(errs, :quantity)) == 2 101 refute Map.has_key?(chgs, :quantity_has_unit_id) 102 or Map.has_key?(chgs, :quantity_has_numerical_value) 103 104 # when `:has_numerical_value` is `nil`, no fields are set 105 assert %Changeset{valid?: false, changes: %{quantity: _}, errors: errs} 106 = Dummy.changeset(%{quantity: %{has_numerical_value: nil}}) 107 assert length(Keyword.get_values(errs, :quantity)) == 2 108 refute Map.has_key?(chgs, :quantity_has_unit_id) 109 or Map.has_key?(chgs, :quantity_has_numerical_value) 110 111 # when both fields are `nil`, no fields are set 112 assert %Changeset{valid?: false, changes: %{quantity: _}, errors: errs} 113 = Dummy.changeset(%{quantity: %{has_unit_id: nil, has_numerical_value: nil}}) 114 assert length(Keyword.get_values(errs, :quantity)) == 2 115 refute Map.has_key?(chgs, :quantity_has_unit_id) 116 or Map.has_key?(chgs, :quantity_has_numerical_value) 117 end 118 119 test "update", %{params: params, inserted: schema} do 120 # no changes when params is `%{}` 121 assert %Changeset{valid?: true, changes: %{}} = Dummy.changeset(schema, %{}) 122 123 # fields are nil when `:quantity` is `nil` 124 assert %Changeset{valid?: true, changes: %{ 125 quantity_has_unit_id: nil, 126 quantity_has_numerical_value: nil, 127 }} = Dummy.changeset(schema, %{quantity: nil}) 128 129 # fields are changed when `:quantity` is properly set 130 assert %Changeset{valid?: true, changes: chgs} 131 = Dummy.changeset(schema, %{quantity: params}) 132 assert chgs.quantity_has_unit_id == params.has_unit_id 133 assert Decimal.eq?(chgs.quantity_has_numerical_value, params.has_numerical_value) 134 135 # `:has_numerical_value` must be positive 136 assert %Changeset{valid?: false, errors: errs} 137 = Dummy.changeset(schema, %{quantity: Map.put(params, :has_numerical_value, 0)}) 138 assert length(Keyword.get_values(errs, :quantity)) == 1 139 assert %Changeset{valid?: false, errors: errs} 140 = Dummy.changeset(schema, %{quantity: Map.put(params, :has_numerical_value, -1)}) 141 assert length(Keyword.get_values(errs, :quantity)) == 1 142 143 # when no fields are provided, no fields are set 144 assert %Changeset{valid?: false, changes: chgs, errors: errs} 145 = Dummy.changeset(schema, %{quantity: %{}}) 146 assert length(Keyword.get_values(errs, :quantity)) == 2 147 refute Map.has_key?(chgs, :quantity_has_unit_id) 148 or Map.has_key?(chgs, :quantity_has_numerical_value) 149 150 # when `:has_unit_id` is `nil`, no fields are set 151 assert %Changeset{valid?: false, changes: chgs, errors: errs} 152 = Dummy.changeset(schema, %{quantity: %{has_unit_id: nil}}) 153 assert length(Keyword.get_values(errs, :quantity)) == 2 154 refute Map.has_key?(chgs, :quantity_has_unit_id) 155 or Map.has_key?(chgs, :quantity_has_numerical_value) 156 157 # when `:has_numerical_value` is `nil`, no fields are set 158 assert %Changeset{valid?: false, changes: %{quantity: _}, errors: errs} 159 = Dummy.changeset(schema, %{quantity: %{has_numerical_value: nil}}) 160 assert length(Keyword.get_values(errs, :quantity)) == 2 161 refute Map.has_key?(chgs, :quantity_has_unit_id) 162 or Map.has_key?(chgs, :quantity_has_numerical_value) 163 164 # when both fields are `nil`, no fields are set 165 assert %Changeset{valid?: false, changes: %{quantity: _}, errors: errs} 166 = Dummy.changeset(schema, %{quantity: %{has_unit_id: nil, has_numerical_value: nil}}) 167 assert length(Keyword.get_values(errs, :quantity)) == 2 168 refute Map.has_key?(chgs, :quantity_has_unit_id) 169 or Map.has_key?(chgs, :quantity_has_numerical_value) 170 end 171 172 test "preload", %{inserted: schema} do 173 assert %{quantity: %Measure{} = meas} = Measure.preload(schema, :quantity) 174 assert meas.has_unit_id == schema.quantity_has_unit_id 175 assert meas.has_numerical_value == schema.quantity_has_numerical_value 176 end 177 end