zf

zenflows testing
git clone https://s.sonu.ch/~srfsh/zf.git
Log | Files | Refs | Submodules | README | LICENSE

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