zf

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

domain.test.exs (7335B)


      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.RecipeProcess.Domain do
     19 use ZenflowsTest.Help.EctoCase, async: true
     20 
     21 alias Ecto.Changeset
     22 alias Zenflows.VF.{
     23 	Duration,
     24 	ProcessSpecification,
     25 	RecipeProcess,
     26 	RecipeProcess.Domain,
     27 }
     28 
     29 setup do
     30 	%{
     31 		params: %{
     32 			name: Factory.str("name"),
     33 			note: Factory.str("note"),
     34 			process_classified_as: Factory.str_list("uri"),
     35 			process_conforms_to_id: Factory.insert!(:process_specification).id,
     36 			has_duration: Factory.build(:iduration),
     37 		},
     38 		inserted: Factory.insert!(:recipe_process),
     39 	}
     40 end
     41 
     42 describe "one/1" do
     43 	test "with good id: finds the RecipeProcess", %{inserted: %{id: id}} do
     44 		assert {:ok, %RecipeProcess{}} = Domain.one(id)
     45 	end
     46 
     47 	test "with bad id: doesn't find the RecipeProcess" do
     48 		assert {:error, "not found"} = Domain.one(Factory.id())
     49 	end
     50 end
     51 
     52 describe "create/1" do
     53 	test "with good params (with :has_duration): creates a RecipeProcess", %{params: params} do
     54 		assert {:ok, %RecipeProcess{} = new} = Domain.create(params)
     55 		assert new.name == params.name
     56 		assert new.note == params.note
     57 		assert new.process_classified_as == params.process_classified_as
     58 		assert new.process_conforms_to_id == params.process_conforms_to_id
     59 		assert new.has_duration_unit_type == params.has_duration.unit_type
     60 		assert new.has_duration_numeric_duration == params.has_duration.numeric_duration
     61 	end
     62 
     63 	test "with good params (without :has_duration): creates a RecipeProcess", %{params: params} do
     64 		params = Map.delete(params, :has_duration)
     65 		assert {:ok, %RecipeProcess{} = new} = Domain.create(params)
     66 		assert new.name == params.name
     67 		assert new.note == params.note
     68 		assert new.process_classified_as == params.process_classified_as
     69 		assert new.process_conforms_to_id == params.process_conforms_to_id
     70 		assert new.has_duration_unit_type == nil
     71 		assert new.has_duration_numeric_duration == nil
     72 	end
     73 
     74 	test "with good params (with :has_duration set to nil): creates a RecipeProcess", %{params: params} do
     75 		params = Map.put(params, :has_duration, nil)
     76 		assert {:ok, %RecipeProcess{} = new} = Domain.create(params)
     77 		assert new.name == params.name
     78 		assert new.note == params.note
     79 		assert new.process_classified_as == params.process_classified_as
     80 		assert new.process_conforms_to_id == params.process_conforms_to_id
     81 		assert new.has_duration_unit_type == nil
     82 		assert new.has_duration_numeric_duration == nil
     83 	end
     84 
     85 	test "with bad params (with bad :has_duration): doesn't create a RecipeProcess", %{params: params} do
     86 		params = Map.put(params, :has_duration, %{unit_type: nil, numeric_duration: nil})
     87 		assert {:error, %Changeset{errors: errs}} = Domain.create(params)
     88 		assert length(Keyword.get_values(errs, :has_duration)) == 2
     89 
     90 		params = Map.put(params, :has_duration, %{unit_type: nil})
     91 		assert {:error, %Changeset{errors: errs}} = Domain.create(params)
     92 		assert length(Keyword.get_values(errs, :has_duration)) == 2
     93 
     94 		params = Map.put(params, :has_duration, %{numeric_duration: nil})
     95 		assert {:error, %Changeset{errors: errs}} = Domain.create(params)
     96 		assert length(Keyword.get_values(errs, :has_duration)) == 2
     97 
     98 		params = Map.put(params, :has_duration, %{unit_type: Factory.build(:time_unit)})
     99 		assert {:error, %Changeset{errors: errs}} = Domain.create(params)
    100 		assert Keyword.has_key?(errs, :has_duration)
    101 
    102 		params = Map.put(params, :has_duration, %{numeric_duration: Factory.decimal()})
    103 		assert {:error, %Changeset{errors: errs}} = Domain.create(params)
    104 		assert Keyword.has_key?(errs, :has_duration)
    105 	end
    106 
    107 	test "with bad params: doesn't create a RecipeProcess" do
    108 		assert {:error, %Changeset{}} = Domain.create(%{})
    109 	end
    110 end
    111 
    112 describe "update/2" do
    113 	test "with good params (with :has_duration): updates the RecipeProcess", %{params: params, inserted: old} do
    114 		assert {:ok, %RecipeProcess{} = new} = Domain.update(old.id, params)
    115 		assert new.name == params.name
    116 		assert new.note == params.note
    117 		assert new.process_classified_as == params.process_classified_as
    118 		assert new.process_conforms_to_id == params.process_conforms_to_id
    119 		assert new.has_duration_unit_type == params.has_duration.unit_type
    120 		assert new.has_duration_numeric_duration == params.has_duration.numeric_duration
    121 	end
    122 
    123 	test "with good params (with :has_duration set to nil): updates the RecipeProcess", %{params: params, inserted: old} do
    124 		params = Map.put(params, :has_duration, nil)
    125 		assert {:ok, %RecipeProcess{} = new} = Domain.update(old.id, params)
    126 		assert new.name == params.name
    127 		assert new.note == params.note
    128 		assert new.process_classified_as == params.process_classified_as
    129 		assert new.process_conforms_to_id == params.process_conforms_to_id
    130 		assert new.has_duration_numeric_duration == nil
    131 		assert new.has_duration_unit_type == nil
    132 	end
    133 
    134 	test "with bad params (with :has_duration fields set to nil): doesn't update the RecipeProcess", %{params: params, inserted: old} do
    135 		params = Map.put(params, :has_duration, %{unit_type: nil, numeric_duration: nil})
    136 		assert {:error, %Changeset{errors: errs}} = Domain.update(old.id, params)
    137 		assert length(Keyword.get_values(errs, :has_duration)) == 2
    138 	end
    139 
    140 	test "with bad params: doesn't update the RecipeProcess", %{inserted: old} do
    141 		assert {:ok, %RecipeProcess{} = new} = Domain.update(old.id, %{})
    142 		assert new.name == old.name
    143 		assert new.note == old.note
    144 		assert new.process_classified_as == old.process_classified_as
    145 		assert new.process_conforms_to_id == old.process_conforms_to_id
    146 		assert new.has_duration_unit_type == old.has_duration_unit_type
    147 		assert new.has_duration_numeric_duration == old.has_duration_numeric_duration
    148 	end
    149 end
    150 
    151 describe "delete/1" do
    152 	test "with good id: deletes the RecipeProcess", %{inserted: %{id: id}} do
    153 		assert {:ok, %RecipeProcess{id: ^id}} = Domain.delete(id)
    154 		assert {:error, "not found"} = Domain.one(id)
    155 	end
    156 
    157 	test "with bad id: doesn't delete the RecipeProcess" do
    158 		assert {:error, "not found"} = Domain.delete(Factory.id())
    159 	end
    160 end
    161 
    162 describe "preload/2" do
    163 	test "preloads :has_duration", %{inserted: rec_proc} do
    164 		rec_proc = Domain.preload(rec_proc, :has_duration)
    165 		assert has_dur = %Duration{} = rec_proc.has_duration
    166 		assert has_dur.unit_type == rec_proc.has_duration_unit_type
    167 		assert has_dur.numeric_duration == rec_proc.has_duration_numeric_duration
    168 	end
    169 
    170 	test "preloads :process_conforms_to", %{inserted: rec_proc} do
    171 		rec_proc = Domain.preload(rec_proc, :process_conforms_to)
    172 		assert proc_con_to = %ProcessSpecification{} = rec_proc.process_conforms_to
    173 		assert proc_con_to.id == rec_proc.process_conforms_to_id
    174 	end
    175 end
    176 end