zf

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

commit 8d5e61e332c10118905533da5b35511976009dba
parent b1b5bbdd73b3f46e6826ce34005024208ce63f21
Author: srfsh <dev@srf.sh>
Date:   Tue, 23 Aug 2022 08:14:42 +0300

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

Diffstat:
Msrc/zenflows/vf/plan/domain.ex | 23+++++++++++++----------
Msrc/zenflows/vf/plan/resolv.ex | 30+++++++++++++++++-------------
Msrc/zenflows/vf/plan/type.ex | 37++++++++++++++++++++++++-------------
Mtest/vf/plan/domain.test.exs | 19+++++++++----------
4 files changed, 63 insertions(+), 46 deletions(-)

diff --git a/src/zenflows/vf/plan/domain.ex b/src/zenflows/vf/plan/domain.ex @@ -20,6 +20,7 @@ defmodule Zenflows.VF.Plan.Domain do alias Ecto.Multi alias Zenflows.DB.Repo +alias Zenflows.GQL.Paging alias Zenflows.VF.Plan @typep repo() :: Ecto.Repo.t() @@ -27,20 +28,22 @@ alias Zenflows.VF.Plan @typep id() :: Zenflows.DB.Schema.id() @typep params() :: Zenflows.DB.Schema.params() -@spec one(repo(), id()) :: {:ok, Plan.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, Plan.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(Plan, clauses) do nil -> {:error, "not found"} found -> {:ok, found} end end +@spec all(Paging.params()) :: Paging.result(Plan.t()) +def all(params) do + Paging.page(Plan, params) +end + @spec create(params()) :: {:ok, Plan.t()} | {:error, chgset()} def create(params) do Multi.new() @@ -57,7 +60,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, &Plan.chgset(&1.one, params)) |> Repo.transaction() |> case do @@ -70,8 +73,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: p}} -> {:ok, p} diff --git a/src/zenflows/vf/plan/resolv.ex b/src/zenflows/vf/plan/resolv.ex @@ -20,36 +20,40 @@ defmodule Zenflows.VF.Plan.Resolv do use Absinthe.Schema.Notation -alias Zenflows.VF.{Plan, Plan.Domain} +alias Zenflows.VF.Plan.Domain -def created(%{id: id}, _, _) do - Zenflows.DB.ID.ts(id) +def plan(params, _) do + Domain.one(params) end -def refinement_of(%Plan{} = plan, _args, _info) do - plan = Domain.preload(plan, :refinement_of) - {:ok, plan.refinement_of} +def plans(params, _) do + Domain.all(params) end -def plan(%{id: id}, _info) do - Domain.one(id) -end - -def create_plan(%{plan: params}, _info) do +def create_plan(%{plan: params}, _) do with {:ok, plan} <- Domain.create(params) do {:ok, %{plan: plan}} end end -def update_plan(%{plan: %{id: id} = params}, _info) do +def update_plan(%{plan: %{id: id} = params}, _) do with {:ok, plan} <- Domain.update(id, params) do {:ok, %{plan: plan}} end end -def delete_plan(%{id: id}, _info) do +def delete_plan(%{id: id}, _) do with {:ok, _} <- Domain.delete(id) do {:ok, true} end end + +def created(%{id: id}, _, _) do + Zenflows.DB.ID.ts(id) +end + +def refinement_of(plan, _, _) do + plan = Domain.preload(plan, :refinement_of) + {:ok, plan.refinement_of} +end end diff --git a/src/zenflows/vf/plan/type.ex b/src/zenflows/vf/plan/type.ex @@ -31,6 +31,7 @@ uniqueness. @due "The time the plan is expected to be complete." @deletable "The plan is able to be deleted or not." @refinement_of "This plan refines a scenario, making it operational." +@refinement_of_id "(`Scenario`) #{@refinement_of}" @desc """ A logical collection of processes that constitute a body of planned work @@ -58,10 +59,6 @@ object :plan do field :refinement_of, :scenario, resolve: &Resolv.refinement_of/3 end -object :plan_response do - field :plan, non_null(:plan) -end - input_object :plan_create_params do @desc @name field :name, non_null(:string) @@ -72,10 +69,7 @@ input_object :plan_create_params do @desc @due field :due, :datetime - # TODO: When - # https://github.com/absinthe-graphql/absinthe/issues/1126 results, - # apply the correct changes if any. - @desc "(`Scenario`) " <> @refinement_of + @desc @refinement_of_id field :refinement_of_id, :id, name: "refinement_of" end @@ -91,20 +85,37 @@ input_object :plan_update_params do @desc @due field :due, :datetime - # TODO: When - # https://github.com/absinthe-graphql/absinthe/issues/1126 results, - # apply the correct changes if any. - @desc "(`Scenario`) " <> @refinement_of + @desc @refinement_of_id field :refinement_of_id, :id, name: "refinement_of" end +object :plan_response do + field :plan, non_null(:plan) +end + +object :plan_edge do + field :cursor, non_null(:id) + field :node, non_null(:plan) +end + +object :plan_connection do + field :page_info, non_null(:page_info) + field :edges, non_null(list_of(non_null(:plan_edge))) +end + object :query_plan do field :plan, :plan do arg :id, non_null(:id) resolve &Resolv.plan/2 end - #plans(start: ID, limit: Int): [Plan!] + field :plans, :plan_connection do + arg :first, :integer + arg :after, :id + arg :last, :integer + arg :before, :id + resolve &Resolv.plans/2 + end end object :mutation_plan do diff --git a/test/vf/plan/domain.test.exs b/test/vf/plan/domain.test.exs @@ -30,7 +30,6 @@ setup do refinement_of_id: Factory.insert!(:scenario).id, }, inserted: Factory.insert!(:plan), - id: Factory.id(), } end @@ -39,18 +38,18 @@ describe "one/1" do assert {:ok, %Plan{}} = Domain.one(id) end - test "with bad id: doesn't find the Plan", %{id: id} do - assert {:error, "not found"} = Domain.one(id) + test "with bad id: doesn't find the Plan" do + assert {:error, "not found"} = Domain.one(Factory.id()) end end describe "create/1" do test "with good params: creates a Plan", %{params: params} do - assert {:ok, %Plan{} = plan} = Domain.create(params) - assert plan.name == params.name - assert plan.note == params.note - assert plan.due == params.due - assert plan.refinement_of_id == params.refinement_of_id + assert {:ok, %Plan{} = new} = Domain.create(params) + assert new.name == params.name + assert new.note == params.note + assert new.due == params.due + assert new.refinement_of_id == params.refinement_of_id end test "with bad params: doesn't create an" do @@ -82,8 +81,8 @@ describe "delete/1" do assert {:error, "not found"} = Domain.one(id) end - test "with bad id: doesn't delete the Plan", %{id: id} do - assert {:error, "not found"} = Domain.delete(id) + test "with bad id: doesn't delete the Plan" do + assert {:error, "not found"} = Domain.delete(Factory.id()) end end