Current section

Files

Jump to
elixir_talk test elixir_talk_test.exs
Raw

test/elixir_talk_test.exs

defmodule ElixirTalkTest do
use ExUnit.Case
setup do
{:ok, pid} = ElixirTalk.connect '192.168.99.10', 11300
{m, s, ms} = :os.timestamp
tube = "ElixirTalk_#{m}_#{s}_#{ms}"
ElixirTalk.use pid, tube
ElixirTalk.watch pid, tube
ElixirTalk.ignore pid, "default"
# Don't have to manually stop it, because ExUnit will send `shutdown` to the runner
# on_exit fn -> ElixirTalk.quit(pid) end
{:ok, [tube: tube, pid: pid]}
end
test "`connect` domain" do
{:ok, pid} = ElixirTalk.connect 'my.beanstalkd.com', 11300
assert is_pid(pid)
end
test "`put`", ctx do
{:inserted, id1} = ElixirTalk.put ctx[:pid], "hello world"
assert is_integer(id1)
{:inserted, id2} = ElixirTalk.put(ctx[:pid], "hello world", pri: 1)
assert is_integer(id2) == true and id2 - id1 == 1
{:inserted, id3} = ElixirTalk.put ctx[:pid], "hello world", pri: 1, delay: 5
assert is_integer(id3) == true and id3 - id1 == 2
{:inserted, id4} = ElixirTalk.put ctx[:pid], "hello world", pri: 1, delay: 5, ttr: 120
assert is_integer(id4) == true and id4 - id1 == 3
for id <- [id1, id2, id3, id4], do: ElixirTalk.delete(ctx[:pid], id)
end
test "`put` unicode", ctx do
{:inserted, id} = ElixirTalk.put ctx[:pid], "hełło"
assert is_integer(id)
ElixirTalk.delete(ctx[:pid], id)
end
test "`use`", ctx do
{:using, now_tube} = ElixirTalk.list_tube_used(ctx[:pid])
tube = "not_default"
{:using, data} = ElixirTalk.use ctx[:pid], tube
assert data == tube
ElixirTalk.use ctx[:pid], now_tube
end
test "`reserved`", ctx do
str = "hello world"
{:inserted, put_id} = ElixirTalk.put ctx[:pid], str
{:reserved, expected_id, expected_str} = ElixirTalk.reserve ctx[:pid]
assert put_id == expected_id
assert str == expected_str
end
test "`ignore`", ctx do
ret = ElixirTalk.ignore ctx[:pid], ctx[:tube]
assert ret == :not_ignored
tube = "new_tube"
{watch, count} = ElixirTalk.ignore ctx[:pid], tube
assert watch == :watching && count == 1
end
test "`list_tubes`", ctx do
tubes = ElixirTalk.list_tubes(ctx[:pid])
assert length(tubes) > 0
end
test "`list_tubes_watched`", ctx do
used_tube = ElixirTalk.list_tubes_watched ctx[:pid]
assert length(used_tube) == 1
assert hd(used_tube) == ctx[:tube]
tubes = ~w(tube1 tube2 tube3 tube4 tube5)
Enum.each tubes, &(ElixirTalk.watch ctx[:pid], &1)
used_tube = ElixirTalk.list_tubes_watched ctx[:pid]
assert length(used_tube) == 1 + length(tubes)
assert hd(used_tube) == ctx[:tube]
end
test "`list_tube_used`", ctx do
{:using, used_tube} = ElixirTalk.list_tube_used ctx[:pid]
assert used_tube == ctx[:tube]
using_tube = "using_tube_foo"
ElixirTalk.use ctx[:pid], using_tube
{:using, used_tube} = ElixirTalk.list_tube_used ctx[:pid]
assert used_tube == using_tube
end
test "`watch`", ctx do
tube = "new_tube"
{:watching, count} = ElixirTalk.watch ctx[:pid], tube
assert count == 2
end
test "`delete`", ctx do
{:inserted, id} = ElixirTalk.put ctx[:pid], "put to ensure has jobs"
ret = ElixirTalk.delete ctx[:pid], id
assert ret == :deleted
ret = ElixirTalk.delete ctx[:pid], id
assert ret == :not_found
{:inserted, id} = ElixirTalk.put ctx[:pid], "another job"
{:reserved, ^id, _} = ElixirTalk.reserve ctx[:pid], 0
assert ElixirTalk.delete(ctx[:pid], id) == :deleted
end
test "with large body smaller than 2**16", ctx do
body = String.duplicate("{msg: \"hello world\"}", 500)
{:inserted, id} = ElixirTalk.put ctx[:pid], body
assert is_integer(id)
{:reserved, ^id, ^body} = ElixirTalk.reserve ctx[:pid], 0
assert ElixirTalk.delete(ctx[:pid], id) == :deleted
end
test "with large body larger than 2**16", ctx do
body = String.duplicate("{msg: \"hello world\"}", 5000)
assert :job_too_big == ElixirTalk.put ctx[:pid], body
end
test "`stats`", ctx do
stats = ElixirTalk.stats(ctx[:pid])
assert is_map(stats)
keys = ["current-jobs-urgent", "cmd-peek", "uptime", "cmd-list-tubes-watched",
"rusage-utime", "cmd-release", "binlog-current-index", "cmd-watch",
"total-connections", "current-workers", "current-waiting", "cmd-ignore", "id",
"cmd-put", "job-timeouts", "cmd-stats-tube", "max-job-size",
"current-producers", "current-jobs-buried", "cmd-touch", "cmd-kick",
"current-tubes", "cmd-bury", "current-jobs-ready", "cmd-stats",
"cmd-list-tube-used", "version", "binlog-records-migrated", "hostname",
"binlog-records-written", "current-jobs-reserved", "cmd-peek-ready",
"cmd-pause-tube", "current-jobs-delayed", "cmd-peek-buried", "cmd-use",
"cmd-reserve", "current-connections", "rusage-stime",
"cmd-reserve-with-timeout", "binlog-oldest-index", "pid", "binlog-max-size",
"total-jobs", "cmd-delete", "cmd-list-tubes", "cmd-stats-job",
"cmd-peek-delayed"]
|> Enum.into(MapSet.new)
assert MapSet.equal?(Enum.into(Map.keys(stats), MapSet.new), keys)
end
test "`stats_job`", ctx do
{:inserted, id} = ElixirTalk.put ctx[:pid], "put to ensure has jobs"
stats = ElixirTalk.stats_job(ctx[:pid], id)
assert is_map(stats)
keys = ["id", "tube", "state", "pri", "age", "delay", "ttr", "time-left",
"file", "reserves", "timeouts", "releases", "buries", "kicks"]
|> Enum.into(MapSet.new)
assert MapSet.equal?(Enum.into(Map.keys(stats), MapSet.new), keys)
ElixirTalk.delete(ctx[:pid], id)
end
test "`stats_tube`", ctx do
stats = ElixirTalk.stats_tube(ctx[:pid], ctx[:tube])
assert is_map(stats)
keys = ["cmd-delete", "cmd-pause-tube", "current-jobs-buried", "current-jobs-delayed",
"current-jobs-ready", "current-jobs-reserved", "current-jobs-urgent",
"current-using", "current-waiting", "current-watching", "name", "pause",
"pause-time-left", "total-jobs"]
|> Enum.into(MapSet.new)
assert MapSet.equal?(Enum.into(Map.keys(stats), MapSet.new), keys)
assert :not_found == ElixirTalk.stats_tube(ctx[:pid], ctx[:tube] <> "_notfound")
end
end