zf

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

type.test.exs (11601B)


      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.Intent.Type do
     19 use ZenflowsTest.Help.AbsinCase, async: true
     20 
     21 alias Zenflows.DB.ID
     22 
     23 setup do
     24 	%{
     25 		params: %{
     26 			"action" => Factory.build(:action_id),
     27 			"inputOf" => Factory.insert!(:process).id,
     28 			"outputOf" => Factory.insert!(:process).id,
     29 			"provider" => Factory.insert!(:agent).id,
     30 			"receiver" => Factory.insert!(:agent).id,
     31 			"resourceInventoriedAs" => Factory.insert!(:economic_resource).id,
     32 			"resourceConformsTo" => Factory.insert!(:resource_specification).id,
     33 			"resourceClassifiedAs" => Factory.str_list("uri"),
     34 			"resourceQuantity" => %{
     35 				"hasUnit" => Factory.insert!(:unit).id,
     36 				"hasNumericalValue" => Factory.decimal(),
     37 			},
     38 			"effortQuantity" => %{
     39 				"hasUnit" => Factory.insert!(:unit).id,
     40 				"hasNumericalValue" => Factory.decimal(),
     41 			},
     42 			"availableQuantity" => %{
     43 				"hasUnit" => Factory.insert!(:unit).id,
     44 				"hasNumericalValue" => Factory.decimal(),
     45 			},
     46 			"hasBeginning" => Factory.iso_now(),
     47 			"hasEnd" => Factory.iso_now(),
     48 			"hasPointInTime" => Factory.iso_now(),
     49 			"due" => Factory.iso_now(),
     50 			"finished" => Factory.bool(),
     51 			"atLocation" => Factory.insert!(:spatial_thing).id,
     52 			"name" => Factory.str("name"),
     53 			"note" => Factory.str("note"),
     54 			# inScopeOf:
     55 			"agreedIn" => Factory.str("uri"),
     56 		},
     57 		inserted: Factory.insert!(:intent),
     58 		id: Factory.id(),
     59 	}
     60 end
     61 
     62 @frag """
     63 fragment measure on Measure {
     64 	hasNumericalValue
     65 	hasUnit {id}
     66 }
     67 
     68 fragment intent on Intent {
     69 	id
     70 	action {id}
     71 	inputOf {id}
     72 	outputOf {id}
     73 	provider {id}
     74 	receiver {id}
     75 	resourceInventoriedAs {id}
     76 	resourceConformsTo {id}
     77 	resourceClassifiedAs
     78 	resourceQuantity {...measure}
     79 	effortQuantity {...measure}
     80 	availableQuantity {...measure}
     81 	hasBeginning
     82 	hasEnd
     83 	hasPointInTime
     84 	due
     85 	finished
     86 	atLocation {id}
     87 	name
     88 	note
     89 	agreedIn
     90 }
     91 """
     92 
     93 describe "Query" do
     94 	test "intent", %{inserted: int} do
     95 		assert %{data: %{"intent" => data}} =
     96 			run!("""
     97 				#{@frag}
     98 				query ($id: ID!) {
     99 					intent(id: $id) {...intent}
    100 				}
    101 			""", vars: %{"id" => int.id})
    102 
    103 		assert data["id"] == int.id
    104 		assert data["action"]["id"] == int.action_id
    105 		assert data["inputOf"]["id"] == int.input_of_id
    106 		assert data["outputOf"]["id"] == int.output_of_id
    107 		assert data["provider"]["id"] == int.provider_id
    108 		assert data["receiver"]["id"] == int.receiver_id
    109 		assert data["resourceInventoriedAs"]["id"] == int.resource_inventoried_as_id
    110 		assert data["resourceConformsTo"]["id"] == int.resource_conforms_to_id
    111 		assert data["resourceClassifiedAs"] == int.resource_classified_as
    112 		assert Decimal.eq?(data["resourceQuantity"]["hasNumericalValue"], int.resource_quantity_has_numerical_value)
    113 		assert data["resourceQuantity"]["hasUnit"]["id"] == int.resource_quantity_has_unit_id
    114 		assert Decimal.eq?(data["effortQuantity"]["hasNumericalValue"], int.effort_quantity_has_numerical_value)
    115 		assert data["effortQuantity"]["hasUnit"]["id"] == int.effort_quantity_has_unit_id
    116 		assert Decimal.eq?(data["availableQuantity"]["hasNumericalValue"], int.available_quantity_has_numerical_value)
    117 		assert data["availableQuantity"]["hasUnit"]["id"] == int.available_quantity_has_unit_id
    118 		assert data["hasBeginning"] == DateTime.to_iso8601(int.has_beginning)
    119 		assert data["hasEnd"] == DateTime.to_iso8601(int.has_end)
    120 		assert data["hasPointInTime"] == DateTime.to_iso8601(int.has_point_in_time)
    121 		assert data["due"] == DateTime.to_iso8601(int.due)
    122 		assert data["finished"] == int.finished
    123 		assert data["atLocation"]["id"] == int.at_location_id
    124 		assert data["name"] == int.name
    125 		assert data["note"] == int.note
    126 		assert data["agreedIn"] == int.agreed_in
    127 	end
    128 end
    129 
    130 describe "Mutation" do
    131 	test "createIntent with only provider", %{params: params} do
    132 		params = Map.put(params, "receiver", nil)
    133 
    134 		assert %{data: %{"createIntent" => %{"intent" => data}}} =
    135 			run!("""
    136 				#{@frag}
    137 				mutation ($intent: IntentCreateParams!) {
    138 					createIntent(intent: $intent) {
    139 						intent {...intent}
    140 					}
    141 				}
    142 			""", vars: %{"intent" => params})
    143 
    144 		assert {:ok, _} = ID.cast(data["id"])
    145 		assert data["action"]["id"] == params["action"]
    146 		assert data["inputOf"]["id"] == params["inputOf"]
    147 		assert data["outputOf"]["id"] == params["outputOf"]
    148 		assert data["provider"]["id"] == params["provider"]
    149 		assert data["receiver"]["id"] == params["receiver"]
    150 		assert data["resourceInventoriedAs"]["id"] == params["resourceInventoriedAs"]
    151 		assert data["resourceConformsTo"]["id"] == params["resourceConformsTo"]
    152 		assert data["resourceClassifiedAs"] == params["resourceClassifiedAs"]
    153 		assert data["resourceQuantity"]["hasNumericalValue"] == params["resourceQuantity"]["hasNumericalValue"]
    154 		assert data["resourceQuantity"]["hasUnit"]["id"] == params["resourceQuantity"]["hasUnit"]
    155 		assert data["effortQuantity"]["hasNumericalValue"] == params["effortQuantity"]["hasNumericalValue"]
    156 		assert data["effortQuantity"]["hasUnit"]["id"] == params["effortQuantity"]["hasUnit"]
    157 		assert data["availableQuantity"]["hasNumericalValue"] == params["availableQuantity"]["hasNumericalValue"]
    158 		assert data["availableQuantity"]["hasUnit"]["id"] == params["availableQuantity"]["hasUnit"]
    159 		assert data["atLocation"]["id"] == params["atLocation"]
    160 
    161 		Enum.each(~w[
    162 				hasBeginning hasEnd hasPointInTime due
    163 				finished name note agreedIn
    164 			], fn x ->
    165 				assert data[x] == params[x]
    166 			end)
    167 	end
    168 
    169 	test "createIntent with only receiver", %{params: params} do
    170 		params = Map.put(params, "provider", nil)
    171 
    172 		assert %{data: %{"createIntent" => %{"intent" => data}}} =
    173 			run!("""
    174 				#{@frag}
    175 				mutation ($intent: IntentCreateParams!) {
    176 					createIntent(intent: $intent) {
    177 						intent {...intent}
    178 					}
    179 				}
    180 			""", vars: %{"intent" => params})
    181 
    182 		assert {:ok, _} = ID.cast(data["id"])
    183 		assert data["action"]["id"] == params["action"]
    184 		assert data["inputOf"]["id"] == params["inputOf"]
    185 		assert data["outputOf"]["id"] == params["outputOf"]
    186 		assert data["provider"]["id"] == params["provider"]
    187 		assert data["receiver"]["id"] == params["receiver"]
    188 		assert data["resourceInventoriedAs"]["id"] == params["resourceInventoriedAs"]
    189 		assert data["resourceConformsTo"]["id"] == params["resourceConformsTo"]
    190 		assert data["resourceClassifiedAs"] == params["resourceClassifiedAs"]
    191 		assert data["resourceQuantity"]["hasNumericalValue"] == params["resourceQuantity"]["hasNumericalValue"]
    192 		assert data["resourceQuantity"]["hasUnit"]["id"] == params["resourceQuantity"]["hasUnit"]
    193 		assert data["effortQuantity"]["hasNumericalValue"] == params["effortQuantity"]["hasNumericalValue"]
    194 		assert data["effortQuantity"]["hasUnit"]["id"] == params["effortQuantity"]["hasUnit"]
    195 		assert data["availableQuantity"]["hasNumericalValue"] == params["availableQuantity"]["hasNumericalValue"]
    196 		assert data["availableQuantity"]["hasUnit"]["id"] == params["availableQuantity"]["hasUnit"]
    197 		assert data["atLocation"]["id"] == params["atLocation"]
    198 
    199 		Enum.each(~w[
    200 				hasBeginning hasEnd hasPointInTime due
    201 				finished name note agreedIn
    202 			], fn x ->
    203 				assert data[x] == params[x]
    204 			end)
    205 	end
    206 
    207 	test "updateIntent with only provider", %{params: params} do
    208 		params = Map.put(params, "receiver", nil)
    209 		%{id: id} = Factory.insert!(:intent, %{provider: Factory.build(:agent), receiver: nil})
    210 		assert %{data: %{"updateIntent" => %{"intent" => data}}} =
    211 			run!("""
    212 				#{@frag}
    213 				mutation ($intent: IntentUpdateParams!) {
    214 					updateIntent(intent: $intent) {
    215 						intent {...intent}
    216 					}
    217 				}
    218 			""", vars: %{
    219 				"intent" => Map.put(params, "id", id),
    220 			})
    221 
    222 		assert data["id"] == id
    223 		assert data["action"]["id"] == params["action"]
    224 		assert data["inputOf"]["id"] == params["inputOf"]
    225 		assert data["outputOf"]["id"] == params["outputOf"]
    226 		assert data["provider"]["id"] == params["provider"]
    227 		assert data["receiver"]["id"] == params["receiver"]
    228 		assert data["resourceInventoriedAs"]["id"] == params["resourceInventoriedAs"]
    229 		assert data["resourceConformsTo"]["id"] == params["resourceConformsTo"]
    230 		assert data["resourceClassifiedAs"] == params["resourceClassifiedAs"]
    231 		assert data["resourceQuantity"]["hasNumericalValue"] == params["resourceQuantity"]["hasNumericalValue"]
    232 		assert data["resourceQuantity"]["hasUnit"]["id"] == params["resourceQuantity"]["hasUnit"]
    233 		assert data["effortQuantity"]["hasNumericalValue"] == params["effortQuantity"]["hasNumericalValue"]
    234 		assert data["effortQuantity"]["hasUnit"]["id"] == params["effortQuantity"]["hasUnit"]
    235 		assert data["availableQuantity"]["hasNumericalValue"] == params["availableQuantity"]["hasNumericalValue"]
    236 		assert data["availableQuantity"]["hasUnit"]["id"] == params["availableQuantity"]["hasUnit"]
    237 		assert data["atLocation"]["id"] == params["atLocation"]
    238 
    239 		Enum.each(~w[
    240 				hasBeginning hasEnd hasPointInTime due
    241 				finished name note agreedIn
    242 			], fn x ->
    243 				assert data[x] == params[x]
    244 			end)
    245 	end
    246 
    247 	test "updateIntent with only receiver", %{params: params} do
    248 		params = Map.put(params, "provider", nil)
    249 		%{id: id} = Factory.insert!(:intent, %{provider: nil, receiver: Factory.build(:agent)})
    250 		assert %{data: %{"updateIntent" => %{"intent" => data}}} =
    251 			run!("""
    252 				#{@frag}
    253 				mutation ($intent: IntentUpdateParams!) {
    254 					updateIntent(intent: $intent) {
    255 						intent {...intent}
    256 					}
    257 				}
    258 			""", vars: %{
    259 				"intent" => Map.put(params, "id", id),
    260 			})
    261 
    262 		assert data["id"] == id
    263 		assert data["action"]["id"] == params["action"]
    264 		assert data["inputOf"]["id"] == params["inputOf"]
    265 		assert data["outputOf"]["id"] == params["outputOf"]
    266 		assert data["provider"]["id"] == params["provider"]
    267 		assert data["receiver"]["id"] == params["receiver"]
    268 		assert data["resourceInventoriedAs"]["id"] == params["resourceInventoriedAs"]
    269 		assert data["resourceConformsTo"]["id"] == params["resourceConformsTo"]
    270 		assert data["resourceClassifiedAs"] == params["resourceClassifiedAs"]
    271 		assert data["resourceQuantity"]["hasNumericalValue"] == params["resourceQuantity"]["hasNumericalValue"]
    272 		assert data["resourceQuantity"]["hasUnit"]["id"] == params["resourceQuantity"]["hasUnit"]
    273 		assert data["effortQuantity"]["hasNumericalValue"] == params["effortQuantity"]["hasNumericalValue"]
    274 		assert data["effortQuantity"]["hasUnit"]["id"] == params["effortQuantity"]["hasUnit"]
    275 		assert data["availableQuantity"]["hasNumericalValue"] == params["availableQuantity"]["hasNumericalValue"]
    276 		assert data["availableQuantity"]["hasUnit"]["id"] == params["availableQuantity"]["hasUnit"]
    277 		assert data["atLocation"]["id"] == params["atLocation"]
    278 
    279 		Enum.each(~w[
    280 				hasBeginning hasEnd hasPointInTime due
    281 				finished name note agreedIn
    282 			], fn x ->
    283 				assert data[x] == params[x]
    284 			end)
    285 	end
    286 
    287 	test "deleteIntent", %{inserted: %{id: id}} do
    288 		assert %{data: %{"deleteIntent" => true}} =
    289 			run!("""
    290 				mutation ($id: ID!) {
    291 					deleteIntent(id: $id)
    292 				}
    293 			""", vars: %{"id" => id})
    294 	end
    295 end
    296 end