test "add/2" do
rolling_list = RollingList.new(2)
assert RollingList.add(rolling_list, 3) ==
{_limit = 2, [3]}
end
Slide 31
Slide 31 text
No content
Slide 32
Slide 32 text
test "add/2" do
{:ok, pid} = RollingAverage.start_link(2)
RollingAverage.add(pid, 3)
state = :sys.get_state(pid)
assert state == {_limit = 2, [3]}
end
Slide 33
Slide 33 text
No content
Slide 34
Slide 34 text
No content
Slide 35
Slide 35 text
test "add/2 and average/1" do
{:ok, pid} =
start_supervised(
{RollingAverage, _limit = 2}
)
# Same as before
end
Slide 36
Slide 36 text
No content
Slide 37
Slide 37 text
def background_work do
Task.start(fn ->
do_something()
end)
end
Slide 38
Slide 38 text
No content
Slide 39
Slide 39 text
No content
Slide 40
Slide 40 text
def background_work(parent, ref) do
Task.start(fn ->
do_something()
send(parent, {ref, :done})
end)
end
Slide 41
Slide 41 text
test "background_work/0" do
ref = make_ref()
background_work(self(), ref)
assert_receive {^ref, :done}
end
Slide 42
Slide 42 text
No content
Slide 43
Slide 43 text
def background_work do
Task.start(fn ->
:ok = twitter_module.post()
end)
end
Slide 44
Slide 44 text
test "background_work/0" do
parent = self()
ref = make_ref()
Mox.expect(TwitterMock, :post, fn ->
send(parent, ref)
:ok
end)
background_work()
assert_receive ^ref
end
Slide 45
Slide 45 text
No content
Slide 46
Slide 46 text
defmodule WeatherChecker do
use GenServer
def init(_) do
:timer.send_interval(5000, self(), :tick)
end
def handle_info(:tick, _) do
check_weather()
end
end
Slide 47
Slide 47 text
test "checking weather periodically" do
{:ok, _pid} = WeatherChecker.start_link()
Process.sleep(5000 * 1.5)
assert weather_checked?()
end
Slide 48
Slide 48 text
No content
Slide 49
Slide 49 text
defmodule WeatherChecker do
use GenServer
def init(_) do
:timer.send_interval(5000, self(), :tick)
end
def tick(pid), do: send(pid, :tick)
def handle_info(:tick, _) do
check_weather()
end
end
Slide 50
Slide 50 text
test "checking weather periodically" do
{:ok, pid} = WeatherChecker.start_link()
WeatherChecker.tick(pid)
assert weather_checked?()
end
Slide 51
Slide 51 text
defmodule WeatherChecker do
use GenServer
def init(:interval) do
:timer.send_interval(5000, self(), :tick)
end
def init(:manual) do
# No send_interval
end
end
Slide 52
Slide 52 text
No content
Slide 53
Slide 53 text
@mix_env Mix.env()
def start(_type, _args) do
Supervisor.start_link(children(@mix_env), ...)
end
defp children(:test), do: [...]
defp children(_env), do: [WeatherChecker | ...]
Slide 54
Slide 54 text
No content
Slide 55
Slide 55 text
No content
Slide 56
Slide 56 text
No content
Slide 57
Slide 57 text
No content
Slide 58
Slide 58 text
test "cleanup after crashes" do
Process.flag(:trap_exit, true)
{:ok, pid} = start_supervised(MyServer)
Process.exit(pid, :kill)
assert cleanup_successful?()
end