zf

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

commit 530f0373faf162be9ce16acd8d06a548b3dd1f0e
parent 40650a0dfa1fe23a827a66bc471b34dadf7882b0
Author: srfsh <dev@srf.sh>
Date:   Mon, 22 Aug 2022 22:01:36 +0300

Zenflows{Test,}.VF.EconomicResource: add paging support and small improvements

Diffstat:
Msrc/zenflows/vf/economic_resource/domain.ex | 45+++++++++++++++++++++++----------------------
Msrc/zenflows/vf/economic_resource/resolv.ex | 39++++++++++++++++++++-------------------
Msrc/zenflows/vf/economic_resource/type.ex | 26+++++++++++++++++++++-----
Mtest/vf/economic_resource/domain.test.exs | 5++---
Mtest/vf/economic_resource/type.test.exs | 209++++++++++++++++++++++++++++++++++++-------------------------------------------
5 files changed, 160 insertions(+), 164 deletions(-)

diff --git a/src/zenflows/vf/economic_resource/domain.ex b/src/zenflows/vf/economic_resource/domain.ex @@ -20,6 +20,7 @@ defmodule Zenflows.VF.EconomicResource.Domain do alias Ecto.Multi alias Zenflows.DB.Repo +alias Zenflows.GQL.Paging alias Zenflows.VF.{ Action, EconomicResource, @@ -28,20 +29,31 @@ alias Zenflows.VF.{ @typep repo() :: Ecto.Repo.t() @typep error() :: Ecto.Changeset.t() | String.t() -@typep changes() :: Ecto.Multi.changes() @typep id() :: Zenflows.DB.Schema.id() @typep params() :: Zenflows.DB.Schema.params() -@spec by_id(repo(), id()) :: EconomicResource.t() | nil -def by_id(repo \\ Repo, id) do - repo.get(EconomicResource, id) +@spec one(repo(), id() | map() | Keyword.t()) + :: {:ok, EconomicResource.t()} | {:error, String.t()} +def one(repo \\ Repo, _) +def one(repo, id) when is_binary(id), do: one(repo, id: id) +def one(repo, clauses) do + case repo.get_by(EconomicResource, clauses) do + nil -> {:error, "not found"} + found -> {:ok, found} + end +end + +@spec all(Paging.params()) :: Paging.result(EconomicResource.t()) +def all(params) do + Paging.page(EconomicResource, params) end -@spec update(id(), params()) :: {:ok, EconomicResource.t()} | {:error, error} +@spec update(id(), params()) :: {:ok, EconomicResource.t()} | {:error, error()} def update(id, params) do Multi.new() - |> Multi.run(:get, multi_get(id)) - |> Multi.update(:update, &EconomicResource.chgset(&1.get, params)) + |> Multi.put(:id, id) + |> Multi.run(:one, &one/2) + |> Multi.update(:update, &EconomicResource.chgset(&1.one, params)) |> Repo.transaction() |> case do {:ok, %{update: er}} -> {:ok, er} @@ -49,11 +61,12 @@ def update(id, params) do end end -@spec delete(id()) :: {:ok, EconomicResource.t()} | {:error, error} +@spec delete(id()) :: {:ok, EconomicResource.t()} | {:error, error()} def delete(id) do Multi.new() - |> Multi.run(:get, multi_get(id)) - |> Multi.delete(:delete, &(&1.get)) + |> Multi.put(:id, id) + |> Multi.run(:one, &one/2) + |> Multi.delete(:delete, & &1.one) |> Repo.transaction() |> case do {:ok, %{delete: er}} -> {:ok, er} @@ -109,16 +122,4 @@ end def preload(eco_res, :unit_of_effort) do Repo.preload(eco_res, :unit_of_effort) end - -# Returns a EconomicResource in ok-err tuple from given ID. Used inside -# Ecto.Multi.run/5 to get a record in transaction. -@spec multi_get(id()) :: (repo(), changes() -> {:ok, EconomicResource.t()} | {:error, String.t()}) -defp multi_get(id) do - fn repo, _ -> - case by_id(repo, id) do - nil -> {:error, "not found"} - er -> {:ok, er} - end - end -end end diff --git a/src/zenflows/vf/economic_resource/resolv.ex b/src/zenflows/vf/economic_resource/resolv.ex @@ -20,78 +20,79 @@ defmodule Zenflows.VF.EconomicResource.Resolv do use Absinthe.Schema.Notation -alias Zenflows.VF.{ - EconomicResource, - EconomicResource.Domain, -} +alias Zenflows.VF.EconomicResource.Domain -def economic_resource(%{id: id}, _info) do - {:ok, Domain.by_id(id)} +def economic_resource(params, _) do + Domain.one(params) end -def update_economic_resource(%{resource: %{id: id} = params}, _info) do +def economic_resources(params, _) do + Domain.all(params) +end + +def update_economic_resource(%{resource: %{id: id} = params}, _) do with {:ok, eco_res} <- Domain.update(id, params) do {:ok, %{economic_resource: eco_res}} end end -def delete_economic_resource(%{id: id}, _info) do +def delete_economic_resource(%{id: id}, _) do with {:ok, _} <- Domain.delete(id) do {:ok, true} end end -def conforms_to(%EconomicResource{} = eco_res, _args, _info) do +def conforms_to(eco_res, _, _) do eco_res = Domain.preload(eco_res, :conforms_to) {:ok, eco_res.conforms_to} end -def accounting_quantity(%EconomicResource{} = eco_res, _args, _info) do +def accounting_quantity(eco_res, _, _) do eco_res = Domain.preload(eco_res, :accounting_quantity) {:ok, eco_res.accounting_quantity} end -def onhand_quantity(%EconomicResource{} = eco_res, _args, _info) do +def onhand_quantity(eco_res, _, _) do eco_res = Domain.preload(eco_res, :onhand_quantity) {:ok, eco_res.onhand_quantity} end -def primary_accountable(%EconomicResource{} = eco_res, _args, _info) do +def primary_accountable(eco_res, _, _) do eco_res = Domain.preload(eco_res, :primary_accountable) {:ok, eco_res.primary_accountable} end -def custodian(%EconomicResource{} = eco_res, _args, _info) do +def custodian(eco_res, _, _) do eco_res = Domain.preload(eco_res, :custodian) {:ok, eco_res.custodian} end -def stage(%EconomicResource{} = eco_res, _args, _info) do +def stage(eco_res, _, _) do eco_res = Domain.preload(eco_res, :stage) {:ok, eco_res.stage} end -def state(%EconomicResource{} = eco_res, _args, _info) do +def state(eco_res, _, _) do eco_res = Domain.preload(eco_res, :state) {:ok, eco_res.state} end -def current_location(%EconomicResource{} = eco_res, _args, _info) do +def current_location(eco_res, _, _) do eco_res = Domain.preload(eco_res, :current_location) {:ok, eco_res.current_location} end -def lot(%EconomicResource{} = eco_res, _args, _info) do +def lot(eco_res, _, _) do eco_res = Domain.preload(eco_res, :lot) {:ok, eco_res.lot} end -def contained_in(%EconomicResource{} = eco_res, _args, _info) do +def contained_in(eco_res, _, _) do eco_res = Domain.preload(eco_res, :contained_in) {:ok, eco_res.contained_in} end -def unit_of_effort(%EconomicResource{} = eco_res, _args, _info) do +def unit_of_effort(eco_res, _, _) do eco_res = Domain.preload(eco_res, :unit_of_effort) {:ok, eco_res.unit_of_effort} end diff --git a/src/zenflows/vf/economic_resource/type.ex b/src/zenflows/vf/economic_resource/type.ex @@ -155,10 +155,6 @@ object :economic_resource do field :unit_of_effort, :unit, resolve: &Resolv.unit_of_effort/3 end -object :economic_resource_response do - field :economic_resource, non_null(:economic_resource) -end - input_object :economic_resource_create_params do @desc @name field :name, non_null(:string) @@ -176,6 +172,20 @@ input_object :economic_resource_create_params do field :lot_id, :id, name: "lot" end +object :economic_resource_response do + field :economic_resource, non_null(:economic_resource) +end + +object :economic_resource_edge do + field :cursor, non_null(:id) + field :node, non_null(:economic_resource) +end + +object :economic_resource_connection do + field :page_info, non_null(:page_info) + field :edges, non_null(list_of(non_null(:economic_resource_edge))) +end + input_object :economic_resource_update_params do field :id, non_null(:id) @@ -192,7 +202,13 @@ object :query_economic_resource do resolve &Resolv.economic_resource/2 end - #economicResources(start: ID, limit: Int): [EconomicResource!] + field :economic_resources, :economic_resource_connection do + arg :first, :integer + arg :after, :id + arg :last, :integer + arg :before, :id + resolve &Resolv.economic_resources/2 + end end object :mutation_economic_resource do diff --git a/test/vf/economic_resource/domain.test.exs b/test/vf/economic_resource/domain.test.exs @@ -67,7 +67,7 @@ setup ctx do end test "by_id/1 returns a EconomicResource", %{inserted: eco_res} do - assert %EconomicResource{} = Domain.by_id(eco_res.id) + assert {:ok, %EconomicResource{}} = Domain.one(eco_res.id) end describe "update/2" do @@ -118,10 +118,9 @@ describe "update/2" do end end -@tag skip: "TODO: fix economic resource factory" test "delete/1 deletes a EconomicResource", %{inserted: %{id: id}} do assert {:ok, %EconomicResource{id: ^id}} = Domain.delete(id) - assert Domain.by_id(id) == nil + assert {:error, "not found"} = Domain.one(id) end describe "preload/2" do diff --git a/test/vf/economic_resource/type.test.exs b/test/vf/economic_resource/type.test.exs @@ -18,144 +18,123 @@ defmodule ZenflowsTest.VF.EconomicResource.Type do use ZenflowsTest.Help.AbsinCase, async: true -alias Zenflows.VF.EconomicResource.Domain - setup do %{ params: %{ - name: Factory.uniq("name"), - note: Factory.uniq("note"), - image: Factory.uri(), + "name" => Factory.uniq("name"), + "note" => Factory.uniq("note"), + "image" => Factory.img(), }, - inserted: - Factory.insert!(:economic_resource) - |> Domain.preload(:accounting_quantity) - |> Domain.preload(:onhand_quantity) + inserted: Factory.insert!(:economic_resource), } end +@frag """ +fragment economicResource on EconomicResource { + id + name + note + image + trackingIdentifier + classifiedAs + conformsTo {id} + accountingQuantity { + hasUnit { id } + hasNumericalValue + } + onhandQuantity { + hasUnit { id } + hasNumericalValue + } + primaryAccountable {id} + custodian {id} + stage {id} + state {id} + currentLocation {id} + lot {id} + containedIn {id} + unitOfEffort {id} +} +""" + describe "Query" do - @tag skip: "TODO: fix economic resource factory" - test "resource()", %{inserted: eco_res} do + test "resource", %{inserted: new} do assert %{data: %{"economicResource" => data}} = - query!(""" - economicResource(id: "#{eco_res.id}") { - id - name - note - image - trackingIdentifier - classifiedAs - conformsTo {id} - accountingQuantity { - hasUnit { id } - hasNumericalValue - } - onhandQuantity { - hasUnit { id } - hasNumericalValue - } - primaryAccountable {id} - custodian {id} - stage {id} - state {id} - currentLocation {id} - lot {id} - containedIn {id} - unitOfEffort {id} + run!(""" + #{@frag} + query ($id: ID!) { + economicResource(id: $id) {...economicResource} } - """) + """, vars: %{"id" => new.id}) - assert data["id"] == eco_res.id - assert data["name"] == eco_res.name - assert data["note"] == eco_res.note - # virtual field atm - # assert data["image"] == eco_res.image - assert data["trackingIdentifier"] == eco_res.tracking_identifier - assert data["classifiedAs"] == eco_res.classified_as - assert data["conformsTo"]["id"] == eco_res.conforms_to_id - assert data["accountingQuantity"]["hasUnit"]["id"] == eco_res.accounting_quantity_has_unit_id - assert data["accountingQuantity"]["hasNumericalValue"] == eco_res.accounting_quantity_has_numerical_value - assert data["onhandQuantity"]["hasUnit"]["id"] == eco_res.onhand_quantity_has_unit_id - assert data["onhandQuantity"]["hasNumericalValue"] == eco_res.onhand_quantity_has_numerical_value - assert data["primaryAccountable"]["id"] == eco_res.primary_accountable_id - assert data["custodian"]["id"] == eco_res.custodian_id - assert data["stage"]["id"] == eco_res.stage_id - assert data["state"]["id"] == eco_res.state_id - assert data["currentLocation"]["id"] == eco_res.current_location_id - assert data["lot"]["id"] == eco_res.lot_id - assert data["containedIn"]["id"] == eco_res.contained_in_id - assert data["unitOfEffort"]["id"] == eco_res.unit_of_effort_id + assert data["id"] == new.id + assert data["name"] == new.name + assert data["note"] == new.note + assert data["image"] == new.image + assert data["trackingIdentifier"] == new.tracking_identifier + assert data["classifiedAs"] == new.classified_as + assert data["conformsTo"]["id"] == new.conforms_to_id + assert data["accountingQuantity"]["hasUnit"]["id"] == new.accounting_quantity_has_unit_id + assert data["accountingQuantity"]["hasNumericalValue"] == new.accounting_quantity_has_numerical_value + assert data["onhandQuantity"]["hasUnit"]["id"] == new.onhand_quantity_has_unit_id + assert data["onhandQuantity"]["hasNumericalValue"] == new.onhand_quantity_has_numerical_value + assert data["primaryAccountable"]["id"] == new.primary_accountable_id + assert data["custodian"]["id"] == new.custodian_id + assert data["stage"]["id"] == new.stage_id + assert data["state"]["id"] == new.state_id + assert data["currentLocation"]["id"] == new.current_location_id + assert data["lot"]["id"] == new.lot_id + assert data["containedIn"]["id"] == new.contained_in_id + assert data["unitOfEffort"]["id"] == new.unit_of_effort_id end end describe "Mutation" do - @tag skip: "TODO: fix economic resource factory" - test "updateEconomicResource()", %{params: params, inserted: eco_res} do + @tag skip: "TODO: fix factory" + test "updateEconomicResource", %{params: params, inserted: old} do assert %{data: %{"updateEconomicResource" => %{"economicResource" => data}}} = - mutation!(""" - updateEconomicResource(resource: { - id: "#{eco_res.id}" - note: "#{params.note}" - image: "#{params.image}" - }) { - economicResource { - id - name - note - image - trackingIdentifier - classifiedAs - conformsTo {id} - accountingQuantity { - hasUnit { id } - hasNumericalValue - } - onhandQuantity { - hasUnit { id } - hasNumericalValue - } - primaryAccountable {id} - custodian {id} - stage {id} - state {id} - currentLocation {id} - lot {id} - containedIn {id} - unitOfEffort {id} + run!(""" + #{@frag} + mutation ($resource: EconomicResourceUpdateParams!) { + updateEconomicResource(resource: $resource) { + economicResource {...economicResource} } } - """) + """, vars: %{"resource" => %{ + "id" => old.id, + "note" => params["note"], + "image" => params["image"], + }}) - assert data["id"] == eco_res.id - assert data["id"] == eco_res.id - assert data["name"] == eco_res.name - assert data["note"] == params.note - # virtual field atm - # assert data["image"] == eco_res.image - assert data["trackingIdentifier"] == eco_res.tracking_identifier - assert data["classifiedAs"] == eco_res.classified_as - assert data["conformsTo"]["id"] == eco_res.conforms_to_id - assert data["accountingQuantity"]["hasUnit"]["id"] == eco_res.accounting_quantity_has_unit_id - assert data["accountingQuantity"]["hasNumericalValue"] == eco_res.accounting_quantity_has_numerical_value - assert data["onhandQuantity"]["hasUnit"]["id"] == eco_res.onhand_quantity_has_unit_id - assert data["onhandQuantity"]["hasNumericalValue"] == eco_res.onhand_quantity_has_numerical_value - assert data["primaryAccountable"]["id"] == eco_res.primary_accountable_id - assert data["custodian"]["id"] == eco_res.custodian_id - assert data["stage"]["id"] == eco_res.stage_id - assert data["state"]["id"] == eco_res.state_id - assert data["currentLocation"]["id"] == eco_res.current_location_id - assert data["lot"]["id"] == eco_res.lot_id - assert data["containedIn"]["id"] == eco_res.contained_in_id - assert data["unitOfEffort"]["id"] == eco_res.unit_of_effort_id + assert data["id"] == old.id + assert data["id"] == old.id + assert data["name"] == old.name + assert data["note"] == params["note"] + assert data["image"] == params["image"] + assert data["trackingIdentifier"] == old.tracking_identifier + assert data["classifiedAs"] == old.classified_as + assert data["conformsTo"]["id"] == old.conforms_to_id + assert data["accountingQuantity"]["hasUnit"]["id"] == old.accounting_quantity_has_unit_id + assert data["accountingQuantity"]["hasNumericalValue"] == old.accounting_quantity_has_numerical_value + assert data["onhandQuantity"]["hasUnit"]["id"] == old.onhand_quantity_has_unit_id + assert data["onhandQuantity"]["hasNumericalValue"] == old.onhand_quantity_has_numerical_value + assert data["primaryAccountable"]["id"] == old.primary_accountable_id + assert data["custodian"]["id"] == old.custodian_id + assert data["stage"]["id"] == old.stage_id + assert data["state"]["id"] == old.state_id + assert data["currentLocation"]["id"] == old.current_location_id + assert data["lot"]["id"] == old.lot_id + assert data["containedIn"]["id"] == old.contained_in_id + assert data["unitOfEffort"]["id"] == old.unit_of_effort_id end - @tag skip: "TODO: fix economic resource factory" test "deleteEconomicResource()", %{inserted: %{id: id}} do assert %{data: %{"deleteEconomicResource" => true}} = - mutation!(""" - deleteEconomicResource(id: "#{id}") - """) + run!(""" + mutation ($id: ID!) { + deleteEconomicResource(id: $id) + } + """, vars: %{"id" => id}) end end end