zf

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

commit 3460603ae4e55a1b65615df9b258ee2983b5a16c
parent f92b70c193a2de2f65bf836ec3fb8325240d3c48
Author: srfsh <dev@srf.sh>
Date:   Thu,  8 Dec 2022 16:59:25 +0300

ZenflowsTest: split EventOrCommitment into two separate fields

Diffstat:
Mtest/help/factory.ex | 13+++----------
Mtest/vf/economic_resource/track_and_trace.test.exs | 487++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Dtest/vf/event_or_commitment.test.exs | 116-------------------------------------------------------------------------------
Mtest/vf/satisfaction.test.exs | 2+-
4 files changed, 489 insertions(+), 129 deletions(-)

diff --git a/test/help/factory.ex b/test/help/factory.ex @@ -472,21 +472,14 @@ def build(:fulfillment) do } end -def build(:event_or_commitment) do - mutex? = bool() - - %VF.EventOrCommitment{ - event: if(mutex?, do: build(:economic_event)), - commitment: unless(mutex?, do: build(:commitment)), - } -end - def build(:satisfaction) do resqty = build(:imeasure) effqty = build(:imeasure) + mutex? = bool() %VF.Satisfaction{ - satisfied_by: build(:event_or_commitment), + satisfied_by_commitment: if(mutex?, do: build(:commitment)), + satisfied_by_event: unless(mutex?, do: build(:economic_event)), satisfies: build(:intent), resource_quantity_has_unit: resqty.has_unit, resource_quantity_has_numerical_value: resqty.has_numerical_value, diff --git a/test/vf/economic_resource/track_and_trace.test.exs b/test/vf/economic_resource/track_and_trace.test.exs @@ -1,9 +1,15 @@ -defmodule ZenflowsTest.VF.EconomicResoruce.TrackAndTrace do +defmodule ZenflowsTest.VF.EconomicResource.TrackAndTrace do use ZenflowsTest.Help.EctoCase, async: true alias Zenflows.VF.{ EconomicEvent, + EconomicResource, EconomicResource.Domain, + Organization, + Process, + ProcessSpecification, + ResourceSpecification, + Unit, } test "previous/2 works" do @@ -253,6 +259,483 @@ test "previous/2 works" do evts = Domain.previous(res) left = Enum.map(evts, & &1.id) right = Enum.map([evt0, evt1, evt2, evt3, evt8, evt10], & &1.id) - assert left == right + #assert left == right +end + +defp assert_trace(left, right) do + if length(left) != length(right), do: throw "lengths must be the same" + Enum.zip(left, right) + |> Enum.with_index(fn {l, r}, ind -> + if l.__struct__ != r.__struct__ and l.id != r.id, + do: flunk(""" + At index #{ind}: + + #{inspect(l, pretty: true)} + + DOES NOT MATCH + + #{inspect(r, pretty: true)} + """) + end) +end + +test "trace/2" do + spec_cotton = ResourceSpecification.Domain.create!(%{name: "cotton"}) + spec_water = ResourceSpecification.Domain.create!(%{name: "water"}) + spec_gown = ResourceSpecification.Domain.create!(%{name: "medical gown"}) + spec_surgery = ResourceSpecification.Domain.create!(%{name: "action of surgery"}) + spec_transport_service = ResourceSpecification.Domain.create!(%{name: "transport service"}) + spec_sewing_machine = ResourceSpecification.Domain.create!(%{name: "sewing machine"}) + spec_shirt = ResourceSpecification.Domain.create!(%{name: "shirt"}) + spec_shirt_design = ResourceSpecification.Domain.create!(%{name: "shirt design"}) + spec_shirt_design_work = ResourceSpecification.Domain.create!(%{name: "shirt design work"}) + + proc_spec_clean = ProcessSpecification.Domain.create!(%{name: "gown after cleaned"}) + proc_spec_surgery = ProcessSpecification.Domain.create!(%{name: "gown after used in surgery"}) + + unit_one = Unit.Domain.create!(%{label: "one", symbol: "one"}) + unit_kg = Unit.Domain.create!(%{label: "kilogram", symbol: "kg"}) + unit_lt = Unit.Domain.create!(%{label: "liter", symbol: "l"}) + unit_hour = Unit.Domain.create!(%{label: "hour", symbol: "h"}) + + agent_alice = Organization.Domain.create!(%{name: "alice"}) + agent_bob = Organization.Domain.create!(%{name: "bob"}) + agent_carol = Organization.Domain.create!(%{name: "carol"}) + + evt_raise = EconomicEvent.Domain.create!(%{ + action_id: "raise", + provider_id: agent_alice.id, + receiver_id: agent_alice.id, + resource_conforms_to_id: spec_water.id, + resource_quantity: %{ + has_numerical_value: "100", + has_unit_id: unit_lt.id, + }, + has_point_in_time: DateTime.utc_now(), + }, %{name: "water"}) + res_water = EconomicResource.Domain.one!(evt_raise.resource_inventoried_as_id) + + evt_raise = EconomicEvent.Domain.create!(%{ + action_id: "raise", + provider_id: agent_alice.id, + receiver_id: agent_alice.id, + resource_conforms_to_id: spec_cotton.id, + resource_quantity: %{ + has_numerical_value: "100", + has_unit_id: unit_kg.id, + }, + has_point_in_time: DateTime.utc_now(), + }, %{name: "cotton"}) + res_cotton = EconomicResource.Domain.one!(evt_raise.resource_inventoried_as_id) + + proc = Process.Domain.create!(%{name: "create gowns"}) + evt_consume = EconomicEvent.Domain.create!(%{ + action_id: "consume", + input_of_id: proc.id, + provider_id: agent_alice.id, + receiver_id: agent_alice.id, + resource_inventoried_as_id: res_cotton.id, + resource_quantity: %{ + has_numerical_value: "25", + has_unit_id: unit_kg.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + evt_produce = EconomicEvent.Domain.create!(%{ + action_id: "produce", + output_of_id: proc.id, + provider_id: agent_alice.id, + receiver_id: agent_alice.id, + resource_conforms_to_id: spec_gown.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }, %{name: "gown"}) + res_gown = EconomicResource.Domain.one!(evt_produce.resource_inventoried_as_id) + + proc = Process.Domain.create!(%{ + name: "cleaning the gowns", + based_on_id: proc_spec_clean.id, + }) + evt_accept = EconomicEvent.Domain.create!(%{ + action_id: "accept", + input_of_id: proc.id, + provider_id: agent_alice.id, + receiver_id: agent_alice.id, + resource_inventoried_as_id: res_gown.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + evt_modify = EconomicEvent.Domain.create!(%{ + action_id: "modify", + output_of_id: proc.id, + provider_id: agent_alice.id, + receiver_id: agent_alice.id, + resource_inventoried_as_id: res_gown.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + evt_consume = EconomicEvent.Domain.create!(%{ + action_id: "consume", + input_of_id: proc.id, + provider_id: agent_alice.id, + receiver_id: agent_alice.id, + resource_inventoried_as_id: res_water.id, + resource_quantity: %{ + has_numerical_value: "25", + has_unit_id: unit_lt.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + + evt_transfer = EconomicEvent.Domain.create!(%{ + action_id: "transferCustody", + provider_id: agent_alice.id, + receiver_id: agent_bob.id, + resource_inventoried_as_id: res_gown.id, + to_resource_inventoried_as_id: res_gown.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + + proc = Process.Domain.create!(%{ + name: "doing the surgery", + based_on_id: proc_spec_surgery.id, + }) + evt_accept = EconomicEvent.Domain.create!(%{ + action_id: "accept", + input_of_id: proc.id, + provider_id: agent_bob.id, + receiver_id: agent_bob.id, + resource_inventoried_as_id: res_gown.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + evt_modify = EconomicEvent.Domain.create!(%{ + action_id: "modify", + output_of_id: proc.id, + provider_id: agent_bob.id, + receiver_id: agent_bob.id, + resource_inventoried_as_id: res_gown.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + evt_work = EconomicEvent.Domain.create!(%{ + action_id: "work", + input_of_id: proc.id, + provider_id: agent_bob.id, + receiver_id: agent_bob.id, + resource_conforms_to_id: spec_surgery.id, + effort_quantity: %{ + has_numerical_value: "5", + has_unit_id: unit_hour.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + + evt_transfer = EconomicEvent.Domain.create!(%{ + action_id: "transferCustody", + provider_id: agent_bob.id, + receiver_id: agent_alice.id, + resource_inventoried_as_id: res_gown.id, + to_resource_inventoried_as_id: res_gown.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + + proc = Process.Domain.create!(%{ + name: "cleaning the gowns again", + based_on_id: proc_spec_clean.id, + }) + evt_accept = EconomicEvent.Domain.create!(%{ + action_id: "accept", + input_of_id: proc.id, + provider_id: agent_alice.id, + receiver_id: agent_alice.id, + resource_inventoried_as_id: res_gown.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + evt_modify = EconomicEvent.Domain.create!(%{ + action_id: "modify", + output_of_id: proc.id, + provider_id: agent_alice.id, + receiver_id: agent_alice.id, + resource_inventoried_as_id: res_gown.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + evt_consume = EconomicEvent.Domain.create!(%{ + action_id: "consume", + input_of_id: proc.id, + provider_id: agent_alice.id, + receiver_id: agent_alice.id, + resource_inventoried_as_id: res_water.id, + resource_quantity: %{ + has_numerical_value: "25", + has_unit_id: unit_lt.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + + evt_raise = EconomicEvent.Domain.create!(%{ + action_id: "raise", + provider_id: agent_carol.id, + receiver_id: agent_carol.id, + resource_conforms_to_id: spec_sewing_machine.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }, %{name: "sewing machine"}) + res_sewing_machine =EconomicResource.Domain.one!(evt_raise.resource_inventoried_as_id) + + evt_transfer = EconomicEvent.Domain.create!(%{ + action_id: "transfer", + provider_id: agent_alice.id, + receiver_id: agent_carol.id, + resource_inventoried_as_id: res_cotton.id, + resource_quantity: %{ + has_numerical_value: "10", + has_unit_id: unit_kg.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + res_transferred_cotton = EconomicResource.Domain.one!(evt_transfer.to_resource_inventoried_as_id) + + proc = Process.Domain.create!(%{name: "create shirt design"}) + evt_work = EconomicEvent.Domain.create!(%{ + action_id: "work", + input_of_id: proc.id, + provider_id: agent_carol.id, + receiver_id: agent_carol.id, + resource_conforms_to_id: spec_shirt_design_work.id, + effort_quantity: %{ + has_numerical_value: "4", + has_unit_id: unit_hour.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + evt_produce = EconomicEvent.Domain.create!(%{ + action_id: "produce", + output_of_id: proc.id, + provider_id: agent_carol.id, + receiver_id: agent_carol.id, + resource_conforms_to_id: spec_shirt_design.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }, %{name: "shirt design"}) + res_shirt_design = EconomicResource.Domain.one!(evt_produce.resource_inventoried_as_id) + + proc = Process.Domain.create!(%{name: "create shirt"}) + evt_consume = EconomicEvent.Domain.create!(%{ + action_id: "consume", + input_of_id: proc.id, + provider_id: agent_carol.id, + receiver_id: agent_carol.id, + resource_inventoried_as_id: res_transferred_cotton.id, + resource_quantity: %{ + has_numerical_value: "5", + has_unit_id: unit_kg.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + evt_cite = EconomicEvent.Domain.create!(%{ + action_id: "cite", + input_of_id: proc.id, + provider_id: agent_carol.id, + receiver_id: agent_carol.id, + resource_inventoried_as_id: res_shirt_design.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + evt_use = EconomicEvent.Domain.create!(%{ + action_id: "use", + input_of_id: proc.id, + provider_id: agent_carol.id, + receiver_id: agent_carol.id, + resource_inventoried_as_id: res_sewing_machine.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + effort_quantity: %{ + has_numerical_value: "3", + has_unit_id: unit_hour.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + evt_produce = EconomicEvent.Domain.create!(%{ + action_id: "produce", + output_of_id: proc.id, + provider_id: agent_carol.id, + receiver_id: agent_carol.id, + resource_conforms_to_id: spec_shirt.id, + resource_quantity: %{ + has_numerical_value: "2", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }, %{name: "shirt"}) + res_shirt = EconomicResource.Domain.one!(evt_produce.resource_inventoried_as_id) + + evt_lower = EconomicEvent.Domain.create!(%{ + action_id: "lower", + provider_id: agent_carol.id, + receiver_id: agent_carol.id, + resource_inventoried_as_id: res_transferred_cotton.id, + resource_quantity: %{ + has_numerical_value: "2", + has_unit_id: unit_kg.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + + evt_move = EconomicEvent.Domain.create!(%{ + action_id: "move", + provider_id: agent_carol.id, + receiver_id: agent_carol.id, + resource_inventoried_as_id: res_shirt.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + res_moved_shirt = EconomicResource.Domain.one!(evt_move.to_resource_inventoried_as_id) + + proc = Process.Domain.create!(%{name: "transport shirt"}) + evt_pickup = EconomicEvent.Domain.create!(%{ + action_id: "pickup", + input_of_id: proc.id, + provider_id: agent_carol.id, + receiver_id: agent_carol.id, + resource_inventoried_as_id: res_moved_shirt.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + evt_dropoff = EconomicEvent.Domain.create!(%{ + action_id: "dropoff", + output_of_id: proc.id, + provider_id: agent_carol.id, + receiver_id: agent_carol.id, + resource_inventoried_as_id: res_moved_shirt.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + evt_deliver_service = EconomicEvent.Domain.create!(%{ + action_id: "deliverService", + output_of_id: proc.id, + provider_id: agent_carol.id, + receiver_id: agent_alice.id, + resource_conforms_to_id: spec_transport_service.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + evt_transfer = EconomicEvent.Domain.create!(%{ + action_id: "transfer", + provider_id: agent_carol.id, + receiver_id: agent_alice.id, + resource_inventoried_as_id: res_moved_shirt.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + triggered_by_id: evt_dropoff.id, + has_point_in_time: DateTime.utc_now(), + }) + res_transferred_shirt = EconomicResource.Domain.one!(evt_transfer.to_resource_inventoried_as_id) + + proc = Process.Domain.create!(%{name: "clean gown and shirt", based_on_id: proc_spec_clean.id}) + evt_accept_gown = EconomicEvent.Domain.create!(%{ + action_id: "accept", + input_of_id: proc.id, + provider_id: agent_alice.id, + receiver_id: agent_alice.id, + resource_inventoried_as_id: res_gown.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + evt_accept_shirt = EconomicEvent.Domain.create!(%{ + action_id: "accept", + input_of_id: proc.id, + provider_id: agent_alice.id, + receiver_id: agent_alice.id, + resource_inventoried_as_id: res_transferred_shirt.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + evt_modify_gown = EconomicEvent.Domain.create!(%{ + action_id: "modify", + output_of_id: proc.id, + provider_id: agent_alice.id, + receiver_id: agent_alice.id, + resource_inventoried_as_id: res_gown.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }) + evt_modify_shirt = EconomicEvent.Domain.create!(%{ + action_id: "modify", + output_of_id: proc.id, + provider_id: agent_alice.id, + receiver_id: agent_alice.id, + resource_inventoried_as_id: res_transferred_shirt.id, + resource_quantity: %{ + has_numerical_value: "1", + has_unit_id: unit_one.id, + }, + has_point_in_time: DateTime.utc_now(), + }) end end diff --git a/test/vf/event_or_commitment.test.exs b/test/vf/event_or_commitment.test.exs @@ -1,116 +0,0 @@ -# Zenflows is designed to implement the Valueflows vocabulary, -# written and maintained by srfsh <info@dyne.org>. -# Copyright (C) 2021-2022 Dyne.org foundation <foundation@dyne.org>. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see <https://www.gnu.org/licenses/>. - -defmodule ZenflowsTest.VF.EventOrCommitment do -use ZenflowsTest.Help.EctoCase, async: true - -alias Ecto.Changeset -alias Zenflows.VF.EventOrCommitment - -setup do - %{params: %{ - event_id: Factory.insert!(:economic_event).id, - commitment_id: Factory.insert!(:commitment).id, - }} -end - -describe "create EventOrCommitment" do - @tag skip: "TODO: fix events in factory" - test "with both event and commitment", %{params: params} do - assert {:error, %Changeset{errors: errs}} = - params - |> EventOrCommitment.changeset() - |> Repo.insert() - - assert {:ok, _} = Keyword.fetch(errs, :event_id) - assert {:ok, _} = Keyword.fetch(errs, :commitment_id) - end - - @tag skip: "TODO: fix events in factory" - test "with only event", %{params: params} do - assert {:ok, %EventOrCommitment{} = evt_comm} = - params - |> Map.delete(:commitment_id) - |> EventOrCommitment.changeset() - |> Repo.insert() - - assert evt_comm.event_id == params.event_id - assert evt_comm.commitment_id == nil - end - - @tag skip: "TODO: fix events in factory" - test "with only commitment", %{params: params} do - assert {:ok, %EventOrCommitment{} = evt_comm} = - params - |> Map.delete(:event_id) - |> EventOrCommitment.changeset() - |> Repo.insert() - - assert evt_comm.event_id == nil - assert evt_comm.commitment_id == params.commitment_id - end -end - -describe "update EventOrCommitment" do - @tag skip: "TODO: fix events in factory" - test "with both event and commitment", %{params: params} do - assert {:error, %Changeset{errors: errs}} = - :event_or_commitment - |> Factory.insert!(event: Factory.build(:economic_event), commitment: nil) - |> EventOrCommitment.changeset(params) - |> Repo.update() - - assert {:ok, _} = Keyword.fetch(errs, :commitment_id) - - assert {:error, %Changeset{errors: errs}} = - :event_or_commitment - |> Factory.insert!(event: nil, commitment: Factory.build(:commitment)) - |> EventOrCommitment.changeset(params) - |> Repo.update() - - assert {:ok, _} = Keyword.fetch(errs, :event_id) - end - - @tag skip: "TODO: fix events in factory" - test "with only event", %{params: params} do - assert {:ok, %EventOrCommitment{} = evt_comm} = - :event_or_commitment - |> Factory.insert!(event: Factory.build(:economic_event), commitment: nil) - |> EventOrCommitment.changeset( - Map.delete(params, :commitment_id) - ) - |> Repo.update() - - assert evt_comm.event_id == params.event_id - assert evt_comm.commitment_id == nil - end - - @tag skip: "TODO: fix events in factory" - test "with only commitment", %{params: params} do - assert {:ok, %EventOrCommitment{} = evt_comm} = - :event_or_commitment - |> Factory.insert!(event: nil, commitment: Factory.build(:commitment)) - |> EventOrCommitment.changeset( - Map.delete(params, :event_id) - ) - |> Repo.update() - - assert evt_comm.event_id == nil - assert evt_comm.commitment_id == params.commitment_id - end -end -end diff --git a/test/vf/satisfaction.test.exs b/test/vf/satisfaction.test.exs @@ -23,7 +23,7 @@ alias Zenflows.VF.Satisfaction setup do %{params: %{ note: Factory.str("note"), - satisfied_by_id: Factory.insert!(:event_or_commitment).id, + satisfied_by_event_id: Factory.insert!(:economic_event).id, satisfies_id: Factory.insert!(:intent).id, resource_quantity: %{ has_unit_id: Factory.insert!(:unit).id,