Packages
double_down
0.63.0
0.69.0
0.68.0
0.66.0
0.65.0
0.64.1
0.64.0
0.63.3
0.63.2
0.63.1
0.63.0
0.62.1
0.61.0
0.60.4
0.60.3
0.60.2
0.60.1
0.60.0
0.59.0
0.58.0
0.57.0
0.56.1
0.56.0
0.55.0
0.54.0
0.53.0
0.52.3
0.52.2
0.52.1
0.52.0
0.51.0
0.50.1
0.50.0
0.49.0
0.48.1
0.48.0
0.47.2
0.47.1
0.47.0
0.46.3
0.46.2
0.46.1
0.46.0
0.45.0
0.44.0
0.43.0
0.42.0
0.41.1
0.41.0
0.40.0
0.39.0
0.38.0
0.37.2
0.37.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.1
0.31.0
0.30.1
0.30.0
0.29.0
0.28.1
0.28.0
0.27.0
0.26.0
0.24.0
Builds on the Mox pattern — generates behaviours and dispatch facades from `defcallback` declarations — and adds stateful test doubles powerful enough to test Ecto.Repo operations without a database.
Current section
Files
Jump to
Current section
Files
lib/double_down/dispatch/stateless_handler.ex
defmodule DoubleDown.Dispatch.StatelessHandler do
@moduledoc """
Behaviour for stateless stub handler modules.
Implement this behaviour to make a stateless stub usable by module
name in `DoubleDown.Double.fallback/2..4`:
# Instead of:
Double.fallback(Repo, Repo.Stateless.new())
# Write:
Double.fallback(Repo, Repo.Stateless)
# With a fallback function:
Double.fallback(Repo, Repo.Stateless, fn _contract, :all, [User] -> [] end)
## Callbacks
* `new/2` — build a 3-arity dispatch function from a fallback
function and options. The returned function has the signature
`fn contract, operation, args -> result end`.
## Example
defmodule MyApp.TestStore do
@behaviour DoubleDown.Dispatch.StatelessHandler
@impl true
def new(fallback_fn, _opts) do
fn contract, operation, args ->
case {operation, args} do
{:get, [id]} -> %{id: id}
_ when is_function(fallback_fn) -> fallback_fn.(contract, operation, args)
_ -> raise "unhandled"
end
end
end
end
"""
@doc """
Build a 3-arity dispatch function from a fallback function and options.
* `fallback_fn` — an optional 3-arity function `(contract, operation, args) -> result`
for operations the stub doesn't handle directly. `nil` if not provided.
* `opts` — additional options for configuring the stub.
Returns a 3-arity function `fn contract, operation, args -> result end` suitable
for use as a `Double.fallback` function fallback.
"""
@callback new(
fallback_fn :: DoubleDown.Dispatch.Types.stateless_fun() | nil,
opts :: keyword()
) :: DoubleDown.Dispatch.Types.stateless_fun()
end