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