Packages

Pavlov is a BDD library for your Elixir projects, allowing you to write expressive unit tests that tell the story of how your application behaves. The syntax tries to follow RSpec's wherever possible.

Current section

Files

Jump to
pavlov lib mocks matchers.ex
Raw

lib/mocks/matchers.ex

defmodule Pavlov.Mocks.Matchers do
@moduledoc """
Provides matchers for Mocked modules.
"""
import ExUnit.Assertions
import Pavlov.Mocks.Matchers.Messages
@doc """
Asserts whether a method was called with on a mocked module.
Use in conjunction with `with` to perform assertions on the arguments
passed in to the method.
A negative version `not_to_have_received` is also provided. The same usage
instructions apply.
## Example
expect HTTPotion |> to_have_received :get
"""
def to_have_received(module, tuple) when is_tuple(tuple) do
{method, args} = tuple
args = List.flatten [args]
result = _called(module, method, args)
case result do
false -> flunk message_for_matcher(:have_received, [module, method, args], :assertion)
_ -> assert result
end
end
def to_have_received(module, method) do
result = _called(module, method, [])
case result do
false -> flunk message_for_matcher(:have_received, [module, method], :assertion)
_ -> assert result
end
end
@doc false
def not_to_have_received(module, tuple) when is_tuple(tuple) do
{method, args} = tuple
args = List.flatten [args]
result = _called(module, method, args)
case result do
true -> flunk message_for_matcher(:have_received, [module, method, args], :refutation)
_ -> refute result
end
end
def not_to_have_received(module, method) do
result = _called(module, method, [])
case result do
true -> flunk message_for_matcher(:have_received, [module, method], :refutation)
_ -> refute result
end
end
@doc """
Use in conjunction with `to_have_received` to perform assertions on the
arguments passed in to the given method.
## Example
expect HTTPotion |> to_have_received :get |> with "http://example.com"
"""
def with(method, args) do
{method, args}
end
@doc """
Asserts whether a method was called when using "Asserts" syntax:
## Example
assert called HTTPotion.get("http://example.com")
"""
defmacro called({ {:., _, [ module , f ]} , _, args }) do
quote do
:meck.called unquote(module), unquote(f), unquote(args)
end
end
defp _called(module, f, args) do
:meck.called module, f, args
end
end