zf

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

commit eec62314fa0ef6dff93152284df3b076b721c849
parent e5b306f9cb2a3a0ea211a3a251a18107b2688527
Author: srfsh <dev@srf.sh>
Date:   Tue, 23 Aug 2022 11:11:02 +0300

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

Diffstat:
Msrc/zenflows/vf/resource_specification/domain.ex | 26+++++++++++++++-----------
Msrc/zenflows/vf/resource_specification/resolv.ex | 23++++++++++++-----------
Msrc/zenflows/vf/resource_specification/type.ex | 39+++++++++++++++++++++++++++------------
Mtest/vf/resource_specification/domain.test.exs | 23+++++++++++------------
Mtest/vf/resource_specification/type.test.exs | 77+++++++++++++++++++++++++++++++++--------------------------------------------
5 files changed, 98 insertions(+), 90 deletions(-)

diff --git a/src/zenflows/vf/resource_specification/domain.ex b/src/zenflows/vf/resource_specification/domain.ex @@ -20,6 +20,7 @@ defmodule Zenflows.VF.ResourceSpecification.Domain do alias Ecto.Multi alias Zenflows.DB.Repo +alias Zenflows.GQL.Paging alias Zenflows.VF.ResourceSpecification @typep repo() :: Ecto.Repo.t() @@ -27,21 +28,24 @@ alias Zenflows.VF.ResourceSpecification @typep id() :: Zenflows.DB.Schema.id() @typep params() :: Zenflows.DB.Schema.params() -@spec one(repo(), id()) :: {:ok, ResourceSpecification.t()} | {:error, String.t()} -def one(repo \\ Repo, id) do - one_by(repo, id: id) -end - -@spec one_by(repo(), map() | Keyword.t()) +@spec one(repo(), id() | map() | Keyword.t()) :: {:ok, ResourceSpecification.t()} | {:error, String.t()} -def one_by(repo \\ Repo, clauses) do +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(ResourceSpecification, clauses) do nil -> {:error, "not found"} found -> {:ok, found} end end -@spec create(repo(), params()) :: {:ok, ResourceSpecification.t()} | {:error, chgset()} +@spec all(Paging.params()) :: Paging.result(ResourceSpecification.t()) +def all(params) do + Paging.page(ResourceSpecification, params) +end + +@spec create(repo(), params()) + :: {:ok, ResourceSpecification.t()} | {:error, chgset()} def create(repo \\ Repo, params) do Multi.new() |> Multi.insert(:insert, ResourceSpecification.chgset(params)) @@ -57,7 +61,7 @@ end def update(id, params) do Multi.new() |> Multi.put(:id, id) - |> Multi.run(:one, &one_by/2) + |> Multi.run(:one, &one/2) |> Multi.update(:update, &ResourceSpecification.chgset(&1.one, params)) |> Repo.transaction() |> case do @@ -71,8 +75,8 @@ end def delete(id) do Multi.new() |> Multi.put(:id, id) - |> Multi.run(:one, &one_by/2) - |> Multi.delete(:delete, &(&1.one)) + |> Multi.run(:one, &one/2) + |> Multi.delete(:delete, & &1.one) |> Repo.transaction() |> case do {:ok, %{delete: rs}} -> {:ok, rs} diff --git a/src/zenflows/vf/resource_specification/resolv.ex b/src/zenflows/vf/resource_specification/resolv.ex @@ -18,39 +18,40 @@ defmodule Zenflows.VF.ResourceSpecification.Resolv do @moduledoc "Resolvers of ResourceSpecifications." -alias Zenflows.VF.{ - ResourceSpecification, - ResourceSpecification.Domain, -} +alias Zenflows.VF.ResourceSpecification.Domain -def resource_specification(%{id: id}, _info) do - Domain.one(id) +def resource_specification(params, _) do + Domain.one(params) end -def create_resource_specification(%{resource_specification: params}, _info) do +def resource_specifications(params, _) do + Domain.all(params) +end + +def create_resource_specification(%{resource_specification: params}, _) do with {:ok, proc_spec} <- Domain.create(params) do {:ok, %{resource_specification: proc_spec}} end end -def update_resource_specification(%{resource_specification: %{id: id} = params}, _info) do +def update_resource_specification(%{resource_specification: %{id: id} = params}, _) do with {:ok, proc_spec} <- Domain.update(id, params) do {:ok, %{resource_specification: proc_spec}} end end -def delete_resource_specification(%{id: id}, _info) do +def delete_resource_specification(%{id: id}, _) do with {:ok, _} <- Domain.delete(id) do {:ok, true} end end -def default_unit_of_resource(%ResourceSpecification{} = res_spec, _args, _info) do +def default_unit_of_resource(res_spec, _, _) do res_spec = Domain.preload(res_spec, :default_unit_of_resource) {:ok, res_spec.default_unit_of_resource} end -def default_unit_of_effort(%ResourceSpecification{} = res_spec, _args, _info) do +def default_unit_of_effort(res_spec, _, _) do res_spec = Domain.preload(res_spec, :default_unit_of_effort) {:ok, res_spec.default_unit_of_effort} end diff --git a/src/zenflows/vf/resource_specification/type.ex b/src/zenflows/vf/resource_specification/type.ex @@ -35,7 +35,9 @@ References a concept in a common taxonomy or other classification scheme for purposes of categorization or grouping. """ @default_unit_of_resource "The default unit used for the resource itself." +@default_unit_of_resource_id "(`Unit`) #{@default_unit_of_resource}" @default_unit_of_effort "The default unit used for use or work." +@default_unit_of_effort_id "(`Unit`) #{@default_unit_of_effort}" @note "A textual description or comment." @desc """ @@ -67,10 +69,6 @@ object :resource_specification do resolve: &Resolv.default_unit_of_effort/3 end -object :resource_specification_response do - field :resource_specification, non_null(:resource_specification) -end - input_object :resource_specification_create_params do @desc @name field :name, non_null(:string) @@ -84,13 +82,10 @@ input_object :resource_specification_create_params do @desc @note field :note, :string - # TODO: When - # https://github.com/absinthe-graphql/absinthe/issues/1126 results, - # apply the correct changes if any. - @desc @default_unit_of_resource + @desc @default_unit_of_resource_id field :default_unit_of_resource_id, :id, name: "default_unit_of_resource" - @desc @default_unit_of_effort + @desc @default_unit_of_effort_id field :default_unit_of_effort_id, :id, name: "default_unit_of_effort" end @@ -109,20 +104,40 @@ input_object :resource_specification_update_params do @desc @note field :note, :string - @desc @default_unit_of_resource + @desc @default_unit_of_resource_id field :default_unit_of_resource_id, :id, name: "default_unit_of_resource" - @desc @default_unit_of_effort + @desc @default_unit_of_effort_id field :default_unit_of_effort_id, :id, name: "default_unit_of_effort" end +object :resource_specification_response do + field :resource_specification, non_null(:resource_specification) +end + +object :resource_specification_edge do + field :cursor, non_null(:id) + field :node, non_null(:resource_specification) +end + +object :resource_specification_connection do + field :page_info, non_null(:page_info) + field :edges, non_null(list_of(non_null(:resource_specification_edge))) +end + object :query_resource_specification do field :resource_specification, :resource_specification do arg :id, non_null(:id) resolve &Resolv.resource_specification/2 end - #resourceSpecifications(start: ID, limit: Int): [ResourceSpecification!] + field :resource_specifications, :resource_specification_connection do + arg :first, :integer + arg :after, :id + arg :last, :integer + arg :before, :id + resolve &Resolv.resource_specifications/2 + end end object :mutation_resource_specification do diff --git a/test/vf/resource_specification/domain.test.exs b/test/vf/resource_specification/domain.test.exs @@ -36,7 +36,6 @@ setup do default_unit_of_resource_id: Factory.insert!(:unit).id, }, inserted: Factory.insert!(:resource_specification), - id: Factory.id() } end @@ -45,20 +44,20 @@ describe "one/1" do assert {:ok, %ResourceSpecification{}} = Domain.one(id) end - test "with bad id: doesn't find the ResourceSpecification", %{id: id} do - assert {:error, "not found"} = Domain.one(id) + test "with bad id: doesn't find the ResourceSpecification" do + assert {:error, "not found"} = Domain.one(Factory.id()) end end describe "create/1" do test "with good params: creates a ResourceSpecification", %{params: params} do - assert {:ok, %ResourceSpecification{} = res_spec} = Domain.create(params) - assert res_spec.name == params.name - assert res_spec.resource_classified_as == params.resource_classified_as - assert res_spec.note == params.note - assert res_spec.image == params.image - assert res_spec.default_unit_of_resource_id == params.default_unit_of_resource_id - assert res_spec.default_unit_of_effort_id == params.default_unit_of_effort_id + assert {:ok, %ResourceSpecification{} = new} = Domain.create(params) + assert new.name == params.name + assert new.resource_classified_as == params.resource_classified_as + assert new.note == params.note + assert new.image == params.image + assert new.default_unit_of_resource_id == params.default_unit_of_resource_id + assert new.default_unit_of_effort_id == params.default_unit_of_effort_id end test "with bad params: doesn't create a ResourceSpecification" do @@ -94,8 +93,8 @@ describe "delete/1" do assert {:error, "not found"} = Domain.one(id) end - test "with bad id: doesn't delete the ResourceSpecification", %{id: id} do - assert {:error, "not found"} = Domain.delete(id) + test "with bad id: doesn't delete the ResourceSpecification" do + assert {:error, "not found"} = Domain.delete(Factory.id()) end end diff --git a/test/vf/resource_specification/type.test.exs b/test/vf/resource_specification/type.test.exs @@ -28,52 +28,50 @@ setup do "defaultUnitOfEffort" => Factory.insert!(:unit).id, "defaultUnitOfResource" => Factory.insert!(:unit).id, }, - resource_specification: Factory.insert!(:resource_specification), + inserted: Factory.insert!(:resource_specification), } end +@frag """ +fragment resourceSpecification on ResourceSpecification { + id + name + resourceClassifiedAs + defaultUnitOfResource {id} + defaultUnitOfEffort {id} + note + image +} +""" + describe "Query" do - test "resourceSpecification()", %{resource_specification: res_spec} do + test "resourceSpecification", %{inserted: new} do assert %{data: %{"resourceSpecification" => data}} = run!(""" + #{@frag} query ($id: ID!) { - resourceSpecification(id: $id) { - id - name - resourceClassifiedAs - defaultUnitOfResource { id } - defaultUnitOfEffort { id } - note - image - } + resourceSpecification(id: $id) {...resourceSpecification} } - """, vars: %{"id" => res_spec.id}) + """, vars: %{"id" => new.id}) - assert data["id"] == res_spec.id - assert data["name"] == res_spec.name - assert data["resourceClassifiedAs"] == res_spec.resource_classified_as - assert data["defaultUnitOfResource"]["id"] == res_spec.default_unit_of_resource_id - assert data["defaultUnitOfEffort"]["id"] == res_spec.default_unit_of_effort_id - assert data["note"] == res_spec.note - assert data["image"] == res_spec.image + assert data["id"] == new.id + assert data["name"] == new.name + assert data["resourceClassifiedAs"] == new.resource_classified_as + assert data["defaultUnitOfResource"]["id"] == new.default_unit_of_resource_id + assert data["defaultUnitOfEffort"]["id"] == new.default_unit_of_effort_id + assert data["note"] == new.note + assert data["image"] == new.image end end describe "Mutation" do - test "createResourceSpecification()", %{params: params} do + test "createResourceSpecification", %{params: params} do assert %{data: %{"createResourceSpecification" => %{"resourceSpecification" => data}}} = run!(""" + #{@frag} mutation ($resourceSpecification: ResourceSpecificationCreateParams!) { createResourceSpecification(resourceSpecification: $resourceSpecification) { - resourceSpecification { - id - name - resourceClassifiedAs - defaultUnitOfResource { id } - defaultUnitOfEffort { id } - note - image - } + resourceSpecification {...resourceSpecification} } } """, vars: %{"resourceSpecification" => params}) @@ -85,34 +83,25 @@ describe "Mutation" do assert data["defaultUnitOfEffort"]["id"] == params["defaultUnitOfEffort"] end - test "updateResourceSpecification()", %{params: params, resource_specification: res_spec} do + test "updateResourceSpecification()", %{params: params, inserted: old} do assert %{data: %{"updateResourceSpecification" => %{"resourceSpecification" => data}}} = run!(""" + #{@frag} mutation ($resourceSpecification: ResourceSpecificationUpdateParams!) { updateResourceSpecification(resourceSpecification: $resourceSpecification) { - resourceSpecification { - id - name - resourceClassifiedAs - defaultUnitOfResource { id } - defaultUnitOfEffort { id } - note - image - } + resourceSpecification {...resourceSpecification} } } - """, vars: %{"resourceSpecification" => - Map.put(params, "id", res_spec.id), - }) + """, vars: %{"resourceSpecification" => Map.put(params, "id", old.id)}) - assert data["id"] == res_spec.id + assert data["id"] == old.id keys = ~w[name note resourceClassifiedAs note image] assert Map.take(data, keys) == Map.take(params, keys) assert data["defaultUnitOfResource"]["id"] == params["defaultUnitOfResource"] assert data["defaultUnitOfEffort"]["id"] == params["defaultUnitOfEffort"] end - test "deleteResourceSpecification()", %{resource_specification: %{id: id}} do + test "deleteResourceSpecification()", %{inserted: %{id: id}} do assert %{data: %{"deleteResourceSpecification" => true}} = run!(""" mutation ($id: ID!) {