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:
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!) {