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:
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