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