zf

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

commit be0e289f199d57096305643ac981f902354c0a18
parent bc23a1a3150dfa3958448790fd54a0d53a2d42f4
Author: srfsh <dev@srf.sh>
Date:   Mon, 22 Aug 2022 20:43:30 +0300

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

Diffstat:
Msrc/zenflows/vf/agreement/domain.ex | 21++++++++++++---------
Msrc/zenflows/vf/agreement/resolv.ex | 12++++++++----
Msrc/zenflows/vf/agreement/type.ex | 26++++++++++++++++++++++----
Mtest/vf/agreement/domain.test.exs | 15+++++++--------
Mtest/vf/agreement/type.test.exs | 10+++++-----
5 files changed, 54 insertions(+), 30 deletions(-)

diff --git a/src/zenflows/vf/agreement/domain.ex b/src/zenflows/vf/agreement/domain.ex @@ -20,6 +20,7 @@ defmodule Zenflows.VF.Agreement.Domain do alias Ecto.Multi alias Zenflows.DB.Repo +alias Zenflows.GQL.Paging alias Zenflows.VF.Agreement @typep repo() :: Ecto.Repo.t() @@ -27,20 +28,22 @@ alias Zenflows.VF.Agreement @typep id() :: Zenflows.DB.Schema.id() @typep params() :: Zenflows.DB.Schema.params() -@spec one(repo(), id()) :: {:ok, Agreement.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, Agreement.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(Agreement, clauses) do nil -> {:error, "not found"} found -> {:ok, found} end end +@spec all(Paging.params()) :: Paging.result(Agreement.t()) +def all(params) do + Paging.page(Agreement, params) +end + @spec create(params()) :: {:ok, Agreement.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, &Agreement.chgset(&1.one, params)) |> Repo.transaction() |> case do @@ -70,7 +73,7 @@ end def delete(id) do Multi.new() |> Multi.put(:id, id) - |> Multi.run(:one, &one_by/2) + |> Multi.run(:one, &one/2) |> Multi.delete(:delete, &(&1.one)) |> Repo.transaction() |> case do diff --git a/src/zenflows/vf/agreement/resolv.ex b/src/zenflows/vf/agreement/resolv.ex @@ -20,12 +20,12 @@ defmodule Zenflows.VF.Agreement.Resolv do alias Zenflows.VF.Agreement.Domain -def created(%{id: id}, _, _) do - Zenflows.DB.ID.ts(id) +def agreement(params, _info) do + Domain.one(params) end -def agreement(%{id: id}, _info) do - Domain.one(id) +def agreements(params, _) do + Domain.all(params) end def create_agreement(%{agreement: params}, _info) do @@ -45,4 +45,8 @@ def delete_agreement(%{id: id}, _info) do {:ok, true} end end + +def created(%{id: id}, _, _) do + Zenflows.DB.ID.ts(id) +end end diff --git a/src/zenflows/vf/agreement/type.ex b/src/zenflows/vf/agreement/type.ex @@ -43,10 +43,6 @@ object :agreement do field :created, non_null(:datetime), resolve: &Resolv.created/3 end -object :agreement_response do - field :agreement, non_null(:agreement) -end - input_object :agreement_create_params do @desc @name field :name, non_null(:string) @@ -65,11 +61,33 @@ input_object :agreement_update_params do field :note, :string end +object :agreement_response do + field :agreement, non_null(:agreement) +end + +object :agreement_edge do + field :cursor, non_null(:id) + field :node, non_null(:agreement) +end + +object :agreement_connection do + field :page_info, non_null(:page_info) + field :edges, non_null(list_of(non_null(:agreement_edge))) +end + object :query_agreement do field :agreement, :agreement do arg :id, non_null(:id) resolve &Resolv.agreement/2 end + + field :agreements, :agreement_connection do + arg :first, :integer + arg :after, :id + arg :last, :integer + arg :before, :id + resolve &Resolv.agreements/2 + end end object :mutation_agreement do diff --git a/test/vf/agreement/domain.test.exs b/test/vf/agreement/domain.test.exs @@ -28,7 +28,6 @@ setup do note: Factory.str("note"), }, inserted: Factory.insert!(:agreement), - id: Factory.id(), } end @@ -37,16 +36,16 @@ describe "one/1" do assert {:ok, %Agreement{}} = Domain.one(id) end - test "with bad id: doesn't find the Agreement", %{id: id} do - assert {:error, "not found"} = Domain.one(id) + test "with bad id: doesn't find the Agreement" do + assert {:error, "not found"} = Domain.one(Factory.id()) end end describe "create/1" do test "with good params: creates an Agreement", %{params: params} do - assert {:ok, %Agreement{} = agreem} = Domain.create(params) - assert agreem.name == params.name - assert agreem.note == params.note + assert {:ok, %Agreement{} = new} = Domain.create(params) + assert new.name == params.name + assert new.note == params.note end test "with bad params: doesn't create an Agreement" do @@ -74,8 +73,8 @@ describe "delete/1" do assert {:error, "not found"} = Domain.one(id) end - test "with bad id: doesn't delete the Agreement", %{id: id} do - assert {:error, "not found"} = Domain.delete(id) + test "with bad id: doesn't delete the Agreement" do + assert {:error, "not found"} = Domain.delete(Factory.id()) end end end diff --git a/test/vf/agreement/type.test.exs b/test/vf/agreement/type.test.exs @@ -38,18 +38,18 @@ fragment agreement on Agreement { """ describe "Query" do - test "agreement", %{inserted: agreem} do + test "agreement", %{inserted: new} do assert %{data: %{"agreement" => data}} = run!(""" #{@frag} query ($id: ID!) { agreement(id: $id) {...agreement} } - """, vars: %{"id" => agreem.id}) + """, vars: %{"id" => new.id}) - assert data["id"] == agreem.id - assert data["name"] == agreem.name - assert data["note"] == agreem.note + assert data["id"] == new.id + assert data["name"] == new.name + assert data["note"] == new.note assert {:ok, created, 0} = DateTime.from_iso8601(data["created"]) assert DateTime.compare(DateTime.utc_now(), created) != :lt end