zf

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

economic_event.test.exs (34826B)


      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.EconomicEvent do
     19 use ZenflowsTest.Help.EctoCase, async: true
     20 
     21 alias Ecto.Changeset
     22 alias Zenflows.VF.EconomicEvent
     23 
     24 setup_all do
     25 	[errmsg_exist_xnor: "exactly one of them must be provided"]
     26 end
     27 
     28 test """
     29 `chgset/1`: every event requires the `:action_id`, `:provider_id`,
     30 `:receiver_id` fields and the allowed combinations of the datetime
     31 fields `:has_point_in_time`, `:has_beginning`, `:has_end`
     32 """ do
     33 	assert %Changeset{valid?: false} = cset = EconomicEvent.changeset(%{})
     34 	err = Changeset.traverse_errors(cset, &elem(&1, 0))
     35 	assert {[_], err} = pop_in(err[:action_id])
     36 	assert {[_], err} = pop_in(err[:provider_id])
     37 	assert {[_], err} = pop_in(err[:receiver_id])
     38 	assert {[_], err} = pop_in(err[:has_point_in_time])
     39 	assert {[_], err} = pop_in(err[:has_beginning])
     40 	assert {[_], err} = pop_in(err[:has_end])
     41 	assert err == %{}
     42 
     43 	assert %Changeset{valid?: false} = cset =
     44 		EconomicEvent.changeset(%{has_point_in_time: DateTime.utc_now()})
     45 	err = Changeset.traverse_errors(cset, &elem(&1, 0))
     46 	assert {[_], err} = pop_in(err[:action_id])
     47 	assert {[_], err} = pop_in(err[:provider_id])
     48 	assert {[_], err} = pop_in(err[:receiver_id])
     49 	assert err == %{}
     50 
     51 	assert %Changeset{valid?: false} = cset =
     52 		EconomicEvent.changeset(%{has_beginning: DateTime.utc_now()})
     53 	err = Changeset.traverse_errors(cset, &elem(&1, 0))
     54 	assert {[_], err} = pop_in(err[:action_id])
     55 	assert {[_], err} = pop_in(err[:provider_id])
     56 	assert {[_], err} = pop_in(err[:receiver_id])
     57 	assert err == %{}
     58 
     59 	assert %Changeset{valid?: false} = cset =
     60 		EconomicEvent.changeset(%{has_end: DateTime.utc_now()})
     61 	err = Changeset.traverse_errors(cset, &elem(&1, 0))
     62 	assert {[_], err} = pop_in(err[:action_id])
     63 	assert {[_], err} = pop_in(err[:provider_id])
     64 	assert {[_], err} = pop_in(err[:receiver_id])
     65 	assert err == %{}
     66 
     67 	assert %Changeset{valid?: false} = cset =
     68 		EconomicEvent.changeset(%{
     69 			has_beginning: DateTime.utc_now(),
     70 			has_end: DateTime.utc_now(),
     71 		})
     72 	err = Changeset.traverse_errors(cset, &elem(&1, 0))
     73 	assert {[_], err} = pop_in(err[:action_id])
     74 	assert {[_], err} = pop_in(err[:provider_id])
     75 	assert {[_], err} = pop_in(err[:receiver_id])
     76 	assert err == %{}
     77 end
     78 
     79 describe "`chgset/1` with raise:" do
     80 	setup do
     81 		agent = Factory.insert!(:agent)
     82 
     83 		%{params: %{
     84 			action_id: "raise",
     85 			provider_id: agent.id,
     86 			receiver_id: agent.id,
     87 			resource_quantity: %{
     88 				has_unit_id: Factory.insert!(:unit).id,
     89 				has_numerical_value: Factory.decimal(),
     90 			},
     91 			has_point_in_time: DateTime.utc_now(),
     92 		}}
     93 	end
     94 
     95 	test "pass with `:resource_conforms_to`", %{params: params} do
     96 		spec = Factory.insert!(:resource_specification)
     97 		assert %Changeset{valid?: true} =
     98 			params
     99 			|> Map.put(:resource_conforms_to_id, spec.id)
    100 			|> EconomicEvent.changeset()
    101 	end
    102 
    103 	test "pass with `:resource_inventoried_as`", %{params: params} do
    104 		res = Factory.insert!(:economic_resource)
    105 		assert %Changeset{valid?: true} =
    106 			params
    107 			|> Map.put(:resource_inventoried_as_id, res.id)
    108 			|> EconomicEvent.changeset()
    109 	end
    110 
    111 	test "fail without `:resource_conforms_to` and `:resource_inventoried_as`",
    112 			%{params: params, errmsg_exist_xnor: errmsg} do
    113 		assert %Changeset{valid?: false} = cset = EconomicEvent.changeset(params)
    114 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    115 		assert {[^errmsg], err} = pop_in(err[:resource_conforms_to_id])
    116 		assert {[^errmsg], err} = pop_in(err[:resource_inventoried_as_id])
    117 		assert err == %{}
    118 	end
    119 
    120 	test "fail with `:resource_conforms_to` and `:resource_inventoried_as`",
    121 			%{params: params, errmsg_exist_xnor: errmsg} do
    122 		res = Factory.insert!(:economic_resource)
    123 		spec = Factory.insert!(:resource_specification)
    124 		assert %Changeset{valid?: false} = cset =
    125 			params
    126 			|> Map.put(:resource_inventoried_as_id, res.id)
    127 			|> Map.put(:resource_conforms_to_id, spec.id)
    128 			|> EconomicEvent.changeset()
    129 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    130 		assert {[^errmsg], err} = pop_in(err[:resource_conforms_to_id])
    131 		assert {[^errmsg], err} = pop_in(err[:resource_inventoried_as_id])
    132 		assert err == %{}
    133 	end
    134 
    135 	test "fail when `:provider` and `:receiver` differ", %{params: params} do
    136 		params =
    137 			Map.put(params, :resource_conforms_to_id, Factory.insert!(:resource_specification).id)
    138 		agent = Factory.insert!(:agent)
    139 
    140 		assert %Changeset{valid?: false} = cset =
    141 			params
    142 			|> Map.put(:provider_id, agent.id)
    143 			|> EconomicEvent.changeset()
    144 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    145 		assert {[_], err} = pop_in(err[:provider_id])
    146 		assert {[_], err} = pop_in(err[:receiver_id])
    147 		assert err == %{}
    148 
    149 		assert %Changeset{valid?: false} = cset =
    150 			params
    151 			|> Map.put(:receiver_id, agent.id)
    152 			|> EconomicEvent.changeset()
    153 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    154 		assert {[_], err} = pop_in(err[:provider_id])
    155 		assert {[_], err} = pop_in(err[:receiver_id])
    156 		assert err == %{}
    157 	end
    158 end
    159 
    160 describe "`chgset/1` with produce:" do
    161 	setup do
    162 		agent = Factory.insert!(:agent)
    163 
    164 		%{params: %{
    165 			action_id: "produce",
    166 			output_of_id: Factory.insert!(:process).id,
    167 			provider_id: agent.id,
    168 			receiver_id: agent.id,
    169 			resource_quantity: %{
    170 				has_unit_id: Factory.insert!(:unit).id,
    171 				has_numerical_value: Factory.decimal(),
    172 			},
    173 			has_beginning: DateTime.utc_now(),
    174 		}}
    175 	end
    176 
    177 	test "pass with `:resource_conforms_to`", %{params: params} do
    178 		spec = Factory.insert!(:resource_specification)
    179 		assert %Changeset{valid?: true} =
    180 			params
    181 			|> Map.put(:resource_conforms_to_id, spec.id)
    182 			|> EconomicEvent.changeset()
    183 	end
    184 
    185 	test "pass with `:resource_inventoried_as`", %{params: params} do
    186 		res = Factory.insert!(:economic_resource)
    187 		assert %Changeset{valid?: true} =
    188 			params
    189 			|> Map.put(:resource_inventoried_as_id, res.id)
    190 			|> EconomicEvent.changeset()
    191 	end
    192 
    193 	test "fail without `:resource_conforms_to` and `:resource_inventoried_as`",
    194 			%{params: params, errmsg_exist_xnor: errmsg} do
    195 		assert %Changeset{valid?: false} = cset = EconomicEvent.changeset(params)
    196 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    197 		assert {[^errmsg], err} = pop_in(err[:resource_conforms_to_id])
    198 		assert {[^errmsg], err} = pop_in(err[:resource_inventoried_as_id])
    199 		assert err == %{}
    200 	end
    201 
    202 	test "fail with `:resource_conforms_to` and `:resource_inventoried_as`",
    203 		%{params: params, errmsg_exist_xnor: errmsg} do
    204 		res = Factory.insert!(:economic_resource)
    205 		spec = Factory.insert!(:resource_specification)
    206 		assert %Changeset{valid?: false} = cset =
    207 			params
    208 			|> Map.put(:resource_inventoried_as_id, res.id)
    209 			|> Map.put(:resource_conforms_to_id, spec.id)
    210 			|> EconomicEvent.changeset()
    211 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    212 		assert {[^errmsg], err} = pop_in(err[:resource_conforms_to_id])
    213 		assert {[^errmsg], err} = pop_in(err[:resource_inventoried_as_id])
    214 		assert err == %{}
    215 	end
    216 
    217 	test "fail when `:provider` and `:receiver` differ", %{params: params} do
    218 		params =
    219 			Map.put(params, :resource_conforms_to_id, Factory.insert!(:resource_specification).id)
    220 		agent = Factory.insert!(:agent)
    221 
    222 		assert %Changeset{valid?: false} = cset =
    223 			params
    224 			|> Map.put(:provider_id, agent.id)
    225 			|> EconomicEvent.changeset()
    226 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    227 		assert {[_], err} = pop_in(err[:provider_id])
    228 		assert {[_], err} = pop_in(err[:receiver_id])
    229 		assert err == %{}
    230 
    231 		assert %Changeset{valid?: false} = cset =
    232 			params
    233 			|> Map.put(:receiver_id, agent.id)
    234 			|> EconomicEvent.changeset()
    235 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    236 		assert {[_], err} = pop_in(err[:provider_id])
    237 		assert {[_], err} = pop_in(err[:receiver_id])
    238 		assert err == %{}
    239 	end
    240 end
    241 
    242 describe "`chgset/1` with lower:" do
    243 	setup do
    244 		agent = Factory.insert!(:agent)
    245 
    246 		%{params: %{
    247 			action_id: "lower",
    248 			provider_id: agent.id,
    249 			receiver_id: agent.id,
    250 			resource_inventoried_as_id: Factory.insert!(:economic_resource).id,
    251 			resource_quantity: %{
    252 				has_unit_id: Factory.insert!(:unit).id,
    253 				has_numerical_value: Factory.decimal(),
    254 			},
    255 			has_end: DateTime.utc_now(),
    256 		}}
    257 	end
    258 
    259 	test "pass when all good", %{params: params} do
    260 		assert %Changeset{valid?: true} = EconomicEvent.changeset(params)
    261 	end
    262 
    263 	test "fail when `:provider` and `:receiver` differ", %{params: params} do
    264 		agent = Factory.insert!(:agent)
    265 
    266 		assert %Changeset{valid?: false} = cset =
    267 			params
    268 			|> Map.put(:provider_id, agent.id)
    269 			|> EconomicEvent.changeset()
    270 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    271 		assert {[_], err} = pop_in(err[:provider_id])
    272 		assert {[_], err} = pop_in(err[:receiver_id])
    273 		assert err == %{}
    274 
    275 		assert %Changeset{valid?: false} = cset =
    276 			params
    277 			|> Map.put(:receiver_id, agent.id)
    278 			|> EconomicEvent.changeset()
    279 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    280 		assert {[_], err} = pop_in(err[:provider_id])
    281 		assert {[_], err} = pop_in(err[:receiver_id])
    282 		assert err == %{}
    283 	end
    284 end
    285 
    286 describe "`chgset/1` with consume:" do
    287 	setup do
    288 		agent = Factory.insert!(:agent)
    289 
    290 		%{params: %{
    291 			action_id: "consume",
    292 			input_of_id: Factory.insert!(:process).id,
    293 			provider_id: agent.id,
    294 			receiver_id: agent.id,
    295 			resource_inventoried_as_id: Factory.insert!(:economic_resource).id,
    296 			resource_quantity: %{
    297 				has_unit_id: Factory.insert!(:unit).id,
    298 				has_numerical_value: Factory.decimal(),
    299 			},
    300 			has_beginning: DateTime.utc_now(),
    301 			has_end: DateTime.utc_now(),
    302 		}}
    303 	end
    304 
    305 	test "pass when all good", %{params: params} do
    306 		assert %Changeset{valid?: true} = EconomicEvent.changeset(params)
    307 	end
    308 
    309 	test "fail when `:provider` and `:receiver` differ", %{params: params} do
    310 		agent = Factory.insert!(:agent)
    311 
    312 		assert %Changeset{valid?: false} = cset =
    313 			params
    314 			|> Map.put(:provider_id, agent.id)
    315 			|> EconomicEvent.changeset()
    316 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    317 		assert {[_], err} = pop_in(err[:provider_id])
    318 		assert {[_], err} = pop_in(err[:receiver_id])
    319 		assert err == %{}
    320 
    321 		assert %Changeset{valid?: false} = cset =
    322 			params
    323 			|> Map.put(:receiver_id, agent.id)
    324 			|> EconomicEvent.changeset()
    325 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    326 		assert {[_], err} = pop_in(err[:provider_id])
    327 		assert {[_], err} = pop_in(err[:receiver_id])
    328 		assert err == %{}
    329 	end
    330 end
    331 
    332 describe "`chgset/1` with use:" do
    333 	setup do
    334 		%{params: %{
    335 			action_id: "use",
    336 			input_of_id: Factory.insert!(:process).id,
    337 			provider_id: Factory.insert!(:agent).id,
    338 			receiver_id: Factory.insert!(:agent).id,
    339 			effort_quantity: %{
    340 				has_unit_id: Factory.insert!(:unit).id,
    341 				has_numerical_value: Factory.decimal(),
    342 			},
    343 			has_point_in_time: DateTime.utc_now(),
    344 		}}
    345 	end
    346 
    347 	test "fail without `:resource_conforms_to` and `:resource_inventoried_as`",
    348 		%{params: params, errmsg_exist_xnor: errmsg} do
    349 		assert %Changeset{valid?: false} = cset = EconomicEvent.changeset(params)
    350 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    351 		assert {[^errmsg], err} = pop_in(err[:resource_conforms_to_id])
    352 		assert {[^errmsg], err} = pop_in(err[:resource_inventoried_as_id])
    353 		assert err == %{}
    354 	end
    355 
    356 	test "fail with `:resource_conforms_to` and `:resource_inventoried_as`",
    357 			%{params: params, errmsg_exist_xnor: errmsg} do
    358 		res = Factory.insert!(:economic_resource)
    359 		spec = Factory.insert!(:resource_specification)
    360 		assert %Changeset{valid?: false} = cset =
    361 			params
    362 			|> Map.put(:resource_inventoried_as_id, res.id)
    363 			|> Map.put(:resource_conforms_to_id, spec.id)
    364 			|> EconomicEvent.changeset()
    365 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    366 		assert {[^errmsg], err} = pop_in(err[:resource_conforms_to_id])
    367 		assert {[^errmsg], err} = pop_in(err[:resource_inventoried_as_id])
    368 		assert err == %{}
    369 	end
    370 
    371 	test "pass with `:resource_conforms_to`", %{params: params} do
    372 		spec = Factory.insert!(:resource_specification)
    373 		assert %Changeset{valid?: true} =
    374 			params
    375 			|> Map.put(:resource_conforms_to_id, spec.id)
    376 			|> EconomicEvent.changeset()
    377 	end
    378 
    379 	test "pass with `:resource_inventoried_as`", %{params: params} do
    380 		res = Factory.insert!(:economic_resource)
    381 		assert %Changeset{valid?: true} =
    382 			params
    383 			|> Map.put(:resource_inventoried_as_id, res.id)
    384 			|> EconomicEvent.changeset()
    385 	end
    386 end
    387 
    388 test "`chgset/1` with work: pass when all good" do
    389 	assert %Changeset{valid?: true} = EconomicEvent.changeset(%{
    390 		action_id: "work",
    391 		input_of_id: Factory.insert!(:process).id,
    392 		provider_id: Factory.insert!(:agent).id,
    393 		receiver_id: Factory.insert!(:agent).id,
    394 		resource_conforms_to_id: Factory.insert!(:resource_specification).id,
    395 		effort_quantity: %{
    396 			has_unit_id: Factory.insert!(:unit).id,
    397 			has_numerical_value: Factory.decimal(),
    398 		},
    399 		has_beginning: DateTime.utc_now(),
    400 	})
    401 end
    402 
    403 describe "`chgset/1` with cite:" do
    404 	setup do
    405 		%{params: %{
    406 			action_id: "cite",
    407 			input_of_id: Factory.insert!(:process).id,
    408 			provider_id: Factory.insert!(:agent).id,
    409 			receiver_id: Factory.insert!(:agent).id,
    410 			resource_quantity: %{
    411 				has_unit_id: Factory.insert!(:unit).id,
    412 				has_numerical_value: Factory.decimal(),
    413 			},
    414 			has_end: DateTime.utc_now(),
    415 		}}
    416 	end
    417 
    418 	test "pass with `:resource_conforms_to`", %{params: params} do
    419 		spec = Factory.insert!(:resource_specification)
    420 		assert %Changeset{valid?: true} =
    421 			params
    422 			|> Map.put(:resource_conforms_to_id, spec.id)
    423 			|> EconomicEvent.changeset()
    424 	end
    425 
    426 	test "pass with `:resource_inventoried_as`", %{params: params} do
    427 		res = Factory.insert!(:economic_resource)
    428 		assert %Changeset{valid?: true} =
    429 			params
    430 			|> Map.put(:resource_inventoried_as_id, res.id)
    431 			|> EconomicEvent.changeset()
    432 	end
    433 
    434 	test "fail without `:resource_conforms_to` and `:resource_inventoried_as`",
    435 			%{params: params, errmsg_exist_xnor: errmsg} do
    436 		assert %Changeset{valid?: false} = cset = EconomicEvent.changeset(params)
    437 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    438 		assert {[^errmsg], err} = pop_in(err[:resource_conforms_to_id])
    439 		assert {[^errmsg], err} = pop_in(err[:resource_inventoried_as_id])
    440 		assert err == %{}
    441 	end
    442 
    443 	test "fail with `:resource_conforms_to` and `:resource_inventoried_as`",
    444 			%{params: params, errmsg_exist_xnor: errmsg} do
    445 		res = Factory.insert!(:economic_resource)
    446 		spec = Factory.insert!(:resource_specification)
    447 		assert %Changeset{valid?: false} = cset =
    448 			params
    449 			|> Map.put(:resource_inventoried_as_id, res.id)
    450 			|> Map.put(:resource_conforms_to_id, spec.id)
    451 			|> EconomicEvent.changeset()
    452 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    453 		assert {[^errmsg], err} = pop_in(err[:resource_conforms_to_id])
    454 		assert {[^errmsg], err} = pop_in(err[:resource_inventoried_as_id])
    455 		assert err == %{}
    456 	end
    457 end
    458 
    459 describe "`chgset/1` with deliverService:" do
    460 	setup do
    461 		%{params: %{
    462 			action_id: "deliverService",
    463 			input_of_id: Factory.insert!(:process).id,
    464 			output_of_id: Factory.insert!(:process).id,
    465 			provider_id: Factory.insert!(:agent).id,
    466 			receiver_id: Factory.insert!(:agent).id,
    467 			resource_conforms_to_id: Factory.insert!(:resource_specification).id,
    468 			resource_quantity: %{
    469 				has_numerical_value: Factory.decimal(),
    470 				has_unit_id: Factory.insert!(:unit).id,
    471 			},
    472 			has_beginning: DateTime.utc_now(),
    473 			has_end: DateTime.utc_now(),
    474 		}}
    475 	end
    476 
    477 	test "fail with `:input_of` and `:output_of` same", %{params: params} do
    478 		assert %Changeset{valid?: false} = cset =
    479 			params
    480 			|> Map.put(:output_of_id, params.input_of_id)
    481 			|> EconomicEvent.changeset()
    482 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    483 		msg = "all of them must be different"
    484 		assert {[^msg], err} = pop_in(err[:input_of_id])
    485 		assert {[^msg], err} = pop_in(err[:output_of_id])
    486 		assert err == %{}
    487 	end
    488 
    489 	test "pass with `:input_of` and `:output_of` differ", %{params: params} do
    490 		assert %Changeset{valid?: true} = EconomicEvent.changeset(params)
    491 	end
    492 
    493 	test "pass without `:input_of`", %{params: params} do
    494 		assert %Changeset{valid?: true} =
    495 			params
    496 			|> Map.delete(:input_of)
    497 			|> EconomicEvent.changeset()
    498 	end
    499 
    500 	test "pass without `:output_of`", %{params: params} do
    501 		assert %Changeset{valid?: true} =
    502 			params
    503 			|> Map.delete(:output_of)
    504 			|> EconomicEvent.changeset()
    505 	end
    506 end
    507 
    508 describe "`chgset/1` with pickup:" do
    509 	setup do
    510 		agent = Factory.insert!(:agent)
    511 
    512 		%{params: %{
    513 			action_id: "pickup",
    514 			input_of_id: Factory.insert!(:process).id,
    515 			provider_id: agent.id,
    516 			receiver_id: agent.id,
    517 			resource_inventoried_as_id: Factory.insert!(:economic_resource).id,
    518 			resource_quantity: %{
    519 				has_unit_id: Factory.insert!(:unit).id,
    520 				has_numerical_value: Factory.decimal(),
    521 			},
    522 			has_point_in_time: DateTime.utc_now(),
    523 		}}
    524 	end
    525 
    526 	test "pass when all good", %{params: params} do
    527 		assert %Changeset{valid?: true} = EconomicEvent.changeset(params)
    528 	end
    529 
    530 	test "fail when `:provider` and `:receiver` differ", %{params: params} do
    531 		agent = Factory.insert!(:agent)
    532 
    533 		assert %Changeset{valid?: false} = cset =
    534 			params
    535 			|> Map.put(:provider_id, agent.id)
    536 			|> EconomicEvent.changeset()
    537 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    538 		assert {[_], err} = pop_in(err[:provider_id])
    539 		assert {[_], err} = pop_in(err[:receiver_id])
    540 		assert err == %{}
    541 
    542 		assert %Changeset{valid?: false} = cset =
    543 			params
    544 			|> Map.put(:receiver_id, agent.id)
    545 			|> EconomicEvent.changeset()
    546 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    547 		assert {[_], err} = pop_in(err[:provider_id])
    548 		assert {[_], err} = pop_in(err[:receiver_id])
    549 		assert err == %{}
    550 	end
    551 end
    552 
    553 describe "`chgset/1` with dropoff:" do
    554 	setup do
    555 		agent = Factory.insert!(:agent)
    556 
    557 		%{params: %{
    558 			action_id: "dropoff",
    559 			output_of_id: Factory.insert!(:process).id,
    560 			provider_id: agent.id,
    561 			receiver_id: agent.id,
    562 			resource_inventoried_as_id: Factory.insert!(:economic_resource).id,
    563 			resource_quantity: %{
    564 				has_unit_id: Factory.insert!(:unit).id,
    565 				has_numerical_value: Factory.decimal(),
    566 			},
    567 			to_location_id: Factory.insert!(:spatial_thing).id,
    568 			has_beginning: DateTime.utc_now(),
    569 		}}
    570 	end
    571 
    572 	test "pass when all good", %{params: params} do
    573 		assert %Changeset{valid?: true} = EconomicEvent.changeset(params)
    574 	end
    575 
    576 	test "fail when `:provider` and `:receiver` differ", %{params: params} do
    577 		agent = Factory.insert!(:agent)
    578 
    579 		assert %Changeset{valid?: false} = cset =
    580 			params
    581 			|> Map.put(:provider_id, agent.id)
    582 			|> EconomicEvent.changeset()
    583 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    584 		assert {[_], err} = pop_in(err[:provider_id])
    585 		assert {[_], err} = pop_in(err[:receiver_id])
    586 		assert err == %{}
    587 
    588 		assert %Changeset{valid?: false} = cset =
    589 			params
    590 			|> Map.put(:receiver_id, agent.id)
    591 			|> EconomicEvent.changeset()
    592 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    593 		assert {[_], err} = pop_in(err[:provider_id])
    594 		assert {[_], err} = pop_in(err[:receiver_id])
    595 		assert err == %{}
    596 	end
    597 end
    598 
    599 describe "`chgset/1` with accept:" do
    600 	setup do
    601 		agent = Factory.insert!(:agent)
    602 
    603 		%{params: %{
    604 			action_id: "pickup",
    605 			input_of_id: Factory.insert!(:process).id,
    606 			provider_id: agent.id,
    607 			receiver_id: agent.id,
    608 			resource_inventoried_as_id: Factory.insert!(:economic_resource).id,
    609 			resource_quantity: %{
    610 				has_unit_id: Factory.insert!(:unit).id,
    611 				has_numerical_value: Factory.decimal(),
    612 			},
    613 			has_end: DateTime.utc_now(),
    614 		}}
    615 	end
    616 
    617 	test "pass when all good", %{params: params} do
    618 		assert %Changeset{valid?: true} = EconomicEvent.changeset(params)
    619 	end
    620 
    621 	test "fail when `:provider` and `:receiver` differ", %{params: params} do
    622 		agent = Factory.insert!(:agent)
    623 
    624 		assert %Changeset{valid?: false} = cset =
    625 			params
    626 			|> Map.put(:provider_id, agent.id)
    627 			|> EconomicEvent.changeset()
    628 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    629 		assert {[_], err} = pop_in(err[:provider_id])
    630 		assert {[_], err} = pop_in(err[:receiver_id])
    631 		assert err == %{}
    632 
    633 		assert %Changeset{valid?: false} = cset =
    634 			params
    635 			|> Map.put(:receiver_id, agent.id)
    636 			|> EconomicEvent.changeset()
    637 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    638 		assert {[_], err} = pop_in(err[:provider_id])
    639 		assert {[_], err} = pop_in(err[:receiver_id])
    640 		assert err == %{}
    641 	end
    642 end
    643 
    644 describe "`chgset/1` with modify:" do
    645 	setup do
    646 		agent = Factory.insert!(:agent)
    647 
    648 		%{params: %{
    649 			action_id: "modify",
    650 			output_of_id: Factory.insert!(:process).id,
    651 			provider_id: agent.id,
    652 			receiver_id: agent.id,
    653 			resource_inventoried_as_id: Factory.insert!(:economic_resource).id,
    654 			resource_quantity: %{
    655 				has_unit_id: Factory.insert!(:unit).id,
    656 				has_numerical_value: Factory.decimal(),
    657 			},
    658 			has_beginning: DateTime.utc_now(),
    659 			has_end: DateTime.utc_now(),
    660 		}}
    661 	end
    662 
    663 	test "pass when all good", %{params: params} do
    664 		assert %Changeset{valid?: true} = EconomicEvent.changeset(params)
    665 	end
    666 
    667 	test "fail when `:provider` and `:receiver` differ", %{params: params} do
    668 		agent = Factory.insert!(:agent)
    669 
    670 		assert %Changeset{valid?: false} = cset =
    671 			params
    672 			|> Map.put(:provider_id, agent.id)
    673 			|> EconomicEvent.changeset()
    674 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    675 		assert {[_], err} = pop_in(err[:provider_id])
    676 		assert {[_], err} = pop_in(err[:receiver_id])
    677 		assert err == %{}
    678 
    679 		assert %Changeset{valid?: false} = cset =
    680 			params
    681 			|> Map.put(:receiver_id, agent.id)
    682 			|> EconomicEvent.changeset()
    683 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    684 		assert {[_], err} = pop_in(err[:provider_id])
    685 		assert {[_], err} = pop_in(err[:receiver_id])
    686 		assert err == %{}
    687 	end
    688 end
    689 
    690 test "`chgset/1` with transferCustody: pass when all good" do
    691 	assert %Changeset{valid?: true} = EconomicEvent.changeset(%{
    692 		action_id: "transferCustody",
    693 		provider_id: Factory.insert!(:agent).id,
    694 		receiver_id: Factory.insert!(:agent).id,
    695 		resource_inventoried_as_id: Factory.insert!(:economic_resource).id,
    696 		resource_quantity: %{
    697 			has_unit_id: Factory.insert!(:unit).id,
    698 			has_numerical_value: Factory.decimal(),
    699 		},
    700 		has_beginning: DateTime.utc_now(),
    701 	})
    702 end
    703 
    704 test "`chgset/1` with transferAllRights: pass when all good" do
    705 	assert %Changeset{valid?: true} = EconomicEvent.changeset(%{
    706 		action_id: "transferAllRights",
    707 		provider_id: Factory.insert!(:agent).id,
    708 		receiver_id: Factory.insert!(:agent).id,
    709 		resource_inventoried_as_id: Factory.insert!(:economic_resource).id,
    710 		resource_quantity: %{
    711 			has_unit_id: Factory.insert!(:unit).id,
    712 			has_numerical_value: Factory.decimal(),
    713 		},
    714 		to_location_id: Factory.insert!(:spatial_thing).id,
    715 		has_end: DateTime.utc_now(),
    716 	})
    717 end
    718 
    719 test "`chgset/1` with transfer: pass when all good" do
    720 	assert %Changeset{valid?: true} = EconomicEvent.changeset(%{
    721 		action_id: "transfer",
    722 		provider_id: Factory.insert!(:agent).id,
    723 		receiver_id: Factory.insert!(:agent).id,
    724 		resource_inventoried_as_id: Factory.insert!(:economic_resource).id,
    725 		resource_quantity: %{
    726 			has_unit_id: Factory.insert!(:unit).id,
    727 			has_numerical_value: Factory.decimal(),
    728 		},
    729 		to_location_id: Factory.insert!(:spatial_thing).id,
    730 		has_beginning: DateTime.utc_now(),
    731 		has_end: DateTime.utc_now(),
    732 	})
    733 end
    734 
    735 describe "`chgset/1` with move:" do
    736 	setup do
    737 		agent = Factory.insert!(:agent)
    738 		%{params: %{
    739 			action_id: "move",
    740 			provider_id: agent.id,
    741 			receiver_id: agent.id,
    742 			resource_inventoried_as_id: Factory.insert!(:economic_resource).id,
    743 			resource_quantity: %{
    744 				has_unit_id: Factory.insert!(:unit).id,
    745 				has_numerical_value: Factory.decimal(),
    746 			},
    747 			has_point_in_time: DateTime.utc_now(),
    748 		}}
    749 	end
    750 
    751 	test "pass when all good", %{params: params} do
    752 		assert %Changeset{valid?: true} = EconomicEvent.changeset(params)
    753 	end
    754 
    755 	test "fail when `:provider` and `:receiver` differ", %{params: params} do
    756 		agent = Factory.insert!(:agent)
    757 
    758 		assert %Changeset{valid?: false} = cset =
    759 			params
    760 			|> Map.put(:provider_id, agent.id)
    761 			|> EconomicEvent.changeset()
    762 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    763 		assert {[_], err} = pop_in(err[:provider_id])
    764 		assert {[_], err} = pop_in(err[:receiver_id])
    765 		assert err == %{}
    766 
    767 		assert %Changeset{valid?: false} = cset =
    768 			params
    769 			|> Map.put(:receiver_id, agent.id)
    770 			|> EconomicEvent.changeset()
    771 		err = Changeset.traverse_errors(cset, &elem(&1, 0))
    772 		assert {[_], err} = pop_in(err[:provider_id])
    773 		assert {[_], err} = pop_in(err[:receiver_id])
    774 		assert err == %{}
    775 	end
    776 end
    777 
    778 describe "" do
    779 	# @tag skip: "TODO: fix events in factory"
    780 	# test "with both :resource_conforms_to and :resource_inventoried_as", %{params: params} do
    781 	# 	params = params
    782 	# 		|> Map.put(:resource_conforms_to_id, Factory.insert!(:resource_specification).id)
    783 	# 		|> Map.put(:resource_inventoried_as_id, Factory.insert!(:economic_resource).id)
    784 	# 		|> Map.put(:has_point_in_time, DateTime.utc_now())
    785 
    786 	# 	assert {:error, %Changeset{errors: errs}} =
    787 	# 		params
    788 	# 		|> EconomicEvent.changeset()
    789 	# 		|> Repo.insert()
    790 
    791 	# 	assert {:ok, _} = Keyword.fetch(errs, :resource_conforms_to_id)
    792 	# 	assert {:ok, _} = Keyword.fetch(errs, :resource_inventoried_as_id)
    793 	# end
    794 
    795 	# @tag skip: "TODO: fix events in factory"
    796 	# test "with both :resource_conforms_to and :to_resource_inventoried_as", %{params: params} do
    797 	# 	params = params
    798 	# 		|> Map.put(:resource_conforms_to_id, Factory.insert!(:resource_specification).id)
    799 	# 		|> Map.put(:to_resource_inventoried_as_id, Factory.insert!(:economic_resource).id)
    800 	# 		|> Map.put(:has_point_in_time, DateTime.utc_now())
    801 
    802 	# 	assert {:error, %Changeset{errors: errs}} =
    803 	# 		params
    804 	# 		|> EconomicEvent.changeset()
    805 	# 		|> Repo.insert()
    806 
    807 	# 	assert {:ok, _} = Keyword.fetch(errs, :resource_conforms_to_id)
    808 	# 	assert {:ok, _} = Keyword.fetch(errs, :to_resource_inventoried_as_id)
    809 	# end
    810 
    811 	# @tag skip: "TODO: fix events in factory"
    812 	# test "with only :resource_inventoried_as", %{params: params} do
    813 	# 	params = params
    814 	# 		|> Map.put(:resource_inventoried_as_id, Factory.insert!(:economic_resource).id)
    815 	# 		|> Map.put(:has_point_in_time, DateTime.utc_now())
    816 
    817 	# 	assert {:ok, %EconomicEvent{} = eco_evt} =
    818 	# 		params
    819 	# 		|> EconomicEvent.changeset()
    820 	# 		|> Repo.insert()
    821 
    822 	# 	assert eco_evt.action_id == params.action_id
    823 	# 	assert eco_evt.provider_id == params.provider_id
    824 	# 	assert eco_evt.receiver_id == params.receiver_id
    825 	# 	assert eco_evt.input_of_id == params.input_of_id
    826 	# 	assert eco_evt.output_of_id == params.output_of_id
    827 	# 	assert eco_evt.resource_inventoried_as_id == params.resource_inventoried_as_id
    828 	# 	assert eco_evt.to_resource_inventoried_as_id == nil
    829 	# 	assert eco_evt.resource_classified_as == params.resource_classified_as
    830 	# 	assert eco_evt.resource_conforms_to_id == nil
    831 	# 	assert eco_evt.resource_quantity_has_unit_id == params.resource_quantity.has_unit_id
    832 	# 	assert eco_evt.resource_quantity_has_numerical_value == params.resource_quantity.has_numerical_value
    833 	# 	assert eco_evt.effort_quantity_has_unit_id == params.effort_quantity.has_unit_id
    834 	# 	assert eco_evt.effort_quantity_has_numerical_value == params.effort_quantity.has_numerical_value
    835 	# 	assert eco_evt.realization_of_id == params.realization_of_id
    836 	# 	assert eco_evt.at_location_id == params.at_location_id
    837 	# 	assert eco_evt.has_beginning == nil
    838 	# 	assert eco_evt.has_end == nil
    839 	# 	assert eco_evt.has_point_in_time == params.has_point_in_time
    840 	# 	assert eco_evt.note == params.note
    841 	# 	# assert in_scope_of
    842 	# 	assert eco_evt.agreed_in == params.agreed_in
    843 	# 	assert eco_evt.triggered_by_id == params.triggered_by_id
    844 	# end
    845 
    846 	# @tag skip: "TODO: fix events in factory"
    847 	# test "with only :to_resource_inventoried_as", %{params: params} do
    848 	# 	params = params
    849 	# 		|> Map.put(:to_resource_inventoried_as_id, Factory.insert!(:economic_resource).id)
    850 	# 		|> Map.put(:has_point_in_time, DateTime.utc_now())
    851 
    852 	# 	assert {:ok, %EconomicEvent{} = eco_evt} =
    853 	# 		params
    854 	# 		|> EconomicEvent.changeset()
    855 	# 		|> Repo.insert()
    856 
    857 	# 	assert eco_evt.action_id == params.action_id
    858 	# 	assert eco_evt.provider_id == params.provider_id
    859 	# 	assert eco_evt.receiver_id == params.receiver_id
    860 	# 	assert eco_evt.input_of_id == params.input_of_id
    861 	# 	assert eco_evt.output_of_id == params.output_of_id
    862 	# 	assert eco_evt.resource_inventoried_as_id == nil
    863 	# 	assert eco_evt.to_resource_inventoried_as_id == params.to_resource_inventoried_as_id
    864 	# 	assert eco_evt.resource_classified_as == params.resource_classified_as
    865 	# 	assert eco_evt.resource_conforms_to_id == nil
    866 	# 	assert eco_evt.resource_quantity_has_unit_id == params.resource_quantity.has_unit_id
    867 	# 	assert eco_evt.resource_quantity_has_numerical_value == params.resource_quantity.has_numerical_value
    868 	# 	assert eco_evt.effort_quantity_has_unit_id == params.effort_quantity.has_unit_id
    869 	# 	assert eco_evt.effort_quantity_has_numerical_value == params.effort_quantity.has_numerical_value
    870 	# 	assert eco_evt.realization_of_id == params.realization_of_id
    871 	# 	assert eco_evt.at_location_id == params.at_location_id
    872 	# 	assert eco_evt.has_beginning == nil
    873 	# 	assert eco_evt.has_end == nil
    874 	# 	assert eco_evt.has_point_in_time == params.has_point_in_time
    875 	# 	assert eco_evt.note == params.note
    876 	# 	# assert in_scope_of
    877 	# 	assert eco_evt.agreed_in == params.agreed_in
    878 	# 	assert eco_evt.triggered_by_id == params.triggered_by_id
    879 	# end
    880 
    881 	# @tag skip: "TODO: fix events in factory"
    882 	# test "with both :resource_inventoried_as and :to_resource_inventoried_as", %{params: params} do
    883 	# 	params = params
    884 	# 		|> Map.put(:resource_inventoried_as_id, Factory.insert!(:economic_resource).id)
    885 	# 		|> Map.put(:to_resource_inventoried_as_id, Factory.insert!(:economic_resource).id)
    886 	# 		|> Map.put(:has_point_in_time, DateTime.utc_now())
    887 
    888 	# 	assert {:ok, %EconomicEvent{} = eco_evt} =
    889 	# 		params
    890 	# 		|> EconomicEvent.changeset()
    891 	# 		|> Repo.insert()
    892 
    893 	# 	assert eco_evt.action_id == params.action_id
    894 	# 	assert eco_evt.provider_id == params.provider_id
    895 	# 	assert eco_evt.receiver_id == params.receiver_id
    896 	# 	assert eco_evt.input_of_id == params.input_of_id
    897 	# 	assert eco_evt.output_of_id == params.output_of_id
    898 	# 	assert eco_evt.resource_inventoried_as_id == params.resource_inventoried_as_id
    899 	# 	assert eco_evt.to_resource_inventoried_as_id == params.to_resource_inventoried_as_id
    900 	# 	assert eco_evt.resource_classified_as == params.resource_classified_as
    901 	# 	assert eco_evt.resource_conforms_to_id == nil
    902 	# 	assert eco_evt.resource_quantity_has_unit_id == params.resource_quantity.has_unit_id
    903 	# 	assert eco_evt.resource_quantity_has_numerical_value == params.resource_quantity.has_numerical_value
    904 	# 	assert eco_evt.effort_quantity_has_unit_id == params.effort_quantity.has_unit_id
    905 	# 	assert eco_evt.effort_quantity_has_numerical_value == params.effort_quantity.has_numerical_value
    906 	# 	assert eco_evt.realization_of_id == params.realization_of_id
    907 	# 	assert eco_evt.at_location_id == params.at_location_id
    908 	# 	assert eco_evt.has_beginning == nil
    909 	# 	assert eco_evt.has_end == nil
    910 	# 	assert eco_evt.has_point_in_time == params.has_point_in_time
    911 	# 	assert eco_evt.note == params.note
    912 	# 	# assert in_scope_of
    913 	# 	assert eco_evt.agreed_in == params.agreed_in
    914 	# 	assert eco_evt.triggered_by_id == params.triggered_by_id
    915 	# end
    916 
    917 	# @tag skip: "TODO: fix events in factory"
    918 	# test "with only :resource_conforms_to", %{params: params} do
    919 	# 	params = params
    920 	# 		|> Map.put(:resource_conforms_to_id, Factory.insert!(:resource_specification).id)
    921 	# 		|> Map.put(:has_point_in_time, DateTime.utc_now())
    922 
    923 	# 	assert {:ok, %EconomicEvent{} = eco_evt} =
    924 	# 		params
    925 	# 		|> EconomicEvent.changeset()
    926 	# 		|> Repo.insert()
    927 
    928 	# 	assert eco_evt.action_id == params.action_id
    929 	# 	assert eco_evt.provider_id == params.provider_id
    930 	# 	assert eco_evt.receiver_id == params.receiver_id
    931 	# 	assert eco_evt.input_of_id == params.input_of_id
    932 	# 	assert eco_evt.output_of_id == params.output_of_id
    933 	# 	assert eco_evt.resource_inventoried_as_id == nil
    934 	# 	assert eco_evt.to_resource_inventoried_as_id == nil
    935 	# 	assert eco_evt.resource_classified_as == params.resource_classified_as
    936 	# 	assert eco_evt.resource_conforms_to_id == params.resource_conforms_to_id
    937 	# 	assert eco_evt.resource_quantity_has_unit_id == params.resource_quantity.has_unit_id
    938 	# 	assert eco_evt.resource_quantity_has_numerical_value == params.resource_quantity.has_numerical_value
    939 	# 	assert eco_evt.effort_quantity_has_unit_id == params.effort_quantity.has_unit_id
    940 	# 	assert eco_evt.effort_quantity_has_numerical_value == params.effort_quantity.has_numerical_value
    941 	# 	assert eco_evt.realization_of_id == params.realization_of_id
    942 	# 	assert eco_evt.at_location_id == params.at_location_id
    943 	# 	assert eco_evt.has_beginning == nil
    944 	# 	assert eco_evt.has_end == nil
    945 	# 	assert eco_evt.has_point_in_time == params.has_point_in_time
    946 	# 	assert eco_evt.note == params.note
    947 	# 	# assert in_scope_of
    948 	# 	assert eco_evt.agreed_in == params.agreed_in
    949 	# 	assert eco_evt.triggered_by_id == params.triggered_by_id
    950 	# end
    951 end
    952 
    953 @tag skip: "TODO: fix events in factory"
    954 test "update EconomicEvent", %{params: _params} do
    955 	# old = Factory.insert!(:economic_event)
    956 
    957 	# assert {:ok, %EconomicEvent{} = new} =
    958 	# 	old
    959 	# 	|> EconomicEvent.changeset(params)
    960 	# 	|> Repo.update()
    961 
    962 	# assert new.action_id == old.action_id
    963 	# assert new.provider_id == old.provider_id
    964 	# assert new.receiver_id == old.receiver_id
    965 	# assert new.input_of_id == old.input_of_id
    966 	# assert new.output_of_id == old.output_of_id
    967 	# assert new.resource_inventoried_as_id == old.resource_inventoried_as_id
    968 	# assert new.to_resource_inventoried_as_id == old.to_resource_inventoried_as_id
    969 	# assert new.resource_classified_as == old.resource_classified_as
    970 	# assert new.resource_conforms_to_id == old.resource_conforms_to_id
    971 	# assert new.resource_quantity_has_unit_id == old.resource_quantity_has_unit_id
    972 	# assert new.resource_quantity_has_numerical_value == old.resource_quantity_has_numerical_value
    973 	# assert new.effort_quantity_has_unit_id == old.effort_quantity_has_unit_id
    974 	# assert new.effort_quantity_has_numerical_value == old.effort_quantity_has_numerical_value
    975 	# assert new.realization_of_id == params.realization_of_id
    976 	# assert new.at_location_id == old.at_location_id
    977 	# assert new.has_beginning == old.has_beginning
    978 	# assert new.has_end == old.has_end
    979 	# assert new.has_point_in_time == old.has_point_in_time
    980 	# assert new.note == params.note
    981 	# # assert in_scope_of
    982 	# assert new.agreed_in == params.agreed_in
    983 	# assert new.triggered_by_id == params.triggered_by_id
    984 end
    985 end